天天看點

裝甲逆襲-玩家移動處理

玩家移動目前采取的是搖杆方式,A星會在後期開始加入,後期會專門寫一篇關于在遊戲中加入A星。

搖杆的部分代碼是用HIMI的那個,然後稍微修改。

#include "HRocker.h" 

#include "RpgGameScene.h"

#include "PlayerSprite.h"

#include "CommonUtil.h"

#include "MoveNPCSprite.h"

#include "CommonCollisonUtil.h"

//委托,處理地圖上的一些事件,包括玩家移動,檢測碰撞等。

void HRocker::updatePos(float dt){ 

if (!active)

return ;

CCNode *playernode=CommonUtil::getPlayerNode();

if (playernode!=NULL)

nowPlayerStand=playernode->getPosition();

jsSprite->setPosition(ccpAdd(jsSprite->getPosition(),ccpMult(ccpSub(currentPoint, jsSprite->getPosition()),0.5))); 

int fangxiang=CommonCollisonUtil::calculationDirection(centerPoint,currentPoint);

CommonCollisonUtil::isPlayerCollidesWithOther(fangxiang);

CommonCollisonUtil::isNPCCollidesWithPlayer();

CommonCollisonUtil::showDialogByPlayer();

if (CommonCollisonUtil::isCollidesWithDoor())

return;

//啟動搖杆 

void HRocker::Active() 

if (!active) { 

flag=0;

currentPoint = centerPoint; 

active=true; 

schedule(schedule_selector(HRocker::updatePos));//添加重新整理函數 

CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, kCCMenuHandlerPriority,false);//添加觸摸委托 

}else { 

}

//解除搖杆 

void HRocker::Inactive() 

if (active) { 

flag=0;

currentPoint = centerPoint; 

active=false; 

this->unschedule(schedule_selector(HRocker::updatePos));//删除重新整理 

CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);//删除委托 

}else { 

//初始化 aPoint是搖杆中心 aRadius是搖杆半徑 aJsSprite是搖杆控制點 aJsBg是搖杆背景 

HRocker* HRocker:: HRockerWithCenter(CCPoint aPoint ,float aRadius ,CCSprite* aJsSprite,CCSprite* aJsBg,bool _isFollowRole){ 

HRocker *jstick=HRocker::create(); 

jstick->initWithCenter(aPoint,aRadius,aJsSprite,aJsBg,_isFollowRole); 

return jstick; 

bool HRocker::ccTouchBegan(CCTouch* touch, CCEvent* event) 

if (!active)

{

return false;

}

CCPoint touchPoint = touch->getLocationInView(); 

touchPoint = CCDirector:: sharedDirector()->convertToGL(touchPoint); 

if (ccpDistance(touchPoint, centerPoint) > radius){ 

return false; 

}

currentPoint = touchPoint; 

return true; 

void  HRocker::ccTouchMoved(CCTouch* touch, CCEvent* event) 

CCPoint touchPoint = touch->getLocationInView(); 

touchPoint = CCDirector:: sharedDirector()->convertToGL(touchPoint); 

if (ccpDistance(touchPoint, centerPoint) > radius) 

currentPoint =ccpAdd(centerPoint,ccpMult(ccpNormalize(ccpSub(touchPoint, centerPoint)), radius)); 

}else { 

currentPoint = touchPoint; 

void  HRocker::ccTouchEnded(CCTouch* touch, CCEvent* event) 

currentPoint = centerPoint; 

void  HRocker::ccTouchCancelled(CCTouch* touch, CCEvent* event) 

currentPoint = centerPoint; 

}

HRocker* HRocker::initWithCenter(CCPoint aPoint ,float aRadius ,CCSprite* aJsSprite,CCSprite* aJsBg,bool _isFollowRole){ 

active = false; 

radius = aRadius; 

centerPoint =aPoint; 

currentPoint = centerPoint; 

jsSprite = aJsSprite; 

jsSprite->setPosition(centerPoint); 

aJsBg->setPosition(centerPoint); 

aJsBg->setTag(88); 

this->addChild(aJsBg); 

this->addChild(jsSprite); 

this->Active();//激活搖杆 

return this; 

效果圖

裝甲逆襲-玩家移動處理
裝甲逆襲-玩家移動處理
裝甲逆襲-玩家移動處理