设为首页 加入收藏

TOP

(Visual C++)游戏开发笔记之十一:基础动画显示(四)排序贴图 (六)
2014-11-23 20:17:32 来源: 作者: 【 】 浏览:230
Tags:Visual 游戏 开发 笔记 十一 基础 动画 显示 排序 贴图
bject(mdc,bmp);


//加载各张恐龙跑动图及背景图,这里以0,1,2,3来代表恐龙的上,下,左,右移动
draPic[0] = (HBITMAP)LoadImage(NULL,"dra0.bmp",IMAGE_BITMAP,528,188,LR_LOADFROMFILE);
draPic[1] = (HBITMAP)LoadImage(NULL,"dra1.bmp",IMAGE_BITMAP,544,164,LR_LOADFROMFILE);
draPic[2] = (HBITMAP)LoadImage(NULL,"dra2.bmp",IMAGE_BITMAP,760,198,LR_LOADFROMFILE);
draPic[3] = (HBITMAP)LoadImage(NULL,"dra3.bmp",IMAGE_BITMAP,760,198,LR_LOADFROMFILE);
bg = (HBITMAP)LoadImage(NULL,"bg.bmp",IMAGE_BITMAP,640,480,LR_LOADFROMFILE);


//设定所有恐龙初始的贴图坐标都为(200,200),初始的移动方向都为向左。
for(i=0;i {
dra[i].dir = 3; //起始方向
dra[i].x = 200; //贴图的起始X坐标
dra[i].y = 200; //贴图的起始Y坐标
}

MyPaint(hdc);

return TRUE;
}

//气泡排序
void BubSort(int n)
{
int i,j;
bool f;
dragon tmp;

for(i=0;i {
f = false;
for(j=0;j {
if(dra[j+1].y < dra[j].y)
{
tmp = dra[j+1];
dra[j+1] = dra[j];
dra[j] = tmp;
f = true;
}
}
if(!f)
break;
}
}

//****自定义绘图函数*********************************
// 1.对窗口中跑动的恐龙进行排序贴图
// 2.恐龙贴图坐标修正
void MyPaint(HDC hdc)
{
int w,h,i;

if(picNum == 8)
picNum = 0;

//在mdc中先贴上背景图
SelectObject(bufdc,bg);
BitBlt(mdc,0,0,640,480,bufdc,0,0,SRCCOPY);

BubSort(draNum); //贴上恐龙图之前调用BubSort()函数进行排序


//下面这个for循环,按照目前恐龙的移动方向dra[i].dir,选取对应的位图到bufdc中,并设定截切的大小。每一张要在窗口上出现的恐龙图案依次先在mdc上进行透明贴图的操作。
for(i=0;i {
SelectObject(bufdc,draPic[dra[i].dir]);
switch(dra[i].dir)
{
case 0:
w = 66;
h = 94;
break;
case 1:
w = 68;
h = 82;
break;
case 2:
w = 95;
h = 99;
break;
case 3:
w = 95;
h = 99;
break;
}
BitBlt(mdc,dra[i].x,dra[i].y,w,h,bufdc,picNum*w,h,SRCAND);
BitBlt(mdc,dra[i].x,dra[i].y,w,h,bufdc,picNum*w,0,SRCPAINT);
}

//将最后画面显示在窗口中
BitBlt(hdc,0,0,640,480,mdc,0,0,SRCCOPY);

tPre = GetTickCount(); //记录此次绘图时间
picNum++;


//下面这个for循环,决定每一只恐龙下一次的移动方向及贴图坐标
for(i=0;i {
switch(rand()%4) //随机数除以4的余数来决定下次移动方向,余数0,1,2,3分别代表上,下,左,右
{
//case 0里面的代码,按照目前的移动方向来修正因为各个方向图案尺寸不一致而产生的贴图坐标误差,加入恐龙每次移动的单位量(上,下,左,右每次20个单位)而得到下次新的贴图坐标
case 0: //上
switch(dra[i].dir)
{
case 0:
dra[i].y -= 20;
break;
case 1:
dra[i].x += 2;
dra[i].y -= 31;
break;
case 2:
dra[i].x += 14;
dra[i].y -= 20;
break;
case 3:
dra[i].x += 14;
dra[i].y -= 20;
break;
}
//在计算出新的贴图坐标之后,还需判断此新的坐标会不会使得恐龙贴图超出窗口边界,若超出,则将该方向上的坐标设定为刚好等于临界值
if(dra[i].y < 0)
dra[i].y = 0;
dra[i].dir = 0;
break;
//其他方向按照和上面相同的方法计算
case 1: //下
switch(dra[i].dir)
{
case 0:
dra[i].x -= 2;
dra[i].y += 31;
break;
case 1:
dra[i].y += 20;
break;
case 2:
dra[i].x += 15;
dra[i].y += 29;
break;
case 3:
dra[i].x += 15;
dra[i].y += 29;
break;
}

if(dra[i].y > 370)
dra[i].y = 370;
dra[i].dir = 1;
break;
case 2: //左
switch(dra[i].dir)
{
case 0:
dra[i].x -= 34;
break;
case 1:
dra[i].x -= 34;
dra[i].y -= 9;
break;
case 2:
dra[i].x -= 20;
break;
case 3:
dra[i].x -= 20;
break;
}
if(dra[i].x < 0)
dra[i].x = 0;
dra[i].dir = 2;
break;
case 3: //右
switch(dra[i].dir)
{
case 0:
dra[i].x += 6;
br

首页 上一页 3 4 5 6 下一页 尾页 6/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇(Visual C++)游戏开发笔记之八.. 下一篇(Visual C++)游戏开发笔记之十..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: