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

和上篇文章里方法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 }

 

posted @ 2013-01-23 00:01  居家懒人  阅读(1961)  评论(0编辑  收藏  举报