首页 > 代码库 > 第三十八天 一乐在其中—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