47 lines
1.1 KiB
GDScript
47 lines
1.1 KiB
GDScript
@tool
|
|
class_name ItemPickup extends CharacterBody2D
|
|
|
|
signal picked_up
|
|
|
|
@export var item_data: ItemData :
|
|
set = set_item_data
|
|
|
|
@onready var area: Area2D = $Area2D
|
|
@onready var sprite: Sprite2D = $Sprite2D
|
|
@onready var audio_player: AudioStreamPlayer2D = $AudioStreamPlayer2D
|
|
|
|
func _ready() -> void:
|
|
update_texture()
|
|
if Engine.is_editor_hint():
|
|
return
|
|
area.body_entered.connect(on_body_enter)
|
|
|
|
func _physics_process(delta: float) -> void:
|
|
var collision_info := move_and_collide(velocity * delta)
|
|
if collision_info:
|
|
velocity = velocity.bounce(collision_info.get_normal())
|
|
velocity -= velocity * delta * 4
|
|
|
|
func on_body_enter(body: Node2D) -> void:
|
|
if !item_data or body is not Player:
|
|
return
|
|
if PlayerManager.INVENTORY_DATA.add_item(item_data):
|
|
item_picked_up()
|
|
|
|
func item_picked_up() -> void:
|
|
area.body_entered.disconnect(on_body_enter)
|
|
audio_player.play()
|
|
visible = false
|
|
picked_up.emit()
|
|
await audio_player.finished
|
|
queue_free()
|
|
|
|
func update_texture() -> void:
|
|
if !item_data or !sprite:
|
|
return
|
|
sprite.texture = item_data.texture
|
|
|
|
func set_item_data(new_item_data: ItemData) -> void:
|
|
item_data = new_item_data
|
|
update_texture()
|