From 363aeaf44596cca8eab528a3d560b7aee6104c19 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=99=A8=E8=90=BD=E5=9F=BA=E5=9B=B4=E8=99=BE?=
<3161880837@qq.com>
Date: Tue, 26 Aug 2025 09:24:09 +0800
Subject: [PATCH] init
---
.gitignore | 1 +
components/Abstracts/EntityBase.tscn | 31 ++++++++++
components/Characters/Rooster.tscn | 30 ++++++++++
components/UI/ColorBar.tscn | 14 +++++
components/UI/EntityStateBar.tscn | 14 +++++
icon.svg | 1 +
icon.svg.import | 37 ++++++++++++
project.godot | 48 ++++++++++++++++
resources/characters/chick/chick-a.svg | 19 +++++++
resources/characters/chick/chick-a.svg.import | 37 ++++++++++++
resources/characters/chick/chick-b.svg | 20 +++++++
resources/characters/chick/chick-b.svg.import | 37 ++++++++++++
resources/characters/cock/rooster-a.svg | 56 +++++++++++++++++++
.../characters/cock/rooster-a.svg.import | 37 ++++++++++++
resources/characters/cock/rooster-b.svg | 51 +++++++++++++++++
.../characters/cock/rooster-b.svg.import | 37 ++++++++++++
resources/characters/hen/hen-a.svg | 37 ++++++++++++
resources/characters/hen/hen-a.svg.import | 37 ++++++++++++
resources/characters/hen/hen-b.svg | 33 +++++++++++
resources/characters/hen/hen-b.svg.import | 37 ++++++++++++
scripts/Contents/Characters/Rooster.gd | 9 +++
scripts/Statemachine/ColorBar.gd | 33 +++++++++++
scripts/Statemachine/EntityBase.gd | 26 +++++++++
scripts/Statemachine/EntityStateBar.gd | 10 ++++
world.tscn | 8 +++
25 files changed, 700 insertions(+)
create mode 100644 .gitignore
create mode 100644 components/Abstracts/EntityBase.tscn
create mode 100644 components/Characters/Rooster.tscn
create mode 100644 components/UI/ColorBar.tscn
create mode 100644 components/UI/EntityStateBar.tscn
create mode 100644 icon.svg
create mode 100644 icon.svg.import
create mode 100644 project.godot
create mode 100644 resources/characters/chick/chick-a.svg
create mode 100644 resources/characters/chick/chick-a.svg.import
create mode 100644 resources/characters/chick/chick-b.svg
create mode 100644 resources/characters/chick/chick-b.svg.import
create mode 100644 resources/characters/cock/rooster-a.svg
create mode 100644 resources/characters/cock/rooster-a.svg.import
create mode 100644 resources/characters/cock/rooster-b.svg
create mode 100644 resources/characters/cock/rooster-b.svg.import
create mode 100644 resources/characters/hen/hen-a.svg
create mode 100644 resources/characters/hen/hen-a.svg.import
create mode 100644 resources/characters/hen/hen-b.svg
create mode 100644 resources/characters/hen/hen-b.svg.import
create mode 100644 scripts/Contents/Characters/Rooster.gd
create mode 100644 scripts/Statemachine/ColorBar.gd
create mode 100644 scripts/Statemachine/EntityBase.gd
create mode 100644 scripts/Statemachine/EntityStateBar.gd
create mode 100644 world.tscn
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..1a6395e
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+.godot
\ No newline at end of file
diff --git a/components/Abstracts/EntityBase.tscn b/components/Abstracts/EntityBase.tscn
new file mode 100644
index 0000000..3577f06
--- /dev/null
+++ b/components/Abstracts/EntityBase.tscn
@@ -0,0 +1,31 @@
+[gd_scene load_steps=6 format=3 uid="uid://cvogxi7mktumf"]
+
+[ext_resource type="Script" path="res://scripts/Statemachine/EntityBase.gd" id="1_mvol6"]
+[ext_resource type="PackedScene" uid="uid://dcjqjqere8ets" path="res://components/UI/EntityStateBar.tscn" id="2_uje1g"]
+
+[sub_resource type="SpriteFrames" id="SpriteFrames_wcqpm"]
+
+[sub_resource type="CircleShape2D" id="CircleShape2D_buhm1"]
+radius = 43.2897
+
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_ce3to"]
+size = Vector2(64, 14)
+
+[node name="EntityBase" type="CharacterBody2D"]
+script = ExtResource("1_mvol6")
+
+[node name="texture" type="AnimatedSprite2D" parent="."]
+sprite_frames = SubResource("SpriteFrames_wcqpm")
+
+[node name="statebar" parent="texture" instance=ExtResource("2_uje1g")]
+position = Vector2(0, -51)
+
+[node name="hurtbox" type="Area2D" parent="texture"]
+
+[node name="hitbox" type="CollisionShape2D" parent="texture/hurtbox"]
+position = Vector2(7, 12)
+shape = SubResource("CircleShape2D_buhm1")
+
+[node name="movebox" type="CollisionShape2D" parent="."]
+position = Vector2(16, 69)
+shape = SubResource("RectangleShape2D_ce3to")
diff --git a/components/Characters/Rooster.tscn b/components/Characters/Rooster.tscn
new file mode 100644
index 0000000..d830988
--- /dev/null
+++ b/components/Characters/Rooster.tscn
@@ -0,0 +1,30 @@
+[gd_scene load_steps=6 format=3 uid="uid://bm7ymrri6pykb"]
+
+[ext_resource type="PackedScene" uid="uid://cvogxi7mktumf" path="res://components/Abstracts/EntityBase.tscn" id="1_e5pl8"]
+[ext_resource type="Script" path="res://scripts/Contents/Characters/Rooster.gd" id="2_oqdqd"]
+[ext_resource type="Texture2D" uid="uid://fn8qx72clh38" path="res://resources/characters/cock/rooster-a.svg" id="2_q0j6j"]
+[ext_resource type="Texture2D" uid="uid://ci2ik43ce82uy" path="res://resources/characters/cock/rooster-b.svg" id="3_b0fgx"]
+
+[sub_resource type="SpriteFrames" id="SpriteFrames_4v2ol"]
+animations = [{
+"frames": [{
+"duration": 1.0,
+"texture": ExtResource("2_q0j6j")
+}, {
+"duration": 1.0,
+"texture": ExtResource("3_b0fgx")
+}],
+"loop": true,
+"name": &"default",
+"speed": 5.0
+}]
+
+[node name="Rooster" instance=ExtResource("1_e5pl8")]
+script = ExtResource("2_oqdqd")
+
+[node name="texture" parent="." index="0"]
+sprite_frames = SubResource("SpriteFrames_4v2ol")
+
+[node name="statebar" parent="texture" index="0" node_paths=PackedStringArray("entity")]
+position = Vector2(0, -83)
+entity = NodePath("../..")
diff --git a/components/UI/ColorBar.tscn b/components/UI/ColorBar.tscn
new file mode 100644
index 0000000..72be9cd
--- /dev/null
+++ b/components/UI/ColorBar.tscn
@@ -0,0 +1,14 @@
+[gd_scene load_steps=2 format=3 uid="uid://d1ulrvupa76ap"]
+
+[ext_resource type="Script" path="res://scripts/Statemachine/ColorBar.gd" id="1_a106p"]
+
+[node name="ColorBar" type="Control"]
+layout_mode = 3
+anchors_preset = 0
+offset_right = 100.0
+offset_bottom = 10.0
+script = ExtResource("1_a106p")
+backColor = Color(0, 0, 0, 0.5)
+middleColor = Color(1, 0, 0, 0.5)
+frontColor = Color(1, 1, 1, 1)
+speed2 = 0.05
diff --git a/components/UI/EntityStateBar.tscn b/components/UI/EntityStateBar.tscn
new file mode 100644
index 0000000..cf8c8b6
--- /dev/null
+++ b/components/UI/EntityStateBar.tscn
@@ -0,0 +1,14 @@
+[gd_scene load_steps=3 format=3 uid="uid://dcjqjqere8ets"]
+
+[ext_resource type="PackedScene" uid="uid://d1ulrvupa76ap" path="res://components/UI/ColorBar.tscn" id="1_0ngbn"]
+[ext_resource type="Script" path="res://scripts/Statemachine/EntityStateBar.gd" id="1_ovbjr"]
+
+[node name="EntityStateBar" type="Node2D"]
+script = ExtResource("1_ovbjr")
+
+[node name="health" parent="." instance=ExtResource("1_0ngbn")]
+unique_name_in_owner = true
+offset_left = -50.0
+offset_top = -5.0
+offset_right = 50.0
+offset_bottom = 5.0
diff --git a/icon.svg b/icon.svg
new file mode 100644
index 0000000..9d8b7fa
--- /dev/null
+++ b/icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/icon.svg.import b/icon.svg.import
new file mode 100644
index 0000000..7461e8b
--- /dev/null
+++ b/icon.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dwwpkn4q07ja2"
+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
diff --git a/project.godot b/project.godot
new file mode 100644
index 0000000..7d49dac
--- /dev/null
+++ b/project.godot
@@ -0,0 +1,48 @@
+; 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="ChickenVSBear"
+run/main_scene="res://world.tscn"
+config/features=PackedStringArray("4.3", "GL Compatibility")
+config/icon="res://icon.svg"
+
+[dotnet]
+
+project/assembly_name="ChickenVSBear"
+
+[input]
+
+m_up={
+"deadzone": 0.5,
+"events": [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":87,"key_label":0,"unicode":119,"location":0,"echo":false,"script":null)
+]
+}
+m_down={
+"deadzone": 0.5,
+"events": [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":83,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null)
+]
+}
+m_left={
+"deadzone": 0.5,
+"events": [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":65,"key_label":0,"unicode":97,"location":0,"echo":false,"script":null)
+]
+}
+m_right={
+"deadzone": 0.5,
+"events": [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":68,"key_label":0,"unicode":100,"location":0,"echo":false,"script":null)
+]
+}
+
+[rendering]
+
+renderer/rendering_method="gl_compatibility"
+renderer/rendering_method.mobile="gl_compatibility"
diff --git a/resources/characters/chick/chick-a.svg b/resources/characters/chick/chick-a.svg
new file mode 100644
index 0000000..d218f6c
--- /dev/null
+++ b/resources/characters/chick/chick-a.svg
@@ -0,0 +1,19 @@
+
\ No newline at end of file
diff --git a/resources/characters/chick/chick-a.svg.import b/resources/characters/chick/chick-a.svg.import
new file mode 100644
index 0000000..fd72711
--- /dev/null
+++ b/resources/characters/chick/chick-a.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://7pkplcqqxvnp"
+path="res://.godot/imported/chick-a.svg-afac6b0ae774c3bd58491e2bd6361d4c.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resources/characters/chick/chick-a.svg"
+dest_files=["res://.godot/imported/chick-a.svg-afac6b0ae774c3bd58491e2bd6361d4c.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
diff --git a/resources/characters/chick/chick-b.svg b/resources/characters/chick/chick-b.svg
new file mode 100644
index 0000000..c0edbf9
--- /dev/null
+++ b/resources/characters/chick/chick-b.svg
@@ -0,0 +1,20 @@
+
\ No newline at end of file
diff --git a/resources/characters/chick/chick-b.svg.import b/resources/characters/chick/chick-b.svg.import
new file mode 100644
index 0000000..b3c09f7
--- /dev/null
+++ b/resources/characters/chick/chick-b.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dj5dvqb8gsedr"
+path="res://.godot/imported/chick-b.svg-b4baddeda341f2ae54cc4b02f0e627a2.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resources/characters/chick/chick-b.svg"
+dest_files=["res://.godot/imported/chick-b.svg-b4baddeda341f2ae54cc4b02f0e627a2.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
diff --git a/resources/characters/cock/rooster-a.svg b/resources/characters/cock/rooster-a.svg
new file mode 100644
index 0000000..ff91e28
--- /dev/null
+++ b/resources/characters/cock/rooster-a.svg
@@ -0,0 +1,56 @@
+
\ No newline at end of file
diff --git a/resources/characters/cock/rooster-a.svg.import b/resources/characters/cock/rooster-a.svg.import
new file mode 100644
index 0000000..5ff972c
--- /dev/null
+++ b/resources/characters/cock/rooster-a.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://fn8qx72clh38"
+path="res://.godot/imported/rooster-a.svg-8f3b7c9a282f7530eadfdf1db6ed219b.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resources/characters/cock/rooster-a.svg"
+dest_files=["res://.godot/imported/rooster-a.svg-8f3b7c9a282f7530eadfdf1db6ed219b.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
diff --git a/resources/characters/cock/rooster-b.svg b/resources/characters/cock/rooster-b.svg
new file mode 100644
index 0000000..30bba52
--- /dev/null
+++ b/resources/characters/cock/rooster-b.svg
@@ -0,0 +1,51 @@
+
\ No newline at end of file
diff --git a/resources/characters/cock/rooster-b.svg.import b/resources/characters/cock/rooster-b.svg.import
new file mode 100644
index 0000000..1c5e4bf
--- /dev/null
+++ b/resources/characters/cock/rooster-b.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ci2ik43ce82uy"
+path="res://.godot/imported/rooster-b.svg-bdafe710157b3cee086ebe2237be9345.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resources/characters/cock/rooster-b.svg"
+dest_files=["res://.godot/imported/rooster-b.svg-bdafe710157b3cee086ebe2237be9345.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
diff --git a/resources/characters/hen/hen-a.svg b/resources/characters/hen/hen-a.svg
new file mode 100644
index 0000000..7ffac0b
--- /dev/null
+++ b/resources/characters/hen/hen-a.svg
@@ -0,0 +1,37 @@
+
\ No newline at end of file
diff --git a/resources/characters/hen/hen-a.svg.import b/resources/characters/hen/hen-a.svg.import
new file mode 100644
index 0000000..408351a
--- /dev/null
+++ b/resources/characters/hen/hen-a.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b5m0fpg3ewfum"
+path="res://.godot/imported/hen-a.svg-e0523199921d84862ee8bebd1fc8832a.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resources/characters/hen/hen-a.svg"
+dest_files=["res://.godot/imported/hen-a.svg-e0523199921d84862ee8bebd1fc8832a.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
diff --git a/resources/characters/hen/hen-b.svg b/resources/characters/hen/hen-b.svg
new file mode 100644
index 0000000..3bee073
--- /dev/null
+++ b/resources/characters/hen/hen-b.svg
@@ -0,0 +1,33 @@
+
\ No newline at end of file
diff --git a/resources/characters/hen/hen-b.svg.import b/resources/characters/hen/hen-b.svg.import
new file mode 100644
index 0000000..908c759
--- /dev/null
+++ b/resources/characters/hen/hen-b.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://3o0oqobnr3b2"
+path="res://.godot/imported/hen-b.svg-fdf12ad84161cdb59dec3cf629cd6ecc.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resources/characters/hen/hen-b.svg"
+dest_files=["res://.godot/imported/hen-b.svg-fdf12ad84161cdb59dec3cf629cd6ecc.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
diff --git a/scripts/Contents/Characters/Rooster.gd b/scripts/Contents/Characters/Rooster.gd
new file mode 100644
index 0000000..0f14c5d
--- /dev/null
+++ b/scripts/Contents/Characters/Rooster.gd
@@ -0,0 +1,9 @@
+extends EntityBase
+class_name Rooster
+
+func ai():
+ var vector = Vector2(
+ Input.get_axis("m_left", "m_right"),
+ Input.get_axis("m_up", "m_down")
+ )
+ move(vector)
diff --git a/scripts/Statemachine/ColorBar.gd b/scripts/Statemachine/ColorBar.gd
new file mode 100644
index 0000000..9275e26
--- /dev/null
+++ b/scripts/Statemachine/ColorBar.gd
@@ -0,0 +1,33 @@
+@tool
+extends Control
+
+@export var minValue: float = 0
+@export var maxValue: float = 100
+@export var currentValue: float = 50
+@export var backColor: Color
+@export var middleColor: Color
+@export var frontColor: Color
+@export var speed1: float = 0.9
+@export var speed2: float = 0.01
+
+var middleValue = 0
+var frontValue = 0
+var forwardDirection = -1
+
+func getPercent(value: float):
+ return (value - minValue) / (maxValue - minValue)
+func setCurrent(value: float):
+ forwardDirection = sign(value - currentValue)
+ currentValue = value
+
+func _ready():
+ middleValue = currentValue
+ frontValue = currentValue
+func _draw():
+ draw_rect(Rect2(0, 0, size.x, size.y), backColor)
+ draw_rect(Rect2(0, 0, size.x * getPercent(middleValue), size.y), middleColor)
+ draw_rect(Rect2(0, 0, size.x * getPercent(frontValue), size.y), frontColor)
+func _process(_delta: float) -> void:
+ middleValue = lerpf(middleValue, currentValue, speed1 if forwardDirection > 0 else speed2)
+ frontValue = lerpf(frontValue, currentValue, speed1 if forwardDirection < 0 else speed2)
+ queue_redraw()
diff --git a/scripts/Statemachine/EntityBase.gd b/scripts/Statemachine/EntityBase.gd
new file mode 100644
index 0000000..cc631dd
--- /dev/null
+++ b/scripts/Statemachine/EntityBase.gd
@@ -0,0 +1,26 @@
+extends CharacterBody2D
+class_name EntityBase # 这是个抽象类
+
+@export var maxHealth: float = 100
+@export var movementSpeed: float = 100
+
+var health: float = 0
+
+func _ready():
+ health = maxHealth
+func _process(_delta):
+ health = clamp(health, 0, maxHealth)
+func _physics_process(_delta: float) -> void:
+ velocity = Vector2.ZERO
+ ai()
+ move_and_slide()
+
+# 通用方法
+func move(direction: Vector2):
+ velocity = direction.normalized() * movementSpeed
+
+# 抽象方法
+func ai():
+ pass
+func attack(_type: int):
+ pass
diff --git a/scripts/Statemachine/EntityStateBar.gd b/scripts/Statemachine/EntityStateBar.gd
new file mode 100644
index 0000000..1881c6e
--- /dev/null
+++ b/scripts/Statemachine/EntityStateBar.gd
@@ -0,0 +1,10 @@
+extends Node2D
+
+@export var entity: EntityBase
+
+@onready var healthBar = $"%health"
+
+func _process(_delta):
+ if entity:
+ healthBar.maxValue = entity.maxHealth
+ healthBar.setCurrent(entity.health)
diff --git a/world.tscn b/world.tscn
new file mode 100644
index 0000000..9072d21
--- /dev/null
+++ b/world.tscn
@@ -0,0 +1,8 @@
+[gd_scene load_steps=2 format=3 uid="uid://dmxi1ikn6avig"]
+
+[ext_resource type="PackedScene" uid="uid://bm7ymrri6pykb" path="res://components/Characters/Rooster.tscn" id="1_7jr0n"]
+
+[node name="world" type="Node2D"]
+
+[node name="rooster" parent="." instance=ExtResource("1_7jr0n")]
+position = Vector2(394, 274)