Как настроить колесные шарниры в LOVE2D - PullRequest
0 голосов
/ 27 января 2019

В настоящее время я пытаюсь создать простой 2D-автомобиль в LOVE2D, но у меня возникают проблемы с выяснением того, как прикрепить колесный шарнир к кузову.

https://love2d.org/wiki/love.physics.newWheelJoint

joint = love.physics.newWheelJoint( body1, body2, x, y, ax, ay, collideConnected )

Чтобы создать колесное соединение, вы передаете 4 числа (x, y, ax, ay), но я не знаю, какими должны быть эти значения.Каждый раз, когда моя машина падает на землю, вся эта вещь волнуется и отстреливается.

Как вы можете видеть ниже, я просто использую простое PolygonShape и два CircleShapes и пытаюсьприкрепить их.

function Car:create()
    local object = {}

    local x = 300
    local y = 300

    local width = 120
    local height = 40
    local size = 20

    local hasCollision = false

    object.frame = Car:createFrame(x, y, width, height)
    object.frontWheel = Car:createWheel(x + width/4, y + height, size)
    object.backWheel = Car:createWheel(x - width/4, y + height, size)

    -- Unsure what values I should use for these.
    frontJoint = love.physics.newWheelJoint(object.frame.body, object.frontWheel.body, 400, 300, 400, 300, hasCollision)
    rearJoint = love.physics.newWheelJoint(object.frame.body, object.backWheel.body, 350, 300, 0, 0,  hasCollision)

    -- Trying to adjust the values to see if that helps, unsure what these should be.
    frontJoint:setSpringFrequency(1)
    frontJoint:setSpringDampingRatio(2)

    return object   
end

function Car:createFrame(x, y, width, height)
    local frame = {}

    frame.body = love.physics.newBody(world, x, y, "dynamic")
    frame.shape = love.physics.newRectangleShape(0, 0, width, height)
    frame.fixture = love.physics.newFixture(frame.body, frame.shape, 5) -- A higher density gives it more mass.

    return frame
end

function Car:createWheel(x, y, size)
    local wheel = {}

    wheel.body = love.physics.newBody(world, x, y, "dynamic") 
    wheel.shape = love.physics.newCircleShape(size) 
    wheel.fixture = love.physics.newFixture(wheel.body, wheel.shape, 1) 
    wheel.fixture:setRestitution(0.25)

    return wheel
end

1 Ответ

0 голосов
/ 27 января 2019

Мне пришлось больше изучить документацию Box2D и я смог понять, где я ошибаюсь. Я смог заставить его работать, используя следующий код.

function Car:createJoint(frame, wheel, motorSpeed, maxMotorTorque)
    local hasCollision = false
    local freq = 7
    local ratio = .5

    local hasChanged = true

    local yOffset = wheel:getY() - frame:getY()

    local joint = love.physics.newWheelJoint(frame, wheel, wheel:getX(), wheel:getY(), 0, 1, hasCollision)
    joint:setSpringFrequency(freq)
    joint:setSpringDampingRatio(ratio)

    joint:setMotorSpeed(motorSpeed)
    joint:setMaxMotorTorque(maxMotorTorque)

    return joint
end

Надеюсь, это поможет кому-то, кто ищет newWheelJoint.

...