和上篇文章里方法1不同的是只要按住屏幕的手不松开,主角会一直往触屏点相对与地图的本地坐标点移动,直到最终走到了触屏点。其实就是类似于开启了个定时器,每次定时一到就去监测是否有新的目标点。

 1 //
 2 //  FightLayer.h
 3 //  VictoryMarchDemo
 4 //
 5 //  Created by jiading on 13-1-15.
 6 //
 7 //
 8
 9 #ifndef __VictoryMarchDemo__FightLayer__
10 #define __VictoryMarchDemo__FightLayer__
11
12 #include "cocos2d.h"
13 #include "Player.h"
14 #include "RangeLayer.h"
15 #include "TouchMoveHandle.h"
16
17 USING_NS_CC;
18
19 class FightLayer : public CCLayer
20 {
21 public:
22     FightLayer();
23     ~FightLayer();
24
25     CCLayer *mapContainer;
26     CCSprite *backBg;
27     CCSprite *centerBg;
28
29     Player *player;
30
31     CCTouch* currentTouch;
32
33     void showBg();
34     void showPlayer();
35
36     virtual void onEnter();
37     virtual void registerWithTouchDispatcher();
38     virtual void ccTouchesEnded(CCSet *pTouches,CCEvent *pEvent);
39     virtual bool ccTouchBegan(CCTouch* touch,CCEvent* event);
40     virtual void ccTouchEnded(CCTouch* touch,CCEvent* event);
41
42     CREATE_FUNC(FightLayer);
43 private:
44     CCPoint selfTargetPos;
45
46     TouchMoveHandle *currentMoveHadle;
47
48     void touchScheduleHandler();
49
50 };
51
52
53 #endif /* defined(__VictoryMarchDemo__FightLayer__) */

  1 //
  2 //  FightLayer.cpp
  3 //  VictoryMarchDemo
  4 //
  5 //  Created by jiading on 13-1-15.
  6 //
  7 //
  8
  9 #include "FightLayer.h"
 10 #include "Enemy.h"
 11
 12 FightLayer::FightLayer():
 13     currentMoveHadle(NULL)
 14 {
 15
 16 }
 17
 18 FightLayer::~FightLayer()
 19 {
 20
 21 }
 22
 23 void FightLayer::onEnter()
 24 {
 25     CCLayer::onEnter();
 26 }
 27
 28
 29
 30 void FightLayer::registerWithTouchDispatcher()
 31 {
 32     CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
 33 }
 34
 35 bool FightLayer::ccTouchBegan(cocos2d::CCTouch *touch, cocos2d::CCEvent *event)
 36 {
 37     currentTouch = touch;
 38
 39     this->schedule(schedule_selector(FightLayer::touchScheduleHandler), 0.3f);
 40
 41
 42     selfTargetPos = ccp(touch->getLocation().x + abs(mapContainer->getPositionX()),touch->getLocation().y);
 43     if(currentMoveHadle)
 44     {
 45         currentMoveHadle->destroy();
 46         currentMoveHadle->release();
 47         currentMoveHadle = NULL;
 48     }
 49
 50     currentMoveHadle = TouchMoveHandle::create();
 51     currentMoveHadle->retain();
 52     currentMoveHadle->handle(player, backBg, centerBg, mapContainer, selfTargetPos);
 53     return true;
 54
 55 }
 56
 57 void FightLayer::touchScheduleHandler()
 58 {
 59
 60     selfTargetPos = ccp(currentTouch->getLocation().x + abs(mapContainer->getPositionX()),currentTouch->getLocation().y);
 61     if(currentMoveHadle)
 62     {
 63         currentMoveHadle->destroy();
 64         currentMoveHadle->release();
 65         currentMoveHadle = NULL;
 66     }
 67
 68     currentMoveHadle = TouchMoveHandle::create();
 69     currentMoveHadle->retain();
 70     currentMoveHadle->handle(player, backBg, centerBg, mapContainer, selfTargetPos);
 71
 72 }
 73
 74 void FightLayer::ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent)
 75 {
 76
 77
 78 }
 79
 80 void FightLayer::ccTouchEnded(CCTouch *touch, cocos2d::CCEvent *event)
 81 {
 82     //     CCLog("ccTouchEnded");
 83     this->unschedule(schedule_selector(FightLayer::touchScheduleHandler));
 84     if(currentMoveHadle)
 85     {
 86         currentMoveHadle->destroy();
 87         currentMoveHadle->release();
 88         currentMoveHadle = NULL;
 89     }
 90 }
 91
 92 void FightLayer::showPlayer()
 93 {
 94     CCSize winSize = CCDirector::sharedDirector()->getWinSize();
 95
 96     //npc
 97     Player *npc = Player::create();
 98     npc->setScale(1.5);
 99     npc->setPosition(ccp(850,75));
100     npc->playAction(Player::state_attack);
101     mapContainer->addChild(npc);
102
103
104     //标出原点
105     player = Player::create();
106     player->setScale(1.5);
107     player->setPosition(ccp(winSize.width/2,95));
108     player->playAction(Player::state_idle);
109     mapContainer->addChild(player);
110
111     //enemy
112     Enemy *enemy = Enemy::create();
113     enemy->setScale(1.5);
114     enemy->setPosition(ccp(centerBg->getContentSize().width * centerBg->getScaleX() - 100,95));
115     enemy->playAction(Enemy::state_idle);
116     mapContainer->addChild(enemy);
117
118     enemy->runTo(ccp(100,95));
119 }
120
121 void FightLayer::showBg()
122 {
123     setTouchEnabled(true);
124
125     mapContainer = CCLayer::create();
126
127
128
129
130     CCSize winSize = CCDirector::sharedDirector()->getWinSize();
131     centerBg = CCSprite::create("map/zhongjing.png");
132     CCSize mapSize = centerBg->getContentSize();
133     float mapScale = winSize.height / mapSize.height;
134     centerBg->setAnchorPoint(CCPointZero);
135     centerBg->setPosition(CCPointZero);
136
137     centerBg->setScale(mapScale);
138
139     backBg = CCSprite::create("map/beijing.png");
140     CCSize backMapSize = backBg->getContentSize();
141     backBg->setAnchorPoint(CCPointZero);
142     backBg->setScale(mapScale);
143     backBg->setPosition(ccp(0,winSize.height - (backMapSize.height * mapScale)));
144
145     addChild(backBg);
146     addChild(mapContainer);
147     mapContainer->addChild(centerBg);
148
149     RangeLayer *range = RangeLayer::create();
150     CCSize size = CCSizeMake(centerBg->getContentSize().width * centerBg->getScale(), winSize.height);
151     range->setContentSize(size);
152     range->setLinePox(winSize.width/2, centerBg->getContentSize().width*centerBg->getScale()- winSize.width/2);
153     mapContainer->addChild(range);
154 }

 1 //
 2 //  TouchMoveHandle.h
 3 //  PlayerActionTest
 4 //
 5 //  Created by 嘉定 on 13-1-3.
 6 //
 7 //  此类负责地图点击移动的执行
 8 //  主要处理人物和背景的移动,都是横向移动,不包含y方向上的移动。
 9
