触屏实例,主角跟随触屏轨迹
来源:互联网 发布:易游网络验证破解 编辑:程序博客网 时间:2024/05/19 12:15
原文地址http://blog.csdn.net/bill_man/article/details/7330806
最近在玩间谍鼠这个游戏,其中有一个触屏操作主角移动的方式,就是手指触摸屏幕的轨迹会被记录下来,然后主角顺着轨迹移动,其实这种操作在很多游戏中都有应用,很适合触屏操作。本篇文章就写一个简单的类似例子在cocos2d-x上的实现。
实现思路很简单,首先需要重写以下几个函数来记录触屏轨迹:
virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent);
virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent);
virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent);
另外我们需要一个CCMutableArray来记录我们的轨迹,我们通过如下方式定义:
CCMutableArray<MyPoint *> * path;
其中MyPoint是我们自己定义的一个CCPoint,为什么需要我们自己定义呢?是因为CCMutableArray要求类型必须具备retain函数,我们自己定义一个MyPoint是为了让它继承retain函数。MyPoint的定义如下:
很简单,就是有x,y,并把它继承于CCNode就可以了。
下面首先看ccTouchesBegan函数:
首先获得坐标点,其中的一系列转换已经不用多说了,然后我们要获得主角的位置,由于我还是用的A星算法那个场景,所以主角是属于地图的,所以我们要获得主角的绝对坐标,就直接加上地图坐标就是主角在屏幕上的绝对坐标,然后我们判断我们的起始拖动点是否在主角这个矩形范围内,如果在主角这个范围内那么首先清空path数组,然后把这个点加入到path中,并把我们的索引值stepindex设为-5,表示后续的拖动有效,stepindex的初始值为-1,-1表示没有接收到指令,大于0的值就是主角移动
再看ccTouchesMoved函数:
如果stepindex为-5,表示后续的拖动有效,我们继续往我们的path里加入点,要注意要检测以下点是否出屏幕范围,另外还要检测是否合上一个点不同,不同的点我们才会记录
再看ccTouchesEnded函数:
当触屏结束并且stepindex为-5,表示后续的拖动有效时,stepindex设为0,表示主角可以移动
在update中每帧更新主角位置,即遍历一遍path,记住设置主角位置时要主角和地图的相对坐标,当path遍历完成stepindex设为-1,这样记录触屏轨迹并使主角按此轨迹移动的功能就实现了
实时拖动主角移动
上面讲解了记录拖动的路径并使主角按照此路径移动的cocos2d-x实现。这篇讲解另一个操作方式,这种方式在纵版射击游戏中有不少的实现,就是触屏拖动主角实时移动,也就是说没有上一节那个记录路径然后主角再移动的过程,主角是随你的手指移动的,之后的例子里我也将完整的实现一个简单的纵版射击游戏,就采用这种操作方式。
和上一篇一样,我们也要实现如下三个函数:
virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent);
virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent);
virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent);
这个实现起来比上一篇的问题要简单,但是我们要实现一个小算法,就是,我们检测我们的触电在主角的矩形范围内的一个点,那我们的触点不一定在主角的锚点上,这样我们不能直接用触点直接设置主角的位置,我们需要处理一下,见下图
如图p点是我们的触点,a点是我们的锚点,我们只要满足一下公式:
Px - Ax = dx,Py - Ay = dy就可以了。
首先来看ccTouchesBegan的实现:
首先还是获得触点,然后我们就要获得主角位置,和上次的程序一样,主角还是绑定在地图上的,所以我们要获得主角的绝对坐标,然后判断触点是否在主角这个矩形范围内,如果在范围内,我们把索引值设置为-5,-5表示起始点有效,-1表示起始点无效,然后我们就通过刚才那个公式获得dx和dy(也就是xdelta,ydelta)。
再来看ccTouchesMoved的实现:
如果索引值为-5,那表示我们就可以控制主角了,然后我们要判断触点是否在屏幕范围内,如果在屏幕范围内,再判断这个位置是否和主角当前位置相同,如果不同才会设置主角位置,这里要说到的是我们获得上一个位置的方法,当然,你也可以通过一个变量来控制,这里介绍通过计算得到的方法,首先通过主角的getposition方法获得的坐标只是主角相对于地图的坐标,我们加上地图的横纵坐标来获得主角的绝对坐标,然后再通过Px - Ax = dx,Py - Ay = dy公式获得上一个触点的位置,最后设置主角位置,注意首先还是通过Px - Ax = dx,Py - Ay = dy公式获得锚点应该移动到的位置,然后再减去地图的位置获得主角和地图的相对坐标
再来看ccTouchesEnded的实现:
很简单,就是如果索引值为-5时重新设置为-1的“未激活”状态。
- 触屏实例,主角跟随触屏轨迹
- cocos2d-x 触屏主角移动轨迹
- cocos2d-x游戏实例(11)-触屏主角移动轨迹
- cocos2d-x游戏实例(11)-触屏主角移动轨迹
- cocos2d-x游戏实例(1)-视角跟随主角
- cocos2d-x游戏实例(1)-视角跟随主角
- 摄像机跟随主角
- unity摄像头跟随游戏主角移动
- Unity3D实现宠物跟随主角的效果图
- 飞机大战之四:飞机跟随触屏手指移动
- Unity3D学习笔记02:GUI主角跟随鼠标运动
- cocos2d-x学习日志(1)--视角跟随主角
- 45度地图游戏的地图拖动和主角跟随
- 【Unity】相机跟随主角移动,并带有延迟效果
- 相机跟随主角移动,并带有延迟效果
- unity中摄像机跟随主角,摄像机穿墙,射线碰撞检测,摄像机穿墙跟随
- unity中摄像机跟随主角,摄像机穿墙,射线碰撞检测,摄像机穿墙跟随
- 【安卓】旋屏跟随
- code::blocks编译多文件
- ubuntu 关机,重启,注销命令
- Javascript : 逻辑和代码的分离
- oracle数据库导入导出命令
- 用VS.NET中的测试工具测试ASP.NET程序 (1)
- 触屏实例,主角跟随触屏轨迹
- Android Make脚本的简记
- 苹果系统下的音视频即时通讯开发方法
- PHP的单引号和双引号
- 如何将Win7 C盘拆分成多个分区
- 【java 基础】Java序列化的机制和原理
- u3d动态加载预制
- 检测网络
- mysql The last packet successfully received from the server was XXX seconds ago