Cocos2D-X2.2.3学习笔记9(处理重力感应事件,移植到Android加入两次返回退出游戏效果)

这节我们来学习Cocos2d-x的最后一节,怎样处理重力感应事件,移植到Android后加入再按一次返回键退出游戏等。我这里用的Android,IOS不会也没设备呃

效果图不好弄,由于是要移植到真机上的。

#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__

#include "cocos2d.h"
using namespace cocos2d;
class HelloWorld : public cocos2d::CCLayer
{
public:
    // Here‘s a difference. Method ‘init‘ in cocos2d-x returns bool, instead of returning ‘id‘ in cocos2d-iphone
    virtual bool init();  

    // there‘s no ‘id‘ in cpp, so we recommend returning the class instance pointer
    static cocos2d::CCScene* scene();
    //重力感应事件
	virtual void didAccelerate(CCAcceleration* pAccelerationValue);
	//返回button
	 virtual void keyBackClicked();
    // implement the "static node()" method manually
    CREATE_FUNC(HelloWorld);
};

#endif // __HELLOWORLD_SCENE_H__

这里重写了两个方法

我们都知道CCLayer是继承了重力感应事件和触屏事件,button事件的

#include "HelloWorldScene.h"

#define FIX_POS(_pos, _min, _max)     if (_pos < _min)            _pos = _min;        else if (_pos > _max)       _pos = _max;
USING_NS_CC;

CCScene* HelloWorld::scene()
{
	// ‘scene‘ is an autorelease object
	CCScene *scene = CCScene::create();

	// ‘layer‘ is an autorelease object
	HelloWorld *layer = HelloWorld::create();

	// add layer as a child to scene
	scene->addChild(layer);

	// return the scene
	return scene;
}

// on "init" you need to initialize your instance
bool HelloWorld::init()
{
	//////////////////////////////
	// 1. super init first
	if ( !CCLayer::init() )
	{
		return false;
	}
	this->setAccelerometerEnabled(true);
	this->setKeypadEnabled(true);

	CCSize visibleSize= CCDirector::sharedDirector()->getVisibleSize();
	CCLabelTTF *lable= CCLabelTTF::create("AccelerometerTest","Arial",34);
	lable->setPosition(ccp(visibleSize.width/2,visibleSize.height-50));
	this->addChild(lable,0,0);

	CCSprite *pSprite= CCSprite::create("ball.png");
	pSprite->setPosition(ccp(visibleSize.width/2,visibleSize.height/2));
	this->addChild(pSprite,0,1);
	return true;
}
void HelloWorld::didAccelerate(CCAcceleration* pAccelerationValue)
{
	CCObject *pObjectlable= this->getChildByTag(0);
	if (pObjectlable==NULL)
	{
		return;
	}
	CCLabelTTF *lable=(CCLabelTTF*)pObjectlable;
	std::ostringstream strstream;
	strstream<<"X:"<<pAccelerationValue->x<<"  Y:"<<pAccelerationValue->y<<"  Z:"<<pAccelerationValue->z;
	std::string str=strstream.str();
	lable->setString(str.c_str());

	//改变小球位置
	CCObject *pObjectSprite= this->getChildByTag(1);
	if (pObjectSprite==NULL)
	{
		return;
	}
	CCSprite *pSprite=(CCSprite*)pObjectSprite;
	CCSize pSpriteSize= pSprite->getContentSize();

	CCPoint ptNow  = pSprite->getPosition();
	CCPoint ptTemp=CCDirector::sharedDirector()->convertToUI(ptNow);
	ptTemp.x += pAccelerationValue->x * 9.81f;
	ptTemp.y -= pAccelerationValue->y * 9.81f;
	CCPoint ptNext = CCDirector::sharedDirector()->convertToGL(ptTemp);

	CCSize visibleSize= CCDirector::sharedDirector()->getVisibleSize();
	FIX_POS(ptNext.x, (pSpriteSize.width / 2.0), (visibleSize.width - pSpriteSize.width / 2.0));
	FIX_POS(ptNext.y, (pSpriteSize.height / 2.0), (visibleSize.height - pSpriteSize.height / 2.0));
	pSprite->setPosition(ptNext);

}
void HelloWorld::keyBackClicked()
{
}

