增加检阅时的运镜效果;画面支持嵌入高分辨率物品

This commit is contained in:
cakipaul 2025-01-02 19:01:44 +08:00
parent a8b947f9a5
commit 1afa814377
21 changed files with 724 additions and 125 deletions

File diff suppressed because one or more lines are too long

View File

@ -8,8 +8,8 @@ enum VIBE {
}
func get_camera() -> MainCamera:
return get_node_or_null("/root/Main/MainPlayer/CameraFocusMarker/MainCamera") as MainCamera
func get_camera_marker():
return get_node_or_null("/root/Main/CameraFocusMarker")
func get_player() -> MainPlayer:
@ -24,16 +24,15 @@ func freeze_player(lock_time: float, animation := ""):
func set_camera_boundary(size: Vector2) -> void:
var camera = get_camera()
if camera:
camera.limit_left = 0
camera.limit_right = size.x
var camera_marker = CameraFocusMarker
camera_marker.limit_left = 0
camera_marker.limit_right = size.x
camera_marker.limit_top = -size.y / 2.0 - 38
camera_marker.limit_bottom = size.y / 2.0 + 38
if GlobalConfig.DEBUG:
print("set camera boundary:", size)
# camera.limit_top = -size.y / 2
# camera.limit_bottom = size.y / 2
else:
printerr("Camera node not found")
printerr("camera_marker node not found")
func set_player_boundary(size: Vector2) -> void:
@ -85,3 +84,52 @@ func pop_note(note: String, note_color := "white", duration := 2.5) -> void:
func get_inspector() -> PropInspector:
return get_node_or_null("/root/Main/PropInspector") as PropInspector
func focus_nodepath(node_path: NodePath) -> void:
if not node_path:
printerr("Node path is empty")
return
var node = get_node_or_null(node_path)
if node:
focus_node(node)
else:
printerr("Node not found:", node_path)
var camera_remote_transformer: RemoteTransform2D
func focus_node(node: Node2D) -> void:
var rt := node.get_node_or_null("./camera_remote_transformer") as RemoteTransform2D
if rt:
if camera_remote_transformer and rt != camera_remote_transformer:
camera_remote_transformer.queue_free()
camera_remote_transformer = rt
else:
if camera_remote_transformer:
camera_remote_transformer.queue_free()
camera_remote_transformer = RemoteTransform2D.new()
node.add_child(camera_remote_transformer)
_setup_camera_remote_transformer()
func _setup_camera_remote_transformer():
if not camera_remote_transformer:
return
camera_remote_transformer.remote_path = "/root/CameraFocusMarker"
camera_remote_transformer.update_position = true
camera_remote_transformer.update_rotation = false
camera_remote_transformer.update_scale = false
camera_remote_transformer.name = "camera_remote_transformer"
func focus_player() -> void:
var player = get_player()
if player:
focus_node(player)
else:
printerr("Player node not found")
func focus_player_and_reset_zoom(duration := 1.0) -> void:
CameraFocusMarker.tween_zoom(1.0, duration).tween_callback(focus_player)

View File

@ -33,6 +33,8 @@ buses/default_bus_layout="res://config/default_bus_layout.tres"
DebugMenu="*res://addons/debug_menu/debug_menu.tscn"
GlobalConfigManager="*res://manager/config_manager/global_config_manager.gd"
CameraFocusMarker="*res://scene/camera/camera_focus_marker.tscn"
MainCamera="*res://scene/camera/main_camera.tscn"
SceneManager="*res://manager/deploy/scene/scene_manager.gd"
AudioManager="*res://manager/audio_manager/audio_manager.gd"
EventManager="*res://manager/event_manager/event_manager.gd"
@ -44,9 +46,9 @@ ArchiveManager="*res://manager/archive_manager/archive_manager.gd"
[display]
window/size/viewport_width=564
window/size/viewport_height=317
window/size/viewport_height=316
window/size/window_width_override=1692
window/size/window_height_override=951
window/size/window_height_override=948
window/subwindows/embed_subwindows=false
window/stretch/mode="canvas_items"
window/stretch/scale_mode="integer"

View File

