背包系统(三)
移动背包
首先添加一些代码移动背包。在Panel添加脚本。
extends Panel
#获取当Inventory1节点,这里你也可以写get_node("../.."),下面这样写的话,无论Panel在什么位置,都可以获取到Inventory
onready var parent:=owner if owner.name == "Inventory1" else owner.get_node("Inventory1")
var drag=false
var offset:Vector2=Vector2.ZERO
func _input(event):
if drag:
parent.rect_global_position=event.global_position-offset
func _gui_input(event):
if event is InputEventMouseButton and event.button_index == BUTTON_LEFT:
drag=event.is_pressed()
offset=event.global_position - parent.rect_global_position
这代码不难理解,获取当前场景根节点,因为我要移动不是Panel,我要移动的时Inventory1节点。
设置偏移值,这样当鼠标点击背包时,背包的原点不会跳到鼠标位置,而是保持着一定距离。
为Inventory1添加代码
为了实现背包抓起时不移除窗口,在Inventory1添加一下代码:
extends Panel
var screen_size:Vector2
var title
func _ready():
screen_size=get_viewport().get_visible_rect().size
title=$VBoxContainer/Panel
func _input(event:InputEvent):
#限制背包的移动范围,只能在视口里移动
if title.drag:
rect_global_position.x=clamp(rect_global_position.x,0,screen_size.x -rect_size.x)
rect_global_position.y=clamp(rect_global_position.y,0,screen_size.y -rect_size.y)
放置格子
现在要把格子实例化到GridContainer,添加一下代码到刚才的Inventory1.gd:
extends Panel
export var slot_scene:PackedScene
#最大格子数
const MAX_SLOTS = 45
onready var slot_container:GridContainer=$VBoxContainer/ScrollContainer/GridContainer
#存放格子的数组
var slot_array:Array
func _ready():
#...接着写
for i in range(MAX_SLOTS):
var slot:ItemSlot=slot_scene.instance()
slot.connect("mouse_entered",self,"_on_slot_mouse_entered",[slot])
slot.connect("mouse_exited",self,"_on_slot_mouse_exited",[slot])
slot.connect("gui_input",self,"_on_slot_gui_input",[slot])
slot_array.append(slot)
slot_container.add_child(slot)
我定义了一个数组,用来存放格子,这样以后就可以很方便的遍历数组,找东西了!
当你完成以上代码,因该会有这样的效果: