射击游戏终极篇(不知道怎么贴代码)
来源:互联网 发布:mac密码正确但无法进入 编辑:程序博客网 时间:2024/04/29 22:06
由于再过几个小时就要回家了,所以一次把这个东西都搞出来,这样好回家,暑假快乐啦
第四步:把我们的敌人加载进来:
还是在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但我已经比较知足,也算是我的一番心血~~
- 射击游戏终极篇(不知道怎么贴代码)
- ios射击类游戏简单代码射击
- 下好了代码不知道怎么用
- 【转】FPS射击游戏准星抖动代码
- 纵轴射击游戏---(1)
- 不知道怎么了???
- 不知道怎么
- 不知道怎么写
- 射击游戏
- 射击游戏
- 射击游戏
- 自制游戏(一) 飞行射击游戏
- 原创射击游戏《重组3D Ⅱ:无限》(附代码)
- Unity3D游戏开发-模仿项目一 第一人称角色射击(有源代码)
- 从论坛上看到一个高手的java 代码回贴 不知道怎么收藏只好 复制过来写个博客了 (注明出处)
- Java版星球大战游戏(横向射击)
- 射击游戏(OpenGL/C++/win32 SDK)
- unity3d 射击游戏(二)--添加敌人
- 用CSS+DIV时width的问题
- datagridviwe的简单总结
- H3C路由器常用命令----更新中
- 哈希(Hash)与加密(Encrypt)的基本原理、区别及工程应用
- gridview的一些操作
- 射击游戏终极篇(不知道怎么贴代码)
- 关于utl_file的初步使用
- 高人的blog
- 大小端转换的例子
- jsp下载文件的实现方法及注意事项
- 【Linux设备驱动程序(第三版)】----阻塞与非阻塞型操作
- 英文系统下传输中文字符的问题!
- 深入理解Android消息处理系统——Looper、Handler、Thread
- C# graphic 的DrawLines 与DrawPath 加粗时线出现分叉现象的解决