首页 > 代码库 > 第三十八天 一乐在其中—Android的小游戏打飞机(二)移动飞机
第三十八天 一乐在其中—Android的小游戏打飞机(二)移动飞机
8月6日,阴。“桑条无叶土生烟,箫管迎龙水庙前。朱门几处看歌舞,犹恐春阴咽管弦"。
上篇已经把飞机放到了屏幕上,怎么让飞机随手指自由移动,是本篇解决的问题。
本篇要用到的几个函数讲解:
一、cocos2d的触摸事件如下:
1、ccTouchesMoved:接受的是手指在屏幕上滑动/停留的信息,即当用户手指在屏幕移动时,执行该方法
。
2、ccTouchesBegan:接受的是手指点击屏幕的那一下的信息,即当用户开始触摸屏幕时,执行该方法
。
3、ccTouchesEnded: 接受手指离开屏幕的那那一下的信息,即当用户手指离开屏幕时,执行该方法
。
二、坐标系
1、OpenGL坐标系:该坐标系原点在屏幕左下角,x轴向右,y轴向上。这也就是cocos2dx中用到的坐标系。
2、屏幕坐标系:该坐标系的原点在屏幕左上角,x轴向右,y轴向下,其实和OpenGL坐标系的差别也就是y轴的方向。假设游戏场景的分辨率为(500,500),其中一个点的坐标为(200,200),那么它在OpenGL坐标系中的坐标还是(200,200),在屏幕坐标系中则要倒过来,则为(200,500-200)。
3、世界坐标系:又名绝对坐标系,世界坐标系和OpenGL坐标系方向一致,原点在屏幕左下角,x轴向右,y轴向上。
4、节点坐标系:又名相对坐标系,和OpenGL坐标系方向一致,不同的是原点在父节点左下角。
convertToGL(CGPoint.ccp(event.getX(), event.getY())):先获得屏幕坐标,在调用convertToGL转成OpenGl坐标系。
三、MainActivity.java
package edu.eurasia.cocos2d_game02; import org.cocos2d.layers.CCScene; import org.cocos2d.nodes.CCDirector; import org.cocos2d.opengl.CCGLSurfaceView; import android.os.Bundle; import android.view.Window; import android.view.WindowManager; import android.app.Activity; public class MainActivity extends Activity { // 创建一个view对象,cocos2d引擎会把图形绘制在该view对象上面 private CCGLSurfaceView view = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 不显示标题栏 requestWindowFeature(Window.FEATURE_NO_TITLE); // 设置当前程序全屏显示 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); // 设置不允许屏幕自动休眠 getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); view = new CCGLSurfaceView(this); setContentView(view); // 获取导演对象 CCDirector director = CCDirector.sharedDirector(); // 设置游戏引擎画面的输出目标View director.attachInView(view); // 设置游戏是否显示FPS值 director.setDisplayFPS(true); // 设置游戏的刷新率 FPS = frame per second director.setAnimationInterval(1 / 30.0f); // 生成场景对象 CCScene scene = CCScene.node(); // 生成图层对象 PlaneLayer layer = new PlaneLayer(this); // 将图层添加至场景当中 scene.addChild(layer); // 通知导演,运行场景 director.runWithScene(scene); } }
本段增加了不显示标题栏,全屏显示和不允许自动休眠的功能。
四、 PlaneLayer.java
package edu.eurasia.cocos2d_game02; import org.cocos2d.layers.CCLayer; import org.cocos2d.nodes.CCDirector; import org.cocos2d.nodes.CCSprite; import org.cocos2d.types.CGPoint; import org.cocos2d.types.CGRect; import org.cocos2d.types.CGSize; import android.content.Context; import android.view.MotionEvent; public class PlaneLayer extends CCLayer{ //声明一个精灵对象 private CCSprite plane; private CCDirector director; private CGSize winSize; private CGPoint offset; private boolean flag = false; public PlaneLayer(Context context){ //设置当前图层是否接受触摸事件 this.setIsTouchEnabled(true); director = CCDirector.sharedDirector(); winSize = director.winSize(); //初始化精灵对象 plane = CCSprite.sprite("p.png"); //设置精灵对象的位置 plane.setPosition(CGPoint.ccp(winSize.width / 2, 200)); this.addChild(plane); } //当用户开始触摸屏幕,执行该方法 @Override public boolean ccTouchesBegan(MotionEvent event) { CGPoint point = director.convertToGL(CGPoint.ccp(event.getX(), event.getY())); CGRect rect = plane.getBoundingBox(); flag = CGRect.containsPoint(rect, point); if(flag){ offset = CGPoint.ccpSub(plane.getPosition(), point); } return super.ccTouchesBegan(event); } //当用户手指离开屏幕时,执行该方法 @Override public boolean ccTouchesEnded(MotionEvent event) { flag = false; return super.ccTouchesEnded(event); } //当用户手指在屏幕移动时,执行该方法 @Override public boolean ccTouchesMoved(MotionEvent event) { if(flag){ CGPoint point = director.convertToGL(CGPoint.ccp(event.getX(), event.getY())); point = CGPoint.ccpAdd(point, offset); plane.setPosition(point); } return super.ccTouchesMoved(event); } }五、运行结果
六、源代码下载地址
http://download.csdn.net/detail/zwszws/7722519