Как реализовать бонусы и другие игровые изменяющие объекты в target-C или cocos2d - PullRequest
2 голосов
/ 15 февраля 2011

Хорошо, у меня есть эти бонусы, которые я хочу на несколько секунд замедлить / ускорить движение других объектов в игре.

У меня есть массив объектов, у меня есть переменная, которая называется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 другим классом?Если так, как бы я реализовал что-то вроде этого?Я действительно ненавижу пытаться попросить кого-то решить мой вопрос, но я действительно не могу напрячь свой мозг вокруг этого, и я довольно новичок ... если бы мне это объяснили, то я знаю, что смогу реализоватьэто в будущих играх самостоятельно ...

Заранее спасибо, и дайте мне знать, если потребуется дополнительная информация ...

1 Ответ

1 голос
/ 20 февраля 2011

Я бы сделал что-то вроде

в файле .h

float speedModifier;
-(void)resetPowerUp;

в .м

-(void)resetPowerUp
{
    speedModifier = 1;
}

везде, где вы инициализируете уровень

[self resetPowerUp];

при столкновении с powerup:

speedModifier = 2;
[self performSelector:@selector(resetPowerUp) withObject:nil afterDelay:5];

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

надеюсь, что это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...