10 #ifndef __PlayerActionTest__TouchMoveHandle__
11 #define __PlayerActionTest__TouchMoveHandle__
12
13 #include "cocos2d.h"
14 #include "Player.h"
15
16 USING_NS_CC;
17
18 class TouchMoveHandle : public CCObject
19 {
20 public:
21
22     TouchMoveHandle();
23     virtual ~TouchMoveHandle();
24
25     typedef enum
26     {
27         leftToCenter = 1,
28         centerToLeft = 2,
29         rightToCenter = 3,
30         centerToRight = 4,
31         behaviorUnKnow = 5
32     }PlayerCrossBehavior;
33
34     void handle(Player *_player, CCSprite *_backBg,CCSprite *_centerBg,CCLayer *_container,CCPoint touchPoint);
35
36
37     virtual bool init();
38
39     PlayerCrossBehavior moveBehavior;
40
41     void destroy();
42
43
44     CREATE_FUNC(TouchMoveHandle);
45
46 private:
47
48     float winWidth;
49     Player *player;
50     CCSprite *backBg;
51     CCSprite *centerBg;
52     CCLayer *container;
53
54
55     float backBgWidth;
56     float centerBgWidth;
57
58     CCPoint targetPoint;
59     //左侧判断移动边界
60     float leftSideX;
61     //右侧判断移动边界
62     float rightSideX;
63
64     CCPoint getCrossSidePoint1();
65
66     void moveContainer1(CCPoint target);
67     void playerCrollSideLineHandler();
68 };
69
70 #endif /* defined(__PlayerActionTest__TouchMoveHandle__) */

  1 //
  2 //  TouchMoveHandle.cpp
  3 //  PlayerActionTest
  4 //
  5 //  Created by 嘉定 on 13-1-3.
  6 //
  7 //
  8
  9 #include "TouchMoveHandle.h"
 10
 11
 12 TouchMoveHandle::TouchMoveHandle():
 13     winWidth(0),
 14     player(NULL),
 15     backBg(NULL),
 16     centerBg(NULL),
 17     backBgWidth(0),
 18     centerBgWidth(0),
 19     leftSideX(0),
 20     rightSideX(0),
 21     moveBehavior(behaviorUnKnow)
 22 {
 23
 24 }
 25
 26 TouchMoveHandle::~TouchMoveHandle()
 27 {
 28     CCLog("~TouchMoveHandle dispose");
 29 }
 30
 31 bool TouchMoveHandle::init()
 32 {
 33     CCNotificationCenter::sharedNotificationCenter()->addObserver(this, callfuncO_selector(TouchMoveHandle::playerCrollSideLineHandler),"playerIdle", NULL);
 34
 35     return true;
 36 }
 37
 38 void TouchMoveHandle::destroy()
 39 {
 40     CCNotificationCenter::sharedNotificationCenter()->removeObserver(this, "playerIdle");
 41     container->stopAllActions();
 42     backBg->stopAllActions();
 43     player->stopAllActions();
 44     player->playAction(Player::state_idle);
 45
 46 }
 47
 48 void TouchMoveHandle::handle(Player *_player, CCSprite *_backBg,CCSprite *_centerBg,CCLayer *_container,CCPoint touchPoint)
 49 {
 50     player = _player;
 51     winWidth = CCDirector::sharedDirector()->getWinSize().width;
 52     backBg = _backBg;
 53     centerBg = _centerBg;
 54     container = _container;
 55     backBgWidth = backBg->getContentSize().width * backBg->getScaleX();
 56     centerBgWidth = centerBg->getContentSize().width * centerBg->getScaleX();
 57     this->targetPoint = ccp(touchPoint.x,player->getPosition().y);
 58     leftSideX = winWidth/2;
 59     rightSideX = centerBgWidth - winWidth/2;
 60
 61     float playerCurrentX = player->getPosition().x;
 62
 63     //玩家在地图左侧
 64     if(playerCurrentX <= leftSideX)
 65     {
 66         //targetPoint也在左侧,就玩家动
 67         if(targetPoint.x <= leftSideX)
 68         {
 69             moveBehavior = behaviorUnKnow;
 70             player->runTo(targetPoint);
 71
 72         }
 73         else //touchPoint在中间,先玩家跑到边界,过界后背景和玩家一起动
 74         {
 75             moveBehavior = leftToCenter;
 76             player->runTo(getCrossSidePoint1());
 77         }
 78     }
 79     else if(playerCurrentX > leftSideX && playerCurrentX < rightSideX)//玩家在中间
 80     {
 81         //targetPoint在左侧,先玩家背景一起动,然后再只玩家动
 82         if(targetPoint.x <= leftSideX)
 83         {
 84             CCPoint temp = getCrossSidePoint1();
 85             player->runTo(temp);
 86             moveContainer1(temp);
 87             moveBehavior = centerToLeft;
 88         }
 89         else if(targetPoint.x > leftSideX && targetPoint.x < rightSideX)//targetPoint在中间,一起动
 90         {
 91             player->runTo(targetPoint);
 92             moveContainer1(targetPoint);
 93             moveBehavior = behaviorUnKnow;
 94         }
 95         else if(targetPoint.x >= rightSideX)//targetPoint在右,先玩家跑到边界,过界后背景和玩家一起动
 96         {
 97             CCPoint temp = ccp(rightSideX,player->getPositionY());
 98             player->runTo(temp);
 99             moveContainer1(temp);
100             moveBehavior = centerToRight;
101         }
102     }
103     else if(playerCurrentX >= rightSideX)//玩家在右侧
104     {
105         if(targetPoint.x < rightSideX)//targetPoint在中间
106         {
107             CCPoint temp = ccp(rightSideX,player->getPositionY());
108             player->runTo(temp);
109             moveBehavior = rightToCenter;
110         }
111         else if(targetPoint.x >= rightSideX)
112         {
113             player->runTo(targetPoint);
114             moveBehavior = behaviorUnKnow;
115         }
116     }
117
118
119 }
120
121 void TouchMoveHandle::playerCrollSideLineHandler()
122 {
123     if(moveBehavior == leftToCenter)
124     {
125         moveBehavior = behaviorUnKnow;
126         player->runTo(targetPoint);
127         moveContainer1(targetPoint);
128     }
129     else if(moveBehavior == centerToLeft)
130     {
131         moveBehavior = behaviorUnKnow;
132         container->stopAllActions();
133         container->setPositionX(0);
134         backBg->stopAllActions();
135         backBg->setPositionX(0);
136         player->runTo(targetPoint);
137     }
138     else if(moveBehavior == centerToRight)
139     {
140         moveBehavior = behaviorUnKnow;
141         container->stopAllActions();
142         container->setPositionX(winWidth-centerBgWidth);
143         backBg->stopAllActions();
144         backBg->setPositionX(winWidth-backBgWidth);
145         player->runTo(targetPoint);
146     }
147     else if(moveBehavior == rightToCenter)
148     {
149         moveBehavior = behaviorUnKnow;
150         player->runTo(targetPoint);
151         moveContainer1(targetPoint);
152     }
153
154 }
155
156 CCPoint TouchMoveHandle::getCrossSidePoint1()
157 {
158     CCPoint crossPoint = ccp(leftSideX,player->getPositionY());
159     return crossPoint;
160 }
161
162 void TouchMoveHandle::moveContainer1(CCPoint target)
163 {
164     container->stopAllActions();
165     backBg->stopAllActions();
166
167     const float SPEED = 12;
168     float currentPlayerPosX = player->getPosition().x;
169     float disX = target.x - currentPlayerPosX;
170     float DIS_X = abs(disX);
171     float containerTartgetX = 0;
172     if(disX < 0)
173     {
174         containerTartgetX = container->getPositionX() + DIS_X;
175     }
176     else
177     {
178         containerTartgetX = container->getPositionX() - DIS_X;
179     }
180     float playerMoveTime = (DIS_X / SPEED) / 60;
181
182     CCAction *action = CCSequence::create(
183                                           CCMoveTo::create(playerMoveTime, ccp(containerTartgetX,0)),
184                                           NULL);
185     container->runAction(action);
186
187     //背景层
188     //中景层从最大横坐标到最小横坐标之间的距离
189     float maxCenterBgDis = centerBgWidth - winWidth;
190     //背景层的移动距离
191     float maxBackBgDis = backBgWidth - winWidth;
192     float backBgMoveScale = maxBackBgDis / maxCenterBgDis;
193     float backBgTargetPosx = containerTartgetX * backBgMoveScale;
194     CCAction *backBgAction = CCSequence::create(CCMoveTo::create(playerMoveTime, ccp(backBgTargetPosx,backBg->getPosition().y)),NULL);
195     backBg->runAction(backBgAction);
196 }

