私は 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 オブジェクトを作成する方法はありますか?