godot游戏开发随手记(1)

还在上高中时就已经想用godot做出这个游戏了,现在就慢慢的实现吧。

由于不能透漏游戏设定,所以我接下来说一说整个游戏开发遇到的技术问题和解决方案。

你可以看看这个视频,一个相似的游戏

本人的godot版本为4.4.1稳定版,可能有些地方因为版本的问题不一样
如果你有更好的解决方案,欢迎在评论区留言,谢谢。

一、多窗口渲染同一个世界

godot是为数不多的支持多窗口的游戏引擎。在GitHub有一个Godot多窗口渲染同一个世界的仓库,这个仓库的作者已经实现了多窗口渲染同一个世界。让我们看一看大佬的操作。

我们先打开项目->项目设置->窗口->高级设置,之后找到子窗口,将嵌入式子窗口启用关闭。

创建Node的子节点Camera2D,之后在main.gd文件里写入以下代码:

1
2
3
4
5
6
extends Node # 你可以将这个节点改成任意节点

@onready var _Camera: Camera2D = $Camera2D

func _process(delta: float) -> void:
_Camera.position = get_window().position

这样就会让相机随着窗口移动而移动。但是在执行_process()方法前窗口位置会变化,这样就会导致轻微的延迟,使得窗口移动时场景会产生抖动。

这貌似没有什么好的解决方案。如果你有什么好的解决方案,欢迎在评论区留言,谢谢。

让我们新建ViewWindow.gd文件,写入以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
extends Window

@onready var _Camera: Camera2D = $Camera2D

var last_position: = Vector2i.ZERO
var velocity: = Vector2i.ZERO

func _ready() -> void:
# Set the anchor mode to "Fixed top-left"
# Easier to work with since it corresponds to the window coordinates
_Camera.anchor_mode = Camera2D.ANCHOR_MODE_FIXED_TOP_LEFT

transient = true # Make the window considered as a child of the main window
close_requested.connect(queue_free) # Actually close the window when clicking the close button

func _process(delta: float) -> void:
velocity = position - last_position
last_position = position
_Camera.position = get_camera_pos_from_window()

func get_camera_pos_from_window()->Vector2i:
return position + velocity