您的位置:首页 > 编程语言

射击游戏终极篇(不知道怎么贴代码)

2011-07-08 09:55 537 查看
由于再过几个小时就要回家了,所以一次把这个东西都搞出来,这样好回家,暑假快乐啦
第四步:把我们的敌人加载进来:
还是在GETPIC()方法中
if(i==1) //读入并显示敌人的图片;
{
for(int i=0;i<5;i++)
{
sprintf(name,"%sCondor0%d.bmp",StaticDir,enemy[i].p);
if(!AddPic(name)) return FALSE;
//AfxMessageBox(name);
enemy[i].p++;
if(enemy[i].p>=enemy[i].m1) enemy[i].p=enemy[i].m0;
SelectObject(MEMDC,bitmap);
if(enemy[i].x0<=Star.x0) //要实现在英雄左边则头向左,在右边则头向右边;
{ if(abs(enemy[i].x0-Star.x0)<=4) enemy[i].x0=Star.x0;
enemy[i].x0+=5;
}
else
{
if(abs(enemy[i].x0-Star.x0)<=4) enemy[i].x0=Star.x0;
enemy[i].x0-=5;
}
enemy[i].y0+=4;
if(enemy[i].y0>=512)
{
enemy[i].x1=enemy[i].x0;
enemy[i].y1=enemy[i].y0;
Remove(i);
}
TransparentBlt2(BKDC0,enemy[i].x0,enemy[i].y0,enemy[i].w,enemy[i].h,MEMDC,0,0,enemy[i].w,enemy[i].h,RGB(0,255,0));

}
}
到这里,我们的场景布置就完毕了:接下来为他们添加行为:回忆一下,英雄是可以自由移动的 在这里我采用了PreTranslateMessage(MSG* pMsg)消息来截取键盘消息并处理
if(pMsg->message==WM_KEYDOWN)
{
switch(pMsg->wParam)
{case 38: //up
m_Game.Star.y0-=8;
if(m_Game.Star.y0<=0) m_Game.Star.y0=0;
break;
case 40: //down
m_Game.Star.y0+=8;
if(m_Game.Star.y0>=444) m_Game.Star.y0=444;
break;
case 37: //left
if(m_Game.Star.x0<=0) m_Game.Star.x0=0;
m_Game.Star.x0-=8;
break;
case 39: //right
m_Game.Star.x0+=8;
if(m_Game.Star.x0>=454) m_Game.Star.x0=454;
break;
default:
break;
}
if(pMsg->wParam=='X')
{
//AfxMessageBox("SPACE IS PRESSED");
m_Game.Create_Bullet();
}
}
实现了下面的效果:
接下来英雄还要会发射火球,也在PreTranslateMessage(MSG* pMsg)进行出来,按下X键就会触发m_Game.Create_Bullet();来刷新子弹数组
然后再调用void CGame::MoveBullet()来让我们的子弹进行移动
当然子弹不可能无限多(内存考虑)
所以当子弹超出屏幕或者击中敌人时就会消失
//如果子弹超出了屏幕范围则自动移除;
if(Bullet[x].y0<=-10)
{
for(int j=x;j<=Bul_Num;j++)
Bullet[j-1]=Bullet[j];
Bul_Num--;
}
英雄的行为设计玩了,接下来设计敌人的AI,在这里敌人的AI很简单,会以英雄为目标,
不顾死活的向你冲来,如果觉得太傻了,可以建立一个类来重写我的代码就可解决
if(enemy[i].x0<=Star.x0) //要实现在英雄左边则头向左,在右边则头向右边;
if(abs(enemy[i].x0-Star.x0)<=4) enemy[i].x0=Star.x0;
enemy[i].x0+=5;
}
else
{
if(abs(enemy[i].x0-Star.x0)<=4) enemy[i].x0=Star.x0;
enemy[i].x0-=5;
}
enemy[i].y0+=4;
接下来就是碰撞检测了
这里的碰撞检测有两个判别:第一个是子弹和敌人的碰撞:两者都会同时消失而英雄的得分会增加
第二个是敌人和英雄的碰撞:敌人会消失,英雄的HP下降
首先看第一个:采用遍历的方法 ,英雄也是采用遍历的方法进行矩形检测void CGame::Collision_detection(){for(int i=0;i<5;i++) //英雄和敌人的检测。敌人碰到英雄会自动爆炸;{ if(abs((enemy[i].x0+enemy[i].w/2)-(Star.x0+Star.w/2))<abs((enemy[i].w+Star.w)/2) &&abs((enemy[i].y0+enemy[i].h/2)-(Star.y0+Star.h/2))<abs((enemy[i].h+Star.h)/2)) { enemy[i].x1=enemy[i].x0; enemy[i].y1=enemy[i].y0; Remove(i); score-=50; //minus score; Star.hp-=1; }}for(i=0;i<5;i++) //敌人和子弹的检测; 敌人和子弹都会同时消失;for(int j=0;j<Bul_Num;j++){ if(abs((enemy[i].x0+enemy[i].w/2)-(Bullet[j].x0+Bullet[j].w/2))<abs((enemy[i].w+Bullet[j].w)/2) &&abs((enemy[i].y0+enemy[i].h/2)-(Bullet[j].y0+Bullet[j].h/2))<abs((enemy[i].h+Bullet[j].h)/2)) { enemy[i].x1=enemy[i].x0; enemy[i].y1=enemy[i].y0; Remove(i); for(int x=j;x<=Bul_Num;x++) {Bullet[x-1]=Bullet[x]; //Bul_Num--; } score+=100; //plus score; }}}
然后就是进行碰撞以后的行为 敌人会原地爆炸 子弹也会消失
爆炸的代码void CGame::Decision()
{
for(int i=0;i<5;i++)
{
if(enemy[i].x1&&enemy[i].y1)
{
PlayExplo(i,enemy[i].x1,enemy[i].y1);
//AfxMessageBox("MessageBox");
if(enemy[i].p1==4)
{
enemy[i].x1=0;enemy[i].y1=0;
enemy[i].p1=enemy[i].m11;
}
}
}
} //设置爆炸的坐标,然后调用void CGame::PlayExplo(int i,int x,int y)产生爆炸动画

至此,应用这个小型引擎的纵轴飞机游戏基本实现功能了(其实为了以后的扩展,我在里面添加了很多函数,这里不多阐述可以轻松的往里面添加敌人,和切换攻击模式都是可以实现的 )
例如为了实现分层效果:我在SPRITE()里面添加了Z轴 背景为0,英雄和敌人为1,这样以后就可以往上面添加云层,而Z轴为2这样就不会产生碰撞,可以实现更多的玩法


最后,为我们的游戏添加上我们的文本显示,不然我们打生打死是为了什么?void CGame::Display(){sprintf(ShowOut,"英雄的坐标值X:%3d.Y:%3d 英雄的生命值:%2d.得分:%5d",Star.x0,Star.y0,Star.hp,score);}
到这里,一个小型的游戏引擎开发,和功能实现都已经完成了
最后再看一下我们的效果吧
撒花撒花 哈哈哈
虽然其中还有不少BUG但我已经比较知足,也算是我的一番心血~~

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: