Trying to add horizontal movement to my game in love2d

旧巷老猫 提交于 2020-07-23 06:36:36

问题


I have tried to add horizontal movement into my game in love, but I haven't found a way yet. This is my code.

PADDLE_SPEED = 200
player1 = Paddle(10, 30, 5, 20)
player1 = Paddle(10, 30, 5, 20)
player2 = Paddle(VIRTUAL_WIDTH - 15, VIRTUAL_HEIGHT - 30, 5, 20)
player3 = Paddle(30, 10, 20, 5)
player4 = Paddle(VIRTUAL_WIDTH - 30, VIRTUAL_HEIGHT - 15, 20, 5)
ball = Ball(VIRTUAL_WIDTH / 2 - 2, VIRTUAL_HEIGHT / 2 - 2, 4, 4)

if love.keyboard.isDown('w') then
    player1.dy = -PADDLE_SPEED
elseif love.keyboard.isDown('s') then
    player1.dy = PADDLE_SPEED
else
    player1.dy = 0
end

if love.keyboard.isDown('a') then
    player1.dx = PADDLE_SPEED
elseif love.keyboard.isDown('d') then
    player1.dx = -PADDLE_SPEED
else 
    player1.dx = 0
end

if love.keyboard.isDown('a') then
    player1.dx = -PADDLE_SPEED
elseif love.keyboard.isDown('d') then
    player1.dy = PADDLE_SPEED
else
    player1.dx = 0
end

if love.keyboard.isDown('up') then
    player2.dy = -PADDLE_SPEED
elseif love.keyboard.isDown('down') then
    player2.dy = PADDLE_SPEED
else
    player2.dy = 0
end

if love.keyboard.isDown('i') then
    player3.dy = -PADDLE_SPEED
elseif love.keyboard.isDown('k') then
    player3.dy = PADDLE_SPEED
else
    player3.dy = 0
end

if love.keyboard.isDown('g') then
    player4.dy = -PADDLE_SPEED
elseif love.keyboard.isDown('b') then
    player4.dy = PADDLE_SPEED
else
    player4.dy = 0
end

This is my class that I call Paddle

Paddle = Class{}

function Paddle:init(x, y, width, height)
    self.x = x
    self.y = y
    self.width = width
    self.height = height
    self.dy = 0
    self.dx = 0
end

function Paddle:update(dt)
    if self.dy < 0 then
        self.y = math.max(0, self.y + self.dy * dt)
    else
        self.y = math.min(VIRTUAL_HEIGHT - self.height, self.y + self.dy * dt)
    end
end

function Paddle:render()
    love.graphics.rectangle('fill', self.x, self.y, self.width, self.height)
end

I would try drawing the rectangles individually, but I would have to remove all the code that includes player1-4. Is there any way that I can set a variable like PADDLE_SPEED to a number?


回答1:


So your not quite instantiating your Paddle class correctly. Based on Lua's documentation, I changed some things in your paddle class.

Paddle.lua

Paddle={x=0,y=0,width=0,height=0}

function Paddle:new(o)
    o = o or {}
    setmetatable(o, self)
    self.__index = self
    return o
end

function Paddle:update(dt)
    if self.dy < 0 then
        self.y = math.max(0, self.y + self.dy * dt)
    else
        self.y = math.min(VIRTUAL_HEIGHT - self.height, self.y + self.dy * dt)
    end
end

function Paddle:render()
    love.graphics.rectangle('fill', self.x, self.y, self.width, self.height)
end

Also I'm not sure what you just didn't include in you question, but I set up your core 3 functions (love.load(), love.update(dt), and love.draw()), set values for VIRTUAL_WIDTH AND VIRTUAL_HEIGHT, and instantiated your player classes according to how the Lua documentation specifies

The main thing that might be your problem is that your assigning the speeds to your player objects dy and dx values. These are made up values that you've created for your player object. They don't do anything unless you later access them and use them somehow. I think what you are trying to do is change the x and y position of your player objects. You can do this by taking the players current x or y position and adding or subtracting the PADDLE_SPEED * dt(the number of seconds that have passed since the last execution of love.update(dt)

main.lua

require('Paddle')

function love.load()
    --initial graphics setup
    love.graphics.setBackgroundColor(0.41, 0.53, 0.97) 
    love.window.setMode(1000, 600) 

    PADDLE_SPEED = 200
    VIRTUAL_WIDTH = 30
    VIRTUAL_HEIGHT = 30

    player1 = Paddle:new{x=10, y=30, width=5, height=20}
    player2 = Paddle:new{x=VIRTUAL_WIDTH-15, y=VIRTUAL_HEIGHT-30, width=5, height=20}
    player3 = Paddle:new{x=30, y=10, width=20, height=5}
    player4 = Paddle:new{x=VIRTUAL_WIDTH-30, y=VIRTUAL_HEIGHT-15, width=20, height=5}
    -- ball = Ball(VIRTUAL_WIDTH / 2 - 2, VIRTUAL_HEIGHT / 2 - 2, 4, 4)

end

function love.update(dt)
    
    if love.keyboard.isDown('w') then
        player1.y = player1.y + PADDLE_SPEED * dt
    elseif love.keyboard.isDown('s') then
        player1.y = player1.y - PADDLE_SPEED * dt
    end

    if love.keyboard.isDown('a') then
        player1.x = player1.x + PADDLE_SPEED * dt
    elseif love.keyboard.isDown('d') then
        player1.x = player1.x - PADDLE_SPEED * dt
    end

    if love.keyboard.isDown('a') then
        player2.x = player2.x - PADDLE_SPEED * dt
    elseif love.keyboard.isDown('d') then
        player2.x = player2.x + PADDLE_SPEED * dt
    end

    if love.keyboard.isDown('up') then
        player2.y = player2.y - PADDLE_SPEED * dt
    elseif love.keyboard.isDown('down') then
        player2.y = player2.y + PADDLE_SPEED * dt
    end

    if love.keyboard.isDown('i') then
        player3.y = player3.y - PADDLE_SPEED * dt
    elseif love.keyboard.isDown('k') then
        player3.y = player3.y + PADDLE_SPEED * dt
    end

    if love.keyboard.isDown('g') then
        player4.y = player4.y - PADDLE_SPEED * dt
    elseif love.keyboard.isDown('b') then
        player4.y = player4.y + PADDLE_SPEED * dt
    end
end

function love.draw()
    player1:render()
    player2:render()
    player3:render()
    player4:render()
end

So your ball won't work, because I don't know exactly what you want with it, and your Paddle:update(dt) still won't work because I don't know exactly what you want. When you do get Paddle:update(dt) working make sure you include player1:update(dt), player2:update(dt) ... inside your love:update(dt) function or else none of your players will update.

You should get horizontal and vertical movement of your blocks though


P.S. If you post a question a again, you should make sure that you specify exactly what isn't working. Some of your details were missing, and I wasn't sure if that was the part you were asking about, or you had those details in your original code and were asking about something else.

It seems like you probably want to deal with collisions. Here's another answer where i kind of explain collisions, but I would probably recommend love.physics for this type of scenario



来源:https://stackoverflow.com/questions/62780447/trying-to-add-horizontal-movement-to-my-game-in-love2d

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!