Я играю с клоном 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++;
}
источник
Ответы:
Это выглядит не так уж плохо, но вам нужно лучше контролировать время и ввод. Поскольку скорость движения зависит от настройки повторения нажатий клавиш на компьютере пользователя, это не совсем оптимально.
Вместо этого вы должны отслеживать, какие клавиши удерживаются в данный момент, вы можете сделать это следующим образом (в псевдокоде):
А затем в вашей функции обновления вы перемещаете игрока, если
keyisdown
, и, возможно, применяете некоторые другие условия, например, игрок не может двигаться, если он перемещался меньше, чем некоторое количество обновлений назад.Сохраняйте обновленный счетчик или какой-либо другой способ отслеживания времени, чтобы ваш код всегда точно знал, как далеко он продвинулся.
Да бомба
Лично я бы сохранить его простым, вы на самом деле не нужно использовать
this
,new
и все другие модные вещи в JavaScript , чтобы сделать полезные объекты.Вы могли бы сделать что-то вроде:
Затем вы можете перемещаться по карте при каждом обновлении, проверять, есть ли бомба и не пора ли ее взорвать, если это так, взорвать и убрать объект бомбы.
Bugtracking
Ваш код пропускает ошибки, они довольно просты, но если вы не узнаете о них и не обработаете их, у вас будут проблемы позже. Каждый современный браузер имеет консоль разработчика Firebug clone. Откройте его, посмотрите на вкладку консоли скрипта, посмотрите весь неприятный красный текст и исправьте его.
Редактировать: Вопросы хронометража
Просто для записи, вы, вероятно, хотели бы что-то немного более продвинутое, чем
setInterval
для синхронизации, если вы серьезно, вам действительно нужно настроить свой код с учетом временного сдвига. См. Мой самый первый ответ о переполнении стека для приблизительного описания проблемы: https://stackoverflow.com/a/2549426/305545Редактировать: setTimeOut версия исправлена
Так как вы используете одни и те же переменные для разных бомб, вы будете перезаписывать их при каждой установке новой бомбы. Вы можете использовать замыкание для создания отдельных переменных для каждой бомбы, например:
Теперь
bombX
иbombY
переменные иexplode
функции являются местными жителями к закрытию созданного placeBombs, таким образом , это локальный экземпляр ,explode
который прилагается к тайм - ауту, и он читает локальные переменные. Каждый раз, когда вы звоните,placeBomb
создается новое замыкание.Я бы не использовал setTimeout для этого, я бы посчитал обновления, таким образом обеспечив фиксированное количество обновлений до того, как взорвалась бомба, но я думаю, это будет работать нормально.
источник
Похоже, вы получили довольно хороший awnser, просто хотел добавить удобный код для взрывов.
источник