You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Kaboom.js中实现角色仅触地时单次跳跃

解决Kaboom.js角色仅落地可跳跃的问题

要实现角色只有接触地面/陆地时才能跳跃、空中无法二次跳跃的效果,只需利用Kaboom.js中body组件自带的isGrounded()方法判断角色的落地状态,再触发跳跃逻辑即可。同时要确保所有可站立的地面实体都标记为solid,这样isGrounded()才能正确检测。

修改后的完整代码

import kaboom from "kaboom"

const SPEED = 300
const JUMP_FORCE = 500
const GRAVITY_AMOUNT = 1000

// initialize context
kaboom({
    background: "#000"
})

// load assets
loadSprite("player", "sprites/player.png")
loadSprite("spider", "sprites/spider.png")
loadSprite("floor", "sprites/floor.png")

gravity(GRAVITY_AMOUNT)

const player = add([
    sprite("player"),
    pos(250, height() - 100),
    area(),
    body()
])

const grass = add([
    rect(width(), 16),
    pos(0, height() - 64),
    area(),
    solid(),
    color(60, 21, 176)
])

const land = add([
    rect(width(), 48),
    pos(0, height() - 48),
    area(),
    solid(),
    color(14, 15, 97)
])

// 空格跳跃:仅落地时触发
onKeyPress("space", () => {
    if (player.isGrounded()) {
        player.jump(JUMP_FORCE)
    }
})

onKeyDown("a", () => {
    player.move(-SPEED, 0)
})
onKeyDown("d", () => {
    player.move(SPEED, 0)
})

var floor = add([
    sprite("floor"),
    scale(0.5),
    pos(120, height() - 150),
    area(),
    z(-1)
])

action(() => {
    if(player.pos.y < height() - floor.height){
        floor.use(body())
        floor.use(solid()) // 标记为solid,让player能检测到站在上面
    }
})

// 鼠标点击跳跃:仅落地时触发
onMouseDown(() => {
    if (player.isGrounded()) {
        player.jump(JUMP_FORCE)
    }
})

// 触摸跳跃:仅落地时触发
onTouchStart(() => {
    if (player.isGrounded()) {
        player.jump(JUMP_FORCE)
    }
})

关键修改说明

  • 所有跳跃触发逻辑(空格、鼠标、触摸)中,添加player.isGrounded()判断,仅当返回true时才执行跳跃动作
  • 给动态添加的floor实体加上solid()标记,确保isGrounded()能识别它为可站立的地面

isGrounded()方法会自动检测角色的body是否与带有solid标记的实体接触,完美适配你场景中的grass、land和动态生成的floor。

内容的提问来源于stack exchange,提问作者Jahin Ahnaf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 07:17:13