有没有一种方法可以使用lua中的math.random()以离散增量生成随机数?

有没有一种方法可以使用lua中的math.random()以离散增量生成随机数?,random,lua,numbers,love2d,Random,Lua,Numbers,Love2d,我试图通过在LÖVE游戏开发环境中编写lua代码来测试游戏机制。我的意图是让敌人的单位在五条通道中的一条通道中繁殖,并穿越屏幕。目前,我能够生成所述单元,并将它们约束到“车道”所在的边界。然而,我不知道如何让它们明确地在五条通道中的一条中繁殖 现在,我正在使用math.random()在车道的顶部和底部边界之间选择一个数字。敌方单位精灵为32x32,因此五条离散车道将覆盖总共160像素的屏幕。现在,我将边界设置为240和400(屏幕高度的中间)。我如何以32为增量生成一个随机数,这样敌人将在五条

我试图通过在LÖVE游戏开发环境中编写lua代码来测试游戏机制。我的意图是让敌人的单位在五条通道中的一条通道中繁殖,并穿越屏幕。目前,我能够生成所述单元,并将它们约束到“车道”所在的边界。然而,我不知道如何让它们明确地在五条通道中的一条中繁殖

现在,我正在使用math.random()在车道的顶部和底部边界之间选择一个数字。敌方单位精灵为32x32,因此五条离散车道将覆盖总共160像素的屏幕。现在,我将边界设置为240和400(屏幕高度的中间)。我如何以32为增量生成一个随机数,这样敌人将在五条可能的车道中的一条车道上繁殖

编辑:所以,看起来边界实际上并没有设置到中间。我会想办法弄清楚上面的坐标,但如果有人能给我一个免费的小费,我会很高兴的D

我目前的工作代码如下:

-- Axis-based collision detection. Effective for rectangular units; does not work well with circles and non-quad shapes.

function CheckCollision(x1,y1,w1,h1, x2,y2,w2,h2)
  return x1 < x2+w2 and
         x2 < x1+w1 and
         y1 < y2+h2 and
         y2 < y1+h1
end

debug = true


-- Timers declared here to reference later.
createEnemyTimerMax = 0.4
createEnemyTimer = createEnemyTimerMax

-- Delcares images; will actually be established in love.load and brought out in love.draw
enemyImg = nil

enemies = {}

function love.load(arg)
    enemyImg = love.graphics.newImage('assets/cat.png')
end


function love.update(dt)
    if love.keyboard.isDown('escape') then
        love.event.push('quit')
    end

    --Generates enemies.
    --Create 5 if/then conditions to account for each lane? 
    --Conditions dependent on createEnemyTimer being < 0 and # of enemies in lane < 5
    --First condition is met; how do we create the second?
    --Will each lane need its own timer?
    createEnemyTimer = createEnemyTimer - (.5 * dt)
    if createEnemyTimer < 0 then
        createEnemyTimer = createEnemyTimerMax

        -- Create an enemy
        randomNumber = math.random(240,400)
        newEnemy = { y = randomNumber, x = 650, img = enemyImg }
        table.insert(enemies, newEnemy)
    end

    --Updates position of enemies.
    for i, enemy in ipairs(enemies) do
        enemy.x = enemy.x - (200 * dt)

        if enemy.x < 0 then -- remove enemies when they pass off the screen
            table.remove(enemies, i)
        end
    end

    -- Collision detection.
    -- For MSJ, collision should prevent PC from moving onto enemy's square.

    --[[

    for i, enemy in ipairs(enemies) do
        for j, bullet in ipairs(bullets) do
            if CheckCollision(enemy.x, enemy.y, enemy.img:getWidth(), enemy.img:getHeight(), bullet.x, bullet.y, bullet.img:getWidth(), bullet.img:getHeight()) then
                table.remove(bullets, j)
                table.remove(enemies, i)
                score = score + 1
            end
        end

        if CheckCollision(enemy.x, enemy.y, enemy.img:getWidth(), enemy.img:getHeight(), player.x, player.y, player.img:getWidth(), player.img:getHeight())
        and isAlive then
            table.remove(enemies, i)
            isAlive = false
        end
    end

    ]]

end

function love.draw(dt)
    for i, enemy in ipairs(enemies) do
        love.graphics.draw(enemy.img, enemy.x, enemy.y)
    end
end
——基于轴的碰撞检测。对矩形单位有效;不适用于圆形和非四边形。
函数检查冲突(x1、y1、w1、h1、x2、y2、w2、h2)
返回x1
我认为你应该改变如何生成五个敌人的方法,每个敌人在一条车道上。生成5个标记每条车道相对位置的随机数怎么样?然后将此相对位置添加到每条车道的起点。例如:

local enemies = {}
local origin_y, height = 240, 32
for i=1,5 do
   local relative_y = math.random(32)
   local y = origin_y + height * i  + relative_y
   table.insert(enemies, { x = math.random(), y = y})
end

谢谢你的回复!我对lua还是相当陌生,更不用说编码了,所以我对你的建议有一些问题,如果你不介意帮我解决的话。这对我来说是一个学习的过程!1) 将其中几个变量确定为局部变量的目的是什么?其他调用敌人表的函数只处理敌人的移动和图像。2) 在第二行中,我知道您正在将原点_y建立为基线坐标,但是您用高度=240,32定义了什么?(在第二条注释中继续)3)定义局部y时,显式计算的是什么?/4) 在代码末尾的table.insert函数中,为什么将x设置为math.random()?有没有具体的原因?我最初将其设置为650,以便在屏幕外生成敌人5) 同样在table.insert函数中,为什么要将{x=math.random(),y=y}添加到数组的末尾?在我发布的原始代码中,table.insert()将变量new敌手放入敌手表中,这也建立了用于敌手的图像文件。在您的示例中是否省略了这一点?@KyleRogacion local关键字将变量绑定到块范围,如Javascript中的
let
,或用C或Java等强类型语言定义变量。不本地化变量会使变量成为全局变量(变量绑定到全局范围(有一个预定义的名为_G的表,其中包含所有全局变量)。关于2)Lua允许多变量赋值。在那条直线上,原点y是240,高度是32。3) 每个车道的高度都是32,如果基线从240开始,那么所有车道的基线都是240、272、304、336、369。@KyleRogacion好的,我意识到我犯了一个错误,高度应该是40,所有车道的基线值应该是240、280、320、360和400。实际上,我说的高度是指车道的宽度,所以也许宽度是一个更好的变量名。所以y是每个车道基线和最大值之间的随机值(相对y应该是0到40之间的随机值)5)对,这是一个简化,我错过了你的代码。嘿,抱歉