AXCWG 5 月之前
当前提交
a5f23c1b57
共有 35 个文件被更改,包括 1459 次插入0 次删除
  1. 二进制
      .DS_Store
  2. 2 0
      .gitattributes
  3. 3 0
      .gitignore
  4. 10 0
      Autoloads/MusicController.tscn
  5. 65 0
      Autoloads/music_controller.gd
  6. 14 0
      Extra Start.gd
  7. 14 0
      Music Room.gd
  8. 14 0
      Option.gd
  9. 16 0
      Practice Start.gd
  10. 21 0
      Quit.gd
  11. 14 0
      Replay.gd
  12. 14 0
      Result.gd
  13. 16 0
      Spell Practice.gd
  14. 28 0
      Start.gd
  15. 307 0
      StartMenu.tscn
  16. 13 0
      easy.gd
  17. 365 0
      export_presets.cfg
  18. 21 0
      fadein.gdshader
  19. 二进制
      fadein.png
  20. 34 0
      fadein.png.import
  21. 二进制
      fadein.psd
  22. 13 0
      hard.gd
  23. 1 0
      icon.svg
  24. 37 0
      icon.svg.import
  25. 13 0
      lunatic.gd
  26. 90 0
      mainmenu.gd
  27. 19 0
      mainmenu.tscn
  28. 13 0
      normal.gd
  29. 11 0
      ok.gd
  30. 54 0
      project.godot
  31. 44 0
      reimu_movement.gd
  32. 54 0
      start_menu.gd
  33. 105 0
      testscene.tscn
  34. 二进制
      title00.png
  35. 34 0
      title00.png.import

二进制
.DS_Store


+ 2 - 0
.gitattributes

@@ -0,0 +1,2 @@
+# Normalize EOL for all files that Git considers text files.
+* text=auto eol=lf

+ 3 - 0
.gitignore

@@ -0,0 +1,3 @@
+# Godot 4+ specific ignores
+.godot/
+/Assets

+ 10 - 0
Autoloads/MusicController.tscn

@@ -0,0 +1,10 @@
+[gd_scene load_steps=2 format=3 uid="uid://cqa61en8ey3u8"]
+
+[ext_resource type="Script" path="res://Autoloads/music_controller.gd" id="1_6hmfd"]
+
+[node name="MusicController" type="Node"]
+script = ExtResource("1_6hmfd")
+
+[node name="BGM" type="AudioStreamPlayer" parent="."]
+
+[node name="SE" type="AudioStreamPlayer" parent="."]

+ 65 - 0
Autoloads/music_controller.gd

@@ -0,0 +1,65 @@
+extends Node
+
+
+enum Level{
+	title, 
+	s01
+}
+
+enum SEs{
+	ok,
+	cancel,
+	invalid,
+	select
+}
+
+var music = {
+	"title":(load("res://Assets/th08bgm/永夜抄 ~ Eastern Night.wav") as AudioStreamWAV)
+	}
+	
+var SE = {
+	"ok": (load("res://Assets/th0809/se_ok00.wav") as AudioStreamWAV	), 
+	"cancel": (load("res://Assets/th0809/se_cancel00.wav") as AudioStreamWAV	),
+	"invalid": (load("res://Assets/th0809/se_invalid.wav") as AudioStreamWAV	),
+	"select": (load("res://Assets/th0809/se_select00.wav") as AudioStreamWAV	),
+}
+
+
+@onready var bgm = self.get_node("BGM") as AudioStreamPlayer
+@onready var se = self.get_node("SE") as AudioStreamPlayer
+
+# Called when the node enters the scene tree for the first time.
+func _ready() -> void:
+	pass # Replace with function body.
+
+func playMusic(level:Level):
+	match level:
+		Level.title:
+			music["title"].loop_mode = AudioStreamWAV.LoopMode.LOOP_FORWARD
+			music["title"].loop_begin = 246700;
+			music["title"].loop_end = 3178816; 
+			bgm.stream = music["title"]
+			bgm.play()
+			
+	pass
+
+func playSE(ses:SEs):
+	match ses:
+		SEs.ok:
+			se.stream = SE["ok"]
+			se.play()
+		SEs.cancel: 
+			se.stream = SE["cancel"]
+			se.play()
+		SEs.invalid: 
+			se.stream = SE["invalid"]
+			se.play()
+		SEs.select: 
+			se.stream = SE["select"]
+			se.play()
+			
+
+# Called every frame. 'delta' is the elapsed time since the previous frame.
+func _process(_delta: float) -> void:
+	
+	pass

+ 14 - 0
Extra Start.gd

@@ -0,0 +1,14 @@
+extends Sprite2D
+
+
+# Called when the node enters the scene tree for the first time.
+func _ready():
+	pass # Replace with function body.
+
+
+# Called every frame. 'delta' is the elapsed time since the previous frame.
+func _process(delta):
+	self.set_region_rect(Rect2(80,64,152,32))
+	if(self.get_meta("selected") == true && self.get_meta("disabled") != true):
+		self.set_region_rect(Rect2(80,0,152,32))
+	

+ 14 - 0
Music Room.gd

@@ -0,0 +1,14 @@
+extends Sprite2D
+
+
+# Called when the node enters the scene tree for the first time.
+func _ready():
+	pass # Replace with function body.
+
+
+# Called every frame. 'delta' is the elapsed time since the previous frame.
+func _process(delta):
+	self.set_region_rect(Rect2(192,96,156,32))
+	if(self.get_meta("selected") == true && self.get_meta("disabled") != true):
+		self.set_region_rect(Rect2(192,32,156,32))
+	

+ 14 - 0
Option.gd

@@ -0,0 +1,14 @@
+extends Sprite2D
+
+
+# Called when the node enters the scene tree for the first time.
+func _ready():
+	pass # Replace with function body.
+
+
+# Called every frame. 'delta' is the elapsed time since the previous frame.
+func _process(delta):
+	self.set_region_rect(Rect2(404,480,96,32))
+	if(self.get_meta("selected") == true && self.get_meta("disabled") != true):
+		self.set_region_rect(Rect2(404,416,96,32))
+	

+ 16 - 0
Practice Start.gd

@@ -0,0 +1,16 @@
+extends Sprite2D
+
+
+# Called when the node enters the scene tree for the first time.
+func _ready():
+	pass # Replace with function body.
+
+func ok():
+	pass
+
+# Called every frame. 'delta' is the elapsed time since the previous frame.
+func _process(delta):
+	self.set_region_rect(Rect2(240,64,184,32))
+	if(self.get_meta("selected") == true && self.get_meta("disabled") != true):
+		self.set_region_rect(Rect2(240,0,184,32))
+	

+ 21 - 0
Quit.gd

