2016-09-27 65 views
1

在我的遊戲場景中,我從一個隨着MoveBy動作隨機移動的球類生成球。我的問題是,在MoveTo動作結束後,我如何釋放球?請參閱我下面的代碼:行動後釋放新對象

//GameScene class 
... 

Ball *ball = new Ball(); //<----need to release this after action is over 
ball->spawnBall(this); 

... 


//Ball class 
... 

void Ball::spawnBall(cocos2d::Layer *layer){ 

ball = Sprite::create(); 
layer->addChild(ball); 
auto action = Sequence::create(MoveBy::create(...)), RemoveSelf::create(), null); 
ball->runAction(action); 

} 

我想擁有它的內存(堆)的控制,因爲我發現用自動釋放(棧):

Ball ball; 
    ball.spawnBall(this); 

某些球會隨機停止。我想他們在產卵時覆蓋了他們的記憶。

感謝

+0

你知道嗎如果你創造e通過'create'方法,如果在完成使用之後調用'release',它會自動釋放(通過'autorelease')(因爲保留計數爲0)? – PnotNP

+0

是的,我知道create()方法會自動發佈。但我不確定這是否解決了我的問題。你能提供一個例子嗎?謝謝 – ctapp1

回答

0

您的問題似乎是,你的堆棧變量是走出去的範圍,如果runAction是異步調用:

int GameScene::func() 
{ 
Ball ball; 
ball.spawnBall(this); 
return 0; //ball is automatically deleted here 
} 

你應該能夠

int GameScene::func() 
{ 
Ball *ball = Ball::create(); //dont use new here, use create() function here and autorelease 
ball.spawnBall(this); 
//autorelease here 
return 0; 
} 

我強烈推薦閱讀Memory deallocation in Cocos2d-x

+0

我得到:釋放對象的校驗和不正確 - 對象可能在釋放後被修改。僅供參考,我會反覆調用這個函數來在屏幕上顯示許多球。另外我使用的是void而不是int,所以我必須將它轉換爲(Ball *)Ball :: create(); – ctapp1

+0

謝謝你嘗試 – ctapp1