Godot调用is_on_floor()提示misplaced and报错如何解决
报错原因
你遇到的(18,41) misplaced and语法错误,是因为跳跃判断的if语句写法不符合GDScript语法规则:你在Input.is_action_just_pressed("up")后面多加了一个冒号,相当于提前终止了if的条件判断段,后续的and is_on_floor()没有对应的语法上下文,因此触发报错。
除此之外你的代码还有几个会导致运行异常的逻辑问题,一并修正如下。
修正后的完整代码
extends KinematicBody2D var velocity = Vector2(0,0) const wspeed = 195 const GRAVITY = 30 const JUMP_HEIGHT = -600 func _physics_process(delta): velocity.y += GRAVITY # 重置水平速度,避免松开按键后角色持续滑动 velocity.x = 0 if Input.is_action_pressed("right"): velocity.x = wspeed if Input.is_action_pressed("left"): velocity.x = -wspeed # 移除条件中间多余的冒号,两个判断条件统一放在if和行尾冒号之间 if Input.is_action_just_pressed("up") and is_on_floor(): velocity.y = JUMP_HEIGHT # move_and_slide会返回碰撞修正后的速度,必须赋值回原velocity变量 velocity = move_and_slide(velocity, Vector2.UP)
关键修改说明
- 修复语法错误:删除跳跃判断条件中多余的冒号,符合GDScript的if语句语法要求,直接解决
misplaced and报错 - 移除重复重力逻辑:删除左移判断块中重复累加重力的代码,避免左移时角色下落速度翻倍
- 修复移动不停止问题:每帧先将水平速度重置为0,再根据按键输入设置移动方向,松开按键后角色会立刻停止水平移动
- 修复速度更新问题:将
move_and_slide的返回值赋值回velocity变量,保证碰撞后的速度计算、落地判定正常生效,is_on_floor()才能正确返回碰撞状态 - 规范代码写法:将跳跃高度从可变变量改为常量,修正原变量名的拼写错误,将_physics_process的形参改为Godot通用的delta命名(代表物理帧间隔时间)
内容的提问来源于stack exchange,提问作者Konstantin
相关产品推荐
相关产品推荐