@@ -0,0 +1,21 @@
+extends Sprite2D
+
+
+var okSound 
+# Called when the node enters the scene tree for the first time. 
+func _ready():
+	okSound =  get_tree().get_root().get_node("Mainmenu").get_node("TitleMenuGroup").get_node("Menu").get_node("Ok") as AudioStreamPlayer
+	pass # Replace with function body.
+
+func ok():
+	(get_tree().get_root().get_node("Mainmenu").get_node("TitleMenuGroup").get_node("AnimationPlayer") as AnimationPlayer).play("new_animation")
+	await get_tree().create_timer(2).timeout
+	get_tree().quit(0)
+
+
+# Called every frame. 'delta' is the elapsed time since the previous frame.
+func _process(delta):
+	self.set_region_rect(Rect2(388,224,64,32))
+	if(self.get_meta("selected") == true && self.get_meta("disabled") != true):
+		self.set_region_rect(Rect2(388,160,64,32))
+	

+ 14 - 0
Replay.gd

@@ -0,0 +1,14 @@
+extends Sprite2D
+
+
+# Called when the node enters the scene tree for the first time.
+func _ready():
+	pass # Replace with function body.
+
+
+# Called every frame. 'delta' is the elapsed time since the previous frame.
+func _process(delta):
+	self.set_region_rect(Rect2(0,96,96,32))
+	if(self.get_meta("selected") == true && self.get_meta("disabled") != true):
+		self.set_region_rect(Rect2(0,32,96,32))
+	

+ 14 - 0
Result.gd

@@ -0,0 +1,14 @@
+extends Sprite2D
+
+
+# Called when the node enters the scene tree for the first time.
+func _ready():
+	pass # Replace with function body.
+
+
+# Called every frame. 'delta' is the elapsed time since the previous frame.
+func _process(delta):
+	self.set_region_rect(Rect2(96,96,92,32))
+	if(self.get_meta("selected") == true && self.get_meta("disabled") != true):
+		self.set_region_rect(Rect2(96,32,92,32))
+	

+ 16 - 0
Spell Practice.gd

@@ -0,0 +1,16 @@
+extends Sprite2D
+
+
+# Called when the node enters the scene tree for the first time.
+func _ready():
+	pass # Replace with function body.
+
+
+# Called every frame. 'delta' is the elapsed time since the previous frame.
+func _process(delta):
+	self.set_region_rect(Rect2(348,96,164,32))
+	if(self.get_meta("selected") == true && self.get_meta("disabled") != true):
+		self.set_region_rect(Rect2(348,32,164,32))
+
+		
+	

+ 28 - 0
Start.gd

@@ -0,0 +1,28 @@
+extends Sprite2D
+	
+
+var submenuopened = false; 
+
+# Called when the node enters the scene tree for the first time.
+func _ready():
+	
+	pass # Replace with function body.
+
+func ok():
+	var startmenu = load("res://StartMenu.tscn").instantiate() as Control
+	(get_tree().get_root().get_node("Mainmenu").get_node("TitleMenuGroup").get_node("AnimationPlayer") as AnimationPlayer).play("new_animation_2")
+	await get_tree().create_timer(0.15).timeout
+	get_tree().current_scene.add_child(startmenu)
+	submenuopened = true
+	
+	
+	
+func cancel():
+	pass
+
+# Called every frame. 'delta' is the elapsed time since the previous frame.
+func _process(delta):
+	self.set_region_rect(Rect2(0,64,80,32))
+	if(self.get_meta("selected") == true && self.get_meta("disabled") != true):
+		self.set_region_rect(Rect2(0,0,80,32))
+	

+ 307 - 0
StartMenu.tscn

