Влияние тяги зажима игрока

Как: ограничивать влияние тяги, позволяя другим силам быть бесконечными.

Пример. Ракета может двигаться в направлении вращения. Только взрывы могут разогнать его до максимальной скорости. Мне нужна теория, а не код.

Любая помощь будет оценена по достоинству.

РЕШЕНО

EDIT: максимальная скорость определяется скоростью тяги и трением.

Тяга может складываться со скоростью, но максимальная скорость может быть достигнута, когда трение сильнее, чем скорость тяги.

vx = (vx + fx) *fr -- velocity = (velocity + force) *friction
vy = (vy + fy) *fr

Когда скорость достаточно высока, дополнительная сила будет вычитаться из-за трения.

fr = .9 : трудно увидеть максимальную скорость

fr = .6 : легко увидеть максимальную скорость


person John Moore    schedule 18.04.2016    source источник
comment
пожалуйста, предоставьте свой код и дополнительную информацию, чтобы людям, которые не знают подробностей love2d, было легче вам помочь. если это возможно в love2d-framework, просто примените максимальную скорость только к самоходному движению   -  person Piglet    schedule 18.04.2016
comment
Скорость объекта есть сумма двух независимых скоростей: самодвижущейся (которая ограничена некоторой константой) и других факторов (которая не ограничена).   -  person Egor Skriptunoff    schedule 18.04.2016
comment
объект max = 50, if vel > 50 как объект force может влиять на vel? Поглотил бы vel force ..   -  person John Moore    schedule 18.04.2016
comment
vel = vel1 + vel2. vel1 поглотить force, если сила означает бег. vel2 поглощает force, если сила означает запуск из человеко-пушки. vel1 зажимается, vel2 нет.   -  person Egor Skriptunoff    schedule 18.04.2016


Ответы (2)


Использование ускорения, ограниченного трением, для точного задания максимальной скорости

Предыдущий ответ верен, что трение может установить предел скорости, но в ответе упущены некоторые детали, касающиеся установки предела.

Сначала ваша переменная скорости

vel = 0; //in pixels per frame. Start at 0 (or wherever you want)

И вам нужна конкретная максимальная скорость в пикселях на кадр.

maxVelocity  = 100; // set the maximum speed

И у вас есть конкретное максимальное ускорение в пикселях на кадр2

maxAccel = 1; // The max acceleration will occur when accelerating from 0 

Теперь вам нужно получить трение, необходимое для прекращения ускорения, когда скорость достигает 100. Назовем неизвестное трение

friction = null;  // what we need to find out

Вы будете использовать уравнение

vel = vel + maxAccel;  // accelerate 
vel = vel * friction;  // add friction

Вы знаете, что friction должно уменьшать скорость после ускорения, чтобы она не превышала maxVelocity. Итак, нам нужно значение для friction, которое при применении к maxVelocity + maxAccel равно maxVelocity.

maxVelocity  = (maxVelocity + maxAccel) * friction;

Теперь просто перестройте уравнение для решения неизвестного friction, чтобы получить

friction = maxVelocity / (maxVelocity + maxAccel);

Теперь у вас есть значение friction, которое гарантирует, что ваша скорость не превысит maxVelocity.

Чтобы немного расширить его, вы можете добавить ускорение, которое даст вам краткосрочную дополнительную скорость, но вы не хотите, чтобы эта ускоренная скорость превышала предел. Вы можете просто пересчитать friction в новое maxVelocity, но это может не дать вам желаемого толчка, так как верхний конец кривой скорости имеет низкое ускорение.

Другой способ - обеспечить дополнительное ускорение при сохранении того же трения - рассчитать необходимое дополнительное ускорение. Нам нужны новые вары.

maxBoostVelocity = 120; // max boost velocity
boostAccel = null; // this will have to be calculated using the friction we have

Используя ту же логику, что и выше, но переставляя решение трения с точки зрения новой максимальной скорости и с известным трением, мы получаем

boostAccel = ((maxBoostVelocity / friction )- maxBoostVelocity);

Мне нравится использовать только дополнительное ускорение для ускорения, поэтому мне не нужно трогать существующие значения ускорения. Поэтому я просто вычитаю исходное ускорение из расчетного ускорения, чтобы получить то, что хочу.

boostAccel = boostAccel - maxAccel;

Итак, в каком-то коде

// the known limits
vel = 0;                 //in pixels per frame. Start at 0 (or wherever you want)
maxVelocity  = 100;      // set the maximum speed
maxAccel = 1;            // The max acceleration will occur when accelerating from 0 
maxBoostVelocity = 120;  // max boost velocity
accelerate = false;      // flag to indicate that we want to accelerate
boost = false;           // flag to indicate we want to boost
// the unknown friction and boost accel
boostAccel = null;       // this will have to be calculated using the friction we       
friction = null;         // what we need to find out
function applyAcceleration()
    if(boost){                 // is boosr flag true then add boost
        vel += boostAccel ;    // boost
    }
    if(accelerate || boost){   // is accelerate or boost flag true 
        vel += maxAccel;       // accelerate 
    }
    // always apply the friction after the accelerations 
    vel *= friction;           // apply friction
}
// in the init function calculate the friction and boost acceleration
function init(){
    friction = maxVelocity / (maxVelocity + maxAccel);
    boostAccel = ((maxBoostVelocity / friction )- maxBoostVelocity) - maxAccel;
}
person Blindman67    schedule 28.04.2016

Элементы управления: влево, вправо и тяга

Максимальная скорость тяги может регулироваться трением.

-- VARIABLES
player = {
    frc = .95, -- friction
    acc = .05, -- acceleration
    max = .5, -- acceleration max
    deg = 0, -- rotation in degree
    rad = 0 -- rotation in radian
    -- rotation is CW and 0 points to the right
}

-- MAIN UPDATE
function love.update()
    control(player)
    applyVelocity(player)
end

-- UPDATE
function control(a)
    if  L then addRotation(a,-5) end
    if  R then addRotation(a, 5) end
    if  U then thrustOn(a) else thrustOff(a) end
end
function applyVelocity(a)
    -- velocity + force
    a.vx = (a.vx + a.fx) *a.fr
    a.vy = (a.vy + a.fy) *a.fr
    -- position + velocity
    a.x = a.x + a.vx
    a.y = a.y + a.vy
end

-- OTHER
function thrustOn(a)
    accelerate(a)
    rotateDist(a)
end
function thrustOff(a)
    a.f = 0 -- integer of force is used to convert to point (x,y) with (rad)
    a.fx = 0
    a.fy = 0
end
function addRotation(a,deg)
    a.deg = a.deg + deg
    a.rad = math.rad(a.deg) -- math.sin/cos functions use radian instead of degree
end
function accelerate(a)
    a.f = a.f + a.acc
    if a.f > a.max then a.f = a.max end
end
function rotateDist(a)
    -- end point of force rotated from player
    a.fx = a.f *math.sin(a.rad)
    a.fy = a.f *math.cos(a.rad)
end
person John Moore    schedule 19.04.2016