virtual void onKeyPressed(cocos2d::EventKeyboard::KeyCode keyCode,cocos2d::Event* event); virtual void onKeyReleased(cocos2d::EventKeyboard::KeyCode keyCode,cocos2d::Event* event);@H_404_0@加入重力感应事件,需要重写方法:
virtual void onAcceleration(cocos2d::Acceleration* acc,cocos2d::Event* unused_event);@H_404_0@加入触摸屏事件,需要重写方法:
virtual bool onTouchBegan(cocos2d::Touch *touch,cocos2d::Event *unused_event); virtual void onTouchMoved(cocos2d::Touch *touch,cocos2d::Event *unused_event); virtual void onTouchEnded(cocos2d::Touch *touch,cocos2d::Event *unused_event); virtual void onTouchCancelled(cocos2d::Touch *touch,cocos2d::Event *unused_event);
@H_404_0@很显然,一个是按键点击方法,一个是按键释放方法。其中的KeyCode就是被按的那个键的编码可以在EventKeyboard::KeyCode类中找到键盘上每个键的定义。 @H_404_0@这里的方法中,我是在键盘按下后,给方块一个左右(x)方向的速度,而在送开时,将速度置为0。如下: @H_404_0@
if(keyCode == EventKeyboard::KeyCode::KEY_A || keyCode == EventKeyboard::KeyCode::KEY_LEFT_ARROW) { //点击A或←按键事件 currentBlock->getPhysicsBody()->setVelocity(Vec2(-60.0f,currentBlock->getPhysicsBody()->getVelocity().y)); } else if(keyCode == EventKeyboard::KeyCode::KEY_W || keyCode == EventKeyboard::KeyCode::KEY_UP_ARROW) { currentBlock->getPhysicsBody()->setAngularVelocity(-5.0f); isRotating = true; }@H_404_0@如上是按下按下向左按钮的事件。用setVelocity设置速度,y方向用它自己的速度,x方向设为60。 @H_404_0@然后就是按向上的按钮将有旋转事件:
else if(keyCode == EventKeyboard::KeyCode::KEY_W || keyCode == EventKeyboard::KeyCode::KEY_UP_ARROW) { currentBlock->getPhysicsBody()->setAngularVelocity(-5.0f); isRotating = true; }@H_404_0@用setAngularVelocoty设置其角速度。 @H_404_0@紧接着,便是在按钮点击释放事件中将这些力恢复:
void GameView::onKeyReleased(EventKeyboard::KeyCode keyCode,Event* event) { currentBlock->getPhysicsBody()->setVelocity(Vec2(0,(isAccelerate && currentBlock->getPhysicsBody()->getVelocity().y < -50.0f) ?currentBlock->getPhysicsBody()->getVelocity().y + 50.0f:currentBlock->getPhysicsBody()->getVelocity().y)); currentBlock->getPhysicsBody()->setAngularVelocity((isRotating && currentBlock->getPhysicsBody()->getAngularVelocity() <= -5.0f) ?currentBlock->getPhysicsBody()->getAngularVelocity() + 5.0f : currentBlock->getPhysicsBody()->getAngularVelocity()); isAccelerate = false; isRotating = false; }@H_404_0@里面那两行代码,分别是恢复左右移动和旋转的方法。 @H_404_0@对于加入重力感应事件,主要是其参数Accelerationacc,通过这个可以判断手机旋转的方向。他有四个变量x、y、z、timestamp。其中x,y,z很容易想象,当我们手中平端着手机时,平面上是x轴和y轴,垂直方向是z轴。 @H_404_0@这里,用z轴可以判断手机是朝上还是朝下(躺着玩手机)。用x轴判断重力的左右偏移。代码如下:
void GameView::onAcceleration(Acceleration* acc,Event* unused_event) { if(acc->x < -0.2f && fabs(currentBlock->getPhysicsBody()->getVelocity().x) > -15.0f ) { if(acc->z < 0) { currentBlock->getPhysicsBody()->setVelocity(Vec2(-50.0f,currentBlock->getPhysicsBody()->getVelocity().y)); } else { currentBlock->getPhysicsBody()->setVelocity(Vec2(50.0f,currentBlock->getPhysicsBody()->getVelocity().y)); } } else if(acc->x > 0.2f && currentBlock->getPhysicsBody()->getVelocity().x < 15.0f) { if(acc->z < 0) { currentBlock->getPhysicsBody()->setVelocity(Vec2(50.0f,currentBlock->getPhysicsBody()->getVelocity().y)); } else { currentBlock->getPhysicsBody()->setVelocity(Vec2(-50.0f,currentBlock->getPhysicsBody()->getVelocity().y)); } } }
@H_404_0@最后说触摸屏事件,这里重写的一共有四个,onTouchBegan是触摸事件开始,onTouchMoved是触摸移动,onTouchEnded是触摸事件结束。onTouchChancelled,这个,我也不太清楚,网上查了一下,我的理解是,既然是取消,和结束差不多,但你主动取消了,不就是结束。所以,这个可能是被动取消了吧,比如来了个电话什么的。不去深究他了先。 @H_404_0@其实可以想象,点击旋转就是一个按钮事件,所以只需要点击开始和点击结束就可以。 @H_404_0@因此,有如下代码:
bool GameView::onTouchBegan(cocos2d::Touch *touch,cocos2d::Event *unused_event) { currentBlock->getPhysicsBody()->setAngularVelocity(-5.0f); isRotating = true; return true; }@H_404_0@触摸开始时,设置其旋转速度,并且将标识置为true。 @H_404_0@然后,触摸结束时:
void GameView::onTouchEnded(cocos2d::Touch *touch,cocos2d::Event *unused_event) { currentBlock->getPhysicsBody()->setAngularVelocity((isRotating && currentBlock->getPhysicsBody()->getAngularVelocity() <= -5.0f) ?currentBlock->getPhysicsBody()->getAngularVelocity() + 5.0f : currentBlock->getPhysicsBody()->getAngularVelocity()); isRotating = false; }@H_404_0@根据标识旋转速度回复。
关于制作游戏相关其他博客的目录,我放在 利用Cocos2dx3.2制作重力版俄罗斯方块(Crazy Tetris) 原文链接:https://www.f2er.com/cocos2dx/344934.html