0

私は C++ プログラミングと Cocos2d-x の初心者で、初めての Cocos2d-x ゲームで問題が発生しています。私は文字通り、重力をシミュレートし、それに基づいてプレイヤーの位置を更新しようとしています。Xcode 4.6.1 を実行していますが、何らかの理由で、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 は 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;
}

それとも、スプライトの作成を呼び出すよりクリーンな方法がありますが、速度を継承して設定する Player オブジェクトを作成する方法はありますか?

4

0 に答える 0