源文件代码如上,

init中我们创建了一个lable和小球的精灵

通过setAccelerometerEnabled启用重力感应事件

这里能够看下源代码,比触屏事件简单多了。

然后重写重力感应事件,这里我再事件中改动了CCLableTTF的文本,

改变小球的位置

改动文本就不多说了,非常easy,我们主要来看看怎样改变小球位置的

首先我们获得小球精灵

得到精灵位置

转换为UIKIT

这里*9.81f我也不知道什么意思,TestCpp这么写我也就这么写了

为了小球不超出手机屏幕。所以我们写了一个宏  FIX_POS

这里看看就懂了

OK。

我们移植到Android,看看效果,怎么移植,第一节专门介绍了的

效果不错,可是我们按返回键它没有退出游戏。没不论什么反应,

我们在src下的org.cocos2dx.lib中找到Cocos2dxGLSurfaceView.java打开

找到

@Override
	public boolean onKeyDown(final int pKeyCode, final KeyEvent pKeyEvent) {
		switch (pKeyCode) {
			case KeyEvent.KEYCODE_BACK:
				return false;//这里是自己新增的, 返回false
			case KeyEvent.KEYCODE_MENU:
				this.queueEvent(new Runnable() {
					@Override
					public void run() {
						Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleKeyDown(pKeyCode);
					}
				});
				return true;
			default:
				return super.onKeyDown(pKeyCode, pKeyEvent);
		}
	}

然后我们在自己的java文件里重写onKeyDown,

详细代码例如以下

/****************************************************************************
Copyright (c) 2010-2011 cocos2d-x.org

http://www.cocos2d-x.org

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
****************************************************************************/
package com.huc.test;

import org.cocos2dx.lib.Cocos2dxActivity;
import org.cocos2dx.lib.Cocos2dxGLSurfaceView;

import android.os.Bundle;
import android.view.KeyEvent;
import android.widget.Toast;

public class test20140521 extends Cocos2dxActivity{
	private long mExitTime;
    protected void onCreate(Bundle savedInstanceState){
		super.onCreate(savedInstanceState);
	}
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
    	// TODO Auto-generated method stub
    	 if (keyCode == KeyEvent.KEYCODE_BACK) {
             if ((System.currentTimeMillis() - mExitTime) > 2000) {// 假设两次按键时间间隔大于2000毫秒。则不退出
                 Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show();
                 mExitTime = System.currentTimeMillis();// 更新mExitTime  

             } else {
                 System.exit(0);// 否则退出程序  

             }
             return true;
         }
    	return super.onKeyDown(keyCode, event);
    }
    public Cocos2dxGLSurfaceView onCreateView() {
    	Cocos2dxGLSurfaceView glSurfaceView = new Cocos2dxGLSurfaceView(this);
    	// test20140521 should create stencil buffer
    	glSurfaceView.setEGLConfigChooser(5, 6, 5, 0, 16, 8);

    	return glSurfaceView;
    }

    static {
        System.loadLibrary("cocos2dcpp");
    }
}

OK,试试吧。

。。

附源代码和APK

时间: 2024-10-10 22:41:32

Cocos2D-X2.2.3学习笔记9(处理重力感应事件,移植到Android加入两次返回退出游戏效果)的相关文章

I.MX6Q(TQIMX6Q/TQE9)学习笔记——新版BSP之触摸屏驱动移植

