Клон Бомбермана, как делать бомбы?

8

Я играю с клоном Bomberman, чтобы изучить развитие игры.

До сих пор я делал плитки, движение, обнаружение столкновений и сбор предметов. У меня также есть псевдо-бомбардировка (только графика и столкновения, никакой реальной функциональности).

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

В любом случае, я хотел бы сделать объект, который имеет общую информацию о бомбах:

function Bomb(){
  this.radius = player.bombRadius;
  this.placeBomb = function (){
    if(player.bombs != 0){
      // place bomb
    }
  }
  this.explosion = function (){
  // Explosion
  }
}

Я действительно не знаю, как вписать его в код, хотя. Каждый раз, когда я размещаю бомбу, мне нужно var bomb = new Bomb();или нужно постоянно иметь ее в сценарии, чтобы иметь к ней доступ.

Как бомба наносит урон? Это так же просто, как делать X, Y во всех направлениях, пока радиус не иссякнет или объект не остановит его? Могу ли я использовать что-то вроде setTimeout (bomb.explosion, 3000) в качестве таймера?

Любая помощь приветствуется, будь то простое объяснение теории или примеры кода на основе скрипки. Когда я пробовал объект таким образом, он нарушает код.

Обновление: теперь я размещаю бомбы, и через определенное время удаляю их в зависимости от позиции, в которой я их разместил. Но если я помещу бомбу до того, как первая бомба взорвется, она удалит только одну из них (очевидно, поскольку bombX и bombY изменились с момента размещения первой).

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

Текущий код:

function placeBomb(){
    if(placebomb && player.bombs != 0){
        map[player.Y][player.X].object = 2;
        bombX = player.X; bombY = player.Y;
        placebomb = false;
        player.bombs--;
        setTimeout(explode, 3000);
    }
}
function explode(){
    alert('BOOM!');
    delete map[bombY][bombX].object;
    player.bombs++;
}
justanotherhobbyist
источник
1
jsFiddle + Firebug -> инструмент создания прототипов игры? Никогда не думал об этом. +1 за то, что сразил меня очень приятно! :)
Anko

Ответы:

6

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

Вместо этого вы должны отслеживать, какие клавиши удерживаются в данный момент, вы можете сделать это следующим образом (в псевдокоде):

keyisdown=false
keydown event{
    if(!keyisdown){
        //This is the 'real' keydown event, the one that only happens the moment the
        //key is pressed down. You may not need it, but this is how you construct it.
    }
    keyisdown=true
}

keyup event{
    keyisdown=false
}

А затем в вашей функции обновления вы перемещаете игрока, если keyisdown, и, возможно, применяете некоторые другие условия, например, игрок не может двигаться, если он перемещался меньше, чем некоторое количество обновлений назад.

Сохраняйте обновленный счетчик или какой-либо другой способ отслеживания времени, чтобы ваш код всегда точно знал, как далеко он продвинулся.

Да бомба
Лично я бы сохранить его простым, вы на самом деле не нужно использовать this, newи все другие модные вещи в JavaScript , чтобы сделать полезные объекты.

Вы могли бы сделать что-то вроде:

bombobject = {} //That is all it takes to make an object.
bombobject.blowtime = currenttime + delay
bombobject.position = mapobject
mapobject.bomb = bombobject

Затем вы можете перемещаться по карте при каждом обновлении, проверять, есть ли бомба и не пора ли ее взорвать, если это так, взорвать и убрать объект бомбы.

Bugtracking
Ваш код пропускает ошибки, они довольно просты, но если вы не узнаете о них и не обработаете их, у вас будут проблемы позже. Каждый современный браузер имеет консоль разработчика Firebug clone. Откройте его, посмотрите на вкладку консоли скрипта, посмотрите весь неприятный красный текст и исправьте его.

Редактировать: Вопросы хронометража
Просто для записи, вы, вероятно, хотели бы что-то немного более продвинутое, чем setIntervalдля синхронизации, если вы серьезно, вам действительно нужно настроить свой код с учетом временного сдвига. См. Мой самый первый ответ о переполнении стека для приблизительного описания проблемы: https://stackoverflow.com/a/2549426/305545

Редактировать: setTimeOut версия исправлена
Так как вы используете одни и те же переменные для разных бомб, вы будете перезаписывать их при каждой установке новой бомбы. Вы можете использовать замыкание для создания отдельных переменных для каждой бомбы, например:

function placeBomb(){
    if(placebomb && player.bombs != 0){
        map[player.Y][player.X].object = 2;
        var bombX = player.X;
        var bombY = player.Y;
        placebomb = false;
        player.bombs--;
        setTimeout(explode, 3000);
    }
    function explode(){
        alert('BOOM!');
        delete map[bombY][bombX].object;
        player.bombs++;
    }
}

Теперь bombXи bombYпеременные и explodeфункции являются местными жителями к закрытию созданного placeBombs, таким образом , это локальный экземпляр , explodeкоторый прилагается к тайм - ауту, и он читает локальные переменные. Каждый раз, когда вы звоните, placeBombсоздается новое замыкание.

Я бы не использовал setTimeout для этого, я бы посчитал обновления, таким образом обеспечив фиксированное количество обновлений до того, как взорвалась бомба, но я думаю, это будет работать нормально.

AAAAAAAAAAAA
источник
Да, скрипка - это не тот же код, что и мой game.js, какая-то копия вставляется и просто вставляется наугад. Настоящий код не выдает никаких ошибок в средствах разработки Firebug или Chrome. Я постараюсь, чтобы ваша бомба сработала. Спасибо. :)
justanotherhobbyist
Действительно, без ошибок? Нет, если вы попытаетесь сойти с карты?
aaaaaaaaaaaa
Теперь, когда вы упомянули об этом, я понял это, но это не проблема, поскольку первые плитки - это бетонная рама. :) Просто карта скрипки, которая была упрощена.
justanotherhobbyist
Да, я заметил проблему с setTimeout, у меня теперь есть массив бомб, который отлично работает с 2 бомбами, при этом больше не удаляет среднюю, я думаю, что мне нужно сделать что-то вроде синхронизации, если (timer> = timeplaced) или что-то подобное. Я многому учусь, совершая ошибки и вынуждаясь разбираться с ними по ходу дела: D, несколько дней назад я даже не смогла сделать понг.
justanotherhobbyist
Добро пожаловать. И приятно слышать, что вы учитесь, иногда трудно поверить, что решение насущных проблем людей действительно приведет к чему угодно.
aaaaaaaaaaaa
0

Похоже, вы получили довольно хороший awnser, просто хотел добавить удобный код для взрывов.

            for (int i = 0; i < actor.blasradius; ++i)
        {
            tiles[actor.tileX - i][actor.tileY].explode(); //left
            tiles[actor.tileX + i][actor.tileY].explode(); //right
            tiles[actor.tileX][actor.tileY -i].explode(); //up
            tiles[actor.tileX][actor.tileY + i].explode(); //down
        }
omgnoseat
источник
Да, я получил что-то похожее, но с такими условиями, как ящики, бетон и т. Д. И разрушением или остановкой в ​​зависимости от этого. Код можно прочитать здесь: gamedev.stackexchange.com/questions/26065/…
justanotherhobbyist