@ -2,9 +2,46 @@ extends Marker2D
@export var lock_horizontal = true
@export var speed := 3.0
@export var half_screen_size := Vector2(564, 240) / 2.0
@export var top_shaded_length := 38
@export var limit_left := 0
@export var limit_right := 564
@export var limit_top := -158
@export var limit_bottom := 158
@onready var target = %Target as Node2D
# @onready var camera = %MainCamera as MainCamera
var zoom_ratio := 1.0
func tweak_position(velocity, facing_direction):
position.x = facing_direction.x * abs(velocity.x) * 0.3
target.position.x = facing_direction.x * abs(velocity.x) * 0.3
if lock_horizontal:
global_position.y = 0
target.position.y = 0
else:
position.y = facing_direction.y * abs(velocity.y) * 0.3
target.position.y = facing_direction.y * abs(velocity.y) * 0.3
func _physics_process(delta: float) -> void:
# set camera's position
var target_position = target.global_position
var current_position = MainCamera.global_position
# easing with speed
var position_delta = (target_position - current_position) * speed * delta
var new_position = current_position + position_delta
# clamp the position
var margin = half_screen_size / zoom_ratio
margin.y += top_shaded_length
new_position.x = clamp(new_position.x, limit_left + margin.x, limit_right - margin.x)
new_position.y = clamp(new_position.y, limit_top + margin.y, limit_bottom - margin.y)
MainCamera.global_position = new_position
MainCamera.zoom = Vector2(zoom_ratio, zoom_ratio)
func tween_zoom(ratio: float, duration := 1.0) -> Tween:
var tween = create_tween()
tween.tween_property(self, "zoom_ratio", ratio, duration).set_trans(Tween.TRANS_CUBIC)
return tween

View File

@ -4,3 +4,13 @@
[node name="CameraFocusMarker" type="Marker2D"]
script = ExtResource("1_7t4e6")
lock_horizontal = null
speed = null
half_screen_size = null
limit_left = null
limit_right = null
limit_top = null
limit_bottom = null
[node name="Target" type="Node2D" parent="."]
unique_name_in_owner = true

View File

@ -1,4 +1 @@
extends Camera2D
class_name MainCamera

111
scene/entity/hd_entity.gd Normal file
View File

@ -0,0 +1,111 @@
@tool
extends Node2D
@export var reload := false:
set(val):
_reload()
reload = false
@export var sprite_name := "name":
set(val):
if sprite_name and sprite_name != val:
_remove_sprite(sprite_name)
sprite_name = val
_reload()
@export var texture: Texture2D:
set(val):
texture = val
_reload()
@export var sprite_scale := 1.0:
set(val):
sprite_scale = val
_update_sprite_transform(true)
@export var sprite_ref: Sprite2D
const RATIO = 4.0
@onready var sign_mark = %Sign as Sprite2D
@onready var area2d = %Area2D as Area2D
func _ready() -> void:
_reload()
set_notify_transform(true)
# set_notify_local_transform(true)
item_rect_changed.connect(_update_sprite_transform)
area2d.body_entered.connect(_reset)
area2d.body_exited.connect(_on_cancel)
sign_mark.interacted.connect(_on_interacted)
sign_mark.cancel.connect(_on_cancel)
func _notification(what: int) -> void:
if what == NOTIFICATION_TRANSFORM_CHANGED:
if not is_node_ready():
await ready
_update_sprite_transform()
func _reload():
if not texture or not sprite_name:
return
var layer = _get_hd_layer()
if not layer:
return
sprite_ref = layer.get_node_or_null(sprite_name) as Sprite2D
if not sprite_ref:
sprite_ref = Sprite2D.new()
layer.add_child(sprite_ref)
sprite_ref.owner = layer
sprite_ref.name = sprite_name
sprite_ref.texture = texture
sprite_ref.z_index = 0
sprite_ref.centered = true
sprite_ref.visible = true
_update_sprite_transform()
func _remove_sprite(sprite_node_name):
if sprite_ref:
sprite_ref.queue_free()
sprite_ref = null
if not sprite_name:
return
var layer = _get_hd_layer()
if layer:
var sprite = layer.get_node_or_null(sprite_node_name)
layer.remove_child(sprite)
sprite.queue_free()
func _get_hd_layer() -> CanvasLayer:
return get_node_or_null("../../SubViewportContainer/SubViewport/HdLayer") as CanvasLayer
func _update_sprite_transform(update_scale := false):
if not sprite_ref:
return
sprite_ref.global_position = global_position * RATIO
if update_scale:
sprite_ref.scale = Vector2(sprite_scale, sprite_scale)
var interacted = false
func _on_interacted() -> void:
if interacted:
_on_cancel()
return
interacted = true
CameraFocusMarker.tween_zoom(1.8, 1.5)
SceneManager.focus_node(self)
func _on_cancel(_body = null):
SceneManager.focus_player_and_reset_zoom()
interacted = false
func _reset(_body):
interacted = false

View File