@@ -0,0 +1,307 @@
+[gd_scene load_steps=12 format=3 uid="uid://c2xq1q4qs53e1"]
+
+[ext_resource type="Script" path="res://start_menu.gd" id="1_gva81"]
+[ext_resource type="Texture2D" uid="uid://b2ogfu8bidlta" path="res://Assets/th0809/select00.png" id="1_mecpy"]
+[ext_resource type="Texture2D" uid="uid://ccq3b3bpc7lln" path="res://Assets/title/sl_text.png" id="2_sw72h"]
+[ext_resource type="Texture2D" uid="uid://86p1gkejh21h" path="res://Assets/title/select01.png" id="3_co3gs"]
+[ext_resource type="Script" path="res://easy.gd" id="4_n3wof"]
+[ext_resource type="Script" path="res://normal.gd" id="5_uhj71"]
+[ext_resource type="Script" path="res://hard.gd" id="6_25dly"]
+[ext_resource type="Script" path="res://lunatic.gd" id="7_ujykt"]
+
+[sub_resource type="Animation" id="Animation_6nvv3"]
+resource_name = "new_animation"
+length = 0.1
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath("Title:modulate")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0, 0.1),
+"transitions": PackedFloat32Array(1, 1),
+"update": 0,
+"values": [Color(1, 1, 1, 0), Color(1, 1, 1, 1)]
+}
+tracks/1/type = "value"
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/path = NodePath("Easy:position")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/keys = {
+"times": PackedFloat32Array(0, 0.1),
+"transitions": PackedFloat32Array(1, 1),
+"update": 0,
+"values": [Vector2(305, 190), Vector2(365, 190)]
+}
+tracks/2/type = "value"
+tracks/2/imported = false
+tracks/2/enabled = true
+tracks/2/path = NodePath("Easy:modulate")
+tracks/2/interp = 1
+tracks/2/loop_wrap = true
+tracks/2/keys = {
+"times": PackedFloat32Array(0, 0.1),
+"transitions": PackedFloat32Array(1, 1),
+"update": 0,
+"values": [Color(1, 1, 1, 0), Color(1, 1, 1, 1)]
+}
+tracks/3/type = "value"
+tracks/3/imported = false
+tracks/3/enabled = true
+tracks/3/path = NodePath("Normal:position")
+tracks/3/interp = 1
+tracks/3/loop_wrap = true
+tracks/3/keys = {
+"times": PackedFloat32Array(0, 0.1),
+"transitions": PackedFloat32Array(1, 1),
+"update": 0,
+"values": [Vector2(200, 284), Vector2(418, 284)]
+}
+tracks/4/type = "value"
+tracks/4/imported = false
+tracks/4/enabled = true
+tracks/4/path = NodePath("Normal:modulate")
+tracks/4/interp = 1
+tracks/4/loop_wrap = true
+tracks/4/keys = {
+"times": PackedFloat32Array(0, 0.1),
+"transitions": PackedFloat32Array(1, 1),
+"update": 0,
+"values": [Color(1, 1, 1, 0), Color(1, 1, 1, 1)]
+}
+tracks/5/type = "value"
+tracks/5/imported = false
+tracks/5/enabled = true
+tracks/5/path = NodePath("Hard:position")
+tracks/5/interp = 1
+tracks/5/loop_wrap = true
+tracks/5/keys = {
+"times": PackedFloat32Array(0, 0.1),
+"transitions": PackedFloat32Array(1, 1),
+"update": 0,
+"values": [Vector2(368, 393), Vector2(398, 393)]
+}
+tracks/6/type = "value"
+tracks/6/imported = false
+tracks/6/enabled = true
+tracks/6/path = NodePath("Hard:modulate")
+tracks/6/interp = 1
+tracks/6/loop_wrap = true
+tracks/6/keys = {
+"times": PackedFloat32Array(0, 0.1),
+"transitions": PackedFloat32Array(1, 1),
+"update": 0,
+"values": [Color(1, 1, 1, 0), Color(1, 1, 1, 1)]
+}
+tracks/7/type = "value"
+tracks/7/imported = false
+tracks/7/enabled = true
+tracks/7/path = NodePath("Lunatic:position")
+tracks/7/interp = 1
+tracks/7/loop_wrap = true
+tracks/7/keys = {
+"times": PackedFloat32Array(0, 0.1),
+"transitions": PackedFloat32Array(1, 1),
+"update": 0,
+"values": [Vector2(589, 514), Vector2(499, 514)]
+}
+tracks/8/type = "value"
+tracks/8/imported = false
+tracks/8/enabled = true
+tracks/8/path = NodePath("Lunatic:modulate")
+tracks/8/interp = 1
+tracks/8/loop_wrap = true
+tracks/8/keys = {
+"times": PackedFloat32Array(0, 0.1),
+"transitions": PackedFloat32Array(1, 1),
+"update": 0,
+"values": [Color(1, 1, 1, 0), Color(1, 1, 1, 1)]
+}
+
+[sub_resource type="Animation" id="Animation_v7755"]
+length = 0.001
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath("Title:modulate")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [Color(1, 1, 1, 0)]
+}
+tracks/1/type = "value"
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/path = NodePath("Easy:position")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [Vector2(335, 190)]
+}
+tracks/2/type = "value"
+tracks/2/imported = false
+tracks/2/enabled = true
+tracks/2/path = NodePath("Easy:modulate")
+tracks/2/interp = 1
+tracks/2/loop_wrap = true
+tracks/2/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [Color(1, 1, 1, 0)]
+}
+tracks/3/type = "value"
+tracks/3/imported = false
+tracks/3/enabled = true
+tracks/3/path = NodePath("Normal:position")
+tracks/3/interp = 1
+tracks/3/loop_wrap = true
+tracks/3/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [Vector2(403, 284)]
+}
+tracks/4/type = "value"
+tracks/4/imported = false
+tracks/4/enabled = true
+tracks/4/path = NodePath("Normal:modulate")
+tracks/4/interp = 1
+tracks/4/loop_wrap = true
+tracks/4/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [Color(1, 1, 1, 0)]
+}
+tracks/5/type = "value"
+tracks/5/imported = false
+tracks/5/enabled = true
+tracks/5/path = NodePath("Hard:position")
+tracks/5/interp = 1
+tracks/5/loop_wrap = true
+tracks/5/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [Vector2(398, 393)]
+}
+tracks/6/type = "value"
+tracks/6/imported = false
+tracks/6/enabled = true
+tracks/6/path = NodePath("Hard:modulate")
+tracks/6/interp = 1
+tracks/6/loop_wrap = true
+tracks/6/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [Color(1, 1, 1, 0)]
+}
+tracks/7/type = "value"
+tracks/7/imported = false
+tracks/7/enabled = true
+tracks/7/path = NodePath("Lunatic:position")
+tracks/7/interp = 1
+tracks/7/loop_wrap = true
+tracks/7/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [Vector2(499, 514)]
+}
+tracks/8/type = "value"
+tracks/8/imported = false
+tracks/8/enabled = true
+tracks/8/path = NodePath("Lunatic:modulate")
+tracks/8/interp = 1
+tracks/8/loop_wrap = true
+tracks/8/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [Color(1, 1, 1, 0)]
+}
+
+[sub_resource type="AnimationLibrary" id="AnimationLibrary_ucd7n"]
+_data = {
+"RESET": SubResource("Animation_v7755"),
+"new_animation": SubResource("Animation_6nvv3")
+}
+
+[node name="StartMenu" type="Control"]
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+script = ExtResource("1_gva81")
+
+[node name="Select00" type="Sprite2D" parent="."]
+scale = Vector2(1.25, 1.25)
+texture = ExtResource("1_mecpy")
+centered = false
+
+[node name="Title" type="Sprite2D" parent="."]
+modulate = Color(1, 1, 1, 0)
+position = Vector2(400, 60)
+scale = Vector2(1.25, 1.25)
+texture = ExtResource("2_sw72h")
+region_enabled = true
+region_rect = Rect2(0, 0, 256, 48)
+
+[node name="Easy" type="Sprite2D" parent="."]
+modulate = Color(1, 1, 1, 0)
+position = Vector2(335, 190)
+scale = Vector2(1.25, 1.25)
+texture = ExtResource("3_co3gs")
+region_enabled = true
+region_rect = Rect2(0, 0, 256, 80)
+script = ExtResource("4_n3wof")
+metadata/selected = false
+
+[node name="Normal" type="Sprite2D" parent="."]
+modulate = Color(1, 1, 1, 0)
+position = Vector2(403, 284)
+scale = Vector2(1.25, 1.25)
+texture = ExtResource("3_co3gs")
+region_enabled = true
+region_rect = Rect2(0, 80, 256, 80)
+script = ExtResource("5_uhj71")
+metadata/selected = true
+
+[node name="Hard" type="Sprite2D" parent="."]
+modulate = Color(1, 1, 1, 0)
+position = Vector2(398, 393)
+scale = Vector2(1.25, 1.25)
+texture = ExtResource("3_co3gs")
+region_enabled = true
+region_rect = Rect2(0, 160, 256, 80)
+script = ExtResource("6_25dly")
+metadata/selected = false
+
+[node name="Lunatic" type="Sprite2D" parent="."]
+modulate = Color(1, 1, 1, 0)
+position = Vector2(499, 514)
+scale = Vector2(1.25, 1.25)
+texture = ExtResource("3_co3gs")
+region_enabled = true
+region_rect = Rect2(0, 240, 256, 80)
+script = ExtResource("7_ujykt")
+metadata/selected = false
+
+[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
+libraries = {
+"": SubResource("AnimationLibrary_ucd7n")
+}
+speed_scale = 0.5

+ 13 - 0
easy.gd

@@ -0,0 +1,13 @@
+extends Sprite2D
+
+
+# Called when the node enters the scene tree for the first time.
+func _ready() -> void:
+	pass # Replace with function body.
+
+
+# Called every frame. 'delta' is the elapsed time since the previous frame.
+func _process(delta: float) -> void:
+	self.set_region_rect(Rect2(256,0,256,80))
+	if(self.get_meta("selected") == true):
+		self.set_region_rect(Rect2(0,0,256,80))

+ 365 - 0
export_presets.cfg

@@ -0,0 +1,365 @@
+[preset.0]
+
+name="Web"
+platform="Web"
+runnable=true
+advanced_options=true
+dedicated_server=false
+custom_features=""
+export_filter="scenes"
+export_files=PackedStringArray("res://mainmenu.tscn", "res://testscene.tscn")
+include_filter=""
+exclude_filter=""
+export_path="web/index.html"
+encryption_include_filters=""
+encryption_exclude_filters=""
+encrypt_pck=false
+encrypt_directory=false
+script_export_mode=2
+
+[preset.0.options]
+
+custom_template/debug=""
+custom_template/release=""
+variant/extensions_support=false
+variant/thread_support=false
+vram_texture_compression/for_desktop=true
+vram_texture_compression/for_mobile=false
+html/export_icon=true
+html/custom_html_shell=""
+html/head_include=""
+html/canvas_resize_policy=2
+html/focus_canvas_on_start=true
+html/experimental_virtual_keyboard=false
+progressive_web_app/enabled=false
+progressive_web_app/ensure_cross_origin_isolation_headers=true
+progressive_web_app/offline_page=""
+progressive_web_app/display=1
+progressive_web_app/orientation=0
+progressive_web_app/icon_144x144=""
+progressive_web_app/icon_180x180=""
+progressive_web_app/icon_512x512=""
+progressive_web_app/background_color=Color(0, 0, 0, 1)
+dotnet/include_scripts_content=false
+dotnet/include_debug_symbols=true
+dotnet/embed_build_outputs=false
+
+[preset.1]
+
+name="macOS"
+platform="macOS"
+runnable=true
+advanced_options=false
+dedicated_server=false
+custom_features=""
+export_filter="scenes"
+export_files=PackedStringArray("res://mainmenu.tscn", "res://testscene.tscn")
+include_filter=""
+exclude_filter=""
+export_path="osx/index.dmg"
+encryption_include_filters=""
+encryption_exclude_filters=""
+encrypt_pck=false
+encrypt_directory=false
+script_export_mode=2
+
+[preset.1.options]
+
+export/distribution_type=1
+binary_format/architecture="universal"
+custom_template/debug=""
+custom_template/release=""
+debug/export_console_wrapper=1
+application/icon=""
+application/icon_interpolation=4
+application/bundle_identifier="com.axcwg.th08"
+application/signature=""
+application/app_category="Games"
+application/short_version=""
+application/version=""
+application/copyright=""
+application/copyright_localized={}
+application/min_macos_version="10.12"
+application/export_angle=0
+display/high_res=true
+application/additional_plist_content=""
+xcode/platform_build="14C18"
+xcode/sdk_version="13.1"
+xcode/sdk_build="22C55"
+xcode/sdk_name="macosx13.1"
+xcode/xcode_version="1420"
+xcode/xcode_build="14C18"
+codesign/codesign=3
+codesign/installer_identity=""
+codesign/apple_team_id=""
+codesign/identity=""
+codesign/entitlements/custom_file=""
+codesign/entitlements/allow_jit_code_execution=false
+codesign/entitlements/allow_unsigned_executable_memory=false
+codesign/entitlements/allow_dyld_environment_variables=false
+codesign/entitlements/disable_library_validation=false
+codesign/entitlements/audio_input=false
+codesign/entitlements/camera=false
+codesign/entitlements/location=false
+codesign/entitlements/address_book=false
+codesign/entitlements/calendars=false
+codesign/entitlements/photos_library=false
+codesign/entitlements/apple_events=false
+codesign/entitlements/debugging=false
+codesign/entitlements/app_sandbox/enabled=false
+codesign/entitlements/app_sandbox/network_server=false
+codesign/entitlements/app_sandbox/network_client=false
+codesign/entitlements/app_sandbox/device_usb=false
+codesign/entitlements/app_sandbox/device_bluetooth=false
+codesign/entitlements/app_sandbox/files_downloads=0
+codesign/entitlements/app_sandbox/files_pictures=0
+codesign/entitlements/app_sandbox/files_music=0
+codesign/entitlements/app_sandbox/files_movies=0
+codesign/entitlements/app_sandbox/files_user_selected=0
+codesign/entitlements/app_sandbox/helper_executables=[]
+codesign/custom_options=PackedStringArray()
+notarization/notarization=0
+privacy/microphone_usage_description=""
+privacy/microphone_usage_description_localized={}
+privacy/camera_usage_description=""
+privacy/camera_usage_description_localized={}
+privacy/location_usage_description=""
+privacy/location_usage_description_localized={}
+privacy/address_book_usage_description=""
+privacy/address_book_usage_description_localized={}
+privacy/calendar_usage_description=""
+privacy/calendar_usage_description_localized={}
+privacy/photos_library_usage_description=""
+privacy/photos_library_usage_description_localized={}
+privacy/desktop_folder_usage_description=""
+privacy/desktop_folder_usage_description_localized={}
+privacy/documents_folder_usage_description=""
+privacy/documents_folder_usage_description_localized={}
+privacy/downloads_folder_usage_description=""
+privacy/downloads_folder_usage_description_localized={}
+privacy/network_volumes_usage_description=""
+privacy/network_volumes_usage_description_localized={}
+privacy/removable_volumes_usage_description=""
+privacy/removable_volumes_usage_description_localized={}
+privacy/tracking_enabled=false
+privacy/tracking_domains=PackedStringArray()
+privacy/collected_data/name/collected=false
+privacy/collected_data/name/linked_to_user=false
+privacy/collected_data/name/used_for_tracking=false
+privacy/collected_data/name/collection_purposes=0
+privacy/collected_data/email_address/collected=false
+privacy/collected_data/email_address/linked_to_user=false
+privacy/collected_data/email_address/used_for_tracking=false
+privacy/collected_data/email_address/collection_purposes=0
+privacy/collected_data/phone_number/collected=false
+privacy/collected_data/phone_number/linked_to_user=false
+privacy/collected_data/phone_number/used_for_tracking=false
+privacy/collected_data/phone_number/collection_purposes=0
+privacy/collected_data/physical_address/collected=false
+privacy/collected_data/physical_address/linked_to_user=false
+privacy/collected_data/physical_address/used_for_tracking=false
+privacy/collected_data/physical_address/collection_purposes=0
+privacy/collected_data/other_contact_info/collected=false
+privacy/collected_data/other_contact_info/linked_to_user=false
+privacy/collected_data/other_contact_info/used_for_tracking=false
+privacy/collected_data/other_contact_info/collection_purposes=0
+privacy/collected_data/health/collected=false
+privacy/collected_data/health/linked_to_user=false
+privacy/collected_data/health/used_for_tracking=false
+privacy/collected_data/health/collection_purposes=0
+privacy/collected_data/fitness/collected=false
+privacy/collected_data/fitness/linked_to_user=false
+privacy/collected_data/fitness/used_for_tracking=false
+privacy/collected_data/fitness/collection_purposes=0
+privacy/collected_data/payment_info/collected=false
+privacy/collected_data/payment_info/linked_to_user=false
+privacy/collected_data/payment_info/used_for_tracking=false
+privacy/collected_data/payment_info/collection_purposes=0
+privacy/collected_data/credit_info/collected=false
+privacy/collected_data/credit_info/linked_to_user=false
+privacy/collected_data/credit_info/used_for_tracking=false
+privacy/collected_data/credit_info/collection_purposes=0
+privacy/collected_data/other_financial_info/collected=false
+privacy/collected_data/other_financial_info/linked_to_user=false
+privacy/collected_data/other_financial_info/used_for_tracking=false
+privacy/collected_data/other_financial_info/collection_purposes=0
+privacy/collected_data/precise_location/collected=false
+privacy/collected_data/precise_location/linked_to_user=false
+privacy/collected_data/precise_location/used_for_tracking=false
+privacy/collected_data/precise_location/collection_purposes=0
+privacy/collected_data/coarse_location/collected=false
+privacy/collected_data/coarse_location/linked_to_user=false
+privacy/collected_data/coarse_location/used_for_tracking=false
+privacy/collected_data/coarse_location/collection_purposes=0
+privacy/collected_data/sensitive_info/collected=false
+privacy/collected_data/sensitive_info/linked_to_user=false
+privacy/collected_data/sensitive_info/used_for_tracking=false
+privacy/collected_data/sensitive_info/collection_purposes=0
+privacy/collected_data/contacts/collected=false
+privacy/collected_data/contacts/linked_to_user=false
+privacy/collected_data/contacts/used_for_tracking=false
+privacy/collected_data/contacts/collection_purposes=0
+privacy/collected_data/emails_or_text_messages/collected=false
+privacy/collected_data/emails_or_text_messages/linked_to_user=false
+privacy/collected_data/emails_or_text_messages/used_for_tracking=false
+privacy/collected_data/emails_or_text_messages/collection_purposes=0
+privacy/collected_data/photos_or_videos/collected=false
+privacy/collected_data/photos_or_videos/linked_to_user=false
+privacy/collected_data/photos_or_videos/used_for_tracking=false
+privacy/collected_data/photos_or_videos/collection_purposes=0
+privacy/collected_data/audio_data/collected=false
+privacy/collected_data/audio_data/linked_to_user=false
+privacy/collected_data/audio_data/used_for_tracking=false
+privacy/collected_data/audio_data/collection_purposes=0
+privacy/collected_data/gameplay_content/collected=false
+privacy/collected_data/gameplay_content/linked_to_user=false
+privacy/collected_data/gameplay_content/used_for_tracking=false
+privacy/collected_data/gameplay_content/collection_purposes=0
+privacy/collected_data/customer_support/collected=false
+privacy/collected_data/customer_support/linked_to_user=false
+privacy/collected_data/customer_support/used_for_tracking=false
+privacy/collected_data/customer_support/collection_purposes=0
+privacy/collected_data/other_user_content/collected=false
+privacy/collected_data/other_user_content/linked_to_user=false
+privacy/collected_data/other_user_content/used_for_tracking=false
+privacy/collected_data/other_user_content/collection_purposes=0
+privacy/collected_data/browsing_history/collected=false
+privacy/collected_data/browsing_history/linked_to_user=false
+privacy/collected_data/browsing_history/used_for_tracking=false
+privacy/collected_data/browsing_history/collection_purposes=0
+privacy/collected_data/search_hhistory/collected=false
+privacy/collected_data/search_hhistory/linked_to_user=false
+privacy/collected_data/search_hhistory/used_for_tracking=false
+privacy/collected_data/search_hhistory/collection_purposes=0
+privacy/collected_data/user_id/collected=false
+privacy/collected_data/user_id/linked_to_user=false
+privacy/collected_data/user_id/used_for_tracking=false
+privacy/collected_data/user_id/collection_purposes=0
+privacy/collected_data/device_id/collected=false
+privacy/collected_data/device_id/linked_to_user=false
+privacy/collected_data/device_id/used_for_tracking=false
+privacy/collected_data/device_id/collection_purposes=0
+privacy/collected_data/purchase_history/collected=false
+privacy/collected_data/purchase_history/linked_to_user=false
+privacy/collected_data/purchase_history/used_for_tracking=false
+privacy/collected_data/purchase_history/collection_purposes=0
+privacy/collected_data/product_interaction/collected=false
+privacy/collected_data/product_interaction/linked_to_user=false
+privacy/collected_data/product_interaction/used_for_tracking=false
+privacy/collected_data/product_interaction/collection_purposes=0
+privacy/collected_data/advertising_data/collected=false
+privacy/collected_data/advertising_data/linked_to_user=false
+privacy/collected_data/advertising_data/used_for_tracking=false
+privacy/collected_data/advertising_data/collection_purposes=0
+privacy/collected_data/other_usage_data/collected=false
+privacy/collected_data/other_usage_data/linked_to_user=false
+privacy/collected_data/other_usage_data/used_for_tracking=false
+privacy/collected_data/other_usage_data/collection_purposes=0
+privacy/collected_data/crash_data/collected=false
+privacy/collected_data/crash_data/linked_to_user=false
+privacy/collected_data/crash_data/used_for_tracking=false
+privacy/collected_data/crash_data/collection_purposes=0
+privacy/collected_data/performance_data/collected=false
+privacy/collected_data/performance_data/linked_to_user=false
+privacy/collected_data/performance_data/used_for_tracking=false
+privacy/collected_data/performance_data/collection_purposes=0
+privacy/collected_data/other_diagnostic_data/collected=false
+privacy/collected_data/other_diagnostic_data/linked_to_user=false
+privacy/collected_data/other_diagnostic_data/used_for_tracking=false
+privacy/collected_data/other_diagnostic_data/collection_purposes=0
+privacy/collected_data/environment_scanning/collected=false
+privacy/collected_data/environment_scanning/linked_to_user=false
+privacy/collected_data/environment_scanning/used_for_tracking=false
+privacy/collected_data/environment_scanning/collection_purposes=0
+privacy/collected_data/hands/collected=false
+privacy/collected_data/hands/linked_to_user=false
+privacy/collected_data/hands/used_for_tracking=false
+privacy/collected_data/hands/collection_purposes=0
+privacy/collected_data/head/collected=false
+privacy/collected_data/head/linked_to_user=false
+privacy/collected_data/head/used_for_tracking=false
+privacy/collected_data/head/collection_purposes=0
+privacy/collected_data/other_data_types/collected=false
+privacy/collected_data/other_data_types/linked_to_user=false
+privacy/collected_data/other_data_types/used_for_tracking=false
+privacy/collected_data/other_data_types/collection_purposes=0
+ssh_remote_deploy/enabled=false
+ssh_remote_deploy/host="user@host_ip"
+ssh_remote_deploy/port="22"
+ssh_remote_deploy/extra_args_ssh=""
+ssh_remote_deploy/extra_args_scp=""
+ssh_remote_deploy/run_script="#!/usr/bin/env bash
+unzip -o -q \"{temp_dir}/{archive_name}\" -d \"{temp_dir}\"
+open \"{temp_dir}/{exe_name}.app\" --args {cmd_args}"
+ssh_remote_deploy/cleanup_script="#!/usr/bin/env bash
+kill $(pgrep -x -f \"{temp_dir}/{exe_name}.app/Contents/MacOS/{exe_name} {cmd_args}\")
+rm -rf \"{temp_dir}\""
+dotnet/include_scripts_content=false
+dotnet/include_debug_symbols=true
+dotnet/embed_build_outputs=false
+
+[preset.2]
+
+name="Windows Desktop"
+platform="Windows Desktop"
+runnable=true
+advanced_options=false
+dedicated_server=false
+custom_features=""
+export_filter="scenes"
+export_files=PackedStringArray("res://mainmenu.tscn", "res://testscene.tscn")
+include_filter=""
+exclude_filter=""
+export_path="win32/index.exe"
+encryption_include_filters=""
+encryption_exclude_filters=""
+encrypt_pck=false
+encrypt_directory=false
+script_export_mode=2
+
+[preset.2.options]
+
+custom_template/debug=""
+custom_template/release=""
+debug/export_console_wrapper=1
+binary_format/embed_pck=true
+texture_format/s3tc_bptc=true
+texture_format/etc2_astc=false
+binary_format/architecture="x86_64"
+codesign/enable=false
+codesign/timestamp=true
+codesign/timestamp_server_url=""
+codesign/digest_algorithm=1
+codesign/description=""
+codesign/custom_options=PackedStringArray()
+application/modify_resources=false
+application/icon=""
+application/console_wrapper_icon=""
+application/icon_interpolation=4
+application/file_version=""
+application/product_version=""
+application/company_name=""
+application/product_name=""
+application/file_description=""
+application/copyright=""
+application/trademarks=""
+application/export_angle=0
+application/export_d3d12=0
+application/d3d12_agility_sdk_multiarch=true
+ssh_remote_deploy/enabled=false
+ssh_remote_deploy/host="user@host_ip"
+ssh_remote_deploy/port="22"
+ssh_remote_deploy/extra_args_ssh=""
+ssh_remote_deploy/extra_args_scp=""
+ssh_remote_deploy/run_script="Expand-Archive -LiteralPath '{temp_dir}\\{archive_name}' -DestinationPath '{temp_dir}'
+$action = New-ScheduledTaskAction -Execute '{temp_dir}\\{exe_name}' -Argument '{cmd_args}'
+$trigger = New-ScheduledTaskTrigger -Once -At 00:00
+$settings = New-ScheduledTaskSettingsSet
+$task = New-ScheduledTask -Action $action -Trigger $trigger -Settings $settings
+Register-ScheduledTask godot_remote_debug -InputObject $task -Force:$true
+Start-ScheduledTask -TaskName godot_remote_debug
+while (Get-ScheduledTask -TaskName godot_remote_debug | ? State -eq running) { Start-Sleep -Milliseconds 100 }
+Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue"
+ssh_remote_deploy/cleanup_script="Stop-ScheduledTask -TaskName godot_remote_debug -ErrorAction:SilentlyContinue
+Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue
+Remove-Item -Recurse -Force '{temp_dir}'"

+ 21 - 0
fadein.gdshader

@@ -0,0 +1,21 @@
+shader_type canvas_item;
+render_mode unshaded;
+
+uniform float cutoff: hint_range(0.0, 1.0);
+uniform sampler2D mask: source_color;
+uniform float smoothSize : hint_range(0.0, 1.0);
+
+
+
+void fragment() {
+	// Called for every pixel the material is visible on.
+	float value = texture(mask, UV).r;
+	float alpha = smoothstep(cutoff, cutoff+smoothSize, value);
+	COLOR = vec4(COLOR.rgb, alpha);
+
+}
+
+//void light() {
+	// Called for every pixel for every light affecting the CanvasItem.
+	// Uncomment to replace the default light processing function with this one.
+//}

二进制
fadein.png


+ 34 - 0
fadein.png.import

@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c82y21t88twfe"
+path="res://.godot/imported/fadein.png-b39adfa4f693f94ef6d8dff78d4497b7.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://fadein.png"
+dest_files=["res://.godot/imported/fadein.png-b39adfa4f693f94ef6d8dff78d4497b7.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1

二进制
fadein.psd


+ 13 - 0
hard.gd

@@ -0,0 +1,13 @@
+extends Sprite2D
+
+
+# Called when the node enters the scene tree for the first time.
+func _ready() -> void:
+	pass # Replace with function body.
+
+
+# Called every frame. 'delta' is the elapsed time since the previous frame.
+func _process(delta: float) -> void:
+	self.set_region_rect(Rect2(256,160,256,80))
+	if(self.get_meta("selected") == true):
+		self.set_region_rect(Rect2(0,160,256,80))

+ 1 - 0
icon.svg

@@ -0,0 +1 @@
+<svg height="128" width="128" xmlns="http://www.w3.org/2000/svg"><rect x="2" y="2" width="124" height="124" rx="14" fill="#363d52" stroke="#212532" stroke-width="4"/><g transform="scale(.101) translate(122 122)"><g fill="#fff"><path d="M105 673v33q407 354 814 0v-33z"/><path fill="#478cbf" d="m105 673 152 14q12 1 15 14l4 67 132 10 8-61q2-11 15-15h162q13 4 15 15l8 61 132-10 4-67q3-13 15-14l152-14V427q30-39 56-81-35-59-83-108-43 20-82 47-40-37-88-64 7-51 8-102-59-28-123-42-26 43-46 89-49-7-98 0-20-46-46-89-64 14-123 42 1 51 8 102-48 27-88 64-39-27-82-47-48 49-83 108 26 42 56 81zm0 33v39c0 276 813 276 813 0v-39l-134 12-5 69q-2 10-14 13l-162 11q-12 0-16-11l-10-65H447l-10 65q-4 11-16 11l-162-11q-12-3-14-13l-5-69z"/><path d="M483 600c3 34 55 34 58 0v-86c-3-34-55-34-58 0z"/><circle cx="725" cy="526" r="90"/><circle cx="299" cy="526" r="90"/></g><g fill="#414042"><circle cx="307" cy="532" r="60"/><circle cx="717" cy="532" r="60"/></g></g></svg>

+ 37 - 0
icon.svg.import

@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c8x0g72s5u8bc"
+path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://icon.svg"
+dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false

+ 13 - 0
lunatic.gd

@@ -0,0 +1,13 @@
+extends Sprite2D
+
+
+# Called when the node enters the scene tree for the first time.
+func _ready() -> void:
+	pass # Replace with function body.
+
+
+# Called every frame. 'delta' is the elapsed time since the previous frame.
+func _process(delta: float) -> void:
+	self.set_region_rect(Rect2(256,240,256,80))
+	if(self.get_meta("selected") == true):
+		self.set_region_rect(Rect2(0,240,256,80))

+ 90 - 0
mainmenu.gd

@@ -0,0 +1,90 @@
+extends Node2D
+
+
+@onready var titleMenuGroup = self.get_node("TitleMenuGroup")
+@onready var nodes = [
+	titleMenuGroup.get_node("Menu").get_node("Start"), 
+	titleMenuGroup.get_node("Menu").get_node("Extra Start"),
+	titleMenuGroup.get_node("Menu").get_node("Spell Practice"),
+	titleMenuGroup.get_node("Menu").get_node("Practice Start"),
+	titleMenuGroup.get_node("Menu").get_node("Replay"),
+	titleMenuGroup.get_node("Menu").get_node("Result"),
+	titleMenuGroup.get_node("Menu").get_node("Music Room"),
+	titleMenuGroup.get_node("Menu").get_node("Option"),
+	titleMenuGroup.get_node("Menu").get_node("Quit")
+	]
+
+
+
+# Called when the node enters the scene tree for the first time.
+func _ready():
+	MusicController.playMusic(MusicController.Level.title)
+
+# Called every frame. 'delta' is the elapsed time since the previous frame.
+func _process(_delta):
+	
+	if(!titleMenuGroup.get_node("Menu").get_node("Start").submenuopened):
+		if(Input.is_action_just_pressed("ui_down")):
+			var ii = 0
+			
+			for i in nodes.size():
+				
+				if((nodes[i] as Sprite2D).get_meta("selected") == true):
+					(nodes[i] as Sprite2D).set_meta("selected", false) 
+					if(i+1 >= nodes.size()):
+						(nodes[0] as Sprite2D).set_meta("selected", true)
+						ii=0
+						break
+					else:
+						(nodes[i+1] as Sprite2D).set_meta("selected", true)
+						ii=i+1
+						break
+			if((nodes[ii] as Sprite2D).get_meta("disabled")):
+				MusicController.playSE(MusicController.SEs.invalid)
+			else:
+				MusicController.playSE(MusicController.SEs.select)
+		
+
+			
+				
+		if(Input.is_action_just_pressed("ui_up")):
+		
+			var ii = 0;
+			
+			for i in range(0, nodes.size()) :
+				if((nodes[i] as Sprite2D).get_meta("selected") == true):
+					(nodes[i] as Sprite2D).set_meta("selected", false) 
+					(nodes[i-1] as Sprite2D).set_meta("selected", true) 
+					ii=i-1
+					break
+			if((nodes[ii] as Sprite2D).get_meta("disabled")):
+				MusicController.playSE(MusicController.SEs.invalid)
+			else:
+				MusicController.playSE(MusicController.SEs.select)
+
+				
+				
+		
+		if(Input.is_action_just_pressed("ui_accept")):
+			
+				for i in nodes.size() :
+					if((nodes[i] as Sprite2D).get_meta("selected") == true ):
+						if( (nodes[i] as Sprite2D).get_meta("disabled") != true):
+							MusicController.playSE(MusicController.SEs.ok)
+							(nodes[i] as Sprite2D).ok()
+						else:
+							MusicController.playSE(MusicController.SEs.invalid)
+
+					
+
+		if(Input.is_action_just_pressed("ui_cancel")):
+			MusicController.playSE(MusicController.SEs.cancel)
+
+			if((nodes[8] as Sprite2D).get_meta("selected")==false):
+				for i in nodes.size():
+					if ((nodes[i] as Sprite2D).get_meta("selected")==true):
+						(nodes[i] as Sprite2D).set_meta("selected",false)
+					
+				(nodes[8] as Sprite2D).set_meta("selected",true)
+			else:
+				(nodes[8] as Sprite2D).ok()

文件差异内容过多而无法显示
+ 19 - 0
mainmenu.tscn


+ 13 - 0
normal.gd

@@ -0,0 +1,13 @@
+extends Sprite2D
+
+
+# Called when the node enters the scene tree for the first time.
+func _ready() -> void:
+	pass # Replace with function body.
+
+
+# Called every frame. 'delta' is the elapsed time since the previous frame.
+func _process(delta: float) -> void:
+	self.set_region_rect(Rect2(256,80,256,80))
+	if(self.get_meta("selected") == true):
+		self.set_region_rect(Rect2(0,80,256,80))

+ 11 - 0
ok.gd

@@ -0,0 +1,11 @@
+extends AudioStreamPlayer
+
+
+# Called when the node enters the scene tree for the first time.
+func _ready() -> void:
+	pass # Replace with function body.
+
+
+# Called every frame. 'delta' is the elapsed time since the previous frame.
+func _process(delta: float) -> void:
+	pass

+ 54 - 0
project.godot

@@ -0,0 +1,54 @@
+; Engine configuration file.
+; It's best edited using the editor UI and not directly,
+; since the parameters that go here are not all obvious.
+;
+; Format:
+;   [section] ; section goes between []
+;   param=value ; assign values to parameters
+
+config_version=5
+
+[application]
+
+config/name="touhou"
+run/main_scene="res://mainmenu.tscn"
+config/features=PackedStringArray("4.3", "GL Compatibility")
+boot_splash/image="res://Assets/th0809/th08logo.png"
+config/icon="res://icon.svg"
+
+[autoload]
+
+MusicController="*res://Autoloads/MusicController.tscn"
+
+[display]
+
+window/size/viewport_width=800
+window/size/viewport_height=600
+window/stretch/mode="viewport"
+
+[dotnet]
+
+project/assembly_name="touhou"
+
+[input]
+
+ui_accept={
+"deadzone": 0.5,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194309,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194310,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":32,"physical_keycode":0,"key_label":0,"unicode":32,"location":0,"echo":false,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":90,"key_label":0,"unicode":122,"location":0,"echo":false,"script":null)
+]
+}
+ui_cancel={
+"deadzone": 0.5,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194305,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":88,"key_label":0,"unicode":120,"location":0,"echo":false,"script":null)
+]
+}
+
+[rendering]
+
+renderer/rendering_method="gl_compatibility"
+renderer/rendering_method.mobile="gl_compatibility"
+textures/vram_compression/import_etc2_astc=true

