Mudanças entre as edições de "Godot Engine: Exercicio 1 - Resolução"

De Aulas
Linha 1: Linha 1:
 +
  
  
Linha 28: Linha 29:
 
** CollisionShape2D
 
** CollisionShape2D
  
* Player (KinematicBody2D):
+
* Player (CharacterBody2D):
 
** AnimatedSprite (horizontal|vertical)
 
** AnimatedSprite (horizontal|vertical)
 
** CollisionShape2D (circle shape)
 
** CollisionShape2D (circle shape)
  
* Turtle (KinematicBody2D):
+
* Turtle (CharacterBody2D):
 
** AnimatedSprite (horizontal|vertical)
 
** AnimatedSprite (horizontal|vertical)
 
** CollisionShape2D (circle shape)
 
** CollisionShape2D (circle shape)

Edição das 11h53min de 6 de maio de 2024


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)
    • score (Label)
    • labelTimer (Label)
    • timer (Label)
    • counter (Timer)

Scripts

Player

extends KinematicBody2D

var speed = 100
var screensize

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

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

Turtle

extends KinematicBody2D

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
		$AnimatedSprite.animation = "vertical"
		$AnimatedSprite.flip_v = false
	elif direction == RIGHT:
		vel.x += speed
		$AnimatedSprite.animation = "horizontal"
		$AnimatedSprite.flip_h = false
	elif direction == UP:
		vel.y -= speed
		$AnimatedSprite.animation = "vertical"
		$AnimatedSprite.flip_v = true
	elif direction == LEFT:
		vel.x -= speed
		$AnimatedSprite.animation = "horizontal"
		$AnimatedSprite.flip_h = true
	if vel.length() > 0:
		move_and_collide(vel * delta)
		$AnimatedSprite.play()
	else:
		$AnimatedSprite.stop()
	position.x = clamp(position.x, 25, screensize.x - 25)
	position.y = clamp(position.y, 25, screensize.y - 25)

HUD

 1extends Node2D
 2
 3var score = 0
 4var end = false
 5
 6func incScore():
 7	score += 1
 8
 9func _process(delta):
10	$timer.text = String(int($counter.time_left))
11	$score.text = String(score)
12	if $timer.text == '0' and not end:
13		get_parent().get_node('Player').kill()
14		end = true
15		$counter.stop()