之所以说是驱动移植是因为之前已经在TQ210.AM335x两个平台上移植过了,因此,仅需要少量修改就可以将驱动移植到imx6q.下面开始触摸驱动移植. DTS编写 参考其它DTS的i2c设备写法,我们可以添加如下内容: &i2c1 { clock-frequency = <100000>; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_i2c1_2>; status = "okay&q

Android开发学习笔记--给一个按钮定义事件

学习Android的第一天,了解了各种布局,然后自己动手画出了一个按钮,然后给按钮定义了一个事件是弹出一条消息显示“我成功了!”字样,具体过程如下: 1.修改布局文件activity_main.xml加入如下语句(我把原来的那个文本框删掉了) <Button android:id="@+id/button1" android:onClick="button_click" android:layout_width="wrap_content"

SQL学习笔记之数据库专题(二):Android下SQL数据库开发

在Android开发 中,数据库是不可缺少的.在Android开发中,用的是一种小型的嵌入式数据库,sqllite.今天会写两篇关于Android开发环境下数据库开发的文章,第一篇先介绍使用android自带的API来实现数据库的使用和管理以及增删改查.数据库升级的相关操作. 一.数据库第一次生成 1.javabean文件的准备 这里以一个Person类为例子来描述 package com.example.freedomsql.bean; import java.io.Serializable;

Java基础学习笔记十二 类、抽象类、接口作为方法参数和返回值以及常用API

不同修饰符使用细节 常用来修饰类.方法.变量的修饰符 public 权限修饰符,公共访问, 类,方法,成员变量 protected 权限修饰符,受保护访问, 方法,成员变量 默认什么也不写 也是一种权限修饰符,默认访问, 类,方法,成员变量 private 权限修饰符,私有访问, 方法,成员变量 static 静态修饰符 方法,成员变量 final 最终修饰符 类,方法,成员变量,局部变量 abstract 抽象修饰符 类 ,方法 我们编写程序时,权限修饰符一般放于所有修饰符之前,不同的权限修饰

iOS学习笔记-iOS事件处理之触摸事件

在iOS学习中,接触最多的就是触摸事件,这节主要学习一下触摸事件的简单使用. 1.iOS中的事件 2.触摸事件 2.1 触摸事件的完整处理过程: 1> 先将事件对象由上往下传递(由父控件传递给子控件), 找到最合适的控件来处理这个事件 2> 调用最合适控件的touches.....方法 3> 如果调用了[super touches...];就会将事件顺着响应者链条往上传递,传递给上一个响应者 4> 接着就会调用上一个响应者的touches.....方法 2.2 什么是响应者链条?

JAVAscript学习笔记 js句柄监听事件 第四节 (原创) 参考js使用表

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>句柄添加监听事件</title> <script type="text/javascript" src="tzy.js"></script> </head> <body>

js学习笔记26----事件冒泡,事件捕获

事件冒泡 : 当一个元素接收到事件的时候,会把它接收到的所有传播给它的父级.一直到顶层window.这种现象称之为事件冒泡机制.出去的事件触发. 阻止冒泡 : 当前要阻止冒泡的事件函数中,调用 event.cancelBubble = true; 事件捕获 : ie下是没有的,在绑定事件中,标准下是有的.进来的事件触发. 给对象绑定函数的形式: 1.给一个对象绑定一个事件处理函数: obj.onclick = fn; 2.给一个对象的同一个事件绑定多个不同的函数: ie : obj.attach

vue学习笔记(一)关于事件冒泡和键盘事件 以及与Angular的区别

一.事件冒泡 方法一.使用event.cancelBubble = true来组织冒泡 <div @click="show2()"> <input type="button" value="按钮" @click="show1($event)"> </div> methods:{ show1:function(ev){ console.log(ev); alert(1); ev.cancelB

JavaScript学习笔记(十二)---- 事件

核心概念: 事件流:事件流描述的是从页面中接收事件的顺序.IE的事件流是事件冒泡,Netscape的事件流是事件捕获流. 在你点击按钮的同时,你也单击了按钮的容器元素,甚至也单击了整个页面. 1) 事件冒泡:IE的事件流 事件开始时由最具体的元素接收,然后逐级向上传播到较为不具体的节点.所有现代浏览器都支持事件冒泡. 事件冒泡的过程,当单击了页面中div元素,这个click事件会按照如下顺序传播: 2) 事件捕获:Netscape Communicator团队提出的另一种事件流 事件捕获的用意在