69 lines
2.1 KiB
GDScript
69 lines
2.1 KiB
GDScript
extends RigidBody2D
|
|
|
|
var MissileSprite: Texture2D = load("res://resources/img/missile-placeholder.png")
|
|
var BulletSprite: Texture2D = load("res://resources/img/bullet-placeholder.png")
|
|
|
|
var bodies_in_area: Array = []
|
|
var sprite_type: int
|
|
var speed: float = GLOBAL.DEF_SPEED
|
|
var armed: bool = false
|
|
|
|
func _ready():
|
|
self.gravity_scale = 0.0
|
|
self.physics_material_override.friction = 0.0
|
|
self.contact_monitor = true
|
|
self.max_contacts_reported = 1
|
|
|
|
func setup(sprite_type: int, speed: float) -> void:
|
|
self.sprite_type = sprite_type
|
|
self.speed = speed
|
|
|
|
if sprite_type == GLOBAL.SpriteType.BULLET:
|
|
$Mask/Sprite2D.set_texture(self.BulletSprite)
|
|
self.armed = true
|
|
$ExplosionArea/ExplosionShape.disabled = false
|
|
else:
|
|
$Mask/Sprite2D.set_texture(self.MissileSprite)
|
|
|
|
func shoot(at: Vector2) -> void:
|
|
var direction = (at - self.global_position)
|
|
self.linear_velocity = at * speed
|
|
|
|
func shoot_missile(at: Vector2) -> void:
|
|
var direction = (at - self.global_position)
|
|
self.apply_central_force(at * GLOBAL.MISSILE_SPEED["max"])
|
|
|
|
func set_random_color() -> void:
|
|
$Mask.set_random_color()
|
|
|
|
func update_collision_layer() -> void:
|
|
if $Mask.highlighted:
|
|
self.set_collision_layer_value(GLOBAL.HIGH_COLLISION, 1)
|
|
self.set_collision_mask_value(GLOBAL.HIGH_COLLISION, 1)
|
|
$ExplosionArea.set_collision_layer_value(GLOBAL.HIGH_COLLISION, 1)
|
|
$ExplosionArea.set_collision_mask_value(GLOBAL.HIGH_COLLISION, 1)
|
|
else:
|
|
self.set_collision_layer_value(GLOBAL.LOW_COLLISION, 1)
|
|
self.set_collision_mask_value(GLOBAL.LOW_COLLISION, 1)
|
|
$ExplosionArea.set_collision_layer_value(GLOBAL.LOW_COLLISION, 1)
|
|
$ExplosionArea.set_collision_mask_value(GLOBAL.LOW_COLLISION, 1)
|
|
|
|
# --- Signals ---
|
|
|
|
func _on_VisibilityNotifier2D_screen_exited():
|
|
self.queue_free()
|
|
|
|
func _on_Projectile_body_entered(body: PhysicsBody2D):
|
|
if armed:
|
|
for missile in bodies_in_area:
|
|
missile.queue_free()
|
|
self.queue_free()
|
|
|
|
func _on_ExplosionArea_body_entered(body: PhysicsBody2D):
|
|
if armed and body.get_node("Mask").highlighted == $Mask.highlighted:
|
|
bodies_in_area.push_front(body)
|
|
|
|
func _on_ExplosionArea_body_exited(body: PhysicsBody2D):
|
|
if armed:
|
|
bodies_in_area.erase(body)
|