Проекция «Граната» на основе угла + отскока

У меня возникли проблемы с синтезом расширенной формулы проекции объекта. Я уже понял несколько основных формул физического моделирования, таких как:

  • Скорость объекта: x += cos(angle); y += sin(angle); *где угол можно получить либо по положению мыши, либо с помощью tan(...target и начальные значения)

но это только движется прямо в зависимости от угла.

  • Гравитация: Yvelocity = Yvelocity - gravity; if(!isHitPlatform) { Obj.y += YVelocity }

  • Отказ:// No point if we've not been sized... if (height > 0) { // Are we bouncing... if (bounce) { // Add the vDelta to the yPos // vDelta may be postive or negative, allowing // for both up and down movement... yPos += vDelta; // Add the gravity to the vDelta, this will slow down // the upward movement and speed up the downward movement... // You may wish to place a max speed to this vDelta += gDelta; // If the sprite is not on the ground... if (yPos + SPRITE_HEIGHT >= height) { // Seat the sprite on the ground yPos = height - SPRITE_HEIGHT; // If the re-bound delta is 0 or more then we've stopped // bouncing... if (rbDelta >= 0) { // Stop bouncing... bounce = false; } else { // Add the re-bound degregation delta to the re-bound delta rbDelta += rbDegDelta; // Set the vDelta... vDelta = rbDelta; } } } }

Мне нужна помощь, чтобы объединить эти три формулы для создания эффективного и легкого алгоритма, который позволяет объекту проецироваться по арке, определяемой углом, но продолжает отскакивать несколько раз, прежде чем остановиться, все с приемлемым количеством разрыв между каждой точкой. *Примечание. Определение гранаты по формуле af(x) = -x^2 приводит к увеличению разрыва прыжка по мере увеличения уклона, что вынуждает вас обращать формулу, чтобы найти значение x = +-y. (чтобы определить + или -, проверьте границы).


person Bennett Yeo    schedule 17.07.2014    source источник


Ответы (1)


что-то типа:

class granade
{
    private static final double dt = 0.1; // or similar

    private double speedx;
    private double speedy;
    private double positionx;
    private double positiony;

    public granade(double v, double angle)
    {
        speedx = v * Math.cos(angle);
        speedy = v * Math.sin(angle);

        positionx = 0;
        positiony = 0;
    }

    public void nextframe()
    {
        // update speed: v += a*dt
        speedy -= gravity* dt;

        // update position: pos += v*dt
        positionx += speedx * dt;
        double newpositiony = positiony + speedy*dt;

        // bounce if hit ground
        if (newpositiony > 0)
            positiony = newpositiony;
        else {
            // bounce vertically
            speedy *= -1;
            positiony = -newpositiony;
        }
    }

    public void draw() { /* TODO */ }
}

OT: избегайте Math.atan(y/x), используйте Math.atan2(y, x)

person Exceptyon    schedule 18.07.2014
comment
Каковы преимущества использования Math.atan2(y,x) по сравнению с Math.atan(y/x.0) (*примечание: двойное деление вместо целочисленного)? - person Bennett Yeo; 18.07.2014
comment
я могу придумать три: 1) atan2(1, 0) = pi/2; atan(1/0) => ExceptionDivisionByZero. 2) атан крайне неточен при углах около 90°. 3) атан2(-1, 1)!=атан2(1,-1) но атан(-1/1)=атан(1/-1) - person Exceptyon; 18.07.2014
comment
Хорошо, я вижу, что функция atan2 более выгодна из-за ее способности обрабатывать неоднозначные случаи треугольников и другие небольшие исключения. Обычная функция атана больше похожа на ответ, который даст вам обычный калькулятор. - person Bennett Yeo; 19.07.2014
comment
Кроме того, что изменяет переменная dt в вашем коде в алгоритме? Это какой-то гравитационный фактор? - person Bennett Yeo; 19.07.2014
comment
dt — это время в секундах между двумя кадрами... вы можете установить dt=1.0/FPS, если хотите симуляцию в реальном времени, или какое-то фиксированное значение 0,1 0,01 (попробуйте некоторые значения и посмотрите, как получится) - person Exceptyon; 19.07.2014
comment
Также в качестве примечания для других зрителей этой темы: вы можете эмулировать отклонение объекта, похожего на гранату, от стены, похожей на структуру, добавив Pi/2 (90 градусов) к параметру угла. - person Bennett Yeo; 08.08.2014