转载于:https://www.cnblogs.com/JD85/archive/2013/01/23/2872357.html

cocos2d-x 横板游戏触屏人物和背景移动 方法2相关推荐

  1. cocos2d-x 横板游戏触屏人物和背景移动 方法1

    大多横板游戏主角的移动都是有背景一起在移动的,不单单是主角在动.当主角的位置离地图的左端距离小于屏幕宽度的一半或者主角离地图最右端的距离小于屏幕宽度的一半时,触屏之后就人物在移动,背景没有动,当主角位 ...

  2. Java游戏触屏处理,非触屏java游戏转换为触屏游戏工具使用方法

    用下面软件可以把非触屏java游戏改为触屏游戏,不会遮挡屏幕,提供了9个可自设触摸键,真是玩rpg类游戏的大福音啊!方法如下: 一.下载HandyPartner.JavaMagic_60b.和halo ...

  3. 无盘服务器玩游戏卡屏,游戏卡屏怎么办 原因介绍及方法处理【图解】

    很多人在玩游戏时都会经常的碰到一些卡屏事件,这是很常见的,因为很多大型的游戏很容易导致电脑的内存运行不起来,就会卡屏.游戏卡屏该怎么处理呢?一般情况,如果是新电脑,可能是因为网速不行导致的.但是如果是 ...

  4. win10 游戏全屏闪退桌面解决方法

    这个原因是epic改了文件所导致的 1.win+r键输入regedit 2.HKEY_CURRENT_USER\Control Panel\Desktop->ForegroundLockTime ...

  5. [Android] 触屏setOnTouchListener实现图片缩放、移动、绘制和添加水印

        前一篇文章讲述了Android实现图片Matrix矩阵类缩放.旋转.对比度.亮度.饱和度处理,但是真正的图片软件都是使用触屏实现图片缩放.移动.添加水印等功能,所以该篇文章主要通过setOnT ...

  6. python控制苹果手机触摸屏失灵怎么办_iPhone手机触屏不灵敏怎么办 触屏失灵乱跳等问题解决方法大全必看...

    目前有很多的用户都正在使用苹果iphone iPhone触屏不灵敏怎么办 解决方法一. 解决方法二. 苹果手机触摸屏不灵敏的解决方法二是,强制重启:同时按住iPhone的电源和Home键并保持几秒钟, ...

  7. 夸克浏览器触屏模式开启de方法

    夸克触屏模式怎么开启?夸克浏览器应该身边很多小伙伴都有下载安装,很纯净,没有广告这些乱七八糟的东西,不仅可以看喜欢的视频,还有很多漫画资源,而且看漫画的时候还有一个触屏模式的功能,但有的小伙伴称夸克触 ...

  8. UIAutomator2.0详解(UIDevice篇----触屏操作1)

    UIDevice中有20个方法,是关于触屏操作的,占方法总数的三分之一.数量看似很多,仔细分析一下,也就几类. (1)功能键型,7个,HOME,RECENT,BACK,DELETE,ENTER,MEN ...

  9. html5 游戏 黑屏,《战地5》游戏黑屏无限加载怎么解决 黑屏解决办法

    导 读 战地5游戏黑屏无限加载怎么办?怎么解决?很多玩家可能还不太清楚,下面小编为大家带来了战地5游戏黑屏无限加载解决方法推荐,还在等什么?感兴趣的玩家一起来看看吧! 战地5游戏黑屏无限加载解决方法推 ...

