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

Phaser 3角色爬绳索功能异常的技术问题求助

问题分析

你的核心问题是所有逻辑都被包裹在Phaser.Input.Keyboard.JustDown(this.keyT)的判断中——这个方法只会在T键被按下的第一帧返回true,后续按住、松开按键,或者角色离开绳索的状态变化,都不会触发这段代码的执行,自然无法停止上升或恢复重力。

解决方案

把绳索生成逻辑和攀爬状态的持续检测逻辑分离:生成逻辑只执行一次,攀爬状态的判断要放在update方法里(每一帧都运行),同时用一个状态变量跟踪攀爬状态。

步骤1:添加攀爬状态变量

在场景的create方法或者类的属性里添加状态标记:

this.isClimbingRope = false;

步骤2:分离绳索生成逻辑

保留原有的生成逻辑,但只在触发条件满足时执行一次:

// 这段代码可放在create的事件监听中,或update方法的开头
if (this.checkCollision(this.p1, this.ropeSpot) && Phaser.Input.Keyboard.JustDown(this.keyT)) {
    // 修复inventory删除逻辑:第二个参数传1才会只删除绳索元素
    const ropeIndex = inventory.indexOf("rope");
    if (ropeIndex !== -1) {
        inventory.splice(ropeIndex, 1);
    }
    this.ropeSpot.destroy();
    this.rope = this.physics.add.sprite(628, 420, 'ropeClimb');
    this.rope.body.immovable = true;
    this.rope.body.allowGravity = false;
}

步骤3:在update中处理攀爬逻辑

把攀爬的状态检测放在update方法里,每一帧都判断状态变化:

update() {
    // 其他游戏逻辑...

    if (this.rope) { // 确保绳索已生成
        const isTouchingRope = this.checkCollision(this.p1, this.rope);
        const isTHeld = this.keyT.isDown;

        if (isTouchingRope && isTHeld) {
            this.isClimbingRope = true;
            this.p1.body.allowGravity = false;
            this.p1.body.setVelocityY(-200); // 持续上升
        } else if (this.isClimbingRope) {
            // 停止攀爬:恢复重力,重置垂直速度
            this.isClimbingRope = false;
            this.p1.body.allowGravity = true;
            this.p1.body.setVelocityY(0); // 避免残留速度导致异常运动
        }
    }
}

额外注意事项

  • 建议替换自定义的checkCollision方法,改用Phaser内置的this.physics.overlap(this.p1, this.rope)来判断碰撞,Arcade Physics的内置检测更可靠。
  • 处理inventory时要先判断绳索是否存在(indexOf返回-1的情况),避免数组操作报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 07:31:16