Пушка: полет снаряда по параболе
Вложений: 1
Доброго времени суток! Срочно нужна помощь знающих людей, ибо уже часа 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; } |
Задача ясна, в чём вопрос?
|
вопрос в траектории полета снаряда - как ее рассчитать и реализовать? на данный момент, есть две функции
/*function Go(){ var u = power; var g = 9.8; var xb = 0; var yb = 0; 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 *t; xb = 25 + x; yb = 770 - y; ctx.fillStyle = 'red'; ctx.beginPath(); ctx.arc(xb, yb, 3, 0, Math.PI*2, true); ctx.fill(); } }*/ /*function Go() { var g = 9.8; var x = 0; var y = 0; var i = 0; var vx = power * Math.cos (alph); var vy = power * Math.sin (alph); var tick = 100, timeTick = tick/1000; var dv = vx * timeTick, dvy = g * timeTick; var Move = function () { x += dx; vy -= dvy; y -= vy * timeTick; ctx.fillStyle = 'red'; ctx.beginPath(); ctx.arc(x, y, 3, 0, Math.PI*2); ctx.fill(); if (i++ > 0 && y <= 0) { clearInterval(interval); return; } } var interval = setInterval(Move, tick); }*/ первая лишь на момент показывает снаряд при силе около 40-50 и угле в 45, вторая не работает. нашел подобную задачу тут http://jsfiddle.net/Yeah/JsWWr/1/ но не смог те функции внедрить в свой код. |
Alex-S,
учи движение тел по окружности, сегодня сюда могу скинуть свои записи с физики, вот только не давно разбирали, впринцепи ничего сложного нет) |
Часовой пояс GMT +3, время: 18:35. |