Игра на Javascript Canvas — Наклонение космического корабля при движении

#javascript #html #canvas

#javascript #HTML #холст

Вопрос:

Я новичок в javascript, пытаюсь создать космическую игру на javascript, в которой вы перемещаете космический корабль, чтобы избежать астероидов.

Вот ссылка для предварительного просмотра. Он должен работать на настольном или мобильном устройстве: http://dylanmadigan.net/_digital-work/game-2/5-tilt/index.html

Я хочу, чтобы корабль слегка наклонялся влево или вправо при движении. Что лучше наклонять корабль с помощью листа спрайтов или фактически поворачивать графику в javascript?

В настоящее время я делаю это с помощью листа спрайтов. Анимация корабля состоит из двух кадров (чтобы заставить пламя ракеты-носителя мерцать). У меня есть два фрейма, посвященных каждой прямой, левой и правой, на одном листе спрайтов. просмотр таблицы спрайтов игрока здесь, похоже, это приводит к мерцанию, когда спрайт перемещается влево и вправо. И время от времени он просто исчезает. Я не уверен, почему.

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

Было бы лучше, если бы я использовал javascript для поворота графики вместо листа спрайтов? Я просто подумал, что лист спрайтов будет проще.

Ответ №1:

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

Вращение спрайта вокруг его центра

Для рендеринга спрайта, который масштабируется, поворачивается вокруг своего центра и имеет альфа-затухание (потому что …? почему бы и нет)

 function drawSprite(ctx,img,x,y,scale,rot,alpha){
    ctx.setTransform(scale,0,0,scale,x,y); // Position and scale
    ctx.rotate(rot); // rotate
    ctx.globalAlpha = alpha;  // set alpha
    ctx.drawImage(img,-img.width/2,-img.height/2); // draw sprite offset half its size
}
 

Когда закончите рисовать спрайты, вам нужно будет сбросить преобразование и альфа

 ctx.setTransform(1,0,0,1,0,0); // sets default transform
ctx.globalAlpha = 1.0; // resets alpha
 

Вы можете просто иметь один спрайт корабля и сделать двигатели отдельным спрайтом (просто удалите корабль и сохраните тот же размер, чтобы упростить позиционирование) Затем вы можете управлять свечением двигателя независимо от корабля, используя альфа-сигнал для его затухания и исчезновения. Вы также можете установить ctx.globalCompositeOperation = "lighter" или "screen" , чтобы получить лучшее свечение двигателя. Сбросьте режим comp "source-over" для нормального рендеринга.

Вам также следует изучить возможность использования requestAnimationFrame и одного игрового цикла, а не использовать все установленные таймауты.