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

De Aulas
Linha 58: Linha 58:
  
 
<syntaxhighlight lang=python n>
 
<syntaxhighlight lang=python n>
extends KinematicBody2D
+
extends CharacterBody2D
  
 
var speed = 100
 
var speed = 100
Linha 65: Linha 65:
 
func _ready():
 
func _ready():
 
screensize = get_viewport_rect().size
 
screensize = get_viewport_rect().size
 +
 +
func kill():
 +
hide()
 +
$CollisionShape2D.disabled = true
  
 
func _process(delta):
 
func _process(delta):
Linha 70: Linha 74:
 
if Input.is_action_pressed("ui_down"):
 
if Input.is_action_pressed("ui_down"):
 
vel.y += speed
 
vel.y += speed
$AnimatedSprite.animation = "vertical"
+
$AnimatedSprite2D.animation = "vertical"
$AnimatedSprite.flip_v = false
+
$AnimatedSprite2D.flip_v = false
 
elif Input.is_action_pressed("ui_right"):
 
elif Input.is_action_pressed("ui_right"):
 
vel.x += speed
 
vel.x += speed
$AnimatedSprite.animation = "horizontal"
+
$AnimatedSprite2D.animation = "horizontal"
$AnimatedSprite.flip_h = false
+
$AnimatedSprite2D.flip_h = false
 
elif Input.is_action_pressed("ui_up"):
 
elif Input.is_action_pressed("ui_up"):
 
vel.y -= speed
 
vel.y -= speed
$AnimatedSprite.animation = "vertical"
+
$AnimatedSprite2D.animation = "vertical"
$AnimatedSprite.flip_v = true
+
$AnimatedSprite2D.flip_v = true
 
elif Input.is_action_pressed("ui_left"):
 
elif Input.is_action_pressed("ui_left"):
 
vel.x -= speed
 
vel.x -= speed
$AnimatedSprite.animation = "horizontal"
+
$AnimatedSprite2D.animation = "horizontal"
$AnimatedSprite.flip_h = true
+
$AnimatedSprite2D.flip_h = true
 
if vel.length() > 0:
 
if vel.length() > 0:
 
var info = move_and_collide(vel * delta)
 
var info = move_and_collide(vel * delta)
 
if info:
 
if info:
 
if ('Turtle' in info.get_collider().name):
 
if ('Turtle' in info.get_collider().name):
hide()
+
kill()
$CollisionShape2D.disabled
+
$AnimatedSprite2D.play()
$AnimatedSprite.play()
 
 
else:
 
else:
$AnimatedSprite.stop()
+
$AnimatedSprite2D.stop()
 
position.x = clamp(position.x, 25, screensize.x - 25)
 
position.x = clamp(position.x, 25, screensize.x - 25)
 
position.y = clamp(position.y, 25, screensize.y - 25)
 
position.y = clamp(position.y, 25, screensize.y - 25)

Edição das 12h50min 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)
    • 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()