0

我对 C++ 编程和 Cocos2d-x 有点陌生,我的第一个 Cocos2d-x 游戏遇到了一些问题。我实际上只是在尝试模拟重力并据此更新玩家的位置。我正在运行 Xcode 4.6.1,出于某种原因,我在一次运行后不断收到 BAD_ACCESS 异常(如果我重新启动它似乎可以工作)。它发生在 libobjc.A.dylib`objc_release。我试过做一个 allexceptions 断点,它在 dylib 中的内存地址处中断。这只发生在我向我的 Player 类添加了一个速度变量之后,所以也许我没有正确分配指针等等?这是我相信的相关课程。

#include "cocos2d.h"

using namespace cocos2d;
class Player : public Sprite{
private:
    Point velocity;

public:
    static Player* create(const char *filename);
    void update(float delta);
    void setVelocity(const Point &v);
    const Point& getVelocity() const;
    ~Player();


};


#include "Player.h"
USING_NS_CC;
using namespace cocos2d;
Player::~Player(){

}

Player* Player::create(const char *filename){
    Player* self = (Player *) Sprite::create(filename);
    self->setVelocity(Point::ZERO);
    return self;
}

void Player::update(float delta){
    log("In player update");
    Point gravity = Point(0.0, -450.0);
    Point gravityStep = gravity * delta;
    this->setVelocity(this->getVelocity() + gravityStep);
    log("Velocity after setting: %f", getVelocity().y);
    Point stepVelocity = this->getVelocity() * delta;
    this->setPosition(this->getPosition() + stepVelocity);
    log("Position after setting: %f, %f", getPosition().x, getPosition().y);
}

void Player::setVelocity(const Point &v){
    this->velocity = v;
}

const Point& Player::getVelocity() const
{
    return this->velocity;
}

#include "GameLayer.h"

USING_NS_CC;

Scene* GameLayer::scene()
{
    // 'scene' is an autorelease object
    Scene *scene = Scene::create();

    // 'layer' is an autorelease object
    GameLayer *layer = GameLayer::create();

    // add layer as a child to scene
    scene->addChild(layer);

    // return the scene
    return scene;
}

GameLayer::~GameLayer(){
    CC_SAFE_RELEASE(player);
    CC_SAFE_RELEASE(map);
}

bool GameLayer::init()
{
    if ( !Layer::init() )
    {
        return false;
    }

    LayerColor *blueSky = LayerColor::create(*new Color4B(100, 100, 250, 255));
    this->addChild(blueSky);

    map = TMXTiledMap::create("level1.tmx");
    this->addChild(map);

    player = Player::create("koalio_stand.png");
    player->setPosition(Point(100,50));
    map->addChild(player, 15);

    setKeyboardEnabled(true);
    this->scheduleUpdate();

    return true;
}

void GameLayer::update(float dt){
    player->update(dt);
}

编辑:所以我发现 player 的构造函数是问题所在。但是,我想知道执行以下操作(因为 Player 继承自 Sprite)来复制 Sprite 函数是否符合规定:

Sprite* Sprite::create(const char *filename)
{
    Sprite *sprite = new Sprite();
    if (sprite && sprite->initWithFile(filename))
    {
        sprite->autorelease();
        return sprite;
    }
    CC_SAFE_DELETE(sprite);
    return NULL;
}

并让 Player 功能为:

Player* Player::create(const char *filename){
    Player *sprite = new Player();
    if (sprite && sprite->initWithFile(filename))
    {
        sprite->setVelocity(Point::ZERO);
        sprite->autorelease();
        return sprite;
    }
    CC_SAFE_DELETE(sprite);
    return NULL;
}

或者也许有一种更简洁的方法来调用 Sprite 的创建,而是创建一个继承并设置速度的 Player 对象?

4

0 回答 0