最新文章

  1. ava.lang.UnsatisfiedLinkError:
  2. 算法学习之路|数位dp简要分析
  3. 数据结构与算法(4)——优先队列和堆
  4. Java判断文件是否为图片文件(GIF,PNG,JPG)
  5. google的api key调用次数是多少_Sprint Boot如何基于Redis发布订阅实现异步消息系统的同步调用?...
  6. 【Elasticsearch】Elasticsearch filter和query的不同
  7. 解析器 java_Java高性能解析器实现思路及方法学习
  8. Android:什么是签名、为什么要给应用程序签名、如何给应用程序签名
  9. LBP特征提取原理和python库代码
  10. 解除谷歌浏览器默认禁止音频自动播放
  11. python为什么被称为胶水语言_为什么只有python成了胶水语言?
  12. 口算题自动生成小工具
  13. 计算机黑屏风扇异响,电脑开机黑屏主机风扇一直响
  14. 操作系统 实时调度
  15. 深挖用户需求,只需要这三步就够了!
  16. BAPI_GOODSMVT_CREATE移库操作(WMS TO SAP)
  17. Java在PDF文档中添加或删除页面
  18. 牛逼了,利用Python实现“天眼系统”,只要照片就能了解个人信息
  19. python制作数据增长动图_手把手教你做一个python+matplotlib的炫酷的数据可视化动图...
  20. Kafka教程(三):原理及存储

热门文章

  1. hive中的事物操作
  2. python获取gps数据_Python GPS模块:读取最新的GPS数据
  3. 【CMU15-445数据库】bustub Project #0:Trie 树实现(C++ Primer)
  4. Java 8 Lambda表达式官方入门教程(包括Lambda表达式介绍和语法)
  5. 读《借助开源项目,学习软件开发》总结
  6. 哨兵 双向 java_SpringCloud微服务:Sentinel哨兵组件,管理服务限流和降级
  7. 用c++输出一个等腰三角形
  8. PMOS和NMOS在开关应用中高侧和低侧驱动的对比
  9. 【基于Web停车场管理系统——开题报告 分享(仅供参考呀)】
  10. CSDN如何上传视频?