godot 圆形 小地图(minimap)

最终效果图

 

节点创建如下

 

 创建节点-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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值