2016-09-27 10 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' он должен автоматически освобождаться (через' autorelease'), если вы вызываете 'release' после того, как вы закончите использовать его (потому что значение count count равно 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

Я получаю: неправильная контрольная сумма для освобожденного объекта - объект, вероятно, был изменен после освобождения. FYI неоднократно называет этот func, чтобы отображать много шаров на экране. Также я использую void вместо int, поэтому мне пришлось вводить его как (Ball *) Ball :: create(); – ctapp1

+0

спасибо за попытку хотя – ctapp1