2016-06-30 1 views
0
std::vector<Spell*> playerSpells{ new Jump(1), new Arrow() }; 

for (int i = 0; i < playerSpells.size(); i++) 
{ 
    player->addSpell(playerSpells[i]); 
} 

for (int i = 0; i < player->getSpells().size(); i++) 
{ 
    auto spell = player->getSpells()[i]; 

    player->getSpells()[i]->icon->onClickEndEH.add([=]() { 
     auto a = player->getSpells()[i]; 
     auto b = player->getSpells()[i]->sprite; 
    }); 
} 

まず、spell変数をチェックし、そのフィールドが正しく初期化されています。ラムダ関数が呼び出されると、変数bが破損します。十分でない場合は、コードの他の部分を提供することができます。コピーによるラムダ関数のキャプチャ結果が破損したデータになる

できるだけ簡略化しました。

//GAMEOBJECT.H 
class GameObject 
{ 
public: 
    cocos2d::Sprite* sprite = nullptr; 

    GameObject(const std::string fileName = "", bool clickable = false); 
    ~GameObject(); 
}; 


//GAMEOBJECT.CPP 
GameObject::GameObject(const std::string fileName, bool addClickEvent) 
{ 
    if (fileName != "") 
    { 
     this->sprite = Sprite::create(fileName); 
    } 
    else 
    { 
     this->sprite = Sprite::create(); 
    } 

    if (addClickEvent) 
    { 
     this->addTouchListener(); 
     this->clickable = true; 
    } 
} 

GameObject::~GameObject() 
{ 
    Director::getInstance()->getEventDispatcher()->removeEventListener(this->listener); 
} 

//SPELL.H 
class Spell : public GameObject 
{ 
public: 
    GameObject* icon = nullptr; 

    Spell(const std::string fileName = "", bool clickable = false); 
    ~Spell(); 
} 

//SPELL.CPP 
Spell::Spell(const std::string fileName, bool clickable) : GameObject(fileName, clickable) 
{ 
} 

Spell::~Spell() 
{ 
    delete icon; 
} 

//ARROW.H 
class Arrow : public Spell 
{ 
public: 
    Arrow(); 
    ~Arrow(); 
}; 

//ARROW.CPP 
Arrow::Arrow() : Spell("arrow.png") 
{ 
    this->icon = new GameObject("arrow.png", true); 
} 
+0

ラムダが呼び出される前に 'playerSpells'のポインタで参照されていた呪文が破壊された可能性はありますか? – user2079303

+3

ストロークに遭遇したばかりか、これは有効ではないC++です。 "for each"と "player Spellsの自動スペル"は、PythonとC++の変わった奇妙な子孫のように見えます。 –

+0

@SamVarshavchik私はそれがVisual Studioについてだと思います。私はそれを変更するつもりです。しかし、それは働いている。 – Cem

答えて

1

retain()release()機能を追加することでそれを解決しました。私はcocos2dxがそのプールをチェックし、スプライトを削除すると思う。それはスコープ内のシーンに追加されていないからだ。

GameObject::GameObject(const std::string fileName, bool addClickEvent) 
{ 
    if (fileName != "") 
    { 
     this->sprite = Sprite::create(fileName); 
    } 
    else 
    { 
     this->sprite = Sprite::create(); 
    } 

    this->sprite->retain(); 

    if (addClickEvent) 
    { 
     this->addTouchListener(); 
     this->clickable = true; 
    } 
} 

GameObject::~GameObject() 
{ 
    this->sprite->release(); 
    Director::getInstance()->getEventDispatcher()->removeEventListener(this->listener); 
} 
関連する問題