Кодирование летающего воздушного шара
Я не совсем уверен, что заголовок этого поста описывает его правильно, но в этом посте я покажу вам, как позволить воздушному шару летать вверх и вниз с помощью мыши и применения базовой гравитации и ускорения. .
Взгляните на Js-Fidle-Demo.
Наш игровой объект
У нас есть холст (300 пикселей * 300 пикселей), на котором мы рисуем изображение воздушного шара, положение и размер которого определяются ballon_obj:
// The ballon object var ballon_obj = { x: 125, // start position x y: 125, // start position y vx: 0, // direction horizontal vy: 0, // direction vertical width: 31, height: 60 }; // The ballon image var ballon_img = new Image(); ballon_img.width = ballon_obj.width; ballon_img.height = ballon_obj.height; ballon_img.src = “https://raw.githubusercontent.com/webarbeit/ballon-game/master/assets/balloon.png";
Теперь я полагаю, вы знаете, как написать функцию draw() самостоятельно. Если нет, просто взгляните на JS-Fiddle code.
Переменные
// The gravity we will apply to the ballon var gravity = 2; // The "force" which will rise the ballon var rise_y = 0; // The acceleration of the rise/fall of the ballon var acceleration = 0.1;
Функция updateFly()
Давайте посмотрим на базовую функцию updateFly(), которая вызывается с каждым тиком игрового цикла:
var updateFly = function(dt) { ballon_obj.y += ballon_obj.vy * gravity * dt — rise_y; /** * The ballon should not fly out of our world (canvas) */ if (ballon_obj.y + ballon_obj.height >= HEIGHT) { ballon_obj.y = HEIGHT — ballon_obj.height; } if (ballon_obj.y <= 0) { ballon_obj.y = 0; } }; // Our loop function would look like this: var loop = function() { // ... updateFly(dt) // ... };
Если бы мы начали наш игровой цикл сейчас, то шарик просто оставался бы в своей начальной позиции, и он не падал бы и не поднимался, потому что направление вертикального движения равно нулю (ballon_obj.vy), как и наша переменная raise_y равна нулю;
Функция updateFall()
Применим гравитацию к воздушному шару, чтобы он упал на землю, как только мы запустим цикл обновления:
var updateFall = function(dt) { ballon_obj.vy = 1; // vertical move direction down rise_y = 0; // No "rise force" updateFly(dt); // Calling our fly fn, which applies the position };
Вместо вызова updateFly() в нашей функции цикла мы вызываем updateFall():
// We are falling ... var loop = function() { // ... updateFall(dt); // ... };
Функция updateRise()
Итак, наша гравитация воздействует на воздушный шар и притягивает его к земле. Но, конечно, мы хотим летать на воздушном шаре и снова подниматься вверх. Чтобы сделать это, мы должны «бороться» с гравитацией и установить для нашего rise_y значение больше 0, а для нашего вертикального движения — «вверх» — то есть минус 1.
var updateRise = function(dt) { ballon_obj.vy = -1; rise_y += acceleration * dt; updateFly(dt); };
Не устанавливая конкретное значение непосредственно для значения rise_y, мы получили более плавный ускоренный рост.
Элементы управления
Далее мы реализуем обработку ввода с помощью мыши. Когда мы удерживаем левую кнопку мыши на холсте, воздушный шар должен взлететь. Когда мы отпускаем кнопку, то баллон должен утонуть.
canvas.addEventListener(‘mousedown’, function(e) { update_fn = updateRise; }); canvas.addEventListener(‘mouseup’, function(e) { update_fn = updateFall; });
Вместо вызова updateRise() или updateFall() в нашей циклической функции у нас есть переменная update_fn, которая является ссылкой на любой из них. из них и будет устанавливаться в зависимости от нашей обработки ввода.
// Update_fn is either updateRise or updateFall var loop = function() { // ... update_fn(dt); // ... };
Вот и все ☺ Так что получайте удовольствие, создавая анимацию или игру с этим ;)