@ -0,0 +1,42 @@
[gd_scene load_steps=7 format=3 uid="uid://bj4ufua0b0k34"]
[ext_resource type="Script" path="res://scene/entity/hd_entity.gd" id="1_fp2a8"]
[ext_resource type="PackedScene" uid="uid://c85t6stvytvjn" path="res://scene/entity/ux/sfx.tscn" id="2_jmpkt"]
[ext_resource type="Texture2D" uid="uid://t526pexw4ng4" path="res://asset/art/neutral_point_light.webp" id="3_oxpta"]
[ext_resource type="Texture2D" uid="uid://dvg6wjwn1qxiv" path="res://asset/art/ui/action_mark/探索ui.png" id="4_7tkfj"]
[ext_resource type="Script" path="res://scene/entity/ux/sign.gd" id="5_5v6q2"]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_gffp4"]
resource_local_to_scene = true
size = Vector2(35, 70)
[node name="HdEntity" type="Marker2D"]
script = ExtResource("1_fp2a8")
[node name="Sfx" parent="." instance=ExtResource("2_jmpkt")]
unique_name_in_owner = true
file = "物品查看.mp3"
[node name="PointLight2D" type="PointLight2D" parent="."]
unique_name_in_owner = true
position = Vector2(0, -35)
scale = Vector2(0.2, 0.2)
energy = 0.0
texture = ExtResource("3_oxpta")
texture_scale = 0.5
[node name="Sign" type="Sprite2D" parent="."]
unique_name_in_owner = true
modulate = Color(1, 1, 1, 0)
position = Vector2(0, -9)
scale = Vector2(0.2, 0.2)
texture = ExtResource("4_7tkfj")
script = ExtResource("5_5v6q2")
[node name="Area2D" type="Area2D" parent="."]
unique_name_in_owner = true
collision_layer = 0
[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D"]
unique_name_in_owner = true
shape = SubResource("RectangleShape2D_gffp4")

View File

@ -0,0 +1,98 @@
extends Sprite2D
# @export var entity_config: EntityConfig:
# set(value):
# entity_config = value
enum { STATUS_NORAML, STATUS_INSPECTING_COVER, STATUS_INSPECTING_NOTES }
@export var entity_name: String = ""
@export var entity_title: String = ""
@export var texture_cover: Texture2D
@export_multiline var inspection_note: String = ""
@onready var sprite2d = %AnimatedSoundSprite2D as AnimatedSoundSprite2D
@onready var sign_mark = %Sign as Sprite2D
@onready var area2d = %Area2D as Area2D
@onready var sfx = %Sfx
@onready var cover_sprite = %Cover as Sprite2D
@onready var content_label = %ContentLabel as Label
@onready var tip_label = %TipLabel as Label
var tip_cover = "Q: 退出 E: 阅读"
var tip_notes = "Q: 退出 E: 收起"
var status := STATUS_NORAML
var blinking_tween: Tween
var inspected_time = 0.0
func _ready() -> void:
sign_mark.interacted.connect(_on_interacted)
sign_mark.cancel.connect(_on_cancel)
content_label.text = inspection_note
content_label.modulate.a = 0.0
tip_label.text = tip_cover
tip_label.modulate.a = 0.0
cover_sprite.modulate.a = 0.0
cover_sprite.texture = texture_cover
func _on_interacted() -> void:
# 1.5s 内锁定交互,留给镜头复位时间
if Time.get_ticks_msec() - inspected_time < 1500:
return
if status == STATUS_NORAML:
sfx.play()
SceneManager.focus_node(self)
CameraFocusMarker.tween_zoom(2.0, 1.5)
status = STATUS_INSPECTING_COVER
sign_mark.show_sign = false
var player = SceneManager.get_player()
if player:
player.freeze_player(0)
tip_label.text = tip_cover
_blink_label(true)
elif status == STATUS_INSPECTING_COVER:
sfx.play()
status = STATUS_INSPECTING_NOTES
tip_label.text = tip_notes
create_tween().tween_property(content_label, "modulate:a", 1.0, 0.2)
create_tween().tween_property(cover_sprite, "modulate:a", 1.0, 0.15)
elif status == STATUS_INSPECTING_NOTES:
sfx.play()
status = STATUS_INSPECTING_COVER
tip_label.text = tip_cover
create_tween().tween_property(content_label, "modulate:a", 0.0, 0.15)
create_tween().tween_property(cover_sprite, "modulate:a", 0.0, 0.2)
func _blink_label(init := true):
if status == STATUS_NORAML:
return
blinking_tween = create_tween()
if init:
blinking_tween.tween_property(tip_label, "modulate:a", 0.8, 2.0)
blinking_tween.tween_callback(_blink_label.bind(false))
else:
blinking_tween.tween_property(tip_label, "modulate:a", 0.5, 1.0)
blinking_tween.tween_callback(_blink_label.bind(true))
func _on_cancel(_body = null):
inspected_time = Time.get_ticks_msec()
status = STATUS_NORAML
cover_sprite.modulate.a = 0.0
var tween = create_tween()
tween.tween_property(content_label, "modulate:a", 0.0, 0.15)
if blinking_tween and blinking_tween.is_running():
blinking_tween.stop()
tween.parallel().tween_property(tip_label, "modulate:a", 0.0, 0.15)
SceneManager.focus_player_and_reset_zoom(1.0)
var player = SceneManager.get_player()
if player:
player.release_player()
sign_mark.show_sign = true

View File

@ -0,0 +1,105 @@
[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"]
[ext_resource type="Texture2D" uid="uid://t526pexw4ng4" path="res://asset/art/neutral_point_light.webp" id="3_o562w"]
[ext_resource type="Texture2D" uid="uid://dvg6wjwn1qxiv" path="res://asset/art/ui/action_mark/探索ui.png" id="4_bi35o"]
[ext_resource type="Script" path="res://scene/entity/ux/sign.gd" id="5_vsfuq"]
[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"]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_4fuic"]
resource_local_to_scene = true
size = Vector2(35, 70)
[sub_resource type="LabelSettings" id="LabelSettings_c3c2j"]
line_spacing = 1.0
font_size = 11
[node name="LocalInspectable" type="Sprite2D"]
script = ExtResource("1_85el0")
[node name="Sfx" parent="." instance=ExtResource("2_h0c2s")]
unique_name_in_owner = true
file = "纸条.mp3"
[node name="PointLight2D" type="PointLight2D" parent="."]
unique_name_in_owner = true
position = Vector2(0, -35)
scale = Vector2(0.2, 0.2)
energy = 0.0
texture = ExtResource("3_o562w")
texture_scale = 0.5
[node name="Sign" type="Sprite2D" parent="."]
unique_name_in_owner = true
modulate = Color(1, 1, 1, 0)
position = Vector2(0, -9)
scale = Vector2(0.2, 0.2)
texture = ExtResource("4_bi35o")
script = ExtResource("5_vsfuq")
[node name="AnimatedSoundSprite2D" type="AnimatedSprite2D" parent="."]
unique_name_in_owner = true
visible = false
sprite_frames = ExtResource("6_e77p4")
animation = &"c00_吕萍_记笔记_right"
script = ExtResource("7_bhwlx")
[node name="Area2D" type="Area2D" parent="."]
unique_name_in_owner = true
collision_layer = 0
[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D"]
unique_name_in_owner = true
shape = SubResource("RectangleShape2D_4fuic")
[node name="Cover" type="Sprite2D" parent="."]
unique_name_in_owner = true
z_index = 99
scale = Vector2(0.5, 0.5)
[node name="ContentLabel" type="Label" parent="."]
unique_name_in_owner = true
modulate = Color(1, 1, 1, 0)
z_index = 100
custom_minimum_size = Vector2(70, 0)
anchors_preset = 8
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = -29.5
offset_top = -49.5
offset_right = 90.5
offset_bottom = 145.5
grow_horizontal = 2
grow_vertical = 2
scale = Vector2(0.5, 0.5)
size_flags_horizontal = 4
text = "据闻奉贤县分水墩又有七人染受鼠疫,病状可怖,闻医官药治无用,免职。
有地方人称鼠疫为妖邪作祟,甚为惊骇,一时人心惶惶,竟有聚众滋闹之事,政府以防疫事宜关系紧要,拟赴分水墩一带调查防疫事宜云。
《申报》
民国五年一月十三日"
label_settings = SubResource("LabelSettings_c3c2j")
vertical_alignment = 1
autowrap_mode = 3
[node name="TipLabel" type="Label" parent="."]
unique_name_in_owner = true
modulate = Color(1, 1, 1, 0)
z_index = 100
anchors_preset = 5
anchor_left = 0.5
anchor_right = 0.5
offset_left = -25.5
offset_top = 49.0
offset_right = 80.5
offset_bottom = 64.0
grow_horizontal = 2
scale = Vector2(0.5, 0.5)
size_flags_vertical = 8
text = "Q: 退出 E: 阅读"
horizontal_alignment = 1
vertical_alignment = 1

View File

@ -32,11 +32,16 @@ func _on_interacted() -> void:
played_time = Time.get_ticks_msec()
mutex.unlock()
%Sfx.play()
SceneManager.focus_node(self)
CameraFocusMarker.tween_zoom(1.2, 1.5)
for note in notes:
SceneManager.pop_note(note, "white", 2.0)
var player = SceneManager.get_player()
# TODO note viewing animation
player.freeze_player(note_time, "")
get_tree().create_timer(note_time - 0.5).timeout.connect(
SceneManager.focus_player_and_reset_zoom
)
func _on_cancel(_body = null):

View File

@ -9,7 +9,13 @@ extends Node2D
# # set(val):
# # base_scale = val
# # sprite2d.scale = base_scale
@export var show_sign := true
@export var show_sign := true:
set(val):
show_sign = val
if val:
modulate.a = 1.0
else:
modulate.a = 0.0
signal interacted
signal cancel

View File

@ -9,6 +9,8 @@ var footstep_audio = RandomAudioStreamPlayer.new()
func _ready() -> void:
foreground.layer = GlobalConfig.CANVAS_LAYER_FG
%ColorRectTop.visible = true
%ColorRectBottom.visible = true
add_child(footstep_audio)
reload()

View File

@ -38,6 +38,7 @@ layer = 10
[node name="BGParallaxLayer" type="ParallaxLayer" parent="ParallaxForeground"]
[node name="FGParallaxLayer" type="ParallaxLayer" parent="ParallaxForeground"]
visible = false
motion_scale = Vector2(1.1, 1.1)
[node name="FGSprite2D" type="Sprite2D" parent="ParallaxForeground/FGParallaxLayer"]
@ -47,6 +48,8 @@ texture = ExtResource("5_i5hii")
centered = false
[node name="ColorRectTop" type="ColorRect" parent="ParallaxForeground"]
unique_name_in_owner = true
visible = false
custom_minimum_size = Vector2(564, 38.5)
anchors_preset = 5
anchor_left = 0.5
@ -59,6 +62,8 @@ mouse_filter = 2
color = Color(0.0519829, 0.0179176, 0.00269875, 1)
[node name="ColorRectBottom" type="ColorRect" parent="ParallaxForeground"]
unique_name_in_owner = true
visible = false
custom_minimum_size = Vector2(564, 38.5)
anchors_preset = 7
anchor_left = 0.5
@ -72,3 +77,17 @@ grow_horizontal = 2
grow_vertical = 0
mouse_filter = 2
color = Color(0.0519829, 0.0179176, 0.00269875, 1)
[node name="SubViewportContainer" type="SubViewportContainer" parent="."]
offset_right = 2256.0
offset_bottom = 1268.0
scale = Vector2(0.25, 0.25)
[node name="SubViewport" type="SubViewport" parent="SubViewportContainer"]
transparent_bg = true
handle_input_locally = false
canvas_item_default_texture_filter = 0
size = Vector2i(2256, 1268)
render_target_update_mode = 4
[node name="HdLayer" type="CanvasLayer" parent="SubViewportContainer/SubViewport"]

View File

@ -16,12 +16,16 @@ func _ready() -> void:
if not ignore_archive:
_load_save()
_read_grounds()
if current_scene and entrance_portal and not Engine.is_editor_hint():
ground = get_node_or_null("Ground")
if current_scene and entrance_portal:
transition_to_scene(current_scene, entrance_portal, true)
elif ground:
ground.queue_free()
ground = null
func _load_save():
if ArchiveManager.archive:
if not Engine.is_editor_hint() and ArchiveManager.archive:
if ArchiveManager.archive.current_scene:
current_scene = ArchiveManager.archive.current_scene
if ArchiveManager.archive.entrance_portal:
@ -68,7 +72,7 @@ func transition_to_scene(key: String, portal: String, load_save := false) -> voi
func _update_player_position():
if ignore_archive:
if ignore_archive or Engine.is_editor_hint():
return
var player = SceneManager.get_player() as MainPlayer
if player and ArchiveManager.archive:
@ -92,28 +96,25 @@ func _do_transition(scene: Node2D):
ground.name = "Ground"
_set_camera_and_player_boundary()
_update_archive()
var portal_node = get_node_or_null("./Ground/DeployLayer/portal_" + entrance_portal) as Node2D
if portal_node:
print("set player and camera to portal:", entrance_portal, portal_node.global_position)
var portal_node = ground.get_node_or_null("DeployLayer/portal_" + entrance_portal) as Node2D
if portal_node and not Engine.is_editor_hint():
var player = SceneManager.get_player()
if player:
player.global_position.x = portal_node.global_position.x
var camera = SceneManager.get_camera()
if camera:
camera.global_position.x = portal_node.global_position.x
if GlobalConfig.DEBUG:
print("move player to portal:", entrance_portal, portal_node.global_position)
if GlobalConfig.DEBUG and not Engine.is_editor_hint():
_watch_scene_update()
func _set_camera_and_player_boundary():
var bg = ground.get_node("BGSprite2D")
if bg.texture:
if bg.texture and not Engine.is_editor_hint():
SceneManager.set_camera_boundary(bg.texture.get_size())
SceneManager.set_player_boundary(bg.texture.get_size())
func _update_archive():
if ArchiveManager.archive:
if not Engine.is_editor_hint() and ArchiveManager.archive:
ArchiveManager.archive.current_scene = current_scene
ArchiveManager.archive.entrance_portal = entrance_portal
@ -121,6 +122,7 @@ func _update_archive():
var update_watcher: Timer
var last_modify = 0
func _watch_scene_update():
var scene_path = ground_dict[current_scene]
if scene_path:
@ -147,6 +149,6 @@ func _check_scene_update(scene_path):
func _on_resources_reload(res):
print("resources_reload processing:", res)
if res.ends_with(".tscn"):
if not Engine.is_editor_hint() and res.ends_with(".tscn"):
ArchiveManager.save_all()
transition_to_scene(current_scene, entrance_portal, true)

View File

@ -1,6 +1,94 @@
[gd_scene load_steps=2 format=3 uid="uid://clxgkj80yin2"]
[gd_scene load_steps=7 format=3 uid="uid://clxgkj80yin2"]
[ext_resource type="Script" path="res://scene/ground/ground_loader.gd" id="1_6mjre"]
[ext_resource type="PackedScene" uid="uid://dayyx4jerj7io" path="res://scene/ground/ground.tscn" id="2_xtikv"]
[ext_resource type="Script" path="res://scene/ground/ground.gd" id="3_aiqgg"]
[ext_resource type="Script" path="res://config/deploy/scene_config.gd" id="4_vfq42"]
[ext_resource type="Texture2D" uid="uid://kc4726andgy2" path="res://asset/art/scene/c02/s01_街道/bg_公寓入口.png" id="5_ogvfs"]
[sub_resource type="Resource" id="Resource_6ux50"]
script = ExtResource("4_vfq42")
scene_name = ""
foreground_scale = Vector2(1.2, 1.2)
foreground_position = Vector2(0, 0)
background_scale = Vector2(1, 1)
background_position = Vector2(0, 0)
player_initial_position = Vector2(300, 186)
player_initial_direction = Vector2(1, -1)
player_movement_rect = Rect2(0, 0, 0, 0)
camera_rect = Rect2(0, -1000, 664, 2317)
footstep_type = "concrete"
[node name="GroundLoader" type="Node2D"]
script = ExtResource("1_6mjre")
[node name="Ground" parent="." instance=ExtResource("2_xtikv")]
script = ExtResource("3_aiqgg")
scene_config = SubResource("Resource_6ux50")
[node name="BGSprite2D" parent="Ground" index="0"]
unique_name_in_owner = true
texture = ExtResource("5_ogvfs")
centered = false
offset = Vector2(0, -119)
[node name="DeployLayer" parent="Ground" index="1"]
unique_name_in_owner = true
[node name="ParallaxForeground" parent="Ground" index="2"]
unique_name_in_owner = true
layer = 10
[node name="FGParallaxLayer" parent="Ground/ParallaxForeground" index="1"]
visible = false
motion_scale = Vector2(1.1, 1.1)
[node name="FGSprite2D" parent="Ground/ParallaxForeground/FGParallaxLayer" index="0"]
unique_name_in_owner = true
position = Vector2(-34, -118)
centered = false
[node name="ColorRectTop" parent="Ground/ParallaxForeground" index="2"]
unique_name_in_owner = true
visible = false
custom_minimum_size = Vector2(564, 38.5)
anchors_preset = 5
anchor_left = 0.5
anchor_right = 0.5
offset_left = -282.0
offset_right = 282.0
offset_bottom = 40.0
grow_horizontal = 2
mouse_filter = 2
color = Color(0.0519829, 0.0179176, 0.00269875, 1)
[node name="ColorRectBottom" parent="Ground/ParallaxForeground" index="3"]
unique_name_in_owner = true
visible = false
custom_minimum_size = Vector2(564, 38.5)
anchors_preset = 7
anchor_left = 0.5
anchor_top = 1.0
anchor_right = 0.5
anchor_bottom = 1.0
offset_left = -282.0
offset_top = -38.5
offset_right = 282.0
grow_horizontal = 2
grow_vertical = 0
mouse_filter = 2
color = Color(0.0519829, 0.0179176, 0.00269875, 1)
[node name="SubViewportContainer" parent="Ground" index="3"]
offset_right = 2256.0
offset_bottom = 1268.0
scale = Vector2(0.25, 0.25)
[node name="SubViewport" parent="Ground/SubViewportContainer" index="0"]
transparent_bg = true
handle_input_locally = false
canvas_item_default_texture_filter = 0
size = Vector2i(2256, 1268)
render_target_update_mode = 4
[editable path="Ground"]

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=7 format=3 uid="uid://e381spnutx62"]
[gd_scene load_steps=9 format=3 uid="uid://e381spnutx62"]
[ext_resource type="PackedScene" uid="uid://dayyx4jerj7io" path="res://scene/ground/ground.tscn" id="1_klnwh"]
[ext_resource type="PackedScene" uid="uid://0sofmhrl358m" path="res://scene/entity/npc.tscn" id="2_upqk5"]
@ -6,6 +6,8 @@
[ext_resource type="PackedScene" uid="uid://61pis75a8fdq" path="res://scene/entity/portal.tscn" id="4_eejqb"]
[ext_resource type="PackedScene" uid="uid://wyj4qdjyn4ql" path="res://scene/entity/inspectable.tscn" id="5_pirce"]
[ext_resource type="PackedScene" uid="uid://bnf3lkcbpx1ar" path="res://scene/entity/ambush.tscn" id="6_fiskb"]
[ext_resource type="PackedScene" uid="uid://bj4ufua0b0k34" path="res://scene/entity/hd_entity.tscn" id="7_l4pco"]
[ext_resource type="Texture2D" uid="uid://b0gti8fx40hph" path="res://asset/art/scene/c01/s04/e_树.png" id="8_6dlbe"]
[node name="S00" type="Node2D"]
@ -32,4 +34,10 @@ position = Vector2(376, 36)
position = Vector2(567, 28)
hook_cg = "c02_胖子说话"
[node name="HdEntity" parent="Ground/DeployLayer" index="5" node_paths=PackedStringArray("sprite_ref") instance=ExtResource("7_l4pco")]
position = Vector2(259, 52)
sprite_name = "tree"
texture = ExtResource("8_6dlbe")
sprite_ref = NodePath("../../SubViewportContainer/SubViewport/HdLayer/tree")
[editable path="Ground"]

View File

@ -1,12 +1,17 @@
[gd_scene load_steps=10 format=3 uid="uid://brck77w81fhvc"]
[gd_scene load_steps=16 format=3 uid="uid://brck77w81fhvc"]
[ext_resource type="PackedScene" uid="uid://dayyx4jerj7io" path="res://scene/ground/ground.tscn" id="1_wrr6r"]
[ext_resource type="Texture2D" uid="uid://c4647gof464ws" path="res://asset/art/scene/c02/s02_走道/bg_过道.png" id="2_cn1s8"]
[ext_resource type="PackedScene" uid="uid://jr1yd46wm5je" path="res://scene/entity/note.tscn" id="3_fy0o1"]
[ext_resource type="PackedScene" uid="uid://61pis75a8fdq" path="res://scene/entity/portal.tscn" id="4_vwh5u"]
[ext_resource type="PackedScene" uid="uid://wyj4qdjyn4ql" path="res://scene/entity/inspectable.tscn" id="5_nhtbp"]
[ext_resource type="Texture2D" uid="uid://do8quqgkrwahj" path="res://asset/art/scene/c02/s02_走道/ux_进门鼠疫海报wz.png" id="6_4pcq0"]
[ext_resource type="PackedScene" uid="uid://bnf3lkcbpx1ar" path="res://scene/entity/ambush.tscn" id="6_70vqn"]
[ext_resource type="Texture2D" uid="uid://ds4yw1wqelhm1" path="res://asset/art/scene/c02/s02_走道/ux_进门鼠疫海报yz.png" id="7_wdwbi"]
[ext_resource type="Texture2D" uid="uid://dd0sn5e4hwq5m" path="res://asset/art/scene/c02/s02_走道/e_纸人.png" id="7_xsghn"]
[ext_resource type="PackedScene" uid="uid://bj4ufua0b0k34" path="res://scene/entity/hd_entity.tscn" id="10_3c313"]
[ext_resource type="Texture2D" uid="uid://dtk3c3uqhn8ue" path="res://asset/art/scene/c01/s04/e_轿车.png" id="11_x0h3x"]
[ext_resource type="PackedScene" uid="uid://ci5anaxsa1apl" path="res://scene/entity/local_inspectable.tscn" id="12_0fckv"]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_vj0ag"]
resource_local_to_scene = true
@ -15,6 +20,10 @@ size = Vector2(45, 130)
[sub_resource type="RectangleShape2D" id="RectangleShape2D_0xrg2"]
size = Vector2(40, 150)
[sub_resource type="RectangleShape2D" id="RectangleShape2D_3qhvr"]
resource_local_to_scene = true
size = Vector2(35, 70)
[node name="S02" type="Node2D"]
[node name="Ground" parent="." instance=ExtResource("1_wrr6r")]
@ -49,6 +58,8 @@ shape = SubResource("RectangleShape2D_vj0ag")
position = Vector2(441, -20)
flip_h = true
entity_title = "(鼠疫海报)"
texture_cover = ExtResource("6_4pcq0")
texture_note = ExtResource("7_wdwbi")
inspection_note = "据闻奉贤县分水墩又有七人染受鼠疫,病状可怖,闻医官药治无用,免职。
有地方人称鼠疫为妖邪作祟,甚为惊骇,一时人心惶惶,竟有聚众滋闹之事,政府以防疫事宜关系紧要,拟赴分水墩一带调查防疫事宜云。
@ -71,8 +82,30 @@ shape = SubResource("RectangleShape2D_0xrg2")
position = Vector2(434, 60)
hook_cg = "c02_胖子说话"
[node name="HdEntity" parent="Ground/DeployLayer" index="6" instance=ExtResource("10_3c313")]
position = Vector2(147, 75)
sprite_name = "car"
texture = ExtResource("11_x0h3x")
[node name="Sign" parent="Ground/DeployLayer/HdEntity" index="2"]
position = Vector2(1, -28)
[node name="CollisionShape2D" parent="Ground/DeployLayer/HdEntity/Area2D" index="0"]
shape = SubResource("RectangleShape2D_3qhvr")
[node name="LocalInspectable" parent="Ground/DeployLayer" index="7" instance=ExtResource("12_0fckv")]
position = Vector2(387, -25)
entity_title = "鼠疫海报"
texture_cover = ExtResource("6_4pcq0")
inspection_note = "据闻奉贤县分水墩又有七人染受鼠疫,病状可怖,闻医官药治无用,免职。
有地方人称鼠疫为妖邪作祟,甚为惊骇,一时人心惶惶,竟有聚众滋闹之事,政府以防疫事宜关系紧要,拟赴分水墩一带调查防疫事宜云。
《申报》
民国五年一月十三日"
[node name="FGSprite2D" parent="Ground/ParallaxForeground/FGParallaxLayer" index="0"]
texture = null
[editable path="Ground"]
[editable path="Ground/DeployLayer/Portal2"]
[editable path="Ground/DeployLayer/HdEntity"]

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=11 format=3 uid="uid://dygvcmykn02n8"]
[gd_scene load_steps=9 format=3 uid="uid://dygvcmykn02n8"]
[ext_resource type="Script" path="res://scene/main.gd" id="1_pks84"]
[ext_resource type="PackedScene" uid="uid://3gk1gxwanw24" path="res://ui/vignette/vignette_shading.tscn" id="2_d1re1"]
@ -7,8 +7,6 @@
[ext_resource type="PackedScene" uid="uid://5g07x6q7wwr1" path="res://scene/notification/notification.tscn" id="5_3gg5t"]
[ext_resource type="PackedScene" uid="uid://cekhj65axie0p" path="res://scene/popup/prop_inspector.tscn" id="5_ux0rw"]
[ext_resource type="PackedScene" uid="uid://cjhw5ecygrqty" path="res://scene/player/main_player.tscn" id="6_6geb0"]
[ext_resource type="PackedScene" uid="uid://cqkeegrcdjyg4" path="res://scene/camera/camera_focus_marker.tscn" id="7_n7qcv"]
[ext_resource type="PackedScene" uid="uid://ogyvstscr0kx" path="res://scene/camera/main_camera.tscn" id="8_nj084"]
[ext_resource type="PackedScene" uid="uid://clxgkj80yin2" path="res://scene/ground/ground_loader.tscn" id="10_8rc5n"]
[node name="Main" type="Node2D"]
@ -35,7 +33,6 @@ metadata/_edit_use_anchors_ = true
[node name="PropInspector" parent="." instance=ExtResource("5_ux0rw")]
unique_name_in_owner = true
layer = 98
[node name="VignetteShading" parent="." instance=ExtResource("2_d1re1")]
@ -43,17 +40,3 @@ layer = 98
unique_name_in_owner = true
position = Vector2(80, 42)
scale = Vector2(0.6, 0.6)
[node name="CameraFocusMarker" parent="MainPlayer" instance=ExtResource("7_n7qcv")]
unique_name_in_owner = true
[node name="MainCamera" parent="MainPlayer/CameraFocusMarker" instance=ExtResource("8_nj084")]
unique_name_in_owner = true
position = Vector2(1.66667, 0)
limit_left = 0
limit_top = -1000
limit_right = 820
limit_bottom = 1000
limit_smoothed = true
position_smoothing_enabled = true
position_smoothing_speed = 8.0

View File

@ -50,6 +50,7 @@ func _ready() -> void:
# _reset_face_direction()
footstep_timer.timeout.connect(_on_footstep_timer_timeout)
footstep_timer.stop()
SceneManager.focus_player()
func _on_footstep_timer_timeout():
@ -198,9 +199,7 @@ func _physics_process(_delta: float) -> void:
# drag the camera marker against the player movement
# so there will be a better vision in front of the player.
func _tweak_camera_marker():
var marker = get_node("./CameraFocusMarker") as Node2D
if marker:
marker.tweak_position(velocity, facing_direction)
CameraFocusMarker.tweak_position(velocity, facing_direction)
var lock_mutex = Mutex.new()

View File

@ -8,10 +8,12 @@ line_spacing = 1.0
font_size = 11
[node name="PropInspector" type="CanvasLayer"]
layer = 98
script = ExtResource("1_2wpwe")
[node name="TextureRect" type="TextureRect" parent="."]
unique_name_in_owner = true
modulate = Color(1, 1, 1, 0)
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
@ -22,6 +24,7 @@ texture = ExtResource("2_wr575")
[node name="ContentLabel" type="Label" parent="."]
unique_name_in_owner = true
modulate = Color(1, 1, 1, 0)
custom_minimum_size = Vector2(120, 0)
anchors_preset = 8
anchor_left = 0.5
@ -46,6 +49,7 @@ autowrap_mode = 3
[node name="TipLabel" type="Label" parent="."]
unique_name_in_owner = true
modulate = Color(1, 1, 1, 0)
anchors_preset = 7
anchor_left = 0.5
anchor_top = 1.0
@ -58,6 +62,6 @@ offset_bottom = -33.0
grow_horizontal = 2
grow_vertical = 0
size_flags_vertical = 8
text = "Q:退出 E阅读"
text = "Q: 退出 E: 阅读"
horizontal_alignment = 1
vertical_alignment = 1