首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cocos2d-x中的EXC_BAD_ACCESS

cocos2d-x中的EXC_BAD_ACCESS
EN

Stack Overflow用户
提问于 2014-04-18 08:57:18
回答 1查看 1.7K关注 0票数 0

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

我编写了如下代码。

然而,当我将“动画”函数写到"init“函数的内部时,EXC_BAD_ACCESS错误没有显示出来。

怎么啦?

GameScene.h

代码语言:javascript
复制
 #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

代码语言:javascript
复制
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);

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-19 11:36:40

嗯,因为我没有50名代表,所以我没有留下评论.这个错误到底是在哪里出现的?我是说台词?

是这段代码吗?

代码语言:javascript
复制
for(int i=3;i<6;i++){
    animation->addSpriteFrame(pSprites[i]);
}

如果是,那么请确保"pSpritesi“还没有发布.如果是这样的话,请用“新”创建它,然后自己进行清理。

之所以会发生这种情况是因为没有人在"init“函数中引用这些精灵.当流从"init“函数中出来时,这些值将被释放(因为它们是用默认设置自动释放的CREATE创建的)。

再说一次,这是我的假设,看看密码.请给出你的反馈!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23150801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档