Phaser 文本交互问题:Phaser 2按钮需求及Phaser 3对话Bug求助
Phaser 3对话系统:T键无法关闭对话的修复方案
问题根源
代码逻辑存在执行顺序冲突:当处于对话状态(talking=true)时,再次按下T键,开启对话的条件仍然会被触发——碰撞检测和JustDown(keyT)的条件依然满足,导致代码先将talking重新设为true,后续关闭对话的逻辑即使执行,也会被这一步覆盖,最终表现为无法关闭对话。
另外,Phaser.Input.Keyboard.JustDown仅在按键按下的第一帧返回true,同一帧内多次调用不会改变结果,但顺序问题会导致逻辑相互抵消。
修复方案
1. 给开启对话逻辑增加状态判断
修改开启对话的if条件,只有当未处于对话状态时才执行开启逻辑:
// 仅在未对话时触发开启逻辑 if (!this.talking && (this.checkCollision(this.p1, this.goodLamb) || this.checkCollision(this.p1, this.stiches)) && Phaser.Input.Keyboard.JustDown(this.keyT)) { this.talking = true; }
2. 简化移动禁用逻辑
原代码逐个判断按键禁用移动的写法冗余,直接重置玩家速度更简洁可靠:
if (this.talking == true){ // 禁用玩家移动:直接重置X/Y轴速度 this.p1.setVelocity(0); // 保留原对话逻辑 if (this.checkCollision(this.p1, this.goodLamb) || this.checkCollision(this.p1, this.stiches)) { if (this.has("spool") && this.has("needleOne") && this.has("needleTwo")){ this.line1.setText('Good Lamb: Oh, thanks Peef! Now we can fix Stiches!'); this.line2.setText('Peef: Glad to help. I know how painful rips are.'); } else { // 简化判断:else已覆盖"未集齐物品"的所有情况 this.line1.setText('Good Lamb: Help! Stiches ripped herself again! Can you get the sewing supplies?'); this.line2.setText('Peef: Oh gosh! Sit tight Stiches. Ill be back soon!'); } } // 关闭对话逻辑保持不变 if ((this.checkCollision(this.p1, this.goodLamb) || this.checkCollision(this.p1, this.stiches)) && Phaser.Input.Keyboard.JustDown(this.keyT)){ this.talking = false; this.line1.setText(''); this.line2.setText(''); } }
额外优化:简化对话判断逻辑
原代码中else if (!(this.has("spool")) || !(this.has("needleOne")) || !(this.has("needleTwo")))可直接改为else,因为这是"集齐物品"条件的唯一反向情况,无需重复写判断条件,让代码更简洁。
修复原理
- 增加
!this.talking判断后,开启对话的逻辑只会在未对话时触发,避免与关闭逻辑冲突。 - 直接重置玩家速度的写法,确保对话状态下玩家完全无法移动,无需逐个处理按键输入。
内容的提问来源于stack exchange,提问作者EmptyStone
相关产品推荐
相关产品推荐

