第三十八天 一乐在其中—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

第三十八天 一乐在其中—Android的小游戏打飞机(二)移动飞机

时间: 2024-08-18 20:47:14

第三十八天 一乐在其中—Android的小游戏打飞机(二)移动飞机的相关文章

第四十天 一乐在其中—Android的小游戏打飞机(三)添加敌机

8月9日,晴."江城如画里,山晓望晴空.雨水夹明镜,双桥落彩虹. 人烟寒橘柚,秋色老梧桐." 上篇已经让飞机加载子弹和音效及背景音乐,本篇主要添加敌机. 本篇要用到的几个函数讲解: 1.voidsetTag (int nTag) 设置动作的标记. 2.CCRANDOM_0_1()函数生成的是 [0, 1] 之间的随机数:要生成  [0-100] 之间的数CCRANDOM_0_1 * 100:生成 [1,5]  之间的float 数,就是 CCRANDOM_0_1 * 4 + 1. 3.

第三十七天 一乐在其中—Android的小游戏打飞机(一)

8月3日,晴天."绿树阴浓夏日长,楼台倒影入池塘, 水晶帘动微风起,满架蔷薇一院香." cocos2d是一个开源的游戏开发框架,利用它可以非常容易的开发2D游戏.目前最主要的分支是iPhone版本的,你可以在iPhone上开发2D游戏.它提供了物理,精灵(sprites),视差卷轴(parallax scrolling),支持iPhone touch和accelerator等很多功能.现在在App Store上已经有不少用cocos2d开发的游戏. 如果你想在Andriod上使用Jav

第三十九天 一乐在其中—Android的小游戏打飞机(三)飞机打子弹

8月7日,小雨."乳鸦啼散玉屏空,一枕新凉一扇风.睡起秋色无觅处,满阶梧桐月明中." 上篇已经让飞机随手指自由移动,本篇加载子弹和音效及背景音乐. 本篇要用到的几个函数讲解: 一.cocos2d的音效.背景音乐函数如下: 1.SoundEngine.sharedEngine().playSound(Context ctxt, int resId, boolean loop) 用于播放背景音乐. 2.SoundEngine.sharedEngine().playEffect(Contex

第四十一天 一乐在其中—Android的小游戏打飞机(五)添加背景

8月10日,晴."寒蝉凄切,对长亭晚,骤雨初歇." 上篇已经加载了敌机,本篇主要添加背景画面. 本篇要用到的几个函数讲解: 1.addChild(CCNode child, int z):两个参数,第一个要加入场景的对象,第二个是绘制层的顺序,默认参数值为0,表示最高优先层导入,该值越大表示该层在最后加载(在最高一层),一般背景图层是首先加载,其它元素在加载在背景层上面.因为背景在后面加载的话,会覆盖掉前面加载的元素,看不到想要的图层组合效果. 2.schedule(String se

Unity3D 学习笔记 - Garen Pick the Balls 捡球小游戏设计 (二) Macanim 动画状态机

注:本游戏开发环境为Unity3D 5.3.4 本星期要求: 模仿 AnimationEvent 编写一个 StateEvents 类 用户可以创建一个指定时间.指定状态触发的事件类 事件可以采用反射机制,调用调用客户的方法:或使用订阅发布方法调用客户的方法. 在你的动画控制程序中使用 StateEvents 类 我采用的是上星期的Garen Pick the Balls小游戏,将Legacy动画部分用Mecanim重写. 要点: 1. 初次状态机开发,尚未实现Run和Attack同时进行(Bl

第三十七天 一乐在当中—Android的小游戏打飞机(一)环境搭建

8月3日,晴天."绿树阴浓夏日长.楼台倒影入池塘. 水晶帘动微风起,满架蔷薇一院香. " cocos2d是一个开源的游戏开发框架.利用它能够非常easy的开发2D游戏.眼下最基本的分支是iPhone版本号的,你能够在iPhone上开发2D游戏. 它提供了物理.精灵(sprites).视差卷轴(parallax scrolling),支持iPhone touch和accelerator等非常多功能.如今在App Store上已经有不少用cocos2d开发的游戏. 假设你想在Andriod

android 小游戏 ---- 数独(二)

> 首先创建一个自己的View类 -->继承SurfaceView并实现SurfaceHolder.Callback接口 --> SurfaceView.getHolder()获得SurfaceHolder对象 -->SurfaceHolder.addCallback(callback) 添加回调函数 -->SurfaceHolder.lockCanvas()获得Canvas对象并锁定画布 --> Canvas绘画 -->SurfaceHolder.unlockC

Java从基础到进阶学习之路----数独小游戏制作(二)

详细设计 游戏数据结构设计 显然,需要存储数据的地方只有九宫格地图部分. 对于地图,很明显我们可以采用二维数组int [] [] game;来存储地图中的数据.但是int的二维数组虽然直接简单,但是还是有一定不便之处,比如没有集合的内置处理方法丰富.所以,显然,在游戏地图的生成过程中,一些辅助数据我们可以采用Java的集合. 地图生成算法 对于数独而言,游戏的成功的最根本的保证就是当前的地图有一个存在的解.这就像是解方程,如果不存在解,那么这个游戏本身就是失败的. 所以,重点在于如何产生一个存在

软件工程 Android小游戏 猜拳大战

一.前言 最近学校举办的大学生程序设计竞赛,自己利用课余时间写了一个小游戏,最近一直在忙这个写这个小游戏,参加比赛,最终是老师说自己写的简单,可以做的更复杂的点的.加油 二.内容简介 自己玩过Android系统下的节奏大师,自己也就考虑做一个类似的,然后自己写技术水平有限,还是在学习Android阶段,自己就想到可以写一个猜拳的比较小游戏. 这是一款基于Android平台小游戏—猜拳大战,简单,易操作,趣味强,训练反应速度,内存小,没有广告,安全. 最大的特点:训练人的反应速度. 游戏规则:在3