cocos2d x游戏开发系列教程 坦克大战游戏之虚拟手柄控制坦克移动
程序员文章站
2024-02-19 23:49:24
...
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
上篇显示了控制手柄,但是还不能用来控制坦克,
这篇将会讲手柄和坦克的移动结合起来。
1.先在CityScene场景中实现场景的虚函数virtual void onEnter();
onEnter在进入场景后将会被调用,我们在onEnter中设置一个定时器,
游戏每一帧都调用次,这样我们可以在每帧中检测手柄按钮是否被按下,
然后控制坦克的移动,onEnter和update的函数实现如下:
void CityScene::onEnter(){ CCLayer::onEnter(); this->scheduleUpdate();}void CityScene::update(float delta){ CCLayer::update(delta); //简单的向前运动,测试使用 mPlayerTank[0]->setPositionY(mPlayerTank[0]->getPositionY()+1);}
在上面的update函数中,我们为了测试效果,简单的让坦克向前移动。
2.为了能通过控制手柄产生的命令控制坦克移动,我们在Tank类中添加相应命令函数
void command(enumOrder order);,实现函数如下:
void Tank::command(enumOrder order){ float stepX = 0.0f; float stepY = 0.0f; switch (order) { case cmdNothing: break; case cmdGoUP: stepY = 1.0f; break; case cmdGoDown: stepY = -1.0f; break; case cmdGoLeft: stepX = -1.0f; break; case cmdGoRight: stepX = 1.0f; break; case cmdFire: break; default: break; } setPositionX(getPositionX() + stepX); setPositionY(getPositionY() + stepY);}
4.我们接下来要使坦克响应虚拟手柄的控制,还需要修改第一步中的update。
在update中获取虚拟手柄的命令,然后传入Tank的命令控制函数command中:
void CityScene::update(float delta){ CCLayer::update(delta); //将控制面板中的mLayerPanel获取的命令传给坦克 mPlayerTank[0]->command(mLayerPanel->getOrder());}
5.我们尝试点击虚拟手柄,可以看到坦克已经可以*移动了,但是移动的时候坦克方向没有改变,
我们根据移动方向来旋转坦克,使用setRotation,具体实现如下:
void Tank::command(enumOrder order){ float stepX = 0.0f; float stepY = 0.0f; static float fRotation = 0.0f; switch (order) { case cmdNothing: break; case cmdGoUP: stepY = 1.0f; fRotation = 0.0f; break; case cmdGoDown: stepY = -1.0f; fRotation = 180.0f; break; case cmdGoLeft: stepX = -1.0f; fRotation = 270.0f; break; case cmdGoRight: stepX = 1.0f; fRotation = 90.0f; break; case cmdFire: break; default: break; } setPositionX(getPositionX() + stepX); setPositionY(getPositionY() + stepY); setRotation(fRotation);}
下面用我们的鼠标来控制上下左右可以正常移动了。效果如下: