代码细节优化
This commit is contained in:
parent
a982c3a2e2
commit
88eede1301
@ -17,7 +17,7 @@
|
||||
老虎钳 [#texture=c02/老虎钳物品.png] [ID:prop_老虎钳]
|
||||
3014旋转锁钥匙 [#texture=c02/3014旋转锁钥匙物品.png] [ID:prop_3014旋转锁钥匙]
|
||||
小猫玩具 [#texture=c02/小猫玩具完整物品.png] [ID:prop_小猫玩具完整]
|
||||
=> END!
|
||||
=> END
|
||||
|
||||
# notes 通用
|
||||
~ notes_纸条
|
||||
|
File diff suppressed because one or more lines are too long
@ -1,6 +1,8 @@
|
||||
@tool
|
||||
extends Node2D
|
||||
|
||||
signal player_entered
|
||||
|
||||
@export var one_shot := true
|
||||
@export var freeze_time := 5.0
|
||||
@export var hook_animation = ""
|
||||
@ -66,7 +68,6 @@ func _load_archive():
|
||||
|
||||
|
||||
func _entered(_body):
|
||||
print("ambush body_entered!")
|
||||
if not one_shot:
|
||||
var time = Time.get_ticks_msec()
|
||||
var time_left = freeze_time - (time - played_time) * 0.001
|
||||
@ -86,7 +87,8 @@ func _entered(_body):
|
||||
DialogueManager.dialogue_ended.connect(_on_dialogue_ended, CONNECT_ONE_SHOT)
|
||||
if one_shot:
|
||||
played = true
|
||||
return
|
||||
player_entered.emit()
|
||||
print("ambush body_entered!")
|
||||
|
||||
|
||||
func _on_dialogue_ended(_res):
|
||||
|
@ -1,16 +1,43 @@
|
||||
@tool
|
||||
extends Sprite2D
|
||||
|
||||
signal interacted(success: bool)
|
||||
|
||||
@export var entity_name: String = ""
|
||||
@export var prop_key := ""
|
||||
@export var interacted := false
|
||||
@export var texture_before: Texture2D
|
||||
@export var texture_after: Texture2D
|
||||
@export var one_shot := true
|
||||
@export var interacted_times := 0
|
||||
var prop_key := ""
|
||||
|
||||
@onready var sfx = $Sfx as Sfx
|
||||
@onready var sign_mark = %Sign as Sign
|
||||
@onready var area2d = %Area2D as Area2D
|
||||
|
||||
static var item_config_res = preload("res://asset/dialogue/item_description.dialogue")
|
||||
var items: PackedStringArray
|
||||
|
||||
|
||||
func _reload_items() -> void:
|
||||
var id = item_config_res.titles["PropItems"]
|
||||
var current_line = item_config_res.lines[id]
|
||||
while current_line:
|
||||
if current_line.has("translation_key"):
|
||||
items.append(current_line.translation_key)
|
||||
if not current_line.has("next_id") or current_line.next_id == "end":
|
||||
break
|
||||
current_line = item_config_res.lines[current_line.next_id]
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
if Engine.is_editor_hint():
|
||||
_reload_items()
|
||||
notify_property_list_changed()
|
||||
return
|
||||
if interacted_times and texture_after:
|
||||
texture = texture_after
|
||||
else:
|
||||
texture = texture_before
|
||||
area2d.body_entered.connect(_reset)
|
||||
area2d.body_exited.connect(_on_cancel)
|
||||
sign_mark.interacted.connect(_on_interacted)
|
||||
@ -26,5 +53,39 @@ func _on_cancel(_body = null) -> void:
|
||||
|
||||
|
||||
func _on_interacted() -> void:
|
||||
if one_shot and interacted_times:
|
||||
return
|
||||
sfx.play()
|
||||
var key = SceneManager.get_current_selected_prop()
|
||||
print("prop_key", key)
|
||||
# print("prop_key", key)
|
||||
if key != prop_key:
|
||||
return
|
||||
interacted_times += 1
|
||||
if texture_after:
|
||||
texture = texture_after
|
||||
interacted.emit()
|
||||
print("%s interacted with %s" % [entity_name, prop_key])
|
||||
|
||||
|
||||
func _get_property_list() -> Array[Dictionary]:
|
||||
return [
|
||||
{
|
||||
"name": "prop_key",
|
||||
"type": TYPE_STRING,
|
||||
"hint": PROPERTY_HINT_ENUM_SUGGESTION,
|
||||
"hint_string": ",".join(items),
|
||||
}
|
||||
]
|
||||
|
||||
|
||||
func _get(property: StringName) -> Variant:
|
||||
if property == "prop_key":
|
||||
return prop_key
|
||||
return null
|
||||
|
||||
|
||||
func _set(property: StringName, value: Variant) -> bool:
|
||||
if property == "prop_key":
|
||||
prop_key = value
|
||||
return true
|
||||
return false
|
||||
|
@ -10,8 +10,10 @@ size = Vector2(35, 70)
|
||||
|
||||
[node name="Interactable" type="Sprite2D"]
|
||||
script = ExtResource("1_6nrd3")
|
||||
prop_key = ""
|
||||
|
||||
[node name="Sfx" parent="." instance=ExtResource("2_bvj74")]
|
||||
file = "开锁声.mp3"
|
||||
|
||||
[node name="Sign" parent="." instance=ExtResource("3_qsms8")]
|
||||
unique_name_in_owner = true
|
||||
|
@ -1,6 +1,9 @@
|
||||
@tool
|
||||
extends Sprite2D
|
||||
|
||||
signal start_inspecting
|
||||
signal quit_inspecting
|
||||
|
||||
# @export var entity_config: EntityConfig:
|
||||
# set(value):
|
||||
# entity_config = value
|
||||
@ -35,10 +38,8 @@ static var content_dialogue = (
|
||||
|
||||
var status := STATUS_NORAML
|
||||
var blinking_tween: Tween
|
||||
|
||||
var inspected_time = 0.0
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
$InspectLayer.layer = GlobalConfig.CANVAS_LAYER_PROP_INSPECTOR
|
||||
sign_mark.interacted.connect(_on_interacted)
|
||||
@ -78,6 +79,7 @@ func _on_interacted() -> void:
|
||||
cover_rect.texture = texture_cover
|
||||
tip_label.text = tip_cover
|
||||
_blink_label(true)
|
||||
start_inspecting.emit()
|
||||
elif status == STATUS_INSPECTING_COVER:
|
||||
sfx.play()
|
||||
status = STATUS_INSPECTING_NOTES
|
||||
@ -104,6 +106,8 @@ func _blink_label(init := true):
|
||||
|
||||
func _on_cancel(_body = null):
|
||||
# inspected_time = Time.get_ticks_msec()
|
||||
if status != STATUS_NORAML:
|
||||
quit_inspecting.emit()
|
||||
status = STATUS_NORAML
|
||||
var tween = create_tween()
|
||||
tween.tween_property(container, "modulate:a", 0.0, 0.15)
|
||||
|
@ -1,4 +1,4 @@
|
||||
[gd_scene load_steps=11 format=3 uid="uid://ci5anaxsa1apl"]
|
||||
[gd_scene load_steps=10 format=3 uid="uid://ci5anaxsa1apl"]
|
||||
|
||||
[ext_resource type="Script" path="res://scene/entity/local_inspectable.gd" id="1_85el0"]
|
||||
[ext_resource type="PackedScene" uid="uid://c85t6stvytvjn" path="res://scene/entity/ux/sfx.tscn" id="2_h0c2s"]
|
||||
@ -7,7 +7,6 @@
|
||||
[ext_resource type="PackedScene" uid="uid://c4tipnj1cr1j3" path="res://scene/entity/ux/sign.tscn" id="4_do8tr"]
|
||||
[ext_resource type="SpriteFrames" uid="uid://c3s8u4ifaucpj" path="res://config/animation/entity_sprite_frames.tres" id="6_e77p4"]
|
||||
[ext_resource type="Script" path="res://scene/entity/ux/animated_sound_sprite_2d.gd" id="7_bhwlx"]
|
||||
[ext_resource type="Texture2D" uid="uid://cpht56skg054p" path="res://asset/art/scene/c01/s05_院长房间/e_座钟.png" id="8_53i12"]
|
||||
|
||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_4fuic"]
|
||||
resource_local_to_scene = true
|
||||
@ -82,7 +81,6 @@ layout_mode = 2
|
||||
size_flags_horizontal = 4
|
||||
size_flags_vertical = 4
|
||||
mouse_filter = 2
|
||||
texture = ExtResource("8_53i12")
|
||||
|
||||
[node name="ContentLabel" type="Label" parent="InspectLayer/Root/Container"]
|
||||
unique_name_in_owner = true
|
||||
|
@ -1,6 +1,8 @@
|
||||
@tool
|
||||
extends Sprite2D
|
||||
|
||||
signal read_note
|
||||
|
||||
@export_enum("os", "ballon") var mode = "os"
|
||||
@export_enum("items", "c01", "c02", "c03", "c04", "c05", "c06") var dialogue := "items":
|
||||
set(val):
|
||||
@ -55,6 +57,7 @@ func _on_interacted() -> void:
|
||||
_show_os()
|
||||
"ballon":
|
||||
_show_balloon()
|
||||
read_note.emit()
|
||||
|
||||
|
||||
func _show_os():
|
||||
|
@ -1,4 +1,4 @@
|
||||
[gd_scene load_steps=22 format=3 uid="uid://dlx5xxbg53rb8"]
|
||||
[gd_scene load_steps=23 format=3 uid="uid://dlx5xxbg53rb8"]
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://dayyx4jerj7io" path="res://scene/ground/ground.tscn" id="1_ff4yb"]
|
||||
[ext_resource type="Script" path="res://config/deploy/scene_config.gd" id="2_ve5ly"]
|
||||
@ -38,6 +38,10 @@ size = Vector2(10, 60)
|
||||
resource_local_to_scene = true
|
||||
size = Vector2(10, 60)
|
||||
|
||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_40ng7"]
|
||||
resource_local_to_scene = true
|
||||
size = Vector2(35, 70)
|
||||
|
||||
[node name="S05院长房间" type="Node2D"]
|
||||
|
||||
[node name="Ground" parent="." instance=ExtResource("1_ff4yb")]
|
||||
@ -113,6 +117,11 @@ shape = SubResource("RectangleShape2D_dq2na")
|
||||
|
||||
[node name="Interactable" parent="Ground/DeployLayer" index="8" instance=ExtResource("14_lq1ou")]
|
||||
position = Vector2(210, 36)
|
||||
one_shot = false
|
||||
prop_key = "prop_令牌"
|
||||
|
||||
[node name="CollisionShape2D" parent="Ground/DeployLayer/Interactable/Area2D" index="0"]
|
||||
shape = SubResource("RectangleShape2D_40ng7")
|
||||
|
||||
[node name="PointLight2D" type="PointLight2D" parent="Ground/AmbientLayer" index="0"]
|
||||
visible = false
|
||||
@ -136,3 +145,4 @@ texture = ExtResource("3_7u4bh")
|
||||
[editable path="Ground/DeployLayer/桌椅"]
|
||||
[editable path="Ground/DeployLayer/画框"]
|
||||
[editable path="Ground/DeployLayer/鸡毛掸子"]
|
||||
[editable path="Ground/DeployLayer/Interactable"]
|
||||
|
@ -31,7 +31,6 @@ class_name PropHud extends Control
|
||||
var items_dict := {}
|
||||
# 从配置文件加载 prop items
|
||||
var item_config_res = preload("res://asset/dialogue/item_description.dialogue")
|
||||
var item_config_title = "PropItems"
|
||||
var texture_path_prefix = "res://asset/art/prop/"
|
||||
var cached_inventory_textures := {}
|
||||
|
||||
@ -75,17 +74,23 @@ func _on_focus_exited() -> void:
|
||||
|
||||
|
||||
func _load_items():
|
||||
var current_line = await item_config_res.get_next_dialogue_line(item_config_title)
|
||||
var id = item_config_res.titles["PropItems"]
|
||||
var current_line = item_config_res.lines[id]
|
||||
while current_line:
|
||||
var texture_path = current_line.get_tag_value("texture")
|
||||
if texture_path:
|
||||
if current_line.has("tags") and current_line.has("translation_key"):
|
||||
var wrapped := "texture="
|
||||
var texture_path = ""
|
||||
for t in current_line.tags:
|
||||
if t.begins_with(wrapped):
|
||||
texture_path = t.replace(wrapped, "").strip_edges()
|
||||
break
|
||||
var item = PropItem.new()
|
||||
item.key = current_line.translation_key
|
||||
item.texture_path = texture_path_prefix + texture_path
|
||||
items_dict[item.key] = item
|
||||
if current_line.next_id == "end":
|
||||
if not current_line.has("next_id") or current_line.next_id == "end":
|
||||
break
|
||||
current_line = await item_config_res.get_next_dialogue_line(current_line.next_id)
|
||||
current_line = item_config_res.lines[current_line.next_id]
|
||||
|
||||
|
||||
func _load_from_archive() -> void:
|
||||
@ -166,7 +171,6 @@ func _on_panel_pressed() -> void:
|
||||
grab_focus()
|
||||
selected = true
|
||||
_mouse_moved_on_listening()
|
||||
print("panel")
|
||||
|
||||
|
||||
func _on_mouse_entered() -> void:
|
||||
|
@ -247,50 +247,51 @@ func release_player():
|
||||
|
||||
|
||||
func _draw() -> void:
|
||||
var animation = sprite.animation
|
||||
if not animation:
|
||||
return
|
||||
if not animation_shadow_polygons.has(animation):
|
||||
_build_shadow_polygons(animation)
|
||||
var animation_polygons = animation_shadow_polygons[animation]
|
||||
if animation_polygons.has(sprite.frame):
|
||||
draw_polygon(animation_polygons[sprite.frame], [shadow_color])
|
||||
else:
|
||||
printerr("No shadow polygon found for frame %d" % sprite.frame)
|
||||
pass
|
||||
# # 绘制阴影,咱不启用
|
||||
# var animation = sprite.animation
|
||||
# if not animation:
|
||||
# return
|
||||
# if not animation_shadow_polygons.has(animation):
|
||||
# _build_shadow_polygons(animation)
|
||||
# var animation_polygons = animation_shadow_polygons[animation]
|
||||
# if animation_polygons.has(sprite.frame):
|
||||
# draw_polygon(animation_polygons[sprite.frame], [shadow_color])
|
||||
# else:
|
||||
# printerr("No shadow polygon found for frame %d" % sprite.frame)
|
||||
|
||||
|
||||
func _build_shadow_polygons(animation):
|
||||
var frames = sprite.sprite_frames
|
||||
var coords_dict = {}
|
||||
for i in frames.get_frame_count(animation):
|
||||
var texture = frames.get_frame_texture(animation, i) as Texture2D
|
||||
if not texture:
|
||||
continue
|
||||
var image = texture.get_image()
|
||||
var x_min = 10000
|
||||
var x_max = -1
|
||||
for y in range(texture.get_height()):
|
||||
for x in range(texture.get_width()):
|
||||
var color = image.get_pixel(x, y)
|
||||
if color.a > 0.0:
|
||||
x_min = min(x_min, x)
|
||||
x_max = max(x_max, x)
|
||||
if x_min >= x_max:
|
||||
continue
|
||||
var oval_ab: Vector2
|
||||
oval_ab.x = (x_max - x_min) * 0.5
|
||||
oval_ab.y = max(3.0, oval_ab.x * 0.12)
|
||||
var x_offset = (x_max - x_min) * 0.5 + x_min - texture.get_width() * 0.5
|
||||
var coords: PackedVector2Array
|
||||
# build shadow oval shape with segments.
|
||||
var segments = 16
|
||||
for j in range(segments):
|
||||
var angle = PI * 2 / segments * j
|
||||
var x = cos(angle) * oval_ab.x + x_offset
|
||||
var y = sin(angle) * oval_ab.y + shadow_y
|
||||
coords.append(Vector2(x, y))
|
||||
coords_dict[i] = coords
|
||||
animation_shadow_polygons[animation] = coords_dict
|
||||
# func _build_shadow_polygons(animation):
|
||||
# var frames = sprite.sprite_frames
|
||||
# var coords_dict = {}
|
||||
# for i in frames.get_frame_count(animation):
|
||||
# var texture = frames.get_frame_texture(animation, i) as Texture2D
|
||||
# if not texture:
|
||||
# continue
|
||||
# var image = texture.get_image()
|
||||
# var x_min = 10000
|
||||
# var x_max = -1
|
||||
# for y in range(texture.get_height()):
|
||||
# for x in range(texture.get_width()):
|
||||
# var color = image.get_pixel(x, y)
|
||||
# if color.a > 0.0:
|
||||
# x_min = min(x_min, x)
|
||||
# x_max = max(x_max, x)
|
||||
# if x_min >= x_max:
|
||||
# continue
|
||||
# var oval_ab: Vector2
|
||||
# oval_ab.x = (x_max - x_min) * 0.5
|
||||
# oval_ab.y = max(3.0, oval_ab.x * 0.12)
|
||||
# var x_offset = (x_max - x_min) * 0.5 + x_min - texture.get_width() * 0.5
|
||||
# var coords: PackedVector2Array
|
||||
# # build shadow oval shape with segments.
|
||||
# var segments = 16
|
||||
# for j in range(segments):
|
||||
# var angle = PI * 2 / segments * j
|
||||
# var x = cos(angle) * oval_ab.x + x_offset
|
||||
# var y = sin(angle) * oval_ab.y + shadow_y
|
||||
# coords.append(Vector2(x, y))
|
||||
# coords_dict[i] = coords
|
||||
# animation_shadow_polygons[animation] = coords_dict
|
||||
|
||||
|
||||
func _reset_os_and_shadow_position():
|
||||
|
Loading…
Reference in New Issue
Block a user