尝试在 love2d 中为我的游戏添加水平移动

Trying to add horizontal movement to my game in love2d

我试过在love的游戏中加入横向移动,但是还没找到方法。这是我的代码。

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

这是我的 class,我称之为 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

我会尝试单独绘制矩形,但我必须删除所有包含玩家 1-4 的代码。有什么方法可以将 PADDLE_SPEED 之类的变量设置为数字?

所以你没有完全正确地实例化你的 Paddle class。基于Lua's documentation,我在你的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

另外,我不确定你的问题中没有包含什么,但我设置了你的 3 个核心功能(love.load()love.update(dt)love.draw()) ,为 VIRTUAL_WIDTHVIRTUAL_HEIGHT, 设置值,并根据 Lua documentation 指定

的方式实例化您的播放器 classes

可能是您的问题的主要问题是您将速度分配给播放器对象 dydx 值。这些是您为玩家对象创建的组合值。除非您稍后访问它们并以某种方式使用它们,否则它们不会执行任何操作。我认为您要做的是更改玩家对象的 x 和 y 位置。您可以通过获取玩家当前的 x 或 y 位置并添加或减去 PADDLE_SPEED * dt(自上次执行 love.update(dt)[=30 以来经过的秒数)来实现=]

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

所以你的球不会工作,因为我不知道你到底想要什么,你的 Paddle:update(dt) 仍然不会工作,因为我不知道你到底想要什么。当您 Paddle:update(dt) 正常工作时,请确保将 player1:update(dt)player2:update(dt) ... 包含在 love:update(dt) 函数中,否则 none 玩家将更新。

虽然你应该让你的块水平和垂直移动


P.S。如果您 post 再次提出问题,则应确保您准确指定了无效的问题。您的一些详细信息丢失了,我不确定那是否是您询问的部分,或者您的原始代码中有这些详细信息并且正在询问其他内容。

看来您可能想要处理碰撞。这是针对此类情况的 where i kind of explain collisions, but I would probably recommend love.physics