Cocos2dx3.2 Crazy Tetris 游戏输入(键盘事件,重力事件,触摸屏事件)

游戏控制方案
本文介绍了一款游戏中的控制方案实现,包括使用键盘控制方块左右移动和旋转,利用重力感应控制移动方向,以及通过触摸屏触发旋转动作。详细展示了如何在Cocos2d-x中实现这些交互。

http://demo.netfoucs.com/m294955408/article/details/42672787

游戏基本的逻辑功能之前已经完成,之后的问题就是如何去控制游戏中的方块。在电脑上,很显然就是使用键盘最为直接,而在手机上,考虑上要让操作方便,这里采用的是用重力感应控制左右移动,点击屏幕进行方块的旋转。

下面,就是加入这些事件的方法:

加入键盘事件,需要重写方法:

  1. virtual void onKeyPressed(cocos2d::EventKeyboard::KeyCode keyCode, cocos2d::Event* event);virtual void onKeyReleased(cocos2d::EventKeyboard::KeyCode keyCode, cocos2d::Event* event);  

加入重力感应事件,需要重写方法:

  1. virtual void onAcceleration(cocos2d::Acceleration* acc, cocos2d::Event* unused_event);  

加入触摸屏事件,需要重写方法:

  1. 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);  

很显然,一个是按键点击方法,一个是按键释放方法。其中的KeyCode就是被按的那个键的编码可以在EventKeyboard::KeyCode类中找到键盘上每个键的定义。

这里的方法中,我是在键盘按下后,给方块一个左右(x)方向的速度,而在送开时,将速度置为0。如下:

  1. 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;}  

如上是按下按下向左按钮的事件。用setVelocity设置速度,y方向用它自己的速度,x方向设为60

然后就是按向上的按钮将有旋转事件:

  1. else if(keyCode == EventKeyboard::KeyCode::KEY_W || keyCode == EventKeyboard::KeyCode::KEY_UP_ARROW){   currentBlock->getPhysicsBody()->setAngularVelocity(-5.0f);    isRotating = true;}  

setAngularVelocoty设置其角速度。

紧接着,便是在按钮点击释放事件中将这些力恢复:

  1. 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;}  

里面那两行代码,分别是恢复左右移动和旋转的方法。

对于加入重力感应事件,主要是其参数Acceleration acc,通过这个可以判断手机旋转的方向。他有四个变量xyztimestamp。其中xyz很容易想象,当我们手中平端着手机时,平面上是x轴和y轴,垂直方向是z轴。

这里,用z轴可以判断手机是朝上还是朝下(躺着玩手机)。用x轴判断重力的左右偏移。代码如下:

  1. 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));     }   }}  

最后说触摸屏事件,这里重写的一共有四个,onTouchBegan是触摸事件开始,onTouchMoved是触摸移动,onTouchEnded是触摸事件结束。onTouchChancelled,这个,我也不太清楚,网上查了一下,我的理解是,既然是取消,和结束差不多,但你主动取消了,不就是结束。所以,这个可能是被动取消了吧,比如来了个电话什么的。不去深究他了先。

其实可以想象,点击旋转就是一个按钮事件,所以只需要点击开始和点击结束就可以。

因此,有如下代码:

  1. bool GameView::onTouchBegan(cocos2d::Touch *touch, cocos2d::Event *unused_event){   currentBlock->getPhysicsBody()->setAngularVelocity(-5.0f);    isRotating = true;  return true;}  

触摸开始时,设置其旋转速度,并且将标识置为true

然后,触摸结束时:

  1. 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;}  

根据标识旋转速度回复。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值