cocos2d-x中的EXC_BAD_ACCESS

时间:2014-04-18 08:57:19

标签: c++ xcode cocos2d-x

我正在训练cocos2d-x。 我试图显示精灵动画,但显示EXC_BAD_ACCESS错误。

我编写的代码如下。

然而,当我写"动画"功能到" init"功能,EXC_BAD_ACCESS错误没有显示。

有什么问题?

GameScene.h

 #include "cocos2d.h"
 #include "SimpleAudioEngine.h"


 class GameScene : public cocos2d::CCLayer
 {
  public:
  // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
  virtual bool init();

  // there's no 'id' in cpp, so we recommend returning the class instance pointer
  static cocos2d::CCScene* scene();


  // implement the "static node()" method manually
  CREATE_FUNC(GameScene);

  void animation();


  cocos2d::CCSprite* pPlayer;

  //スプライトを格納する領域
  cocos2d::CCSpriteFrame* pSprites[12];

 };

GameScene.m

bool GameScene::init()
{
    if(!CCLayer::init())
    {
        return false;
    }



    //端末サイズ取得
CCSize visiblesize = CCDirector::sharedDirector()->getVisibleSize();

//背景画像
CCSprite* bgImg = CCSprite::create("pic1.jpg");

//背景画像のポジション
bgImg->setPosition(ccp(visiblesize.width / 2, visiblesize.height / 2));
//背景画像のポジションを取得
CCPoint pos = bgImg->getPosition();




//===============================================================================
//                              ボタンイベント作成


//ボタンイベント追加
CCMenuItemImage *tapitem = CCMenuItemImage::create("animButton.png", "animButton.png", this, menu_selector(GameScene::animation));

CCMenu* tapMenu = CCMenu::create(tapitem, NULL);

tapMenu->setPosition(ccp(bgImg->convertToNodeSpace(pos).x, bgImg->convertToNodeSpace(pos).y));

//ボタン画像設置
bgImg->addChild(tapMenu);
//背景画像設置
this->addChild(bgImg);


cocos2d::CCSpriteFrame* pSprites[12];

const int WIDTH_SIZE = 96; //1つのスプライトの幅
const int HEIGHT_SIZE = 64; //1つのスプライトの高さ

//●アトラスから矩形切り出し、スプライト領域に格納.アニメーション画像を扱いたい時は、pSpriteから取り出してください。
for(int y = 0; y < 4; y++){
    for(int x = 0; x < 3; x++){
        CCRect rect(x * WIDTH_SIZE, y * HEIGHT_SIZE,WIDTH_SIZE,HEIGHT_SIZE);
        pSprites[y * 3 + x] = CCSpriteFrame::create("texture1.png",rect);
    }
}



// プレイヤースプライトを生成
pPlayer= CCSprite::create("texture1.png", CCRectMake(0, 64, 96, 64));

// プレイヤーのポジション
pPlayer->setPosition(ccp(100,100));

//プレイヤーをシーンに登録して
bgImg->addChild(pPlayer);



return true;

}





void GameScene::animation()
{

//移動先の指定
CCMoveTo* move = CCMoveTo::create(1.8, ccp(200, 100));

//===============================================
//               アニメーションの作成
CCAnimation* animation = CCAnimation::create();


for(int i=3;i<6;i++){
    animation->addSpriteFrame(pSprites[i]);
}

//アニメーションの設定:1コマ0.1秒で切り替える
animation->setDelayPerUnit(0.1);

//アニメーションの設定:6回ループさせる
animation->setLoops(6);


CCRepeatForever *pAction = CCRepeatForever::create( CCAnimate::create(animation) );

// 作成したアニメーションを実行
pPlayer->runAction(pAction);
pPlayer->runAction(move);

}

1 个答案:

答案 0 :(得分:0)

好吧,它没有让我发表评论,因为我没有50个代表......这个错误到底出现了什么?我的意思是?

这是代码吗?

for(int i=3;i<6;i++){
    animation->addSpriteFrame(pSprites[i]);
}

如果是,那么请确保&#34; pSprites [i]&#34;还没有被释放......如果是这样的话,请用&#34; new&#34;然后自己进行清理。

这可能发生的原因是因为没有人在&#34; init&#34;中引用这些精灵。功能......当流出来时,&#34; init&#34;函数,这些值被释放(因为它们是使用CREATE创建的,默认情况下设置自动释放)

同样,这是我的假设,看着代码...... 请提供反馈!