refonte de l'inventaire en 3D et nettoyage des prints
This commit is contained in:
62
gui/game/inventory_gui/scripts/inventory_3d.gd
Normal file
62
gui/game/inventory_gui/scripts/inventory_3d.gd
Normal file
@@ -0,0 +1,62 @@
|
||||
@tool
|
||||
extends Node3D
|
||||
class_name Inventory3D
|
||||
|
||||
const INVENTORY_OBJECT_SIZE = 0.2
|
||||
const SEPARATOR_SIZE = 0.1
|
||||
|
||||
@export var inventory_item_scene: PackedScene
|
||||
@export var bar: TextureRect
|
||||
|
||||
@export var test_inventory : Inventory
|
||||
|
||||
var last_n_tools = -1
|
||||
var inventory_item_objects: Array[InventoryItem3D] = []
|
||||
|
||||
@export_tool_button("Test Update", "Callable") var update_action = func() : update(test_inventory)
|
||||
|
||||
func _ready():
|
||||
if not Engine.is_editor_hint():
|
||||
GameInfo.game_data.player_data.inventory.updated.connect(update)
|
||||
update(GameInfo.game_data.player_data.inventory)
|
||||
|
||||
func update(inventory : Inventory):
|
||||
if len(inventory.items) != len(inventory_item_objects) or last_n_tools != inventory.n_tools:
|
||||
create_inventory_objects(inventory)
|
||||
for i in range(len(inventory.items)):
|
||||
var item : Item= inventory.items[i]
|
||||
var object : InventoryItem3D = inventory_item_objects[i]
|
||||
object.item = inventory.items[i]
|
||||
|
||||
if inventory.current_item_ind == i:
|
||||
object.state = (
|
||||
InventoryItem3D.State.TOOL if i < inventory.n_tools
|
||||
else InventoryItem3D.State.ITEM
|
||||
)
|
||||
else:
|
||||
object.state = InventoryItem3D.State.BLACK
|
||||
|
||||
|
||||
func create_inventory_objects(inventory : Inventory):
|
||||
for c in %Items3D.get_children():
|
||||
c.queue_free()
|
||||
last_n_tools = inventory.n_tools
|
||||
|
||||
inventory_item_objects = []
|
||||
|
||||
for i in range(len(inventory.items)):
|
||||
var new_inventory_object := (inventory_item_scene.instantiate() as InventoryItem3D)
|
||||
%Items3D.add_child(new_inventory_object)
|
||||
new_inventory_object.position.x = -INVENTORY_OBJECT_SIZE * i
|
||||
if i >= inventory.n_tools:
|
||||
new_inventory_object.position.x -= SEPARATOR_SIZE
|
||||
inventory_item_objects.append(new_inventory_object)
|
||||
|
||||
%Items3D.position.x = (
|
||||
(len(inventory_item_objects) - 1) * INVENTORY_OBJECT_SIZE + SEPARATOR_SIZE
|
||||
) / 2
|
||||
%ItemSeparator.position.x = (
|
||||
%Items3D.position.x
|
||||
- (inventory.n_tools) * INVENTORY_OBJECT_SIZE
|
||||
+ SEPARATOR_SIZE/2
|
||||
)
|
||||
1
gui/game/inventory_gui/scripts/inventory_3d.gd.uid
Normal file
1
gui/game/inventory_gui/scripts/inventory_3d.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://c66acjl2dhd7x
|
||||
@@ -1,36 +1,47 @@
|
||||
extends HBoxContainer
|
||||
@tool
|
||||
extends Control
|
||||
class_name InventoryGui
|
||||
|
||||
@export var inventory_item_scene: PackedScene
|
||||
@export var bar: TextureRect
|
||||
const SEPARATOR_OBJECT_SIZE = 40
|
||||
|
||||
var inventory_item_objects: Array[InventoryGuiItem]
|
||||
@export var test_size : int
|
||||
@export var test_n_tool : int
|
||||
|
||||
var last_n_tools = -1
|
||||
var last_inventory_size = 0
|
||||
|
||||
@export_tool_button("Test Update", "Callable") var update_action = func() : generate_inventory_mouse_detectors(test_size,test_n_tool,true)
|
||||
|
||||
func _ready():
|
||||
GameInfo.game_data.player_data.inventory.updated.connect(update)
|
||||
update(GameInfo.game_data.player_data.inventory)
|
||||
if not Engine.is_editor_hint():
|
||||
GameInfo.game_data.player_data.inventory.updated.connect(update)
|
||||
update(GameInfo.game_data.player_data.inventory)
|
||||
|
||||
func update(inventory: Inventory):
|
||||
if len(inventory_item_objects) == 0 or len(inventory_item_objects) != inventory.items.size():
|
||||
for o in inventory_item_objects:
|
||||
o.queue_free()
|
||||
inventory_item_objects = generate_inventory_item_objects(inventory, inventory.items.size())
|
||||
|
||||
for i in range(inventory.items.size()):
|
||||
inventory_item_objects[i].update(inventory.get_item(i), i == inventory.current_item_ind)
|
||||
if last_inventory_size != len(inventory.items) or last_n_tools != inventory.n_tools:
|
||||
last_inventory_size = len(inventory.items)
|
||||
last_n_tools = inventory.n_tools
|
||||
generate_inventory_mouse_detectors(last_inventory_size, last_n_tools)
|
||||
|
||||
func generate_inventory_mouse_detectors(inventory_size: int, n_tool : int, test = false):
|
||||
for c in %InventoryMouseDetectors.get_children():
|
||||
c.queue_free()
|
||||
|
||||
move_child(bar, inventory.n_tools)
|
||||
bar.visible = inventory.n_tools > 0 && inventory.items.size() > inventory.n_tools
|
||||
for i in range(inventory_size):
|
||||
if i == n_tool:
|
||||
%InventoryMouseDetectors.add_child(generate_separator(test))
|
||||
%InventoryMouseDetectors.add_child(generate_item_mouse_detector(i, test))
|
||||
|
||||
func generate_inventory_item_objects(inventory: Inventory, nb: int = 1) -> Array[InventoryGuiItem]:
|
||||
var objects: Array[InventoryGuiItem] = []
|
||||
for i in range(nb):
|
||||
var o = inventory_item_scene.instantiate() as InventoryGuiItem
|
||||
add_child(o)
|
||||
move_child(o, i)
|
||||
objects.append(o)
|
||||
o.item_clicked.connect(func(): change_current_item_ind(inventory, i))
|
||||
return objects
|
||||
func generate_item_mouse_detector(index : int, test = false) -> ColorRect:
|
||||
return InventoryGuiItemMouseDetector.new(index, test)
|
||||
|
||||
func change_current_item_ind(inventory: Inventory, new_ind: int):
|
||||
inventory.set_current_item(new_ind)
|
||||
func generate_separator(test = false) -> ColorRect:
|
||||
var separator = ColorRect.new()
|
||||
separator.custom_minimum_size = Vector2(SEPARATOR_OBJECT_SIZE, SEPARATOR_OBJECT_SIZE)
|
||||
separator.color = Color.RED
|
||||
|
||||
if test:
|
||||
separator.color.a = 0.5
|
||||
else :
|
||||
separator.color.a = 0.
|
||||
return separator
|
||||
@@ -0,0 +1,30 @@
|
||||
extends ColorRect
|
||||
class_name InventoryGuiItemMouseDetector
|
||||
|
||||
const SIZE = 80
|
||||
|
||||
var index : int
|
||||
|
||||
func _init(_index := 0, test := false):
|
||||
index = _index
|
||||
color = Color.WHITE
|
||||
color.a = 0.5 if test else 0.
|
||||
|
||||
func _ready():
|
||||
custom_minimum_size = Vector2.ONE * SIZE
|
||||
|
||||
mouse_entered.connect(
|
||||
func(): Pointer.inspect(self)
|
||||
)
|
||||
mouse_exited.connect(
|
||||
func(): Pointer.stop_inspect(self)
|
||||
)
|
||||
|
||||
func card_info() -> CardInfo:
|
||||
var inventory := GameInfo.game_data.player_data.inventory
|
||||
if inventory and index < len(inventory.items):
|
||||
var item = GameInfo.game_data.player_data.inventory.items[index]
|
||||
if item:
|
||||
return item.card_info()
|
||||
|
||||
return null
|
||||
@@ -0,0 +1 @@
|
||||
uid://c1gdqe8u6kftl
|
||||
Reference in New Issue
Block a user