+ 44 - 0
reimu_movement.gd

@@ -0,0 +1,44 @@
+extends CharacterBody2D
+
+
+var speed = 200.0
+
+
+# Get the gravity from the project settings to be synced with RigidBody nodes.
+var gravity = ProjectSettings.get_setting("physics/2d/default_gravity")
+
+
+func _physics_process(delta):
+	# Add the gravity.
+	#if not is_on_floor():
+		#velocity.y += gravity * delta
+
+	# Handle jump.
+	#if Input.is_action_just_pressed("ui_accept") and is_on_floor():
+		#velocity.y = JUMP_VELOCITY
+
+	# Get the input direction and handle the movement/deceleration.
+	# As good practice, you should replace UI actions with custom gameplay actions.
+	var direction = Input.get_axis("ui_left", "ui_right")
+	var directiony = Input.get_axis("ui_up", "ui_down")
+	if direction:
+		velocity.x = direction * speed
+
+	else:
+		velocity.x = move_toward(velocity.x, 0, speed)
+		
+
+	if directiony:
+		velocity.y = directiony*speed
+	else: 
+		velocity.y = move_toward(velocity.y, 0, speed)
+		
+	if Input.is_physical_key_pressed(KEY_SHIFT):
+		speed = 100.0
+		print(speed)
+	else:
+		speed=200
+	
+		
+
+	move_and_slide()

