command()函数说明
void command(role* p1, role* p2) {
BeginBatchDraw();
draw_fight(p1, p2);//画战斗背景,如血量变化、背景图,人物头像
/*action说明
* switch(action)
* case 1:跳跃; case 2:拳击;
* case 3:腿击; case 4:技能1;
* case 5:技能2; case 6:技能3;
* case 7:移动; case 8:防御;
* case 0:站立; case 9:被打
*/
//使P1的各操作异步,使P2的各操作异步
//P1操作
if (GetAsyncKeyState('S') & 0x8000 && (p1->action == 8 || p1->action == 0))
{
p1->action = 8;
p1->Defend(p2);
}
else if (!(GetAsyncKeyState('S') & 0x8000) && p1->action == 8)
p1->action = 0;
//挨打状态
if (p1->action == 9) {
p1->Beaten(p2);
if (p1->count_beaten != 0)
p1->action = 9;
else
p1->action = 0;
}
//进入跳跃状态 优先让跳跃完成 coun_jump==0时完成
if ((GetAsyncKeyState('W') & 0x8000 && p1->action == 0) || p1->action == 1) {
p1->Jump(p2);
if (p1->count_jump != 0)
p1->action = 1;
else
p1->action = 0;
}
//如果不在跳跃状态则允许进入攻击或释放技能状态
if (GetAsyncKeyState('J') & 0x8000 && p1->action == 0 || p1->action == 2) {
p1->fistAttack(p2);
if (p1->count_fist != 0)
p1->action = 2;
else
p1->action = 0;
}
if (GetAsyncKeyState('K') & 0x8000 && p1->action == 0 || p1->action == 3) {
p1->legAttack(p2);
if (p1->count_leg != 0)
p1->action = 3;
else
p1->action = 0;
}
//技能必须完全释放
if (GetAsyncKeyState('U') & 0x8000 && p1->action == 0 || p1->action == 4) {
p1->skill_I(p2);
if (p1->count_skill1 != 0)
p1->action = 4;
else
p1->action = 0;
}
if (GetAsyncKeyState('I') & 0x8000 && p1->action == 0 || p1->action == 5) {
p1->skill_II(p2);
if (p1->count_skill2 != 0)
p1->action = 5;
else
p1->action = 0;
}
if (GetAsyncKeyState('O') & 0x8000 && p1->action == 0 || p1->action == 6) {
p1->skill_III(p2);
if (p1->count_skill3 != 0)
p1->action = 6;
else
p1->action = 0;
}
//如果不在跳跃或攻击施法状态 则可以移动
if (GetAsyncKeyState('A') & 0x8000 && (p1->action == 0 || p1->action == 7)) {
p1->LeftMove(p2);
p1->action = 7;
}
if (GetAsyncKeyState('D') & 0x8000 && (p1->action == 0 || p1->action == 7)) {
p1->RightMove(p2);
p1->action = 7;
}
if (p1->action == 0) {
p1->Stand(p2);
}
else if (p1->action == 7)
p1->action = 0;
}
进入游戏界面,command()函数会对玩家的输入结合角色当前状态进行下一步动作的判断。
以P1的操作为例,最开始判断若角色在站立(0)状态下,则收到输入S,可进入防御状态(8),若当前状态已为防御状态则继续保持。
如果在本次判断中没有收到S键,则终止防御状态。
只要在P2的成员函数里改变了P1的action为挨打(9)状态,P1立即进入挨打(9)状态。
跳跃状态优先于技能和普攻,如果在跳跃状态(1)收到W输入或跳跃动作未完成则继续跳跃动作的贴图。
攻击和技能释放的优先级较低,仅高于移动、站立状态。
攻击和技能要求一次将整个动作贴图完成,利用相应的count变量记录贴图是否完成,如果未完成则保持当前攻击或技能状态,继续动作的贴图。
上述判断做完之后,再对移动按键进行判断,如果有A或D输入则进入移动状态(7),移动状态不会完成整个移动动画,必须持续按键才能连续移动,因为在判断最后如果处于移动状态会被转到站立状态(0),只有下一次输为A或D才能极快的刷新掉站立状态,从而使得移动动画连贯。