如何修复Kaboom.js中player.jump is not a function报错
问题根因
报错TypeError: player.jump is not a function是因为你在定义player游戏对象时,把body()组件注释掉了。
在Kaboom v0.5.0版本中,jump()、resolve()这些物理相关的方法,都是body()组件提供的内置方法,游戏对象没有挂载这个组件时,调用对应方法就会报不存在的错误。
除此之外你的现有逻辑还有两处不符合Flappy Bird的常规设计:
- 给小鸟绑定了持续水平向右的移动,没有开启重力下落
- 管道是静止的,没有向左的相对移动,无法形成闯关的玩法
修复方法
- 取消player定义中
body()组件的注释,给小鸟挂载物理能力 - 移除小鸟水平向右自动移动的逻辑,依靠
body()自带的重力实现自然下落 - 空格触发跳跃时传入你预先定义的
JUMP_SPEED参数控制跳跃高度 - 给所有管道添加向左移动的逻辑,移出屏幕后自动销毁避免性能问题
- 碰撞管道后补充跳转结算场景的逻辑,避免游戏卡死
修复后可运行的核心代码
JavaScript部分
kaboom({ global: true, fullscreen: true, scale: 1, debug: true, clearColor: [0,0,0] }) const MOVE_SPEED = 120 const JUMP_SPEED = 800 loadSprite('tubo_sinistra', 'https://i.imgur.com/YVW4m89.png') loadSprite('tubo_punta_sinistra', 'https://i.imgur.com/JcvhMs4.png') loadSprite('tubo_punta_destra', 'https://i.imgur.com/wHB9HzE.png') loadSprite('tubo_destra', 'https://i.imgur.com/Drs3q84.png') loadSprite('player', 'https://i.imgur.com/MOOR8tT.png') scene("game", ({ level, score }) => { layer(['bg', 'obj', 'ui'], 'obj') const maps = [ [ ' sd sd sd sd sd sd sd sd sd sd ', ' sd sd sd sd sd sd sd sd sd sd ', ' sd sd sd ', ' sd sd sd ', ' sd sd ', ' sd ', ' ', ' sd ', ' sd sd ', ' sd sd sd ', ' sd sd sd sd sd sd sd sd sd sd ', ' sd sd sd sd sd sd sd sd sd sd ', ], ] const levelCfg = { width: 48, height: 48, 's': [sprite('tubo_sinistra'), solid(), 'wall',scale(4)], 'd': [sprite('tubo_destra'), solid(), 'wall', scale(4)], } addLevel(maps[level], levelCfg) const player = add([ sprite('player'), scale(2.5), pos(5, 190), body(), // 恢复body组件,提供jump、resolve等物理方法 { dir: vec2(1,0), } ]) // 处理碰撞推挤逻辑 player.action(() => { player.resolve() }) player.collides('wall', () => { destroy(player) go("lose", { score: score }) }) // 管道自动向左移动,出屏销毁 action('wall', (wall) => { wall.move(-MOVE_SPEED, 0) if (wall.pos.x < -50) { destroy(wall) } }) // 空格触发跳跃 keyPress('space', () => { player.jump(JUMP_SPEED) }) }) scene("lose", ({ score }) => { add([text(score, 32), origin('center'), pos(width()/ 2, height() /2)]) }) start("game", { level: 0, score: 0})
HTML部分(无需修改,保持原有即可)
<html lang="en"> <head> <meta charset="utf-8" /> <title>Flappy Bird </title> <style> body { margin: 0; overflow: hidden; } </style> </head> <body> <script src="https://kaboomjs.com/lib/0.5.0/kaboom.js"></script> <script src="flappy_bird.js"></script> </body> </html>
内容的提问来源于stack exchange,提问作者SGTMM
相关产品推荐
相关产品推荐

