Godot Engine: Exercicio 1 - Resolução
De Aulas
Afluentes : Jogos Digitais, Usabilidade, desenvolvimento web, mobile e jogos
Videoaula
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
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 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
extends Node2D
var score = 0
var end = false
func incScore():
score += 1
func _process(delta):
$timer.text = String(int($counter.time_left))
$score.text = String(score)
if $timer.text == '0' and not end:
get_parent().get_node('Player').kill()
end = true
$counter.stop()