Доброго времени суток! Срочно нужна помощь знающих людей, ибо уже часа 4 убил на это дело, а с места не сдвинулся.
Суть: из точки с координатами X и Y (конец ствола пушки) со скоростью U под углом L вылетает снаряд. Летит вдоль оси OX. Необходимо анимировать полет снаряда и при столкновении с мишенью уничтожить ее и снаряд.
Вот полный текст задачи:
Реализовать игру, заключающуюся в поражении случайно появляющихся целей ядром, выпущенным из пушки. Пушка позиционируется в нижнем левом углу игрового поля. Имеет возможность поворачивать дуло на 90 градусов (от вертикального положения до горизонтального). Пушка имеет силу залпа, которая регулируется игроком в процессе стрельбы (например, при зажатии клавиши происходит увеличение силы залпа, и при отпускании клавиши происходит выстрел). Углом поворота дула следует управлять с клавиатуры. После выстрела сила залпа обнуляется. Ядро представлено окружностью. Ядро имеет массу. При выстреле ядро в горизонтальном направлении движется прямолинейно, в вертикальном направлении - равноускоренно (учесть силу тяжести). Само собой необходимо связать массу ядра и силу залпа: чем меньше сила залпа - тем медленнее полетит ядро. Пока ядро находится в движении, произвести выстрел нельзя. При достижении границ игрового поля ядро прекращает свое движение. Исключение составляет верхняя граница поля - ядро может свободно вылетать за нее. Предполагается, что за пределами верхнего поля ядро движется аналогично, т.е. рано или поздно оно должно вернуться в поле видимости (конечно, с учетом угла полета). Дополнительные баллы за реализацию автомасштабирования поля, чтобы ядро всегда было на виду. Реализация цели может быть какой угодно. Главное, при попадании ядра в цель, последняя исчезает, ядро прекращает движение, игроку присваиваются очки (их нужно отображать), генерируется новая цель. Следует самостоятельно решить и реализовать, что будет, если ядро упадет на пушку.
То, что уже есть:
var ctx = document.getElementById("can").getContext("2d");
var alph = 0;
var power = 0;
var xa = 1000;
var ya = Math.floor( Math.random( ) * (700 - 50 + 1) ) + 50;
var x = 0;
var y = 0;
document.getElementById("p").innerHTML = power;
function main(){
ctx.clearRect(0, 0, 1000, 800)
//прямоугольники
ctx.fillStyle = '#000'
ctx.fillRect(0, 780, 60, 20);
ctx.fillRect(0, 760, 30, 20);
//линия
ctx.lineWidth = 7;
ctx.strokeStyle = '#000';
ctx.moveTo(25, 770);
ctx.lineTo(25 + 40*Math.cos(alph*(Math.PI/180)), 770 - 40*Math.sin(alph*(Math.PI/180)));
ctx.stroke();
//круг
ctx.fillStyle = 'red';
ctx.beginPath();
ctx.arc(25, 770, 3, 0, Math.PI*2, true);
ctx.fill();
air();
}
setInterval(main, 1);
function flyball(){
var u = power;
var g = 9.8;
var xb;
var yb;
var t = (u * Math.sin (alph)) / g;
var ux = u * Math.cos (alph);
var uy = u * Math.sin (alph);
var xmax = ((u * u) * (Math.sin (alph) * Math.cos (alph))) / g;
for (i = 1; i < t; i++){
x = ux * i;
y = uy * i - g - (i * i )/ 2;
xb = 25 + x;
yb = 770 - y;
ctx.fillStyle = 'red';
ctx.beginPath();
ctx.arc(xa, xb, 3, 0, Math.PI*2, true);
ctx.fill();
}
}
function air(){
if (xa != -95) {
xa--;
} else {
var ya1 = Math.floor( Math.random( ) * (700 - 50 + 1) ) + 50;
ya = ya1;
xa = 1000;
}
ctx.lineWidth = 10;
ctx.strokeStyle = '#000';
ctx.moveTo(xa, ya);
ctx.lineTo(xa + 80, ya);
ctx.moveTo(xa + 20, ya);
ctx.lineTo(xa + 70, ya + 30);
ctx.moveTo(xa + 20, ya);
ctx.lineTo(xa + 70, ya - 30);
ctx.moveTo(xa + 75, ya);
ctx.lineTo(xa + 95, ya - 15);
ctx.stroke();
}
function key(event) {
if (event.keyCode == 38) {
alph++;
alph++;
alph++;
if (alph > 90) alph = 90;
}
if (event.keyCode == 40) {
alph--;
alph--;
alph--;
if (alph < 0) alph = 0;
}
}
function p_key() {
if (event.keyCode == 32) {
power++;
document.getElementById("p").innerHTML = power;
}
}
function upkey() {
if (event.keyCode == 32) {
flyball ();
power = 0;
}
document.getElementById("p").innerHTML = power;
}