diff --git a/components/Abstracts/BulletBase.tscn b/components/Abstracts/BulletBase.tscn index cb97a53..fa09ef9 100644 --- a/components/Abstracts/BulletBase.tscn +++ b/components/Abstracts/BulletBase.tscn @@ -18,6 +18,7 @@ _data = { script = ExtResource("1_pklpq") [node name="texture" type="AnimatedSprite2D" parent="."] +unique_name_in_owner = true sprite_frames = SubResource("SpriteFrames_vypy3") [node name="animator" type="AnimationPlayer" parent="texture"] diff --git a/components/Abstracts/EffectBase.tscn b/components/Abstracts/EffectBase.tscn index 7863c86..1183bc6 100644 --- a/components/Abstracts/EffectBase.tscn +++ b/components/Abstracts/EffectBase.tscn @@ -2,9 +2,7 @@ [ext_resource type="Script" path="res://scripts/Statemachine/EffectController.gd" id="1_pt2rk"] -[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_tgxns"] -particle_flag_disable_z = true -gravity = Vector3(0, 98, 0) +[sub_resource type="ShaderMaterial" id="ShaderMaterial_7cv4k"] [node name="EffectBase" type="Node2D"] script = ExtResource("1_pt2rk") @@ -12,5 +10,16 @@ script = ExtResource("1_pt2rk") [node name="particles" type="GPUParticles2D" parent="."] unique_name_in_owner = true amount = 30 -process_material = SubResource("ParticleProcessMaterial_tgxns") +process_material = SubResource("ShaderMaterial_7cv4k") explosiveness = 1.0 + +[node name="stage" type="ColorRect" parent="."] +unique_name_in_owner = true +offset_left = -50.0 +offset_top = -50.0 +offset_right = 50.0 +offset_bottom = 50.0 +color = Color(1, 1, 1, 0) + +[node name="animator" type="AnimationPlayer" parent="stage"] +unique_name_in_owner = true diff --git a/components/Bullets/Laser.tscn b/components/Bullets/Laser.tscn index 2e1f801..64b5380 100644 --- a/components/Bullets/Laser.tscn +++ b/components/Bullets/Laser.tscn @@ -8,9 +8,6 @@ [sub_resource type="ShaderMaterial" id="ShaderMaterial_5n8cv"] shader = ExtResource("2_h6cxi") -shader_parameter/color = Color(0.654902, 1, 1, 1) -shader_parameter/laser_width = 0.01 -shader_parameter/soft_edge = 0.5 [sub_resource type="CapsuleShape2D" id="CapsuleShape2D_y85id"] height = 300.0 @@ -32,9 +29,10 @@ sprite_frames = SubResource("SpriteFrames_yip5k") material = SubResource("ShaderMaterial_5n8cv") offset_left = -10.0 offset_top = -300.0 -offset_right = 10.0 +offset_right = 19.0 [node name="hitbox" parent="." index="1"] +visible = false position = Vector2(150, 0) rotation = 1.5708 shape = SubResource("CapsuleShape2D_y85id") diff --git a/components/Bullets/Pencil.tscn b/components/Bullets/Pencil.tscn index effda84..3658bf9 100644 --- a/components/Bullets/Pencil.tscn +++ b/components/Bullets/Pencil.tscn @@ -59,7 +59,7 @@ tracks/3/interp = 1 tracks/3/loop_wrap = true tracks/3/keys = { "handle_modes": PackedInt32Array(0, 0), -"points": PackedFloat32Array(-100, -0.25, 0, 0.25, 0, -44, -0.25, 0, 0.25, 0), +"points": PackedFloat32Array(-200, -0.25, 0, 0.25, 0, -44, -0.25, 0, 0.25, 0), "times": PackedFloat32Array(0.75, 1) } @@ -121,6 +121,7 @@ size = Vector2(10, 10) [node name="Pencil" instance=ExtResource("1_anksp")] script = ExtResource("2_4w6n2") +lifeTime = 3000.0 [node name="texture" parent="." index="0"] position = Vector2(0, -44) diff --git a/components/Effects/Bomb.tscn b/components/Effects/Bomb.tscn new file mode 100644 index 0000000..2b535a1 --- /dev/null +++ b/components/Effects/Bomb.tscn @@ -0,0 +1,16 @@ +[gd_scene load_steps=4 format=3 uid="uid://bsqq3oqcidjve"] + +[ext_resource type="PackedScene" uid="uid://bcvuuy2m0pke0" path="res://components/Abstracts/EffectBase.tscn" id="1_6fayo"] +[ext_resource type="Shader" path="res://shaders/Bomb.gdshader" id="2_fmma6"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_1h4c2"] +shader = ExtResource("2_fmma6") +shader_parameter/explosion_radius = 0.0 +shader_parameter/explosion_intensity = 1.0 +shader_parameter/explosion_color = Color(1, 0.5, 0, 1) +shader_parameter/time_scale = 1.0 + +[node name="EffectBase" instance=ExtResource("1_6fayo")] + +[node name="stage" parent="." index="1"] +material = SubResource("ShaderMaterial_1h4c2") diff --git a/scripts/Contents/Bullets/Diamond.gd b/scripts/Contents/Bullets/Diamond.gd index ae9e429..2281dd8 100644 --- a/scripts/Contents/Bullets/Diamond.gd +++ b/scripts/Contents/Bullets/Diamond.gd @@ -2,7 +2,7 @@ extends BulletBase class_name Diamond func ai(): - var tracing = Time.get_ticks_msec() - spawnInWhen < 1000 + var tracing = timeLived() < 1000 if tracing: rotation = lerp_angle(rotation, position.angle_to_point(launcher.currentFocusedBoss.position), 0.1) canDamageSelf = !tracing diff --git a/scripts/Contents/Bullets/Pencil.gd b/scripts/Contents/Bullets/Pencil.gd index 9e83990..0ee506f 100644 --- a/scripts/Contents/Bullets/Pencil.gd +++ b/scripts/Contents/Bullets/Pencil.gd @@ -1 +1,7 @@ extends BulletBase + +func spawn(): + await TickTool.millseconds(1000) + hitbox.disabled = false +func ai(): + texture.global_rotation = 0 diff --git a/scripts/Contents/Characters/Rooster.gd b/scripts/Contents/Characters/Rooster.gd index f0237c7..b742d2a 100644 --- a/scripts/Contents/Characters/Rooster.gd +++ b/scripts/Contents/Characters/Rooster.gd @@ -19,7 +19,8 @@ func ai(): func attack(type): if type == 0: var weaponPos = findWeaponAnchor("normal") - return BulletBase.generate(preload("res://components/Bullets/PurpleCrystal.tscn"), self, weaponPos, (get_global_mouse_position() - weaponPos).angle()) + return BulletBase.generate(preload("res://components/Bullets/Pencil.tscn"), self, weaponPos, (get_global_mouse_position() - weaponPos).angle()) + # return BulletBase.generate(preload("res://components/Bullets/PurpleCrystal.tscn"), self, weaponPos, (get_global_mouse_position() - weaponPos).angle()) func sprint(): move(Vector2( Input.get_axis("m_left", "m_right"), diff --git a/scripts/Statemachine/BulletBase.gd b/scripts/Statemachine/BulletBase.gd index d08edad..106002b 100644 --- a/scripts/Statemachine/BulletBase.gd +++ b/scripts/Statemachine/BulletBase.gd @@ -12,8 +12,9 @@ class_name BulletBase @export var canDamageSelf: bool = false # 是否可以伤害发射者 @export var needEnergy: float = 4.0 # 发射时需要消耗的能量 -@onready var animator = $"%animator" -@onready var hitbox = $"%hitbox" +@onready var animator: AnimationPlayer = $"%animator" +@onready var hitbox: CollisionShape2D = $"%hitbox" +@onready var texture: AnimatedSprite2D = $"%texture" var launcher: EntityBase = null var spawnInWhen: float = 0 @@ -51,6 +52,8 @@ func forward(direction: Vector2): position += direction.normalized() * fields.get(FieldStore.Bullet.SPEED) * GameRule.bulletSpeedMultiplier func fullPenerate(): return fields.get(FieldStore.Bullet.PENERATE) + launcher.fields.get(FieldStore.Entity.PENERATE) +func timeLived(): + return Time.get_ticks_msec() - spawnInWhen func ai(): pass diff --git a/shaders/Bomb.gdshader b/shaders/Bomb.gdshader new file mode 100644 index 0000000..ca43e5d --- /dev/null +++ b/shaders/Bomb.gdshader @@ -0,0 +1,31 @@ +shader_type canvas_item; + +uniform float explosion_radius : hint_range(0.0, 1.0) = 0.0; +uniform float explosion_intensity : hint_range(0.0, 2.0) = 1.0; +uniform vec4 explosion_color : source_color = vec4(1.0, 0.5, 0.0, 1.0); +uniform float time_scale = 1.0; + +void fragment() { + // 计算当前像素到中心的距离 + vec2 center = vec2(0.5, 0.5); + float dist = distance(UV, center); + + // 使用TIME创建随时间变化的爆炸效果 + float time = TIME * time_scale; + float explosion = smoothstep(explosion_radius, explosion_radius - 0.2, dist) * explosion_intensity; + + // 添加一些噪声使爆炸看起来更自然 + float noise = sin(dist * 20.0 - time * 5.0) * 0.1; + explosion += noise; + + // 计算最终颜色,混合原始纹理和爆炸效果 + vec4 original_color = texture(TEXTURE, UV); + vec4 final_color = mix(original_color, explosion_color, explosion); + + // 添加一些发光效果 + float glow = exp(-dist * 5.0) * explosion_intensity; + final_color.rgb += glow * explosion_color.rgb; + final_color.a; + // 输出最终颜色 + COLOR = final_color; +} diff --git a/shaders/Laser.gdshader b/shaders/Laser.gdshader index 4154724..a629778 100644 --- a/shaders/Laser.gdshader +++ b/shaders/Laser.gdshader @@ -3,10 +3,14 @@ uniform vec4 color: source_color; uniform float laser_width: hint_range(0.01, 1.0) = 0; uniform float soft_edge: hint_range(0.0, 0.5) = 0.5; void fragment() { - float dist = abs(UV.x - 0.5); + float textureWidth=float(textureSize(TEXTURE,0).x); + float textureHeight=float(textureSize(TEXTURE,0).y); + float radius=textureHeight/2.0; + float radiusU=radius*TEXTURE_PIXEL_SIZE; + float dist = distance(vec2(0.5,clamp(UV.y,radiusU,1.0-radiusU)),UV); float core = 1.0 - smoothstep(0.0, laser_width, dist); - float edge = 1.0 - smoothstep(laser_width, laser_width + soft_edge, dist); - float alpha = max(core, edge); + float edge=1.0 - smoothstep(laser_width, laser_width + soft_edge, dist); + float alpha = max(core, edge); COLOR = color; COLOR.a = alpha; } \ No newline at end of file