最终效果图
编辑
节点创建如下
编辑
创建节点-CanvasLayer 重命名miniMap
创建子节点–sprite 重命名bg 添加背景图
创建子节点—ViewportContainer 设置合适的尺寸
设置材质做圆形遮罩
编辑
shader 代码
$$
shader_type canvas_item;
render_mode unshaded;
uniform float precent : hint_range(0.0, 1.0) = 0.75;//圆的比例
uniform vec4 color : hint_color= vec4(0.2,0.2,0.2,0);//圆外空白处填充颜色
uniform vec2 center_pos = vec2(0.5,0.5); // 圆点位置 xy值为0到1
void fragment()
{
if (distance(UV, center_pos) > precent/2.0)
{
COLOR = color;
}
else
{
COLOR = texture(TEXTURE,UV);
}
}
$$
创建子节点—-Viewport 设置合适的尺寸 透明背景勾选
编辑
创建子节点—–Camera2D
current勾选
zoom调整合适的大小
编辑
创建子节点—–Node2D 重命名SpriteRoot 作为地图元素的节点
创建在小地图上展示的 mapSprite
Node2D –Sprite 填入合适的图片
编辑
编辑
编辑
准备工作完成后 开始代码部分
在minmap节点上添加代码
编辑
$$
class_name minimap
extends CanvasLayer
onready var sprite_root = $bg/ViewportContainer/Viewport/SpriteRoot
onready var camera = $bg/ViewportContainer/Viewport/Camera2D
var player_sprite = preload(“res://scenes/packedscene/minimap/playerSprite.tscn”)
var enemy_sprite_pre = preload(“res://scenes/packedscene/minimap/enemySprite.tscn”)
var m_canmera_targte
#小地图icon种类
var mapsprite_array = []
Called when the node enters the scene tree for the first time.
func _ready():
pass # Replace with function body.
#初始化小地图
func _init_minmap(player,camera_target):
mapsprite_array.append(player_sprite)
mapsprite_array.append(enemy_sprite_pre)
#添加player
_add_mapsprite(0,player)
m_canmera_targte = camera_target
pass
#添加小地图的icon type: 种类
func add_mapsprite(type,traget):
var mapsprite = mapsprite_array[type].instance()
sprite_root.add_child(mapsprite)
mapsprite.set_target(traget,camera)
pass
func _process(delta):
if is_instance_valid(m_canmera_targte):
#相机跟随 相机缩放跟随
camera.position = m_canmera_targte.position
camera.zoom = m_canmera_targte.cam.zoom * 5
$$
在建好的mapSprite上添加代码
编辑
$$
extends Node2D
var m_camera
var m_target
#是否已经启动
var isuse = false
Called when the node enters the scene tree for the first time.
func _ready():
pass # Replace with function body.
func _set_target(target,camera):
m_target = target
m_camera = camera
isuse = true
show()
pass
func _process(delta):
if is_instance_valid(m_target):
#更新位置
position = m_target.position
scale = Vector2(m_camera.zoom.x,m_camera.zoom.y) * 1
else:
if isuse:
#已经启用,且目标已被回收 回收自己
queue_free()
$$
原帖