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

 

由于再过几个小时就要回家了,所以一次把这个东西都搞出来,这样好回家,暑假快乐啦

第四步:把我们的敌人加载进来:

还是在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但我已经比较知足,也算是我的一番心血~~

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
matlab版星之咏叹类似雷电的纵版射击游戏-StellariaTechDemoB20120924.rar 本帖最后由 stellari 于 2012-9-25 15:24 编辑 本人近来无事,业余写得一款射击游戏。 从画面到游戏风格都是有意识模仿《雷电》的, 但是由于水平和素材的限制,最后成品不是很像,请谅解。 中上配置的电脑应该都能流畅运行,我的联想G460本上在某些敌机过多的场景会略卡。 * 本游戏以“纯”MATLAB写成:不需任何工具包,没有使用任何其他语言* 安装方法: --------- 1. 普通版本 解压附件中的 StellariaTechDemoB20120924.rar 压缩包, 将得到的所有文件放在一个文件夹中(比如该文件夹叫做StellariaTechDemo)即可。 (可以将该文件夹和其子文件夹添加至路径列表中,但这步现在不是必需的了。 2. App版本(仅适用于MATLAB R2012b): 解压附件中的 Stellaria Demo App 1.4.0.rar 在MATLAB主窗口的顶部的选项卡中选择Apps 然后点工具条栏左侧的Install App,在弹出的窗口中选择刚才解压出的文件即可。 运行方法: --------- 普通版本:运行StellariaTechDemo文件夹中的stl_StellariaMain App版本:在Apps面板中的Apps栏内选择Stellaria Demo即可 操作方法: --------- 1P: WSAD - 方向, u - 子弹, i - 炸弹 2P: 方向键 - 方向, insert - 子弹, delete - 炸弹 p - 暂停游戏 1,2 - 1P或2P开始游戏。 更新日志 ----------- 2012\09\25   * 删除了冗余的音乐素材文件 2012\09\24   * 加入App版本(仅R2012b下可用) 2012\09\10   * 现在不需要用户手动添加子目录了,解压后直接运行stl_StellariaMain即可。   * 现在在标题画面和结尾画面时可以直接关闭窗口,不会报错。   * 在游戏中试图关闭窗口,游戏会暂停并提示用户确认退出。若选No(默认)的话游戏会继续进行。 已确认的Bug: --------- 1. MATLAB2010b之前的用户可能会遇到下列错误(已修正): ??? Undefined function or method 'plus' for input arguments of type 'uint64'. Error in ==> stl_StellariaMain at 221                   stageStartTime = stageStartTime pauseElapsedTime.* timer2sec; 解决方案: 将stl_StellariaMain中的221行改为: stageStartTime = uint64 pauseElapsedTime.*timer2sec); 2. 如果遇到下列错误(已修正): ??? Error using ==> eval   Undefined function or variable 'stl_STAGE_TitleScreen'. Error in ==> stl_StellariaMain at 118   bkgMusicPlayer = eval; 请将stl_StellariaMain所在的目录和该目录的所有子目录添加到MATLAB搜索路径中去即可。 --- 用户报告的Bug -- 1. 暂停一段时间后再恢复游戏,在短时间内游戏速度会变得飞快,就像是要赶上刚才暂停时落下的进度一样。    解决方案:未知。 2. 某些文字是倒着的。    解决方案:未知 3. 按1\2键无法开始游戏。    解决方案:请确认中文输入已关闭(感谢会员rihkddd指出);且必须按键盘左上角的1,2键才能进入游戏,按小键盘中的数字键无效。 -- 如有任何问题请跟帖。 谢谢!
matlab版星之咏叹类似雷电的纵版射击游戏-Stellaria Demo App 1.4.0.rar 本帖最后由 stellari 于 2012-9-25 15:24 编辑 本人近来无事,业余写得一款射击游戏。 从画面到游戏风格都是有意识模仿《雷电》的, 但是由于水平和素材的限制,最后成品不是很像,请谅解。 中上配置的电脑应该都能流畅运行,我的联想G460本上在某些敌机过多的场景会略卡。 * 本游戏以“纯”MATLAB写成:不需任何工具包,没有使用任何其他语言* 安装方法: --------- 1. 普通版本 解压附件中的 StellariaTechDemoB20120924.rar 压缩包, 将得到的所有文件放在一个文件夹中(比如该文件夹叫做StellariaTechDemo)即可。 (可以将该文件夹和其子文件夹添加至路径列表中,但这步现在不是必需的了。 2. App版本(仅适用于MATLAB R2012b): 解压附件中的 Stellaria Demo App 1.4.0.rar 在MATLAB主窗口的顶部的选项卡中选择Apps 然后点工具条栏左侧的Install App,在弹出的窗口中选择刚才解压出的文件即可。 运行方法: --------- 普通版本:运行StellariaTechDemo文件夹中的stl_StellariaMain App版本:在Apps面板中的Apps栏内选择Stellaria Demo即可 操作方法: --------- 1P: WSAD - 方向, u - 子弹, i - 炸弹 2P: 方向键 - 方向, insert - 子弹, delete - 炸弹 p - 暂停游戏 1,2 - 1P或2P开始游戏。 更新日志 ----------- 2012\09\25   * 删除了冗余的音乐素材文件 2012\09\24   * 加入App版本(仅R2012b下可用) 2012\09\10   * 现在不需要用户手动添加子目录了,解压后直接运行stl_StellariaMain即可。   * 现在在标题画面和结尾画面时可以直接关闭窗口,不会报错。   * 在游戏中试图关闭窗口,游戏会暂停并提示用户确认退出。若选No(默认)的话游戏会继续进行。 已确认的Bug: --------- 1. MATLAB2010b之前的用户可能会遇到下列错误(已修正): ??? Undefined function or method 'plus' for input arguments of type 'uint64'. Error in ==> stl_StellariaMain at 221                   stageStartTime = stageStartTime pauseElapsedTime.* timer2sec; 解决方案: 将stl_StellariaMain中的221行改为: stageStartTime = uint64 pauseElapsedTime.*timer2sec); 2. 如果遇到下列错误(已修正): ??? Error using ==> eval   Undefined function or variable 'stl_STAGE_TitleScreen'. Error in ==> stl_StellariaMain at 118   bkgMusicPlayer = eval; 请将stl_StellariaMain所在的目录和该目录的所有子目录添加到MATLAB搜索路径中去即可。 --- 用户报告的Bug -- 1. 暂停一段时间后再恢复游戏,在短时间内游戏速度会变得飞快,就像是要赶上刚才暂停时落下的进度一样。    解决方案:未知。 2. 某些文字是倒着的。    解决方案:未知 3. 按1\2键无法开始游戏。    解决方案:请确认中文输入已关闭(感谢会员rihkddd指出);且必须按键盘左上角的1,2键才能进入游戏,按小键盘中的数字键无效。 -- 如有任何问题请跟帖。 谢谢!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值