Flopsy/objects/characters/monsters/03/monster_03.gd

73 lines
2.3 KiB
GDScript3
Raw Normal View History

2022-07-19 22:22:16 +02:00
extends ReferenceRect
export var speed : float = 5.0
const BULLET_PATH = "res://objects/characters/monsters/03/bullet.tscn"
var velocity = Vector2(speed, 0)
export var cooldown_time: float = 3.0
export var bullet_speed: float = 3.0
export var damage: int = 10
onready var level = get_parent()
var cooldown = false
onready var bullet_scene = preload(BULLET_PATH)
var bullet_vector = Vector2.ZERO
# Called when the node enters the scene tree for the first time.
func _ready():
randomize()
$monster.position.x = fmod(randi(), rect_size.x)
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
pass
func _physics_process(delta):
# Move only if shoot animation is not played
if not $monster/Animation.is_playing():
_movement()
# Check angle and distance
var angle = $monster.global_position.angle_to_point(GlobalState.player.global_position)
2022-07-20 04:28:30 +02:00
var rounded_angle = fmod(round(rad2deg(angle)), 90)
2022-07-19 22:22:16 +02:00
var distance = $monster.global_position.distance_to(GlobalState.player.global_position)
var direction = ($monster.global_position - GlobalState.player.global_position).normalized()
var player_is_left = direction.x > 0
# Shoot if in right distance/angle
2022-07-20 04:28:30 +02:00
if rounded_angle == -45 and cooldown == false \
2022-07-19 22:22:16 +02:00
and player_is_left != $monster/AnimatedSprite.flip_h \
and GlobalState.player.global_position.y <= rect_global_position.y + rect_size.y:
cooldown = true
# calculate bullet velocity
bullet_vector = ($monster.global_position - GlobalState.player.global_position).normalized()
2022-07-20 00:43:24 +02:00
$monster/CastSound.play()
2022-07-19 22:22:16 +02:00
$monster/Animation.play("shoot")
yield(get_tree().create_timer(cooldown_time), "timeout")
cooldown = false
func _movement():
# Move monster
$monster.position += velocity
if $monster.position.x >= rect_size.x or $monster.position.x <= 0:
velocity.x = -velocity.x
$monster/AnimatedSprite.flip_h = velocity.x > 0
func _on_Animatio_finished(anim_name):
if anim_name == "shoot" and $monster/Animation.current_animation_position != 0:
# generate bullet
var bullet = bullet_scene.instance()
bullet.global_position = $monster.global_position
if $monster/AnimatedSprite.flip_h:
bullet.global_position.x += 70
bullet.velocity = bullet_vector * bullet_speed
bullet.damage = damage
level.add_child(bullet)
2022-07-20 00:43:24 +02:00
$monster/ShootSound.play()
2022-07-19 22:22:16 +02:00
$monster/Animation.play_backwards("shoot")