玩家这块练三样:输入、移动、动画。
根节点用 Area2D 而不是 CharacterBody2D,是因为这个项目只需要「碰到就结束」,不需要物理推挤和贴墙滑行。想要更结实的碰撞手感再换 CharacterBody2D,别一上来就上重的。
输入映射在项目设置里的 Input Map 配,别在代码里硬写键码。配好 ui_left、ui_right 之类的动作,脚本里用 Input.get_vector 拿一个方向向量,四个方向一次处理完:
var direction := Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")
velocity = direction * speed
position += velocity * delta
position = position.clamp(Vector2.ZERO, screen_size)
用 get_vector 顺带解决了斜向移动过快的问题——它返回的是归一化向量,不用自己再算一遍长度。
乘 delta 这件事后面单独有一篇讲,这里先记住:_process 或 _physics_process 每帧都跑,位移必须乘上帧间隔,否则机器越快跑得越快。
动画用 AnimatedSprite2D,在 SpriteFrames 资源里建 walk、up 两套帧。方向往哪边走就播哪套,静止时停帧。有个小地方容易漏:向上走时通常让精灵水平翻转配合,别把两套动画做得一模一样又重复占资源。
碰撞形状用 CircleShape2D 或 CapsuleShape2D 贴着角色轮廓,别直接拿图片外框的矩形。矩形在边缘会让人觉得「明明没碰到却死了」,手感差在这一两像素上。
最后把玩家实例拖进 Main,跑一次只测移动。确认方向、速度、边界都对,再往下接敌人。一次只加一个变量,出问题才好定位。
