Хорошо, у меня есть эти бонусы, которые я хочу на несколько секунд замедлить / ускорить движение других объектов в игре.
У меня есть массив объектов, у меня есть переменная, которая называетсяspawnInterval, который становится все быстрее и быстрее по мере прохождения игры, что усложняет эму через несколько минут.
Но я не могу понять, как это сделать, чтобы персонаж в игре по-разному реагировал на разные объектыкак в случае, когда fastPowerUp поражен спрайтом персонажа, интервал появления не меняется.
И наоборот с slowPowerUp.
код, который у меня есть на данный момент, таков:метод перемещения последовательности, который вызывается в методе обновления:
-
(void) updateObstacles:(ccTime)delta{
for (int i = 0; i < 20; i++) {
//int randomizer = CCRANDOM_0_1() * [obstacles count];
//NSLog(@"randomizer: %i",randomizer);
CCSprite* randomObject = [obstacles randomObject];
currentObject = [obstacles indexOfObject:randomObject];
if ([randomObject numberOfRunningActions] == 0) {
[self runObstacleMoveSequence:randomObject withTimer:delta];
break;
}
}
}
-(void) runObstacleMoveSequence:(CCSprite *)object withTimer:(ccTime)delta{
static int time;
//Slowly increase object speed
numObstaclesMoved++;
if (!slowPowerUp && !fastPowerUp) {
time += delta;
if (numObstaclesMoved % 17 == 0 && obstacleMoveDuration > 2.0f) {
obstacleMoveDuration -= 0.2f;
if (spawnInterval > 0.1f) {
[self unschedule:@selector(updateObstacles:)];
[self schedule:@selector(updateObstacles:) interval:spawnInterval];
spawnInterval-=0.1f;
NSLog(@"interval: %f",spawnInterval);
}
}
}else if (slowPowerUp && !fastPowerUp) {
if (numObstaclesMoved % 17 == 0 && obstacleMoveDuration > 2.0f) {
obstacleMoveDuration += 3.0f;
if (spawnInterval > 0.1f) {
[self unschedule:@selector(updateObstacles:)];
[self schedule:@selector(updateObstacles:) interval:spawnInterval];
spawnInterval-=0.1f;
NSLog(@"interval: %f",spawnInterval);
if (time >= (delta + 3)) {
slowPowerUp = NO;
obstacleMoveDuration -= 3.0f;
}
}
}
}else if (!slowPowerUp && fastPowerUp) {
if (numObstaclesMoved % 17 == 0 && obstacleMoveDuration > 2.0f) {
obstacleMoveDuration -= 3.0f;
if (spawnInterval > 0.1f) {
[self unschedule:@selector(updateObstacles:)];
[self schedule:@selector(updateObstacles:) interval:spawnInterval];
spawnInterval-=0.1f;
NSLog(@"interval: %f",spawnInterval);
if (time >= (delta + 3)) {
fastPowerUp = NO;
obstacleMoveDuration += 3.0f;
}
}
}
}
CGSize screenSize = [[CCDirector sharedDirector]winSize];
CGPoint aboveScreenPosition = CGPointMake(object.position.x, screenSize.height - object.position.y);
int rotations = (CCRANDOM_0_1()*3) * 360;
float duration = (CCRANDOM_0_1()*5.0f) + 8.0f;
CCMoveTo* move = [CCMoveTo actionWithDuration:obstacleMoveDuration position:aboveScreenPosition];
CCRotateTo* rotate = [CCRotateBy actionWithDuration:duration angle:rotations];
CCSpawn* moveRotate = [CCSpawn actions: move, rotate, nil];
CCCallFuncN* call = [CCCallFuncN actionWithTarget:self selector:@selector(objectAboveScreen:)];
CCSequence* sequence = [CCSequence actions:moveRotate, call, nil];
[object runAction:sequence];
if (time >= (delta + 3)) {
fastPowerUp = NO;
}
}
-(void) objectAboveScreen:(id) sender{
//make sure sender is actually of the right class
NSAssert([sender isKindOfClass:[CCSprite class]], @"sender is not a CCSprite!");
CCSprite* obstacle = (CCSprite*)sender;
//move the back to the bottom of the screen
CGPoint pos = obstacle.position;
CGSize screenSize = [[CCDirector sharedDirector]winSize];
pos.y = (-screenSize.height - [obstacle texture].contentSize.height);
pos.x = CCRANDOM_0_1() * screenSize.width;
obstacle.position = pos;
}
Я просто не знаю, куда идти ... Должен ли я сделать powerUps другим классом?Если так, как бы я реализовал что-то вроде этого?Я действительно ненавижу пытаться попросить кого-то решить мой вопрос, но я действительно не могу напрячь свой мозг вокруг этого, и я довольно новичок ... если бы мне это объяснили, то я знаю, что смогу реализоватьэто в будущих играх самостоятельно ...
Заранее спасибо, и дайте мне знать, если потребуется дополнительная информация ...