Проверка наличия CCSprite, добавление и удаление из CCScene и циклическое выполнение до выполнения условия - PullRequest
0 голосов
/ 18 декабря 2011

В настоящее время я работаю над игрой, в которой я добавляю CCSprite к сцене (анимированный призрак) и заставляю его перемещаться из случайно сгенерированной точки в другую случайно сгенерированную точку, исчезать и затем удаляться изсцена.Когда игрок касается призрака, к баллу добавляется 1.

Все работает прекрасно, но я хочу, чтобы это действие повторялось до тех пор, пока не будет выполнено условие (в частности, когда счет достигнет 50).Я не могу найти лучший способ сделать это.Каждый раз, когда я пытаюсь запустить цикл, он повторяется бесконечно и вылетает из игры.

Каков наилучший способ добиться такой петли?Я слышал упоминание о создании массивов для спрайтов, но за один раз на сцене будет только одна итерация призрака.Есть ли другие способы достижения этого?

В идеале, я хочу достичь: выполнить действия, дождаться их завершения, а затем запустить их снова, пока счет не станет равным 50.

Вот мой код:

-(void) ghostSpawner {


CGPoint endPoint = [self randomPointGenerator];
[self birthGhost];

CCSprite * Ghost = (CCSprite *) [self getChildByTag:2];



//...then fade him in
CCFiniteTimeAction *ghostBegin = [CCSequence actions:[CCDelayTime actionWithDuration:1],[CCTintTo actionWithDuration:0 red:0 green:0 blue:0],[CCTintTo actionWithDuration:.5 red:255 green:255 blue:255], nil];

//...move him over a given amount of time, then fade him out and DIE
CCFiniteTimeAction *ghostEnd = [CCSequence actions:[CCMoveTo actionWithDuration:2     position:endPoint],[CCTintTo actionWithDuration:1 red:0 green:0 blue:0],[CCCallFunc actionWithTarget:self selector:@selector(killGhost)], nil] ;

[Ghost runAction:[CCRepeatForever actionWithAction:[CCSequence actions:ghostBegin,ghostEnd, nil]]];
}

Для генерации спрайта:

-(void) birthGhost {
CGPoint spawnPoint = [self randomPointGenerator];  
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"ghostidle.plist"];

CCSprite * Ghost = [CCSprite spriteWithSpriteFrameName:@"Ghost0001.png"];
[Ghost setColor:ccc3(0,0,0)];
Ghost.anchorPoint = ccp(.5, .5);
Ghost.position = spawnPoint;
Ghost.anchorPoint = ccp(0.5f,0.5f);
Ghost.scale = .4;
Ghost.tag = 2;

[Ghost runAction:ghostIdleAnimation()];
[self addChild:Ghost z:0];
}

Функция 'ghostSpawner' вызывается в моем init'е на сцене

[self ghostSpawner];

Надеюсь, этого достаточно.Любой отзыв будет потрясающим, так как это один из моих первых настоящих проектов для iPhone.Заранее спасибо!

1 Ответ

3 голосов
/ 18 декабря 2011

Хорошо, вот как бы я это сделал:

  1. Отправить ghostSpawner для себя при инициализации (как вы делаете сейчас).

  2. ВghostSpawner, возьмите свой спрайт, сбросьте его (измените непрозрачность на 0, сбросьте позицию и т. д.), затем отправьте ему 2 сообщения runAction: одно для перехода, другое для перемещения в конечную позицию, затем отправьте сообщение killGhostк себе.

  3. В killGhost проверьте, не меньше ли 50 очков. Если это так, отправьте ghostSpawner снова себе, в противном случае сделайте все, что вы делаете, когда они набрали 50 очков.

Ваш код создания спрайта должен быть в init.Вы можете просто использовать один и тот же спрайт.Также есть CCFadeIn, который вы можете использовать вместо CCTintTo.

...