如何让Lua函数延迟执行后续逻辑?LOVE2D兔子弹跳实现求助
LOVE2D实现兔子跳跃后停留复位的正确方法
你的问题出在两个核心点:
- 你写的
wait函数是空的,根本没有实现等待逻辑; - LOVE2D是事件驱动+帧循环架构,
love.keypressed是按键触发的瞬间回调,在里面用阻塞式等待会直接卡住整个游戏循环——代码会瞬间执行完bunny.y-30和bunny.y+30,玩家看不到任何移动,同时游戏会失去响应。
正确的做法是用状态跟踪+帧循环检测时间来实现,具体代码如下:
1. 初始化变量
先定义兔子的位置、初始坐标,以及跟踪跳跃状态的变量:
-- 兔子的基础属性,可替换成你自己的图片/坐标 local bunny = { x = 100, y = 300, original_y = 300 -- 记录初始y坐标,用于复位 } local is_jumping = false -- 是否处于跳跃状态 local jump_pause_time = 0.5 -- 停留时间(单位:秒) local jump_start_time = 0 -- 跳跃开始的时间戳
2. 处理按键事件
按下空格时只触发跳跃起始动作,不要在这里做等待:
function love.keypressed(key) -- 只有兔子没在跳跃时,才响应空格 if key == "space" and not is_jumping then bunny.y = bunny.y - 30 is_jumping = true jump_start_time = love.timer.getTime() -- 记录当前时间 end end
3. 在帧循环中检测时间并复位
LOVE2D的love.update是每帧都会调用的函数,在这里检查是否达到停留时间:
function love.update(dt) if is_jumping then local current_time = love.timer.getTime() -- 当当前时间与跳跃开始时间的差值 >= 设定的停留时间,执行复位 if current_time - jump_start_time >= jump_pause_time then bunny.y = bunny.original_y is_jumping = false end end end
4. 绘制兔子
最后在love.draw里渲染兔子(这里用矩形代替,你可以换成自己的兔子图片):
function love.draw() love.graphics.rectangle("fill", bunny.x, bunny.y, 50, 50) -- 如果用图片,替换为:love.graphics.draw(bunny_img, bunny.x, bunny.y) end
原理说明
LOVE2D的核心是不断重复update→draw的循环:
update负责处理逻辑(比如时间检测、状态更新)draw负责渲染画面
用is_jumping标记状态,在update里实时检查时间,既不会阻塞游戏,又能精准控制停留时间,兔子的移动和复位过程也会正常显示在画面上。
内容的提问来源于stack exchange,提问作者ThePegasusknight
相关产品推荐
相关产品推荐

