Move.h
#ifndef __RPG_Move__Move__
#define __RPG_Move__Move__
#include <iostream>
#include "cocos2d.h"
using namespace cocos2d;
class Move : public CCLayer
{
public:
static Move* createMove(CCSprite *_play, CCTMXTiledMap *_map);
void initMove(CCSprite *_play, CCTMXTiledMap *_map);
CCSprite* play;
CCTMXTiledMap* map;
float SW, SH; //设备的宽和高
bool isUp, isDown, isLeft, isRight; //标识主角是否移动
bool mapUp, mapDown, mapLeft, mapRight; //标识地图是否移动
void update(float time);//更新函数
void logic(); //逻辑函数
void move(); //主角和地图是否移动函数
virtual void onEnter();
virtual void onExit();
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
};
#endif /* defined(__RPG_Move__Move__) */
Move.cpp
#include "Move.h"
Move* Move::createMove(CCSprite *_play, CCTMXTiledMap *_map)
{
Move* layer = new Move();
if (layer && layer->init()) {
layer->autorelease();
layer->initMove(_play, _map);
return layer;
}
CC_SAFE_DELETE(layer);
return NULL;
}
void Move::initMove(CCSprite *_play, CCTMXTiledMap *_map)
{
play = _play;
map = _map;
//得到设备和宽和高
SW = CCDirector::sharedDirector()->getWinSize().width;
SH = CCDirector::sharedDirector()->getWinSize().height;
scheduleUpdate(); //调用更新函数 void update(float time)
}
void Move::update(float time)
{
logic(); //判断逻辑
move(); //移动
}
void Move::logic()
{
if (isRight) {
//在地图不超出屏幕的情况下
if (map->getPositionX() > SW - map->getContentSize().width) {
if (play->getPositionX() < SW*0.5) {
}else{
mapRight = true;
play->setPositionX(SW*0.5);
}
}else{
mapRight = false;
}
}
if (isLeft) {
//在地图不超出屏幕的情况下
if (map->getPositionX() < 0) {
if (play->getPositionX() > SW*0.5) {
}else{
mapLeft = true;
play->setPositionX(SW*0.5);
}
}else{
mapLeft = false;
}
}
if (isUp) {
//在地图不超出屏幕的情况下
if (map->getPositionY() > SH - map->getContentSize().height) {
if (play->getPositionY() < SH*0.5) {
}else{
mapUp = true;
play->setPositionY(SH*0.5);
}
}else{
mapUp = false;
}
}
if (isDown) {
//在地图不超出屏幕的情况下
if (map->getPositionY() < 0) {
if (play->getPositionY() > SH*0.5) {
}else{
mapDown = true;
play->setPositionY(SH*0.5);
}
}else{
mapDown = false;
}
}
}
void Move::move()
{
//判断主角是否移动
if (isUp) {
play->setPositionY(play->getPositionY()+1);
}
if (isDown) {
play->setPositionY(play->getPositionY()-1);
}
if (isLeft) {
play->setPositionX(play->getPositionX()-1);
}
if (isRight) {
play->setPositionX(play->getPositionX()+1);
}
//判断地图是否移动
if (mapUp) {
map->setPositionY(map->getPositionY()-1);
}
if (mapDown) {
map->setPositionY(map->getPositionY()+1);
}
if (mapLeft) {
map->setPositionX(map->getPositionX()+1);
}
if (mapRight) {
map->setPositionX(map->getPositionX()-1);
}
}
//当用户点下时开始移动
bool Move::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent){
if (pTouch->getLocation().x > SW*0.8) {
isRight = true;
}
if (pTouch->getLocation().x < SW*0.2) {
isLeft = true;
}
if (pTouch->getLocation().y > SH*0.8) {
isUp = true;
}
if (pTouch->getLocation().y < SH*0.2) {
isDown = true;
}
return true;
}
void Move::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent){
}
//当用户抬起时停止移动
void Move::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent){
isUp = false;
isDown = false;
isLeft = false;
isRight = false;
mapUp = false;
mapDown = false;
mapLeft = false;
mapRight = false;
}
void Move::onEnter(){
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
CCLayer::onEnter();
}
void Move::onExit(){
CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
CCLayer::onExit();
}