2016-03-20 46 views
0

İyi günler,Neden() içinde bir Eylem çalıştırılıyor() uygulamayı çöker?

senaryo bu, ben 3 sprite var ve güncelleme() içinde dizisini kullanarak onlara eylemleri yürütmek istiyoruz. Hareketlendiricinin yine de eylemi yürütmesi durumunda yeni bir işlem gerçekleşmez, ancak eylemi yürütürse, yeni bir eylem oluşturur ve sonra yürütür.

Kontrol için .isDone() kullanıyorum. okunabilir olması için

-Legend: Burada

sözde kodu SampleSprite - Bu sprites dizi olduğunu varsayarak. isStillOnAction - boolean, true şu anda eylem gerçekleştiriyorsa, yanlış eğer değilse. - 2-5 DAN RASTGELE SAYI 5.

for(int ctr = 0; ctr < 3; ctr++){ 
if(!SpriteSample[ctr].isStillOnAction)   // not currently executing action, so we can now assign an action 
{ 
    SampleSprite[ctr].isStillOnAction = true; // the isStillOnAction boolean is changed to true 

    if(SampleSprite[ctr].facingDirection == 1) 
    { 
     SampleSprite[ctr].moveAction = cocos2d::MoveBy::create(RANDOM NUMBER FROM 2-5, cocos2d::Vec2(0, 100)); 
     SampleSprite[ctr].stoppingAction = cocos2d::MoveBy::create(RANDOM NUMBER FROM 2-5, cocos2d::Vec2(10, 0)); 
    } 
    else if(SampleSprite[ctr].facingDirection == 2) 
    { 
     SampleSprite[ctr].moveAction = cocos2d::MoveBy::create(RANDOM NUMBER FROM 2-5, cocos2d::Vec2(0, -100)); 
     SampleSprite[ctr].stoppingAction = cocos2d::MoveBy::create(RANDOM NUMBER FROM 2-5, cocos2d::Vec2(10, 0)); 
    } 
    else if(SampleSprite[ctr].facingDirection == 3) 
    { 
     SampleSprite[ctr].moveAction = cocos2d::MoveBy::create(RANDOM NUMBER FROM 2-5, cocos2d::Vec2(-100, 0)); 
     SampleSprite[ctr].stoppingAction = cocos2d::MoveBy::create(RANDOM NUMBER FROM 2-5, cocos2d::Vec2(0,10)); 
    } 
    else if(SampleSprite[ctr].facingDirection == 4) 
    { 
     SampleSprite[ctr].moveAction = cocos2d::MoveBy::create(RANDOM NUMBER FROM 2-5, cocos2d::Vec2(100, 0)); 
     SampleSprite[ctr].stoppingAction = cocos2d::MoveBy::create(RANDOM NUMBER FROM 2-5, cocos2d::Vec2(0, 10)); 
    } 

    SampleSprite[ctr].moveStopAction = cocos2d::Sequence::create(SampleSprite[ctr].moveAction, SampleSprite[ctr].stoppingAction, nullptr); 
    SampleSprite[ctr].characterSprite->runAction(SampleSprite[ctr].moveStopAction); 
} 
else // currently executing action 
{ 
     if(SampleSprite[ctr].moveStopAction->isDone())   // check if done executing action 
     { 
      SampleSprite[ctr].isStillOnAction = false;   
     } 
}} 

Sonuç 2'den rastgele bir sayıdır: Bu dizi eylem çalışır ancak sonra çöker donar sonra .

Gözardı ettiğim olası sorun nedir?

app çökme olmaz planlanmış bir işlevi içinde

cevap

0

Koşu eylemleri gülümseme şimdiden teşekkürler. Sorun şu şekildedir: .isDone() kullanıldığında eylem serbest bırakılacak.

  1. . Bir eylem yapıldığında, referans sayımını azaltır ve korumasız sürece serbest bırakılır (önerilmez).
  2. MoveBy::create() bir otomatik bırakma nesnesini döndürür; yani, runAction numaralı telefonu aramazsanız veya alıkoymazsanız, bu çerçevenin sonunda serbest bırakılır.
Bir aksiyon çalışır durumda olup olmadığını kontrol etmek için etiketleri kullanabilirsiniz

: ben kendi, nasıl dizisi içinde başka bir boşluk işlevi çağırmak için sırasını kullanan başka bir yol düzeltmeye görünüyor

static const int MY_MOVEBY_ACTION = 3333; 
for(int ctr = 0; ctr < 3; ctr++){ 
if(!SpriteSample[ctr].characterSprite->getActionByTag(MY_MOVE_ACTION))   // not currently executing action, so we can now assign an action 
{ 
    SampleSprite[ctr].isStillOnAction = true; // the isStillOnAction boolean is changed to true 

    //...... 

    SampleSprite[ctr].moveStopAction = cocos2d::Sequence::create(SampleSprite[ctr].moveAction, SampleSprite[ctr].stoppingAction, nullptr); 
    moveStopAction->setTag(MY_MOVE_ACTION); 
    SampleSprite[ctr].characterSprite->runAction(SampleSprite[ctr].moveStopAction); 
} 
else // currently executing action 
{ 
     if(SampleSprite[ctr].moveStopAction->isDone())   // check if done executing action 
     { 
      SampleSprite[ctr].isStillOnAction = false;   
     } 
}} 
+0

Teşekkür? – nightrobin

+0

'Action :: setCallbackFunc'? @nightrobin – Zen