Godot将 Camera 的视野范围限制在 TileMap 内

Posted 张学徒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Godot将 Camera 的视野范围限制在 TileMap 内相关的知识,希望对你有一定的参考价值。

Godot 3.3.2

将摄像机视野范围限制在 TileMap 的范围内

##==================================================
#	Tile Map Group
##==================================================
#  将摄像机视野范围限制在当前节点下的所有 TileMap 大小内
##==================================================
# @path: res://test/scn_top_down/TileMapGroup.gd
# @datetime: 2021-8-27 00:46:48
##==================================================

extends Node2D


## 选中的节点是当前所有 tilemap 的
export (NodePath) var _camera : NodePath = @""
export var min_zoom : float = 1.0
export var max_zoom : float = 10.0
## 顶部与左侧最大位置(只有比这个值小才相机范围限制会被赋值)
export var limit_top_left : Vector2 = Vector2(0, 0)
## 底部与右侧最小位置(只有比这个值大才相机范围限制会被赋值)
export var limit_bottom_right : Vector2 = Vector2(100000, 100000)



##==================================================
#   内置方法
##==================================================
func _ready() -> void:
	var tilemap_list = []
	for child in get_children():
		if child is TileMap:
			tilemap_list.push_back(child)
	set_camera_prop(tilemap_list)


##  设置摄像机属性 
## @tilemap_list  tilemap 列表
func set_camera_prop(tilemap_list : Array) -> void:
	var camera : Camera2D = get_node_or_null(_camera) as Camera2D
	if camera == null || tilemap_list.size() == 0:
		return
	
	# 设置默认摄像机大小为第一个 tilemap 的大小
	var camera_size : Rect2 = tilemap_list[0].get_used_rect()
	camera_size.size *= tilemap_list[0].cell_size
	camera_size.position *= tilemap_list[0].cell_size
	tilemap_list.remove(0)
	
	# 计算所有 tilemap 的最大边界位置
	for tilemap in tilemap_list:
		var used_rect = tilemap.get_used_rect()
		used_rect.size *= tilemap.cell_size
		used_rect.position *= tilemap.cell_size
		
		if camera_size.position.x > used_rect.position.x:
			camera_size.position.x = used_rect.position.x
		if camera_size.position.y > used_rect.position.y:
			camera_size.position.y = used_rect.position.y
		if camera_size.end.x < used_rect.end.x:
			camera_size.end.x = used_rect.end.x
		if camera_size.end.y < used_rect.end.y:
			camera_size.end.y = used_rect.end.y
	
	# 设置最大位置的居中位置
#	camera.global_position = (camera_size.end - camera_size.position) / 2
	
	# 游戏窗口大小
	var w = ProjectSettings.get("display/window/size/width")
	var h = ProjectSettings.get("display/window/size/height")
	
	var scale_zoom = camera_size.size / Vector2(w, h)
	var zoom = max(scale_zoom.x, scale_zoom.y)
	zoom = max(min_zoom, zoom)
	zoom = min(max_zoom, zoom)
	
	# 限制视野范围
	if limit_top_left.x > camera_size.position.x:
		camera.limit_left = camera_size.position.x
	if limit_top_left.y > camera_size.position.y:
		camera.limit_top = camera_size.position.y
	
	if limit_bottom_right.x < camera_size.end.x:
		camera.limit_right = camera_size.end.x
	if limit_bottom_right.y < camera_size.end.y:
		camera.limit_bottom = camera_size.end.y
	
	camera.zoom = Vector2(zoom, zoom)

注意,节点要放在这个节点的下边

对比默认和运行后的效果

编辑器中默认的视野范围

运行后的视野范围

可以看到,已经全部覆盖到了

以上是关于Godot将 Camera 的视野范围限制在 TileMap 内的主要内容,如果未能解决你的问题,请参考以下文章

Godot Tapping 游戏建议

Unity俯视角相机地面视野范围的计算

关于Unity中渲染顺序问题

Godot在 Godot 中使用代理模式将一些通用的功能封装起来

Godot Shader替换颜色

Godot Shader替换颜色