超级玛丽制作揭秘13小怪和火圈,模板

本文详细介绍了游戏开发中敌人类元素的具体实现方法,包括显示处理、帧刷新与运动控制、碰撞检测及火圈产生蘑菇兵的过程。通过具体代码示例展示了如何使敌人在屏幕上移动并响应碰撞。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 小怪的显示问题.
蘑菇兵和火圈处于同一个数组,很简单.
函数:void GAMEMAP::ShowAniObj(MYANIOBJ & bmobj)
代码:
 //显示敌人
 for(i=0;i<MAX_MAP_OBJECT;i++)
 {
  if (MapEnemyArray[i].show)
  {
   bmobj.DrawItem(MapEnemyArray[i].x,MapEnemyArray[i].y,
    MapEnemyArray[i].id,MapEnemyArray[i].iframe); 
  }
 }
同样,如同图片处理所讲,显示一个图片,只需要坐标,id,帧.

帧刷新和小怪运动.
函数:void GAMEMAP::ChangeFrame(int itimeclip)
代码:
 //移动时间:每隔一段时间ENEMY_SPEED,移动一下
 if(0 == itimeclip% ENEMY_SPEED)
 {
  for(i=0;i<MAX_MAP_OBJECT;i++)
  {
   //如果小怪可见
   if(MapEnemyArray[i].show)
   {
    //帧刷新
    MapEnemyArray[i].iframe=(MapEnemyArray[i].iframe+1)%MapEnemyArray[i].iframemax;
    
    switch(MapEnemyArray[i].id)
    {
    case ID_ANI_ENEMY_NORMAL:
    case ID_ANI_ENEMY_SWORD:
     //蘑菇兵移动(士兵,刺客)
     MapEnemyArray[i].x+=MapEnemyArray[i].movex;
     
     //控制敌人移动:向左移动到左边界后,移动速度movex改为向右。移动到右边界后,改为向左。
     if(MapEnemyArray[i].movex<0)
     {
      if(MapEnemyArray[i].x<=MapEnemyArray[i].xleft)
      {
       MapEnemyArray[i].movex=ENEMY_STEP_X;      
      }
     }
     else
     {
      if(MapEnemyArray[i].x>=MapEnemyArray[i].xright)
      {
       MapEnemyArray[i].movex=-ENEMY_STEP_X;    
      }
     }
     break;
    }
至此,所有小怪不停移动。(火圈的movex为0,不会移动)

碰撞检测和消失。
在前面的子弹、旋风的碰撞处理中已讲过。碰撞后,生命值减少,减为0后,消失。

火圈.
火圈会产生新的蘑菇兵,怎样实现的呢?思路:不断地检测火圈是否出现在屏幕中,出现后,生成蘑菇兵。
函数:int GAMEMAP::CheckAni(int itimeclip)
代码部分:
 //如果在显示范围之内,则设置显示属性
 for(i=0;i<MAX_MAP_OBJECT;i++)
 {
  //判断是否在屏幕范围内
  if ( IN_AREA(MapEnemyArray[i].x, viewx, VIEWW) )
  {
   //如果有生命值,设置为可见
   if(MapEnemyArray[i].health)
   {
    MapEnemyArray[i].show=1;

    switch(MapEnemyArray[i].id)
    {
    //普通级火圈
    case ID_ANI_BOSS_HOUSE:
     //每隔一段时间, 产生新的敌人
     if(itimeclip == TIME_CREATE_ENEMY)
     {
      MapEnemyArray[iMapEnemyCursor]=gl_enemy_normal;
      MapEnemyArray[iMapEnemyCursor].x=MapEnemyArray[i].x;
      MapEnemyArray[iMapEnemyCursor].y=MapEnemyArray[i].y+32;

      //移动游标
      iMapEnemyCursor=(iMapEnemyCursor+1)%BOSS_CURSOR;     
     }
     break;
     //下面是战斗级火圈,处理相似
    }
   }
  }
  else
  {
   //不在显示范围内,设置为不可见
   MapEnemyArray[i].show=0;
  }  
 }
这样,火圈就不断地产生蘑菇兵.

再说一下模板.
这里的模板不是c++的模板.据说template技术已发展到艺术的境界.游戏中用到的和template无关,而是全局变量.如下:
//普通蘑菇兵
struct ROLE gl_enemy_normal=
{
 0,
 0,
 32,
 32,
 ID_ANI_ENEMY_NORMAL,
 0,
 2,
 0,
 0,
 -ENEMY_STEP_X,//speed
 1,
 1
};
当火圈不断产生新的蘑菇兵时,直接把这个小怪模板放到数组中,再修改一下坐标即可.(对于蘑菇刺客,还要修改id和生命值)
游戏的主要逻辑完成.此外,还有金币,爆炸效果等其他动态元素,它们是怎么实现的?且听下回分解。
附:
超级玛丽第一版源码链接:http://download.youkuaiyun.com/source/497676
超级玛丽增强版源码链接:http://download.youkuaiyun.com/source/584350

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值