cocos2d this-> getBoundingBox

时间:2017-06-09 15:29:33

标签: c++ cocos2d-x

在一个继承自cocos2d Sprite类的pawn类中,我在它的update函数中使用了this-> getBoundingBox()。这导致“读取位置的访问冲突”错误。然后,我将“this”与“GAME :: PLAYER”交换,这是一个引用播放器的命名空间中的变量,并且它起作用。当GAME :: PLAYER-> getBoundingBox()完美运行时,为什么this-> getBoundingBox()会导致错误?它们不应该是同一个东西吗?请注意,“这 - >”适用于任何其他函数但getBoundingBox。这是我做错的事吗?我对C ++不太好。

这是pawn.h

#include <cocos2d.h>

#ifndef PLAYER_CONTROLLER


#define PLAYER_CONTROLLER GAME::PLAYER







class pawn : public cocos2d::Sprite {
public:

pawn();
~pawn();

static pawn* create();
static pawn* create(bool default_moving);

bool moving;
bool right;
int speed;

cocos2d::Rect getBounds();
void step();
void initOptions();
void update(float dt) override;
void move(cocos2d::Vec2 vec);
void moveX(int x);
void moveY(int y);
virtual bool touchBegan(cocos2d::Touch*, cocos2d::Event*);
virtual void touchEnded(cocos2d::Touch*, cocos2d::Event*);

};

namespace GAME {
static pawn* PLAYER;
};



#endif

这是pawn.cpp

#include "player.h"
#include <cocos2d.h>


pawn::pawn() {

}

pawn::~pawn() {

}

bool pawn::touchBegan(cocos2d::Touch* touch, cocos2d::Event* event) {
    this->move(cocos2d::Vec2(5, 0));
    this->moving = false;
    return true;
}

void pawn::touchEnded(cocos2d::Touch* touch, cocos2d::Event* event) {
    this->moving = true;
}

void pawn::step() {
    if (this->moving) {
        if (this->right) {
            this->move(cocos2d::Vec2(this->speed, 0));
        }
        else {
            this->move(cocos2d::Vec2(-this->speed, 0));
        }
        if (this->getPositionX() < 0) {
            this->right = true; 
            CCLOG("Going right V4");
        }
        else {
            if (this->getPositionX() + this->getContentSize().width > cocos2d::Director::getInstance()->getWinSizeInPixels().width + cocos2d::Director::getInstance()->getVisibleOrigin().x){
                this->right = false;
                CCLOG("Going left V4");
            }
        }
    }
}

void pawn::move(cocos2d::Vec2 vec) {
    PLAYER_CONTROLLER->setPosition(cocos2d::Vec2(PLAYER_CONTROLLER->getPositionX() + vec.x, PLAYER_CONTROLLER->getPositionY() + vec.y));
}

void pawn::moveX(int x) {

}

void pawn::moveY(int y) {

}

void pawn::update(float dt) {
    //cocos2d::Rect act = this->getBoundingBox();
    this->getPosition();
    this->step();
}

cocos2d::Rect pawn::getBounds() {
    if (!PLAYER_CONTROLLER) {
        CCLOG("Is this the problem?");
    }

    return PLAYER_CONTROLLER->getBoundingBox();
}

pawn* pawn::create() {

    auto character = new pawn();
    character->moving = true;
    character->right = false;
    character->speed = 5;
    character->setPositionY(50);

    if (PLAYER_CONTROLLER == NULL) {
        CCLOG("There is no player, yet.");
        CCLOG("Adding player");
        PLAYER_CONTROLLER = character;
    }
    else {
        CCLOG("There's already a player");
        return NULL;
    }

    //character->setPositionX(40);
    if (character->initWithFile("Base.jpg")){
        return character;
    }
    CC_SAFE_DELETE(character);
    return NULL;
}

pawn* pawn::create(bool default_moving) {

    pawn* character = new pawn();
    character->moving = default_moving;
    character->setPositionX(40);
    if (character->initWithFile("Base.jpg")){
        return character;
    }
    CC_SAFE_DELETE(character);
    return NULL;
}

