Нажмите клавишу "Дарт", чтобы изменить направление спрайта в 2D-игре.
Я недавно делал игру в дартс. В игре пользователь управляет спрайтом космического корабля с помощью клавиш W, A, S и D. Это заставит спрайт двигаться вверх. Влево, вправо и вниз соответственно. Космос сделает квадрат, представляющий снаряд, ракетную пулю и т. Д., Движущийся с большой скоростью в направлении движения корабля.
У меня очень плохая система, которая работает:
(ДЛЯ ОБРАБОТКИ КЛЮЧЕВОЙ ПЕЧАТИ)
bool drawBull = false;
void handleKeyboard(KeyboardEvent event) {
kevent = event.keyCode;
if (kevent == KeyCode.W || kevent == KeyCode.UP){
direction = 'up';
window.console.log('w / up');
}
else if (kevent == KeyCode.A || kevent == KeyCode.LEFT){
direction = 'left';
window.console.log('a / left');
}
else if (kevent == KeyCode.S || kevent == KeyCode.DOWN){
direction = 'down';
window.console.log('s / down');
}
else if (kevent == KeyCode.D || kevent == KeyCode.RIGHT){
direction = 'right';
window.console.log('d / right');
}
else if (kevent == KeyCode.SPACE) {
shotX = lastX; shotY = lastY;
if (direction == 'right') { shotX = shotX + 400; }
if (direction == 'down') { shotY = shotY + 400; }
drawBull = true;
window.console.log('space');
} else {
return null;
}
}
И сама функция рисования:
void draw() {
canvas.width = canvas.width;
switch (direction) {
case 'up':
lastY = lastY - 3;
context.drawImage(shipU, lastX, lastY);
if (drawBull) { shotY = shotY - 30; context.fillRect(lastX + 240, shotY, 20, 20); }
break;
case 'left':
lastX = lastX - 3;
context.drawImage(shipL, lastX, lastY);
if (drawBull) { shotX = shotX - 30; context.fillRect(shotX, lastY + 240, 20, 20); }
break;
case 'down':
lastY = lastY + 3;
context.drawImage(shipD, lastX, lastY);
if (drawBull) { shotY = shotY + 30; context.fillRect(lastX + 240, shotY, 20, 20); }
break;
case 'right':
lastX = lastX + 3;
context.drawImage(shipR, lastX, lastY);
if (drawBull) { shotX = shotX + 30; context.fillRect(shotX, lastY + 240, 20, 20); }
break;
default:
return null;
}
}
Как видите, это долгий неопрятный и утомительный метод. Тем не менее, несмотря на все мои мозги, я не могу придумать систему, которая избегает этих множества операторов if / switch, и идею выписать изображение для рисования и код для каждого из них.
Моя настоящая игра будет, конечно, сильно ориентирована на объект, поэтому, возможно, было бы полезно объектно-ориентированное решение.
Кодовый ответ, данный на этот вопрос, был довольно приятным, хотя точно не соответствует моим потребностям. Так что, возможно, было бы неплохо принять такой класс. Как многократно слушать нажатие клавиш в Dart для игр?
Большое спасибо за Вашу помощь!
Том Том
1 ответ
Вместо сохранения направлений в виде строк, вы можете сохранить скорость и / или вращение элементов и использовать их для рендеринга.
Затем вы можете сохранить карту ключа в зависимости от изменения скорости:
var keyHandlers = {
KeyCode.W: new Point(0, 1),
KeyCode.S: new Point(0, -1),
KeyCode.A: new Point(-1, 0),
KeyCode.D: new Point(1, 0),
}
var spritePosition = new Point(0, 0);
void handleKeyboard(KeyboardEvent event) {
if (keyHandlers[event.keyCode])
spritePosition += keyHandlers[event.keyCode];
}
В конечном счете, вы, вероятно, захотите сохранить Velocity для спрайта и использовать ввод для увеличения скорости; а затем "затухают" эту скорость в каждом кадре (для представления силы тяжести / трения и т. д.).
Если ваш спрайт должен отображаться в определенном направлении, вы должны сохранить вращение, а также положение и скорость. Здесь есть простой набор слайдов, которые могут быть полезны; и есть также много хороших учебных пособий по XNA, которые будут охватывать создание класса GameObject, чтобы обернуть это состояние (хотя XNA мертва, учебные пособия великолепны, а C# не за миллион миль от Dart).
Когда ваш корабль стреляет, вы можете скопировать положение и вращение с корабля на пулю и рассчитать его скорость, применяя вращение корабля к начальной скорости вашей пули.
На http://gameprogrammingpatterns.com/ также есть замечательный веб-сайт Боба Нистрома, который я рекомендую прочитать, когда вы в него вникнете.