试图在我的love2d游戏中增加水平运动 [英] Trying to add horizontal movement to my game in love2d

查看:56
本文介绍了试图在我的love2d游戏中增加水平运动的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我曾尝试将水平运动添加到我的恋爱游戏中,但是我还没有找到解决方法.这是我的代码.

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

这是我叫Paddle的课程

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

我会尝试分别绘制矩形,但是必须删除所有包含player1-4的代码.有什么办法可以将 PADDLE_SPEED 之类的变量设置为数字?

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?

推荐答案

所以您不太正确地实例化Paddle类.根据 Lua的文档,我更改了桨类中的一些内容.

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

我也不确定您的问题中没有包括什么,但是我设置了您的核心3个功能( love.load() love.update(dt) love.draw()),分别为 VIRTUAL_WIDTH VIRTUAL_HEIGHT 设置值,并根据如何实例化播放器类 Lua文档指定了

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

主要问题可能是您将速度分配给播放器对象 dy dx 值.这些是您为播放器对象创建的值.除非您稍后访问它们并以某种方式使用它们,否则它们不会执行任何操作.我认为您正在尝试更改播放器对象的x和y位置.您可以通过获取玩家当前的x或y位置并添加或减去 PADDLE_SPEED * dt (自上一次执行 love.update(dt)

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

所以您的球不起作用,因为我不知道您到底想要什么,而您的 Paddle:update(dt)仍然不起作用,因为我不知道正是您想要的.当您确实使 Paddle:update(dt)正常工作时,请确保您包括 player1:update(dt) player2:update(dt)...在您的 love:update(dt)函数中,否则您的播放器将不会更新.

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.如果您再次提出问题,则应确保确切指定不起作用的地方.您的某些详细信息丢失了,我不确定这是否是您要询问的部分,或者您在原始代码中有那些详细信息,并在询问其他内容.

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

这篇关于试图在我的love2d游戏中增加水平运动的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