+ 54 - 0
start_menu.gd

@@ -0,0 +1,54 @@
+extends Control
+
+
+var nodes
+# Called when the node enters the scene tree for the first time.
+func _ready() -> void:
+	nodes = [
+		self.get_node("Easy"), 
+		self.get_node("Normal"),
+		self.get_node("Hard"),
+		self.get_node("Lunatic")
+	]
+	(self.get_node("AnimationPlayer") as AnimationPlayer).play("new_animation")
+
+
+# Called every frame. 'delta' is the elapsed time since the previous frame.
+func _process(delta: float) -> void:
+	if(Input.is_action_just_pressed("ui_accept")):
+		MusicController.playSE(MusicController.SEs.ok)
+
+	if(Input.is_action_just_pressed("ui_cancel")):
+		get_tree().current_scene.get_node("TitleMenuGroup").get_node("Menu").get_node("Start").submenuopened = false
+		MusicController.playSE(MusicController.SEs.cancel)
+		(self.get_node("AnimationPlayer") as AnimationPlayer).play_backwards("new_animation")
+		await get_tree().create_timer(0.25).timeout
+
+
+		self.queue_free()
+		(get_tree().get_root().get_node("Mainmenu").get_node("TitleMenuGroup").get_node("AnimationPlayer") as AnimationPlayer).play_backwards("new_animation_2")
+
+		
+		
+	if(Input.is_action_just_pressed("ui_up")):
+		MusicController.playSE(MusicController.SEs.select)
+		for i in range(0, nodes.size()) :
+			if((nodes[i] as Sprite2D).get_meta("selected") == true):
+				(nodes[i] as Sprite2D).set_meta("selected", false) 
+				(nodes[i-1] as Sprite2D).set_meta("selected", true) 
+				break
+	if(Input.is_action_just_pressed("ui_down")):
+		MusicController.playSE(MusicController.SEs.select)
+		for i in nodes.size():
+			
+			if((nodes[i] as Sprite2D).get_meta("selected") == true):
+				(nodes[i] as Sprite2D).set_meta("selected", false) 
+				if(i+1 >= nodes.size()):
+					(nodes[0] as Sprite2D).set_meta("selected", true)
+					
+					break
+				else:
+					(nodes[i+1] as Sprite2D).set_meta("selected", true)
+					
+					break
+	

