小场景:自动跟随的老鼠
This commit is contained in:
parent
097594f22b
commit
055b9dd1f8
BIN
asset/art/little_game/老鼠/老鼠.png
Normal file
BIN
asset/art/little_game/老鼠/老鼠.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 351 B |
34
asset/art/little_game/老鼠/老鼠.png.import
Normal file
34
asset/art/little_game/老鼠/老鼠.png.import
Normal file
@ -0,0 +1,34 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://bebirk1fwldg2"
|
||||
path="res://.godot/imported/老鼠.png-ec72ce9b9d545fd97136d899edf3f074.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://asset/art/little_game/老鼠/老鼠.png"
|
||||
dest_files=["res://.godot/imported/老鼠.png-ec72ce9b9d545fd97136d899edf3f074.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
|
@ -82,6 +82,7 @@
|
||||
吕萍: (疑惑——)[ID:c01_s05_夜行船2]
|
||||
=> END
|
||||
|
||||
~ c01_s05_院长房间_开门
|
||||
音效: 开门 [ID:音效_开门]
|
||||
~ c01_s06_谈论鬼差
|
||||
小孩甲: 鬼差...你知道吗? [ID:c01_s06_谈论鬼差1]
|
||||
小孩乙: 我听奶奶说... [ID:c01_s06_谈论鬼差2]
|
||||
=> END
|
||||
|
@ -723,17 +723,6 @@ height = 50.0
|
||||
[node name="MainPlayer" parent="Ground" index="5"]
|
||||
character = "小小蝶"
|
||||
|
||||
[node name="CameraFocusMarker" parent="Ground" index="6"]
|
||||
force_offset = Vector2(0, 0)
|
||||
lock_horizontal = true
|
||||
speed = 5.0
|
||||
half_screen_size = Vector2(282, 120)
|
||||
shaded_height = 38
|
||||
shake_enabled = false
|
||||
shake_strength = 2.0
|
||||
shake_recovery_speed = 8.0
|
||||
zoom_ratio = 1.0
|
||||
|
||||
[node name="FGSprite2D" parent="Ground/ParallaxForeground/FGParallaxLayer" index="0"]
|
||||
position = Vector2(21, 39)
|
||||
texture = ExtResource("3_vmr0f")
|
||||
|
@ -1,4 +1,4 @@
|
||||
[gd_scene load_steps=30 format=3 uid="uid://bx16c8nn32f40"]
|
||||
[gd_scene load_steps=32 format=3 uid="uid://bx16c8nn32f40"]
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://dayyx4jerj7io" path="res://scene/ground/ground.tscn" id="1_bitx7"]
|
||||
[ext_resource type="Script" path="res://scene/ground/scene/c01/s06_animation.gd" id="2_fkfhi"]
|
||||
@ -12,7 +12,9 @@
|
||||
[ext_resource type="SpriteFrames" uid="uid://c6okvaeemoodq" path="res://asset/art/gif/c01_孤儿院围墙/frames.tres" id="7_dsj2r"]
|
||||
[ext_resource type="Script" path="res://scene/entity/general/state_action_res.gd" id="9_lg0nw"]
|
||||
[ext_resource type="PackedScene" uid="uid://b50n0hvs4yh75" path="res://scene/entity/general/autoplay_animated_sprite.tscn" id="9_on7ga"]
|
||||
[ext_resource type="PackedScene" uid="uid://nwpbl5yuh280" path="res://scene/ground/script/c01/s00_自动跟随的老鼠.tscn" id="11_7gmev"]
|
||||
[ext_resource type="PackedScene" uid="uid://bnf3lkcbpx1ar" path="res://scene/entity/ambush.tscn" id="11_tudob"]
|
||||
[ext_resource type="PackedScene" uid="uid://jr1yd46wm5je" path="res://scene/entity/note.tscn" id="12_28t76"]
|
||||
|
||||
[sub_resource type="Animation" id="Animation_723yg"]
|
||||
length = 0.001
|
||||
@ -254,6 +256,13 @@ sprite_frames = ExtResource("7_dsj2r")
|
||||
animation = &"【胖小孩背着残疾小孩】-呼吸"
|
||||
state_configs = Array[ExtResource("9_lg0nw")]([SubResource("Resource_wae3q"), SubResource("Resource_1yioc")])
|
||||
|
||||
[node name="自动跟随的老鼠" parent="Ground/DeployLayer" index="12" instance=ExtResource("11_7gmev")]
|
||||
position = Vector2(2507, 75)
|
||||
|
||||
[node name="Note院长房间" parent="Ground/DeployLayer" index="13" instance=ExtResource("12_28t76")]
|
||||
|
||||
[node name="Note小孩房间" parent="Ground/DeployLayer" index="14" instance=ExtResource("12_28t76")]
|
||||
|
||||
[node name="PointLight2D" type="PointLight2D" parent="Ground/AmbientLayer" index="0"]
|
||||
energy = 0.6
|
||||
range_layer_max = 2
|
||||
|
178
scene/ground/script/c01/s00_自动跟随的老鼠.gd
Normal file
178
scene/ground/script/c01/s00_自动跟随的老鼠.gd
Normal file
@ -0,0 +1,178 @@
|
||||
@tool
|
||||
extends Node2D
|
||||
|
||||
@export var enabled := true
|
||||
@export var amounts := 5
|
||||
# 老鼠活动区域
|
||||
@export var action_area := Vector2(200, 30):
|
||||
set(val):
|
||||
action_area = val
|
||||
queue_redraw()
|
||||
@export var gizmo_outline_color := Color(0.565, 0.271, 0.318, 0.8):
|
||||
set(val):
|
||||
gizmo_outline_color = val
|
||||
queue_redraw()
|
||||
@export var move_speed := 100.0
|
||||
@export var distance_to_player_range := Vector2(50, 270)
|
||||
@export var random_wait_time_range := Vector2(0.5, 1.0)
|
||||
@export var random_wait_possibility := 0.4
|
||||
@export var random_mov_distace_range := Vector2(20, 50)
|
||||
@export var scatter_on_start := false
|
||||
@export var debug_scatter := false:
|
||||
set(val):
|
||||
debug_scatter = false
|
||||
if Engine.is_editor_hint():
|
||||
_init_mice(true)
|
||||
|
||||
var mice = []
|
||||
# 大于 0 时等待,小于 0 时移动,abs()<0.1 时重新生成时间
|
||||
var random_wait_time := [] as Array[float]
|
||||
var random_directions := [] as Array[Vector2]
|
||||
var random_positions := [] as Array[Vector2]
|
||||
var player
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
if Engine.is_editor_hint():
|
||||
queue_redraw()
|
||||
_init_mice()
|
||||
|
||||
|
||||
func _enter_tree() -> void:
|
||||
if is_node_ready():
|
||||
_init_mice()
|
||||
|
||||
|
||||
func flush_right_and_disable() -> void:
|
||||
enabled = false
|
||||
var tween = create_tween()
|
||||
for i in range(mice.size()):
|
||||
var m = mice[i]
|
||||
m.flip_h = true
|
||||
if i == 0:
|
||||
tween.tween_property(m, "position:x", m.position.x + 10000, 100.0)
|
||||
else:
|
||||
tween.parallel().tween_property(m, "position:x", m.position.x + 10000, 100.0)
|
||||
|
||||
|
||||
func _init_mice(scatter := scatter_on_start) -> void:
|
||||
mice.clear()
|
||||
for c in get_children():
|
||||
if c is AnimatedSprite2D:
|
||||
mice.append(c)
|
||||
random_wait_time.resize(mice.size())
|
||||
random_directions.resize(mice.size())
|
||||
random_positions.resize(mice.size())
|
||||
for i in range(mice.size()):
|
||||
var m = mice[i]
|
||||
# clamp to action area
|
||||
if scatter:
|
||||
var pos = Vector2(randf() * action_area.x, randf() * action_area.y)
|
||||
m.position = pos
|
||||
random_positions[i] = m.position
|
||||
random_directions[i] = Vector2.ONE
|
||||
random_wait_time[i] = 0
|
||||
|
||||
|
||||
func _physics_process(delta: float) -> void:
|
||||
if Engine.is_editor_hint() or not enabled:
|
||||
return
|
||||
if not player:
|
||||
player = SceneManager.get_player()
|
||||
if not player:
|
||||
return
|
||||
var player_global_position = player.global_position
|
||||
# clamp to action area, 允许稍微大一点,防止卡位
|
||||
player_global_position.x = clampf(
|
||||
player_global_position.x, global_position.x - 2, global_position.x + action_area.x + 4
|
||||
)
|
||||
for i in range(mice.size()):
|
||||
var m = mice[i]
|
||||
var m_pos = m.position
|
||||
var m_global_pos = m.global_position
|
||||
var squared_distance = m_global_pos.distance_squared_to(player_global_position)
|
||||
var facing_right := true
|
||||
var direction = m_global_pos.direction_to(player_global_position)
|
||||
if squared_distance < pow(distance_to_player_range.x, 2):
|
||||
# move away
|
||||
facing_right = direction.x < 0
|
||||
if facing_right:
|
||||
m.position.x += move_speed * delta
|
||||
else:
|
||||
m.position.x -= move_speed * delta
|
||||
m.position.y -= direction.y * move_speed * delta
|
||||
random_wait_time[i] = -0.5 # 进入运动状态
|
||||
random_positions[i] = m.position
|
||||
elif squared_distance > pow(distance_to_player_range.y, 2):
|
||||
# move closer
|
||||
facing_right = direction.x > 0
|
||||
if facing_right:
|
||||
m.position.x += move_speed * delta
|
||||
else:
|
||||
m.position.x -= move_speed * delta
|
||||
m.position.y += direction.y * move_speed * delta
|
||||
random_wait_time[i] = -0.5 # 进入运动状态
|
||||
random_positions[i] = m.position
|
||||
else:
|
||||
if abs(random_wait_time[i]) < 0.1:
|
||||
random_wait_time[i] = (
|
||||
random_wait_time_range.x
|
||||
+ randf() * (random_wait_time_range.y - random_wait_time_range.x)
|
||||
)
|
||||
if randf() > random_wait_possibility:
|
||||
random_wait_time[i] *= -1
|
||||
# 一半概率等待,一半概率移动
|
||||
elif random_wait_time[i] > 0:
|
||||
random_wait_time[i] -= delta
|
||||
# random move, 每次移动后随机生成新的目标位置,避免老鼠在原地打转
|
||||
else:
|
||||
random_wait_time[i] += delta
|
||||
var target = random_positions[i]
|
||||
if target.distance_squared_to(m_pos) < 9:
|
||||
direction.y = randf_range(-0.5, 0.5)
|
||||
var x_diff = player_global_position.x - m_global_pos.x
|
||||
var diff_sign = signf(x_diff)
|
||||
# 大概率向 distance_to_player_range 的中间移动
|
||||
x_diff = (
|
||||
x_diff
|
||||
- (
|
||||
diff_sign
|
||||
* (distance_to_player_range.x + distance_to_player_range.y)
|
||||
* 0.5
|
||||
)
|
||||
)
|
||||
# 75% 的概率向 x_diff 移动
|
||||
if signf(x_diff) > 0:
|
||||
direction.x = 1 if randf() < 0.7 else -1
|
||||
else:
|
||||
direction.x = -1 if randf() < 0.7 else 1
|
||||
random_directions[i] = direction
|
||||
var random_dis = (
|
||||
random_mov_distace_range.x
|
||||
+ randf() * (random_mov_distace_range.y - random_mov_distace_range.x)
|
||||
)
|
||||
target = direction * random_dis + m_pos
|
||||
# clamp to action area,稍小于 action_area,避免老鼠在边缘打转
|
||||
# random_positions[i] = target.clamp(Vector2(2, 2), action_area - Vector2(4, 4))
|
||||
random_positions[i] = target.clamp(Vector2.ZERO, action_area)
|
||||
facing_right = target.x > m_pos.x
|
||||
var delta_max = move_speed * delta
|
||||
m_pos = m.position
|
||||
m.position.x = move_toward(m_pos.x, target.x, delta_max)
|
||||
m.position.y = move_toward(m_pos.y, target.y, delta_max)
|
||||
# set flip h
|
||||
m.flip_h = facing_right
|
||||
# clamp to action area
|
||||
m.position = m.position.clamp(Vector2.ZERO, action_area)
|
||||
|
||||
|
||||
func _draw() -> void:
|
||||
if Engine.is_editor_hint():
|
||||
# draw gizmo: 老鼠活动区域
|
||||
var action_area_rect = Rect2(Vector2.ZERO, action_area)
|
||||
# fill
|
||||
var fill_color = gizmo_outline_color
|
||||
fill_color.a = 0.4
|
||||
draw_rect(action_area_rect, fill_color)
|
||||
# outline
|
||||
draw_rect(action_area_rect, gizmo_outline_color, false, 1.0)
|
65
scene/ground/script/c01/s00_自动跟随的老鼠.tscn
Normal file
65
scene/ground/script/c01/s00_自动跟随的老鼠.tscn
Normal file
@ -0,0 +1,65 @@
|
||||
[gd_scene load_steps=6 format=3 uid="uid://nwpbl5yuh280"]
|
||||
|
||||
[ext_resource type="Script" path="res://scene/ground/script/c01/s00_自动跟随的老鼠.gd" id="1_lesfu"]
|
||||
[ext_resource type="Texture2D" uid="uid://bebirk1fwldg2" path="res://asset/art/little_game/老鼠/老鼠.png" id="2_6u35i"]
|
||||
|
||||
[sub_resource type="AtlasTexture" id="AtlasTexture_6ljga"]
|
||||
atlas = ExtResource("2_6u35i")
|
||||
region = Rect2(0, 0, 16, 10)
|
||||
|
||||
[sub_resource type="AtlasTexture" id="AtlasTexture_p46st"]
|
||||
atlas = ExtResource("2_6u35i")
|
||||
region = Rect2(32, 0, 16, 10)
|
||||
|
||||
[sub_resource type="SpriteFrames" id="SpriteFrames_bqotn"]
|
||||
animations = [{
|
||||
"frames": [{
|
||||
"duration": 1.0,
|
||||
"texture": SubResource("AtlasTexture_6ljga")
|
||||
}],
|
||||
"loop": true,
|
||||
"name": &"mouse1",
|
||||
"speed": 5.0
|
||||
}, {
|
||||
"frames": [{
|
||||
"duration": 1.0,
|
||||
"texture": SubResource("AtlasTexture_p46st")
|
||||
}],
|
||||
"loop": true,
|
||||
"name": &"mouse2",
|
||||
"speed": 5.0
|
||||
}]
|
||||
|
||||
[node name="自动跟随的老鼠" type="Node2D"]
|
||||
script = ExtResource("1_lesfu")
|
||||
action_area = Vector2(700, 40)
|
||||
|
||||
[node name="mouse1" type="AnimatedSprite2D" parent="."]
|
||||
y_sort_enabled = true
|
||||
position = Vector2(341.946, 19.4184)
|
||||
sprite_frames = SubResource("SpriteFrames_bqotn")
|
||||
animation = &"mouse1"
|
||||
|
||||
[node name="mouse2" type="AnimatedSprite2D" parent="."]
|
||||
y_sort_enabled = true
|
||||
position = Vector2(441.315, 7.66069)
|
||||
sprite_frames = SubResource("SpriteFrames_bqotn")
|
||||
animation = &"mouse2"
|
||||
|
||||
[node name="mouse3" type="AnimatedSprite2D" parent="."]
|
||||
y_sort_enabled = true
|
||||
position = Vector2(602.687, 37.4692)
|
||||
sprite_frames = SubResource("SpriteFrames_bqotn")
|
||||
animation = &"mouse2"
|
||||
|
||||
[node name="mouse4" type="AnimatedSprite2D" parent="."]
|
||||
y_sort_enabled = true
|
||||
position = Vector2(59.7088, 20.6539)
|
||||
sprite_frames = SubResource("SpriteFrames_bqotn")
|
||||
animation = &"mouse1"
|
||||
|
||||
[node name="mouse5" type="AnimatedSprite2D" parent="."]
|
||||
y_sort_enabled = true
|
||||
position = Vector2(198.783, 2.87105)
|
||||
sprite_frames = SubResource("SpriteFrames_bqotn")
|
||||
animation = &"mouse2"
|
Loading…
Reference in New Issue
Block a user