Показать сообщение отдельно
  #1 (permalink)  
Старый 14.06.2012, 19:43
Новичок на форуме
Отправить личное сообщение для Alex-S Посмотреть профиль Найти все сообщения от Alex-S
 
Регистрация: 14.06.2012
Сообщений: 2

Пушка: полет снаряда по параболе
Доброго времени суток! Срочно нужна помощь знающих людей, ибо уже часа 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;
}
Вложения:
Тип файла: zip пушка.zip (1.2 Кб, 30 просмотров)
Ответить с цитированием