Cocos2d.Снизить скорость (скорострельность) огня (пуль)? - PullRequest
0 голосов
/ 31 марта 2012

У меня есть геймпад с панелью управления и 2 кнопками. Все они цифровые (не аналоговые).

У меня есть процедура для обработки своих событий:

-(void)gamepadTick:(float)delta
{
    ...
    if ([gamepad.B active]) {
        [ship shoot];
    }
    ...
}

И я вызываю это командой:

[self schedule:@selector(gamepadTick:) interval:1.0 / 60];

[Корабельная стрельба] вызывает функцию стрельбы из класса оружия:

-(void)shoot
{
    Bullet *bullet = [Bullet bulletWithTexture:bulletTexture];
    Ship *ship = [Ship sharedShip];
    bullet.position = [ship getWeaponPosition];
    [[[CCDirector sharedDirector] runningScene] addChild:bullet];

    CGSize winSize = [[CCDirector sharedDirector] winSize];
    int realX = ship.position.x;
    int realY = winSize.height + bullet.contentSize.height / 2;
    CGPoint realDest = ccp(realX, realY);

    int offRealX = realX - bullet.position.x;
    int offRealY = realY - bullet.position.y;
    float length = sqrtf((offRealX*offRealX) + (offRealY*offRealY));
    float velocity = 480/1; // 480pixels/1sec
    float realMoveDuration = length / velocity;

    [bullet runAction:[CCSequence actions:[CCMoveTo actionWithDuration:realMoveDuration position:realDest],
                       [CCCallFuncN actionWithTarget:self selector:@selector(bulletMoveFinished:)], nil]];
}

-(void)bulletMoveFinished:(id)sender
{
    CCSprite *sprite = (CCSprite *)sender;
    [[[CCDirector sharedDirector] runningScene] removeChild:sprite cleanup:YES];
}

Проблема в том, что оружие стреляет слишком много пуль. Можно ли уменьшить их количество без записи, используя таймеры и функции, которые являются отдельными для каждой кнопки и панели управления?

Ответы [ 2 ]

1 голос
/ 01 апреля 2012

Используйте Delta для отслеживания времени между съемками, и снимайте, только если Delta увеличилась на определенную величину. Это обычный способ делать вещи, которые вам не нужны в каждом кадре.

Вам потребуется сохранить счетчик времени iVar, увеличивая его на Delta при каждом снимке, а затем проверяйте количество прошедшего времени, чтобы увидеть, соответствует ли оно требуемому интервалу порога; если это произойдет, снимите и сбросьте истекшее время до 0.

0 голосов
/ 13 апреля 2012
-(void) update:(ccTime)delta {
totalTime += delta;
if (fireButton.active && totalTime > nextShotTime) {
    nextShotTime = totalTime + 0.5f;
    GameScene* game = [GameScene sharedGameScene];
    [game shootBulletFromShip:[game defaultShip]];
}
// Allow faster shooting by quickly tapping the fire button if (fireButton.active == NO)
{
    nextShotTime = 0;
}
}

это оригинальный код из книги Штеффена Иттерхайма "Изучите разработку игр cocos2d". Но я могу немного улучшить этот код.

Обновлено

Труднее понять мой код, чем оригинальный, но он имеет правильную структуру. Это означает следующее: - глобальный таймер принадлежит сцене; - корабль может стрелять из оружия; - оружие может стрелять пулями, и задержка между пулями относится к этому оружию (не к сцене, как в оригинальном примере)

Класс Scene содержит переменную totalTime, объект корабля и следующий метод для обработки обновления таймера:

-(void)update:(ccTime)delta
{
    totalTime += delta;

    if (!fireButton.active) {
        ship.weapon.nextShotTime = 0;
    } else if (totalTime > ship.weapon.nextShotTime) {
        [ship.weapon updateNextShotTime:totalTime];
        [ship shoot];
    }
}

Класс кораблей содержит объект оружия и метод выстрела (этот метод не подходит для этого вопроса).

Класс оружия содержит переменную nextShotTime и следующий метод:

-(void)updateNextShotTime:(ccTime)currentTime
{
    nextShotTime = currentTime + 0.05f;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...