0 votes

When my Scene hit it's time to 0 (Game Over) the ConvasLayer pops up (it becomes visible)
on that CanvasLayer is the Score and Highscore.
and when the time hits 0 and the CanvasLayer pops up i want to add a soundeffect

Game Scene Script:

    func _ready() -> void:
        $ControlScore/ScoreCount.text = str(Globals.Score) 
        set_process(true) 
        var actor_id = randi() % 4 + 1
        if actor_id == 1:
            spawn_player1(1)
            for _i in range(4 + Globals.Score):
                spawn_enemy1()
        elif actor_id == 2:
            spawn_player2(1)
            for _i in range(4 + Globals.Score):
                spawn_enemy2()
        elif actor_id == 3:
            spawn_player3(1)
            for _i in range(4 + Globals.Score):
                spawn_enemy3()
        else: 
            spawn_player4(1)
            for _i in range(4 + Globals.Score):
                spawn_enemy4()


    # 1 of the player and enemy scripts, all are basically the same

func spawn_player1(num):

    for _i in range(num):
        var w = Player1.instance()
        w.connect("player1_pressed", self, "_on_player1_pressed") 
        player_container1.add_child(w)


func _on_player1_pressed():
    if Globals.timeLeft > 0:
        Globals.timeLeft += 5
        if Globals.timeLeft > Globals.maxTime:
            Globals.timeLeft = Globals.maxTime
    Globals.Score += 1
    get_tree().call_group("Players", "next_level")
    get_tree().call_group("Enemies", "hide_for_time", 0.5)
    yield(get_tree().create_timer(0.5), "timeout")
    get_tree().change_scene("res://Game.tscn")

func spawn_enemy1():
    var rand = floor(rand_range(0, Enemy1.size()))
    var piece = Enemy1[rand].instance()
    add_child(piece)

ControlTimer Script: (Where the time hits 0 and sends signals )

func _process(delta):
    if Globals.timeLeft > 0:
        Globals.timeLeft -= delta
        $TimerCount.text = str(Globals.timeLeft)
        $TimerCount.text = "%d" % Globals.timeLeft
    else:
        Globals.timeLeft = 0
        get_tree().call_group("Player", "game_over")
        get_tree().call_group("Enemies", "game_over")
        get_tree().call_group("GameOverGroup", "game_over")  <---- Game Over Signal to CanvasLayer

CanvasLayer (inherited Scene of Game Scene)
Script of a child node

extends Control

func game_over():
    visible = true    <---- here the canvas Layer gets Visible and at that  point i want to add the Game Over sfx

    if Globals.Score > Globals.highscore:
        Globals.highscore = Globals.Score
        save_highscore()
    $VBoxContainer/Best.text = "Best  " + str(Globals.highscore)
    $VBoxContainer/Score.text = "Score  " + str(Globals.Score)

But the signal i coming from a _process delta function it either giving a bug sound or i doesn't play at all. I've tried to put the Sound effect on all functions where the Game Over is happening but it doesn't play at all.

I don't know where to put it
oh and btw the Sound effect is on a Autoload

in Engine by (133 points)

1 Answer

+1 vote
Best answer

Hmmm... You have a strange habit of asking a question, getting an answer, ignoring it (or, at least not responding to it), and then asking the same or similar question again.

In this case, you already asked this (or something similar) here:

https://godotengine.org/qa/89104/audio-keeps-repeating-loop-is-off

And I provided an answer, to the best of my ability, based on the limited amount of code you provided (and, you never followed up).

While you've provided more code here, any traction we gained in the other thread is completely lost when you "start over" in a new thread.

Please try to keep this stuff consolidated for the sake of those trying to help as well as those trying to use this forum as a resource for solving their problems in the future...

And, know that the people who assist here are volunteers who can certainly find other things to do with their time. Don't make it harder than necessary for them to help you.

Now, to your question(s)...

I'd say the underlying problem is the same as in the other question (linked above). You're going to process that else side of your _ready() function in every frame once your timer reaches zero. That'll cause your game_over function to be called in every frame, which I assume isn't what you want.

While there are lots of things that could/should be cleaned up in the code you provided, you can get that GameOver stuff to be called only once by making this adjustment...

var game_over = false # <--- flag to track game_over status

func _process(delta):
    if Globals.timeLeft > 0:
        Globals.timeLeft -= delta
        $TimerCount.text = str(Globals.timeLeft)
        $TimerCount.text = "%d" % Globals.timeLeft
    else:
        if !game_over: # <--- if game isn't over...
            game_over = true # <--- now the game is over
            Globals.timeLeft = 0
            get_tree().call_group("Player", "game_over")
            get_tree().call_group("Enemies", "game_over")
            get_tree().call_group("GameOverGroup", "game_over")

Also, you mention that your soundeffect is an autoload. While I don't know exactly what that means to you, if you're saying the sound can be played by calling a function in an autoload script, then you should be able to just call it from your game_over() function.

by (10,894 points)
selected by
Welcome to Godot Engine Q&A, where you can ask questions and receive answers from other members of the community.

Please make sure to read How to use this Q&A? before posting your first questions.
Social login is currently unavailable. If you've previously logged in with a Facebook or GitHub account, use the I forgot my password link in the login box to set a password for your account. If you still can't access your account, send an email to webmaster@godotengine.org with your username.