Godot Version
`Godot.V4,3
Question
`
I have a problem. The enemy shoots at me only once when starting the game. It also the bullet enemy plays alone when I hit run play game, second problem the enemy bullet don’t hit my player just passing without doing anything to my player health!
How to make my player die after many hits?
Script for player
extends CharacterBody2D
var health = 2
@export var speed = 100
@export var bullet_scene : PackedScene
@onready var sprite_2d: AnimatedSprite2D = $Sprite2d
@onready var bowShoot =$bowShoot
@export var bullet2 : PackedScene
@onready var typhon: AudioStreamPlayer2D = $typhon
func get_input():
var dir = Input.get_axis("back", "forward")
velocity = transform.x * dir * speed
if Input.is_action_just_pressed("shoot"):
shoot()
bowShoot.play()
sprite_2d.animation = "shoot"
if Input.is_action_just_released("shoot"):
sprite_2d.animation = "idle"
if Input.is_action_just_pressed("shoot2"):
shoot2()
typhon.play()
sprite_2d.animation = "shoot2"
func _physics_process(delta):
velocity.y += GRAVITY * delta
if Input.is_action_just_pressed("jump"): if not is_on_floor():
velocity.y = JUMP_FORCE
sprite_2d.animation = "jump"
if Input.is_action_just_released("jump"):
sprite_2d.animation = "idle"
move_and_slide()
get_input()
# Animations
if Input.is_action_just_pressed("crouch"):
sprite_2d.animation = "crouch"
if Input.is_action_just_released("crouch"):
sprite_2d.animation = "idle"
if Input.is_action_just_pressed("back"):
sprite_2d.animation = "back"
if Input.is_action_just_released("back"):
sprite_2d.animation = "idle"
if Input.is_action_just_pressed("forward"):
sprite_2d.animation = "forward"
if Input.is_action_just_released("forward"):
sprite_2d.animation = "idle"
if Input.is_action_just_released("up"):
velocity.y += 2
#Gravity
if Input.is_action_pressed("ui_down",true):
sprite_2d.play("face_down")
if Input.is_action_pressed("ui_left",true):
sprite_2d.play("left")
if Input.is_action_pressed("ui_right",true):
sprite_2d.play("right")
func shoot():
var b = preload ("res://bullet.tscn").instantiate()
get_tree().root.add_child(b)
b.transform = $Muzzle.global_transform
func shoot2():
var c = preload ("res://bullet2.tscn").instantiate()
get_tree().root.add_child(c)
c.transform = $Muzzle.global_transform
var isLeft = velocity.x < 0
sprite_2d.flip_h = isLeft
func player_hit():
health -= 1
if health ==0:
queue_free()
Script for Enemy
extends CharacterBody2D
var b = preload ("res://bullet.tscn")
var c = preload ("res://bullet2.tscn")
var Bullet = preload("res://mob_bullet.tscn")
@export var bullet2 : PackedScene
var speed = 50
@export var health = 10
var player = null
var canshoot = true
@onready var bowShoot =$bowShoot
@onready var Spawnpos =$Spawnpos
func _ready():
velocity = transform.x * speed
func _physics_process(delta):
var collision = move_and_collide(velocity * delta)
if collision:
velocity = velocity.bounce(collision.get_normal())
func _on_Shootspeed_timeout():
canshoot = true
$Shootspeed.start()
canshoot = false
func enemy_hit():
health -= 1
if health == 0:
queue_free()
func get_input():
var dir = Input.get_axis("back", "forward")
velocity = transform.x * dir * speed
move_and_slide()
func _on_detection_body_entered(body: Node2D) -> void:
if body.is_in_group("mob"):
player = body
var movement =Vector2(-2 , 0)
if player:
movement = position.direction_to(player.position) * speed
movement = move_and_collide(movement)
func shoot():
if canshoot:
var Bullet = Bullet.instantiate()
Bullet.position = Spawnpos.global_position
get_parent().add_child(Bullet)
$ShootSpeed.start()
canshoot = false
Script for enemy bullet
extends Area2D
var speed = 400
func _physics_process(delta):
position.x -= delta * speed
func _on_body_entered(body: Node2D) -> void:
if body.has_method("playr_hit"):
body.player_hit()
queue_free()