Godot实现Camera2D的移动放缩
目标 使用WASD平移 使用鼠标中键平移 使用鼠标滚轮按照鼠标位置放缩 平滑动画 准备工作 窗口尺寸设置为 1920 * 1080 ,加入一些输入映射,例如WASD对应"ui_xx",设置空格或者你喜欢的按键作为"ui_recovery" 新建Node2d、Sprite2D和Carmea2d 取消Sprite2D的居中,并把Carmea2d的锚点模式设置为Fixed Top Left 导入一张图片作为Sprite2D的纹理,我这里使用Azgaar的奇幻地图生成器随机生成了一张 运行图片左上角对齐屏幕左上角即可。 给创建的Node2d节点添加GDScript脚本,写入以下代码 1 2 3 4 5 6 7 8 9 10 11 12 13 @onready var camera = $Camera2D @onready var sprite = $Sprite2D var CamScale = Vector2(1.0, 1.0) var CamPos = Vector2(0.0, 0.0) func _ready() -> void: pass func _input(event: InputEvent) -> void: pass func _process(delta: float) -> void: pass 其中CamScale保存变换后的缩放倍率,CamPos保存变换后的锚点位置 缩放 按照鼠标位置缩放 设置的相机锚点为左上角,即(0,0),那么直接对相机的zoom参数改变会以(0,0)为中心缩放。那么如果要实现按照鼠标为中心缩放则需要在缩放的同时进行平移。那么如何进行平移呢? 代码如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 var scale_delta = 0.05 var mouse_position func _input(event: InputEvent) -> void: mouse_position = get_viewport().get_mouse_position() if event is InputEventMouseButton: var BeforeScale = CamScale #滚轮缩放 if event.button_index == MOUSE_BUTTON_WHEEL_UP: CamScale.x = exp(log(CamScale.x) + scale_delta) CamScale.y = exp(log(CamScale.y) + scale_delta) if event.button_index == MOUSE_BUTTON_WHEEL_DOWN: CamScale.x = exp(log(CamScale.x) - scale_delta) CamScale.y = exp(log(CamScale.y) - scale_delta) var pscale = CamScale / BeforeScale if pscale != Vector2(1, 1): #按照鼠标位置缩放 var delta_mouse_posion = (pscale * (position + mouse_position) - mouse_position) / CamScale CamPos += delta_mouse_posion camera.zoom = CamScale 平移 平移操作分为WASD平移和鼠标中键平移,两者逻辑稍有不同。 我们需要设置变量来保存平移一次的距离,在脚本中加入如下代码 ...