Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #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 просмотров)
Ответить с цитированием
  #2 (permalink)  
Старый 15.06.2012, 17:48
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

Задача ясна, в чём вопрос?
Ответить с цитированием
  #3 (permalink)  
Старый 16.06.2012, 04:20
Новичок на форуме
Отправить личное сообщение для Alex-S Посмотреть профиль Найти все сообщения от Alex-S
 
Регистрация: 14.06.2012
Сообщений: 2

вопрос в траектории полета снаряда - как ее рассчитать и реализовать? на данный момент, есть две функции
/*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/ но не смог те функции внедрить в свой код.
Ответить с цитированием
  #4 (permalink)  
Старый 16.06.2012, 13:15
Аватар для 9xakep
сегодня в 12:34|Комментир
Отправить личное сообщение для 9xakep Посмотреть профиль Найти все сообщения от 9xakep
 
Регистрация: 12.04.2011
Сообщений: 1,180

Alex-S,
учи движение тел по окружности, сегодня сюда могу скинуть свои записи с физики, вот только не давно разбирали, впринцепи ничего сложного нет)
__________________
оляля, ололо
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Российский истребитель 5-го поколения впервые совершил полет nemo Оффтопик 7 02.02.2010 17:19