class_name EnemySmall extends EnemyBase ## 小型敌机:直线下压 + 可选横向摆动,部分会朝正下方开火。 const TEX := preload("res://assets/svg/enemy_small.svg") var base_x := 270.0 var vy := 150.0 var sway_amp := 0.0 var sway_freq := 2.0 var phase := 0.0 var shoot := false var bullet_speed := 250.0 var _t := 0.0 var _shoot_timer := 0.0 func setup( p_base_x: float, p_y: float, p_vy: float, p_sway_amp := 0.0, p_sway_freq := 2.0, p_phase := 0.0, p_shoot := false, p_bullet_speed := 250.0 ) -> void: base_x = p_base_x position = Vector2(p_base_x, p_y) vy = p_vy sway_amp = p_sway_amp sway_freq = p_sway_freq phase = p_phase shoot = p_shoot bullet_speed = p_bullet_speed func _ready() -> void: collision_layer = 4 collision_mask = 0 hp = 1 score_value = 100 hit_radius = 14.0 var sprite := Sprite2D.new() sprite.texture = TEX # 掉落道具的敌机染成红色涂装(1942 惯例:红机掉宝) if drops_powerup: sprite.modulate = Color(1.0, 0.5, 0.4) add_child(sprite) var shape := CollisionShape2D.new() var capsule := CapsuleShape2D.new() capsule.radius = 12.0 capsule.height = 34.0 shape.shape = capsule add_child(shape) _shoot_timer = randf_range(1.2, 2.4) func _process(delta: float) -> void: _t += delta position.y += vy * delta position.x = base_x + sin(_t * sway_freq + phase) * sway_amp if position.y > 1010.0 or position.x < -50.0 or position.x > 590.0: queue_free() return if shoot and position.y > 90.0 and position.y < 640.0: _shoot_timer -= delta if _shoot_timer <= 0.0: _shoot_timer = randf_range(1.8, 3.0) _fire_bullet(Vector2(0.0, bullet_speed))