提示信息,是玩家得到的反馈。比如,碰到金币,金币消失,此时就要显示“+10”;攻击小怪,小怪却没有消失,这时要显示血条,告知玩家小怪的生命值。下面讲提示信息。
金币提示:
+10的字样,并没有用文字处理,而是用图片(4帧的动画)。这样,实现起来很简单,和爆炸效果用同一个数组存储,处理方法相同。
金币的碰撞检测函数:int GAMEMAP::CheckAni(int itimeclip)
代码:
for(i=0;i<iCoinNum;i++)
{
//判断玩家是否碰到金币
switch(MapCoinArray[i].id)
{
case ID_ANI_COIN:
//碰到金币
iMoney+=10;
//金币消失,显示+10字样
ClearCoin(i);
break;
金币消失函数:void GAMEMAP::ClearCoin(int i)
代码:
switch(MapCoinArray[i].id)
{
case ID_ANI_COIN:
//碰到了金币,显示+10字样. 和爆炸效果的处理一样, 只是图片id不同
BombArray[iBombNum].show=1;
BombArray[iBombNum].id=ID_ANI_COIN_SCORE;
BombArray[iBombNum].iframe=0;
BombArray[iBombNum].x=MapCoinArray[i].x-COIN_XOFF;
BombArray[iBombNum].y=MapCoinArray[i].y-COIN_YOFF;
iBombNum=(iBombNum+1)%MAX_MAP_OBJECT;
break;
}
攻击提示:需要给出攻击对象名称,血条。
存储:
//攻击对象提示
char AttackName[20];//攻击对象名称
int iAttackLife;//攻击对象当前生命值
int iAttackMaxLife;//攻击对象最大生命值
提示信息设置:在小怪被攻击的时候,设置提示信息。
函数:void GAMEMAP::ClearEnemy(int i)
代码:
//设置攻击对象生命值
iAttackLife=MapEnemyArray[i].health;
switch(MapEnemyArray[i].id)
{
case ID_ANI_BOSS_HOUSE:
//设置名称
strcpy(AttackName,"普通级火圈");
//设置最大生命值
iAttackMaxLife=BOSS_HEALTH;
其他攻击对象处理相似。
显示:
函数: void GAMEMAP::ShowOther(HDC h)
代码:
//如果攻击对象生命值不为0, 显示提示信息
if(iAttackLife)
{
//输出名称
TextOut(h,viewx+ATTACK_TO_TEXT_X,
ATTACK_TO_TEXT_Y,AttackName,strlen(AttackName));
//显示血条
xstart=viewx+ATTACK_TO_X-iAttackMaxLife*10;
//按最大生命值显示一个矩形, 作为背景
bmMap.DrawItemNoMaskWidth(xstart-1, ATTACK_TO_Y-1,ID_MAP_HEALTH_BK,
iAttackMaxLife*BMP_WIDTH_HEALTH, 0);
//按当前生命值对应的宽度, 显示一个红色矩形
bmMap.DrawItemNoMaskWidth(xstart, ATTACK_TO_Y,ID_MAP_HEALTH,
iAttackLife*BMP_WIDTH_HEALTH, 0);
}
提示信息功能完成。
金钱数量显示:和攻击提示位于同一个函数void GAMEMAP::ShowOther(HDC h)
代码:
sprintf(temp,"MONEY: %d",iMoney);
TextOut(h,viewx+20,20,temp,strlen(temp));
至此,攻击系统(子弹、旋风、蘑菇兵,火圈),金币(金币,金钱数量),提示信息(金币提示,攻击提示),这几类元素都介绍过了,还有一个,武器切换,就是从魂斗罗里抠来的那个东西,且听下回分解。
附:
超级玛丽第一版源码链接:http://download.csdn.net/source/497676
超级玛丽增强版源码链接:http://download.csdn.net/source/584350