是否因为我从另一个类调用pawn方法?我使用Collider类来调用pawn中的函数

Collider.cpp

#include "Collider.h"
#include "player.h"


Collider::Collider() : CollideMode(OVERLAP) {

}

Collider::~Collider() {

}

Collider* Collider::create() {
    Collider* col = new Collider;

    if (col->initWithFile("Base.jpg")){
        col->setAnchorPoint(cocos2d::Vec2(0, 0));
        col->setContentSize(cocos2d::Size(100, 100));
        return col;
    }
    CC_SAFE_DELETE(col);
    return NULL;
}

void Collider::collision(cocos2d::Vec2 intersect) {
    CCLOG("IT IS COLLIDING");
    if (intersect.x < intersect.y) {
        PLAYER_CONTROLLER->move(cocos2d::Vec2(-intersect.x, 0));
        CCLOG("X");
    }
    else if (intersect.x > intersect.y) {
        PLAYER_CONTROLLER->move(cocos2d::Vec2(0, -intersect.y));
        CCLOG("Y");
    }
}

void Collider::update(float dt) {
    //cocos2d::Rect col = this->getBoundingBox();
    auto act = PLAYER_CONTROLLER->getBounds();
    if (PLAYER_CONTROLLER) {
        if (!PLAYER_CONTROLLER) {
            CCLOG("There is no player?");
        }

    }
    else {
        CCLOG("Not colliding");
    }
}

2 个答案:

答案 0 :(得分:0)

this->getBoundingBox()函数内update(float dt)似乎没有任何问题。

我创建了小测试:

.h文件

中的

声明

class MySprite: public Sprite {

public:

    bool init() override;
    void update(float) override;

    CREATE_FUNC(MySprite);
};

现在.cpp文件

中的方法定义
bool MySprite::init(){

    if(!Sprite::init())
        return false;

    scheduleUpdate();
    return true;
}

void MySprite::update(float dt){

    auto rect=this->getBoundingBox();
    CCLOG("Inside Update method of MySprite Bounding rect Width %f & Height %f",rect.size.width,rect.size.height);
}

然后我创建了一个MySprite的自动释放对象并添加到父级。

auto mysprite=MySprite::create();
mysprite->setContentSize(Size(10,10));
addChild(mysprite);

在输出控制台上运行,预期结果。

答案 1 :(得分:0)

我看到了我的错误。事实上我每次都包含pawn.h时重新定义名称空间“GAME”和它的变量“GAME :: PLAYER”,我调用pawn函数的其他源文件不知道GAME :: PLAYER或者PLAYER_CONTROLLER(只是GAME :: PLAYER的一个宏),因为我只在pawn.cpp中定义了PLAYER_CONTROLLER。这就是为什么当你在另一个文件中调用PLAYER_CONTROLLER-&gt; method()时,它将NULL作为“this”传递,以及为什么PLAYER_CONTROLLER指的是另一个PLAYER_CONTROLLER而不是传入的“this”。

我通过使用extern关键字解决了这个问题,该关键字使变量在所有文件之间全局化,这是我的初衷。

pawn.h

#include <cocos2d.h>

#ifndef PLAYER_CONTROLLER


#define PLAYER_CONTROLLER GAME::PLAYER
#define INITIALIZE_PLAYER pawn* GAME::PLAYER = NULL





class pawn : public cocos2d::Sprite {
public:

    pawn();
    ~pawn();


    static pawn* create();
    static pawn* getController();
    static pawn* create(bool default_moving);

    bool moving;
    bool right;
    int speed;

    cocos2d::Rect getBounds();
    void step();
    void initOptions();
    void update(float dt) override;
    void move(cocos2d::Vec2 vec);
    void moveX(int x);
    void moveY(int y);
    virtual bool touchBegan(cocos2d::Touch*, cocos2d::Event*);
    virtual void touchEnded(cocos2d::Touch*, cocos2d::Event*);
};




namespace GAME {
    extern pawn* PLAYER;
};



#endif

这就是为什么我说我不擅长C ++。