如何使用lua中的math.random()生成离散增量的随机数?
2017-6-20 5:57:22
收藏:0
阅读:87
评论:1
我正在使用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
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

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