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