玩家移動目前采取的是搖杆方式,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;
}
效果圖