RPG 游戏主角与地图移动关系封装类

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();
}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值