+ 105 - 0
testscene.tscn

@@ -0,0 +1,105 @@
+[gd_scene load_steps=13 format=3 uid="uid://dnnc0pdu3rvyh"]
+
+[ext_resource type="Script" path="res://reimu_movement.gd" id="1_cgk3l"]
+[ext_resource type="Texture2D" uid="uid://kmbyuo5g2l0q" path="res://Assets/player00/player00.png" id="2_kxu6v"]
+
+[sub_resource type="CircleShape2D" id="CircleShape2D_e8k53"]
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_ws6jr"]
+atlas = ExtResource("2_kxu6v")
+region = Rect2(0, 0, 32, 51)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_bwbvw"]
+atlas = ExtResource("2_kxu6v")
+region = Rect2(32, 0, 32, 51)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_vaknj"]
+atlas = ExtResource("2_kxu6v")
+region = Rect2(64, 0, 32, 51)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_c5giq"]
+atlas = ExtResource("2_kxu6v")
+region = Rect2(96, 0, 32, 51)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_u0lpw"]
+atlas = ExtResource("2_kxu6v")
+region = Rect2(128, 0, 32, 51)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_nh2ku"]
+atlas = ExtResource("2_kxu6v")
+region = Rect2(160, 0, 32, 51)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_ok4fn"]
+atlas = ExtResource("2_kxu6v")
+region = Rect2(192, 0, 32, 51)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_5r4iv"]
+atlas = ExtResource("2_kxu6v")
+region = Rect2(224, 0, 32, 51)
+
+[sub_resource type="SpriteFrames" id="SpriteFrames_5x2dv"]
+animations = [{
+"frames": [{
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_ws6jr")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_bwbvw")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_vaknj")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_c5giq")
+}],
+"loop": true,
+"name": &"reimu",
+"speed": 10.0
+}, {
+"frames": [{
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_u0lpw")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_nh2ku")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_ok4fn")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_5r4iv")
+}],
+"loop": true,
+"name": &"yukari",
+"speed": 10.0
+}]
+
+[node name="Node2D" type="Node2D"]
+
+[node name="Camera2D" type="Camera2D" parent="."]
+offset = Vector2(100, 50)
+zoom = Vector2(4, 4)
+
+[node name="CharacterBody2D" type="CharacterBody2D" parent="."]
+position = Vector2(104, 55)
+script = ExtResource("1_cgk3l")
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="CharacterBody2D"]
+shape = SubResource("CircleShape2D_e8k53")
+
+[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="CharacterBody2D"]
+sprite_frames = SubResource("SpriteFrames_5x2dv")
+animation = &"reimu"
+autoplay = "reimu"
+
+[node name="CharacterBody2D2" type="CharacterBody2D" parent="."]
+position = Vector2(152, 54)
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="CharacterBody2D2"]
+shape = SubResource("CircleShape2D_e8k53")
+
+[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="CharacterBody2D2"]
+sprite_frames = SubResource("SpriteFrames_5x2dv")
+animation = &"yukari"
+autoplay = "yukari"
+frame_progress = 0.87452

二进制
title00.png


+ 34 - 0
title00.png.import

@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://csbno4yuxytkl"
+path="res://.godot/imported/title00.png-d383fff669530d9dfbacff1dc7179e43.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://title00.png"
+dest_files=["res://.godot/imported/title00.png-d383fff669530d9dfbacff1dc7179e43.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1

部分文件因为文件数量过多而无法显示