Godot Engine: Exercicio 1 - Resolução

De Aulas



Afluentes : Jogos Digitais, Usabilidade, desenvolvimento web, mobile e jogos

Videoaula

Youtube

Descrição

Baseado na última aula, crie um jogo com as seguintes características:

  • 1 elemento caixa. Você usará as caixas para criar um labirinto e as bordas do jogo;
  • 1 elemento player pra você controlar. Ele não usa gravidade, e pode ir para cima, baixo, esquerda e direita, conforme setas do teclado;
  • 1 elemento monstro que se controla sozinho. Anda para lados aleatórios a uma velocidade aleatória a cada certo período de tempo ou timeout de 1 segundo;
  • Faça teste de colisão entre o player e o monstro. Caso o monstro toque no player, ele não se movimenta mais, está morto.

Algumas coisas foram vistas em aula, outras você terá que pesquisar para conseguir fazer o exercício.

Assets

Exemplo de Assets

Estrutura

  • Box (StaticBody2D):
    • Sprite
    • CollisionShape2D
  • Player (CharacterBody2D):
    • AnimatedSprite (horizontal|vertical)
    • CollisionShape2D (circle shape)
  • Turtle (CharacterBody2D):
    • AnimatedSprite (horizontal|vertical)
    • CollisionShape2D (circle shape)
  • World (Node2D)
    • TextureRect (Fundo)
    • Linkar
      • Player
      • Turtle (algumas)
      • Box (algumas)
      • HUD
  • HUD (Node2D)
    • LabelScore (Label)
    • InfoScore (Label)
    • LabelTimer (Label)
    • InfoTimer (Label)
    • Timer (Timer)

Scripts

Player

extends CharacterBody2D

var speed = 100
var screensize

func _ready():
	screensize = get_viewport_rect().size

func kill():
	hide()
	$CollisionShape2D.disabled = true

func _process(delta):
	var vel = Vector2()
	if Input.is_action_pressed("ui_down"):
		vel.y += speed
		$AnimatedSprite2D.animation = "vertical"
		$AnimatedSprite2D.flip_v = false
	elif Input.is_action_pressed("ui_right"):
		vel.x += speed
		$AnimatedSprite2D.animation = "horizontal"
		$AnimatedSprite2D.flip_h = false
	elif Input.is_action_pressed("ui_up"):
		vel.y -= speed
		$AnimatedSprite2D.animation = "vertical"
		$AnimatedSprite2D.flip_v = true
	elif Input.is_action_pressed("ui_left"):
		vel.x -= speed
		$AnimatedSprite2D.animation = "horizontal"
		$AnimatedSprite2D.flip_h = true
	if vel.length() > 0:
		var info = move_and_collide(vel * delta)
		if info:
			if ('Turtle' in info.get_collider().name):
				kill()
		$AnimatedSprite2D.play()
	else:
		$AnimatedSprite2D.stop()
	position.x = clamp(position.x, 25, screensize.x - 25)
	position.y = clamp(position.y, 25, screensize.y - 25)

Turtle

extends CharacterBody2D

const DOWN = 0
const RIGHT = 1
const UP = 2
const LEFT = 3

var direction = DOWN
var speed = 100
var steps
var count_steps
var screensize

func _ready():
	randomize()
	screensize = get_viewport_rect().size
	new_goal()

func new_goal():
	direction = randi() % 4;
	steps = 50 + (randi() % 50)
	count_steps = 0

func _process(delta):
	count_steps += 1
	if count_steps > steps:
		new_goal()
	var vel = Vector2()
	if direction == DOWN:
		vel.y += speed
		$AnimatedSprite2D.animation = "vertical"
		$AnimatedSprite2D.flip_v = false
	elif direction == RIGHT:
		vel.x += speed
		$AnimatedSprite2D.animation = "horizontal"
		$AnimatedSprite2D.flip_h = false
	elif direction == UP:
		vel.y -= speed
		$AnimatedSprite2D.animation = "vertical"
		$AnimatedSprite2D.flip_v = true
	elif direction == LEFT:
		vel.x -= speed
		$AnimatedSprite2D.animation = "horizontal"
		$AnimatedSprite2D.flip_h = true
	if vel.length() > 0:
		move_and_collide(vel * delta)
		$AnimatedSprite2D.play()
	else:
		$AnimatedSprite2D.stop()
	position.x = clamp(position.x, 25, screensize.x - 25)
	position.y = clamp(position.y, 25, screensize.y - 25)

HUD

extends Node2D

var score = 0
var end = false

func incScore():
	score += 1

func _process(_delta):
	$InfoTimer.text = str(int($Timer.time_left))
	$InfoScore.text = str(score)
	if $InfoTimer.text == '0' and not end:
		get_parent().get_node('Player').kill()
		end = true
		$Timer.stop()