Page 1 of 2

How should I implement physics using windshield?

Posted: Fri Oct 28, 2022 3:16 am
by MaxGamz
This is the first time I am creating my own game using love2d. I decided to use windshield for my physics because I believed Box2D didn't have the tools I needed to make the process simple and concise. However, I am having issues with getting it to work for a platformer game. The tutorial I used was mainly for a top-down Zelda clone, and while my character is moving, the animations are a bit off. When I move left to right, the y velocity changes even though the I am not adding any forces to the y direction of the collision box. I feel like this is a simple fix but I wasn't able to find much information in the windshield documentation. Is there a way I can fix this small issue?

Re: How should I implement physics using windshield?

Posted: Fri Oct 28, 2022 11:59 am
by ReFreezed
Could you post your code?

Re: How should I implement physics using windshield?

Posted: Fri Oct 28, 2022 12:43 pm
by MaxGamz

Code: Select all

Player = {}


-- load functions
function Player:load()
    self.x = 100
    self.y = 0
    self.width = 48
    self.height = 48
    self.collider = World:newRectangleCollider(self.x * 2, self.y * 2, self.width * 2, self.height * 2)
    self.collider:setFixedRotation(true)
    
    self.maxSpeed = 400
    self.spriteSheet = love.graphics.newImage("Sprites/Will Ishan Nielsen.png") -- saves sprite sheet
    self.grid = anim8.newGrid(24, 24, self.spriteSheet:getWidth(), self.spriteSheet:getHeight()) -- converts sprite sheet into a grid of frames
    self.grounded = false
    self.xVel = 0
    self.yVel = 0
    self.scale = 2
    
    Player:animations()

    

end


function Player:animations() -- loads in animations
    local g = self.grid
    idle = anim8.newAnimation(g(("1-4"), 1), 0.1)
    runAnim = anim8.newAnimation(g(("6-9"), 1), 0.1)
    jumpAnim = anim8.newAnimation(g((11), 1), 0.1)
    fallAnim = anim8.newAnimation(g((10), 1), 0.1)
    currentAnim = idle
end


-- Update functions
function Player:update(dt)
    self.xVel, self.yVel = self.collider:getLinearVelocity()
    currentAnim:update(dt)
    if self.yVel ~= 0 then
        self.grounded = false
    else
        self.grounded = true
    end
    self:move(dt)
    self:skyAnim()
end

function Player:move(dt)
    if love.keyboard.isDown("d") and self.xVel < self.maxSpeed then -- moves player to the right
        currentAnim = runAnim
        self.collider:applyForce(5500, 0)
    elseif love.keyboard.isDown("a") and self.xVel > -self.maxSpeed then -- moves player to the left
        currentAnim = runAnim
        self.collider:applyForce(-5500, 0)
    else
        currentAnim = idle
    end
end

-- miscellaneous

function Player:jump(key) -- controls for jumping
    if key == "w" and self.grounded then
        self.collider:applyLinearImpulse(0, -10000)
    end
end

function Player:facing(key) --  working
    if key == "d" then
        self.scale = 2
    elseif key == "a" then
        self.scale = -2
    end
end

function Player:skyAnim()
    if self.grounded == false then
        if self.yVel > 0 then
            currentAnim = jumpAnim
        elseif self.yVel < 0 then
            currentAnim = fallAnim
        end
    end
end 


-- draw function
function Player:draw()
    currentAnim:draw(self.spriteSheet, self.x, self.y - self.width / 2, nil, self.scale, 2, 12)
end

This is the player functions

Code: Select all

function love.update(dt)
    Player.x = Player.collider:getX() / 2
    Player.y = Player.collider:getY() / 2
    World:update(dt) -- updates what is happening to the world
    Player:update(dt)
end
And this is in the main file

Re: How should I implement physics using windshield?

Posted: Fri Oct 28, 2022 1:24 pm
by Andlac028
This forum doesn't support markdown styling for code, please use:
[code]
-- your code here
[/code]

Re: How should I implement physics using windshield?

Posted: Fri Oct 28, 2022 2:09 pm
by ReFreezed
I assume the reason the y position changes is because of gravity. The code you posted omits how the World object is created, but I assume the gravity isn't set to zero. And the reason the animation is drawn in the wrong place (I assume that's the problem) is because you grab the player's x and y from the collider before running the physics simulation (World:update()), thus the rendering will be one frame behind the physics.

(I'm assuming a lot here. It would help more if you provided a .love file we could run.)

Re: How should I implement physics using windshield?

Posted: Fri Oct 28, 2022 2:43 pm
by MaxGamz
Is it possible for me to post the file here? Sorry this is my first time using the forums

Re: How should I implement physics using windshield?

Posted: Fri Oct 28, 2022 2:49 pm
by ReFreezed
There should be a tab for attachments when you write a reply, next to the post options.

(Actually, it's possible newly registered accounts can't add attachments. I don't remember.)

Re: How should I implement physics using windshield?

Posted: Fri Oct 28, 2022 2:50 pm
by MaxGamz
ReFreezed wrote: Fri Oct 28, 2022 2:09 pm I assume the reason the y position changes is because of gravity. The code you posted omits how the World object is created, but I assume the gravity isn't set to zero. And the reason the animation is drawn in the wrong place (I assume that's the problem) is because you grab the player's x and y from the collider before running the physics simulation (World:update()), thus the rendering will be one frame behind the physics.

(I'm assuming a lot here. It would help more if you provided a .love file we could run.)
By the way I took your consideration. The collider and player are moving at the same time now, but I am still having issues with the animation issue.

Re: How should I implement physics using windshield?

Posted: Fri Oct 28, 2022 3:16 pm
by MaxGamz
ReFreezed wrote: Fri Oct 28, 2022 2:49 pm There should be a tab for attachments when you write a reply, next to the post options.

(Actually, it's possible newly registered accounts can't add attachments. I don't remember.)
Ok I think I'm able to add attachments
Game.love
(75.86 KiB) Downloaded 147 times

Re: How should I implement physics using windshield?

Posted: Fri Oct 28, 2022 3:56 pm
by ReFreezed
Ok, the tiny added y-velocity is probably caused by small rounding errors in the physics library. The reason the animation looks glitchy is because the detection for whether the player is grounded or not isn't very robust. Change the `if self.yVel ~= 0 then` code in Player:update() to something like this:

Code: Select all

    if self.collider:enter("Default") then
        self.grounded = true
    elseif self.collider:exit("Default") then
        self.grounded = false
    end
I.e. ask the library whether the player is colliding with anything or not. This code solves the immediate animation issue but has several other issues, but maybe you can figure out the rest from here.