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

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

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

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

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

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

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

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

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。如下:

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。

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

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

	isRotating = true;
}

用setAngularVelocoty设置其角速度。

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

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,通过这个可以判断手机旋转的方向。他有四个变量x、y、z、timestamp。其中x,y,z很容易想象,当我们手中平端着手机时,平面上是x轴和y轴,垂直方向是z轴。

这里,用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));
		}
	}
}

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

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

因此,有如下代码:

bool GameView::onTouchBegan(cocos2d::Touch *touch, cocos2d::Event *unused_event)
{
	currentBlock->getPhysicsBody()->setAngularVelocity(-5.0f);

	isRotating = true;

	return true;
}

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

然后,触摸结束时:

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

根据标识旋转速度回复。

关于制作游戏相关其他博客的目录,我放在利用Cocos2dx3.2制作重力版俄罗斯方块(Crazy
Tetris)

时间: 2024-07-30 08:41:18

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

Cocos2dx3.2 Crazy Tetris update 定时更新 游戏逻辑处理

现在,对于游戏的基本准备都已经做好,之后需要考虑的,就是游戏逻辑的处理,主要考虑一下几个方面: 1 判断方块是否已经落下停止,并下落新的方块: 2 方块落下后,判断是否符合消行条件,进行消行: 3 根据下落或者消行进行计分. 这些判断,需要定时处理,因此这里需要使用到默认更新的update. 在初始化中,需要调用: this->scheduleUpdate(); 如果需要停止更新,可以调用: this->unscheduleUpdate(); 这样,就可以在void update(float 

Cocos2dx3.2 Crazy Tetris 绘制不规则方块 遮罩(ClippingNode的使用)

前面已经思考了可能遇到的消除和面积判定问题,那么接下来的问题就是如何显示这些由于消除可能引出的不规则图形. 在这里,我使用了ClippingNode(遮罩).关于ClippingNode网上的介绍都非常仔细,因此我在这里只是简单的说一下: 正如他的名字一样,他本身也是一个节点,因此可以参考我的最开始的一篇关于节点树的博文,使用他时,需要将其添加到另外一个节点中. 使用时需要注意的是要向其中添加模板(stencil)和底板.Stencil的意思就是类似模具一样的东西,可以想象,如果我们将模具的形状

Cocos2dx3.2 Crazy Tetris 由于遮罩引起的部分手机白屏

上一章是说明使用ClipplingNode制作遮罩,以显示不规则图形.但是这样一直到Android端,却在部分手机中发生了问题. 具体问题表现为:白屏,只有边界(右上角)有矩形色块. 这里其实是框架对Android手机引用OennGL时,设置上没有启用stencil buff的问题. 解决方案,在onCreateView构造函数中添加: Cocos2dxGLSurfaceView glSurfaceView = new Cocos2dxGLSurfaceView(this); glSurface

哪种机械键盘更适合打游戏? 机械键盘5种常用机械轴详细介绍

哪种机械键盘更适合打游戏? 机械键盘5种常用机械轴详细介绍 机械键盘 12-08 (4)青轴 最具特点的就是青轴,青轴一般是打字员的梦想,很少用于游戏,不过是本人的最爱,特点是只有当声音响起的时候按键才被触发,因此打字的时候噼里啪啦,无论是指尖还是心理上都得到了极大满足. 但是其"机动性"打字和双击时效果并不是很好,因为触底比"触发"要高,这款特别适合输入文字,但是要注意噪音很大,但这也是我喜欢MX青轴的原因之一. (5)白轴 最后说一下白轴,目前白轴基本已经停产了

React 事件对象、键盘事件、表单事件、ref获取dom节点、react实现类似Vue双向数据绑定

1.案例实现代码 import React, { Component } from 'react'; /** * 事件对象.键盘事件.表单事件.ref获取dom节点.react实现类似Vue双向数据绑定 * 事件对象: 在触发DOM上的某个事件时,会产生一个事件对象event,这个对象包含着所有与事件有关的信息 * 表单事件: 获取表单的值 * 1.监听表单的改变事件 ---onChange * 2.在改变的事件里面获取表单输入的值 ---event * 3.把表单输入的值赋值给username

微信公众号弹出框在IOS最新系统中点击键盘上的“完成”导致事件无法触发问题

微信公众号弹出框在IOS最新系统中点击键盘上的"完成"导致事件无法触发问题 问题描述 微信公众号中有项功能是弹框模态框,输入信息后保存操作.但是在IOS系统中发现,当输入内容后,点击键盘上的"完成"后,再点击"提交"无反应:跳过"完成"直接点击"提交"就可以正常保存 问题原因 当键盘弹出后,会将body向上弹起:但是点击"完成"后并没有将body拉回,导致点击事件不在body内而无法触发

quick-cocos2d-x游戏开发【12】——硬件按键事件

在quick中,对于按键事件也进行了重新封装,和node的触摸事件一样,也是通过addNodeEventListener来实现.所谓按键事件,主要是针对于android设备中的返回键"back"和菜单键"menu"的响应,在前面的一篇博文中我也简单提过一次,不过咱们还是系统性的来学习一下. 首先清楚预定义的层事件有两个, cc.ACCELERATE_EVENT     - 重力感应事件 cc.KEYPAD_EVENT                - 硬件按键事件

jQuery基础(鼠标事件,表单事件,键盘事件,自定义事件 篇)

1.jQuery鼠标事件之click与dbclick事件 方法一:$ele.click()(不带参数) <div id="test">点击触发<div> $("ele").click(function(){ alert('触发指定事件') }) $("#test").click(function(){ $("ele").click() //手动指定触发事件 });   方法二:$ele.click( h

Cocos2d-x3.x塔防游戏(保卫萝卜)从零开始(二)

一.前提: 完成前一篇的内容. 具体参考:Cocos2d-x3.x塔防游戏(保卫萝卜)从零开始(一)篇 二.本篇目标: l  说说关于cocos2dx手机分辨率适配 l  对前一篇完成的塔防游戏原型进行屏幕适配完善 三.内容: l  说说关于cocos2dx手机分辨率适配 在上一篇的结尾我们遗留了一个问题,在真机上运行时女主角.色狼的位置相当于道路都有点偏上了,并且好像背景地图也没有显示全背景的顶部和底部有一部分没有显示出来,但是在windows下运行确正常,这个是什么原因呢,该怎么调整呢?我的