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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 19:24:23