如何使用lua中的math.random()生成离散增量的随机数?

我正在使用LÖVE游戏开发环境编写lua代码来测试游戏机制。我的意图是让敌人单位在五条车道中的一条上生成并穿过屏幕。目前,我能够生成这些单位并将它们限制在“车道”边界内。但我不确定如何让它们明确地在五条车道之一中生成。

目前,我使用math.random()在车道的上下边界之间选择一个数字。敌人单位的精灵为32x32,因此五个离散的车道将覆盖屏幕的总计160像素。目前,我将边界设置为240和400(屏幕高度的中间)。如何生成一个增量为32的随机数,以便敌人将生成在五个可能的车道中之一?

编辑:所以,似乎边界并没有实际设置到中间。我将尝试找出那个坐标,但如果有人能给我个免费的提示,我会很高兴!:D

我目前正在使用的工作代码如下:

-- 基于轴的碰撞检测。对于矩形单位有效;与圆形和非四边形形状不兼容。

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

-- 声明计时器以后引用。
createEnemyTimerMax = 0.4
createEnemyTimer = createEnemyTimerMax

-- 声明图像;实际上将在love.load中建立并在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

    -- 生成敌人。
    --为每个车道创建5个if / then条件?
    --条件取决于createEnemyTimer小于0并且车道中的敌人数量小于5
    --第一个条件已满足;我们如何创建第二个条件?
    --每个车道都需要自己的计时器吗?
    createEnemyTimer = createEnemyTimer - (0.5 * dt)
    if createEnemyTimer < 0 then
        createEnemyTimer = createEnemyTimerMax

        -- 创建一个敌人
        randomNumber = math.random(240,400)
        newEnemy = { y = randomNumber, x = 650, img = enemyImg }
        table.insert(enemies, newEnemy)
    end

    -- 更新敌人位置。
    for i, enemy in ipairs(enemies) do
        enemy.x = enemy.x - (200 * dt)

        if enemy.x < 0 then -- 在它们通过屏幕后删除敌人
            table.remove(enemies, i)
        end
    end

    -- 碰撞检测。
    -- 对于微软杂志,碰撞应防止PC进入敌人的区域。

    --[[

    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
点赞
用户134758
用户134758

我认为你应该改变生成五个敌人的方法,每个敌人在一条路上。你怎么说生成 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
2017-06-20 06:11:38