pongodot day 7: GAME OVER

Today’s post is going to be pretty short. The goal today was to add a start screen and a victory/defeat condition.

For the start screen, into our main Scene tree I added in a new label, with very similar settings to the first. From code I can easily turn this label on and off. As a child node to the main label I added another label with smaller text that says “Press R to Start” to tell the player how to start the game. Now when the game boots up this is what you see.

PRESS R TO START

From here I added a bit of code to the game controller and to the PlayerPaddle that essentially makes it so nothing happens when the game is not in an “active state”

This is the new process loop.
the _reset() call earlier handles starting up a new game and setting the paddle to active, basically

Player Paddle.gd has a similar change with a new variable, is_active that we check in _process before obeying any input.

In that first block you’ll likely notice a check to a new action as well. In our input map I also added an action to start the game by pressing ‘r’. In the future I might just instead have it also happen on spacebar, but for now this works.

back in GameController.gd

Here I’ve added in a max_score, set to 3 for now for testing purposes, as well as a center_text variable. This is where I can easily set the text for that main label, like you see in the above screengrab.

Finally, at the bottom of GameController.gd there is some logic that handles checking for victory/loss.

as well as changes to our goal triggers

And with that it’s now possible to win (or lose).

3 is low for a score goal, but this is just for testing.

Sorry for the condensed nature of today’s post, but I didn’t have a lot of time for today’s changes. Hopefully future posts won’t be as rushed.

Here is now the current version, in full, of the GameController script.

extends Node2D

var ballscene = load("res://Ball.tscn")
onready var comPaddle = get_node("Com Paddle")
onready var playerPadd = get_node("Player Paddle")
var current_ball

var is_active

var center_text

export (int) var max_score = 3
var playerScore = 0
var comScore = 0

func _init():
	is_active = false
	center_text = "PONGODOT"

func _process(_delta):
	if (!is_active):
		$CenterLabel.visible = true
		$CenterLabel.text = center_text
		if Input.is_action_just_pressed("start"):
			_reset()
	if (is_active):
		$CenterLabel.visible = false
		$PlayerScoreLabel.text = str(playerScore)
		$ComScoreLabel.text = str(comScore)
		if Input.is_action_just_pressed("launch"):
			if current_ball != null:
				return
			current_ball = ballscene.instance()
			current_ball.position.x = playerPadd.position.x + 20
			current_ball.position.y = playerPadd.position.y
			add_child(current_ball)
			comPaddle.ball = current_ball

func _end_game():
	is_active = false
	playerPadd.is_active = false

func _reset():
	playerScore = 0
	comScore = 0
	is_active = true
	playerPadd.is_active = true

func _delete_ball():
	if current_ball != null:
		current_ball.queue_free()
		current_ball = null
		comPaddle.ball = null

func _on_PlayerGoal_body_entered(body):
	_delete_ball()
	comScore += 1
	_check_victory()

func _on_ComGoal_body_entered(body):
	_delete_ball()
	playerScore += 1
	_check_victory()

func _check_victory():
	if playerScore >= max_score:
		center_text = "You Win!"
		_end_game()
	elif comScore >= max_score:
		center_text = "Game Over"
		_end_game()

See you tomorrow

-Ike

Leave a Reply

Your email address will not be published. Required fields are marked *