小怪的显示问题.
蘑菇兵和火圈处于同一个数组,很简单.
函数: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