Mudanças entre as edições de "Godot Engine: SkyFire"

De Aulas
Linha 1: Linha 1:
 +
  
  
Linha 46: Linha 47:
 
== Background ==
 
== Background ==
  
<syntaxhighlight lang=gdscript>
+
<syntaxhighlight lang="gdscript">
 
extends Node2D
 
extends Node2D
  
Linha 57: Linha 58:
 
screensize = get_viewport_rect().size
 
screensize = get_viewport_rect().size
 
h = $A.texture.get_height()
 
h = $A.texture.get_height()
half_h = h / 2  
+
half_h = h / 2
  
 
func _process(delta):
 
func _process(delta):
Linha 70: Linha 71:
 
== Ship ==
 
== Ship ==
  
<syntaxhighlight lang=gdscript>
+
<syntaxhighlight lang="gdscript">
extends KinematicBody2D
+
extends CharacterBody2D
  
 +
const type = 'ship'
 
var speed = 500
 
var speed = 500
 
var screensize
 
var screensize
Linha 81: Linha 83:
 
func _ready():
 
func _ready():
 
screensize = get_viewport_rect().size
 
screensize = get_viewport_rect().size
h = $Sprite.texture.get_height()
+
h = $Sprite2D.texture.get_height()
half_w = $Sprite.texture.get_width() / 2
+
half_w = $Sprite2D.texture.get_width() / 2
 
half_h = h / 2
 
half_h = h / 2
  
Linha 106: Linha 108:
 
== Enemy ==
 
== Enemy ==
  
<syntaxhighlight lang=gdscript>
+
<syntaxhighlight lang="gdscript">
extends KinematicBody2D
+
extends CharacterBody2D
  
 +
const type = 'enemy'
 
const LEFT = 0
 
const LEFT = 0
 
const RIGHT = 1
 
const RIGHT = 1
Linha 124: Linha 127:
 
randomize()
 
randomize()
 
screensize = get_viewport_rect().size
 
screensize = get_viewport_rect().size
w = $Sprite.texture.get_width()
+
w = $Sprite2D.texture.get_width()
h = $Sprite.texture.get_height()
+
h = $Sprite2D .texture.get_height()
 
half_w = w / 2
 
half_w = w / 2
 
half_h = h / 2
 
half_h = h / 2
Linha 143: Linha 146:
 
if position.x - half_w < 0:
 
if position.x - half_w < 0:
 
direction = RIGHT
 
direction = RIGHT
var info = move_and_collide(vec * delta)
+
var collision = move_and_collide(vec * delta)
if info:
+
if collision:
var obj = info.get_collider()
+
var entity = collision.get_collider()
if 'Ship' in obj.name:
+
if 'ship' in entity.type:
 
kill()
 
kill()
obj.kill()
+
entity.kill()
 
if position.y - half_h > screensize.y:
 
if position.y - half_h > screensize.y:
 
get_parent().change_score(-1)
 
get_parent().change_score(-1)
Linha 156: Linha 159:
  
 
func kill():
 
func kill():
 +
get_parent().new_explosion(position)
 
queue_free()
 
queue_free()
get_parent().new_explosion(position)
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 
== Bomb ==
 
== Bomb ==
  
<syntaxhighlight lang=gdscript>
+
<syntaxhighlight lang="gdscript">
extends KinematicBody2D
+
extends CharacterBody2D
  
 +
const type = 'bomb'
 
var speed = 200
 
var speed = 200
  
func _ready():
+
func _ready():  
 
$SoundBomb.play()
 
$SoundBomb.play()
  
 
func _process(delta):
 
func _process(delta):
var info = move_and_collide(Vector2(0, -speed) * delta)
+
var collision = move_and_collide(Vector2(0, -speed) * delta)
if info:
+
if collision:
var obj = info.get_collider()
+
var entity = collision.get_collider()
if 'Enemy' in obj.name:
+
if 'enemy' in entity.type:
obj.kill()
+
entity.kill()  
 
queue_free()
 
queue_free()
 
get_parent().change_score(1)
 
get_parent().change_score(1)
Linha 184: Linha 188:
 
== Explosion ==
 
== Explosion ==
  
<syntaxhighlight lang=gdscript>
+
<syntaxhighlight lang="gdscript">
 
extends StaticBody2D
 
extends StaticBody2D
 +
 +
const type = 'explosion'
  
 
func _ready():
 
func _ready():
$AnimatedSprite.play()
+
$AnimatedSprite2D.play()
 
$SoundExplosion.play()
 
$SoundExplosion.play()
  
func _on_AnimatedSprite_animation_finished():
+
func _on_animated_sprite_2d_animation_finished():
 
queue_free()
 
queue_free()
 
</syntaxhighlight>
 
</syntaxhighlight>
Linha 197: Linha 203:
 
== World ==
 
== World ==
  
<syntaxhighlight lang=gdscript>
+
<syntaxhighlight lang="gdscript">
 
extends Node2D
 
extends Node2D
  
var Ship = preload("res://Ship.tscn")
+
const Ship = preload("res://ship.tscn")
var Bomb = preload("res://Bomb.tscn")
+
const Bomb = preload("res://bomb.tscn")
var Enemy = preload("res://Enemy.tscn")
+
const Enemy = preload("res://enemy.tscn")
var Explosion = preload("res://Explosion.tscn")
+
const Explosion = preload("res://explosion.tscn")
 
var score = 0
 
var score = 0
 
var is_game_over = false
 
var is_game_over = false
Linha 220: Linha 226:
 
score = 0
 
score = 0
 
$Score.text = str(score)
 
$Score.text = str(score)
var ship = Ship.instance()
+
var ship = Ship.instantiate()
 
ship.position = Vector2(screensize.y - 10, screensize.x / 2)
 
ship.position = Vector2(screensize.y - 10, screensize.x / 2)
 
add_child(ship)
 
add_child(ship)
Linha 238: Linha 244:
  
 
func new_explosion(pos):
 
func new_explosion(pos):
var explosion = Explosion.instance()
+
var explosion = Explosion.instantiate()
 
explosion.position = pos
 
explosion.position = pos
 
add_child(explosion)
 
add_child(explosion)
  
 
func new_bomb(pos):
 
func new_bomb(pos):
var bomb = Bomb.instance()
+
var bomb = Bomb.instantiate()
 
bomb.position = pos
 
bomb.position = pos
 
add_child(bomb)
 
add_child(bomb)
  
func _on_EnemyTimer_timeout():
+
func _on_enemy_timer_timeout():
 
if is_game_over:
 
if is_game_over:
 
return
 
return
var enemy = Enemy.instance()
+
var enemy = Enemy.instantiate()
 
add_child(enemy)
 
add_child(enemy)
 
$EnemyTimer.wait_time = (randi() % 2) + 1
 
$EnemyTimer.wait_time = (randi() % 2) + 1
 
$EnemyTimer.start()
 
$EnemyTimer.start()
 
</syntaxhighlight>
 
</syntaxhighlight>

Edição das 15h32min de 6 de maio de 2024



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

Screenshot

Godot skyfire.jpg

Assets

Estrutura

  • BackGround (Node2D)
    • A (Sprite2D)
    • B (Sprite2D)
  • Ship (CharacterBody2D)
    • Sprite2D
    • CollisionShape2D
  • Enemy (CharacterBody2D)
    • Sprite2D
    • CollisionShape2D
  • Bomb (CharacterBody2D)
    • Sprite2D
    • CollisionShape2D
    • SoundBomb (AudioStreamPlayer2D)
  • Explosion (StaticBody2D)
    • AnimatedSprite2D
    • CollisionShape2D
    • SoundExplosion (AudioStreamPlayer2D)
    • Nó (sinal) - _on_animated_sprite_2d_animation_finished()
  • World (Node2D)
    • Background (instancia)
    • Ship (instancia)
    • EnemiTimer (Timer)
    • Music (AudioStreamPlayer2D)
    • GameOver (TextureRect)
    • Label (Label)
    • Score (Label)
    • Nó (sinal) - _on_enemy_timer_timeout()

Scripts

Background

extends Node2D

var speed = 100
var screensize
var h
var half_h

func _ready():
	screensize = get_viewport_rect().size
	h = $A.texture.get_height()
	half_h = h / 2

func _process(delta):
	$A.position.y += speed * delta
	$B.position.y += speed * delta
	if $A.position.y - half_h > screensize.y:
		$A.position.y -= h * 2
	if $B.position.y - half_h > screensize.y:
		$B.position.y -= h * 2

Ship

extends CharacterBody2D

const type = 'ship'
var speed = 500
var screensize
var h
var half_w
var half_h

func _ready():
	screensize = get_viewport_rect().size
	h = $Sprite2D.texture.get_height()
	half_w = $Sprite2D.texture.get_width() / 2
	half_h = h / 2

func _process(delta):
	var vec = Vector2()
	if Input.is_action_pressed("ui_left"):
		vec.x -= speed
	elif Input.is_action_pressed("ui_right"):
		vec.x += speed
	if Input.is_action_just_pressed("ui_select"):
		get_parent().new_bomb(Vector2(position.x, position.y - half_h - 20))
	var _info = move_and_collide(vec * delta)
	position.x = clamp(position.x, half_w, screensize.x - half_w)
	if get_parent().score < 0:
		kill()

func kill():
	queue_free()
	get_parent().new_explosion(position)
	get_parent().game_over()

Enemy

extends CharacterBody2D

const type = 'enemy'
const LEFT = 0
const RIGHT = 1

var screensize
var direction
var w
var h
var half_w
var half_h
var speed_y = 200
var speed_x = 300

func _ready():
	randomize()
	screensize = get_viewport_rect().size
	w = $Sprite2D.texture.get_width()
	h = $Sprite2D .texture.get_height()
	half_w = w / 2
	half_h = h / 2
	position.x = (randi() % int(screensize.x - w)) + half_w
	position.y = -100
	direction = randi() % 2
	
func _process(delta):
	var vec = Vector2()
	vec.y += speed_y
	if direction == RIGHT:
		vec.x += speed_x
		if position.x + half_w > screensize.x:
			direction = LEFT
	elif direction == LEFT:
		vec.x -= speed_x
		if position.x - half_w < 0:
			direction = RIGHT
	var collision = move_and_collide(vec * delta)
	if collision:
		var entity = collision.get_collider()
		if 'ship' in entity.type:
			kill()
			entity.kill()
	if position.y - half_h > screensize.y:
		get_parent().change_score(-1)
		queue_free()
	if get_parent().is_game_over:
		queue_free()

func kill():
	get_parent().new_explosion(position)
	queue_free()

Bomb

extends CharacterBody2D

const type = 'bomb'
var speed = 200

func _ready(): 
	$SoundBomb.play()

func _process(delta):
	var collision = move_and_collide(Vector2(0, -speed) * delta)
	if collision:
		var entity = collision.get_collider()
		if 'enemy' in entity.type:
			entity.kill() 
			queue_free()
			get_parent().change_score(1)
	if position.y < 0:
		queue_free()

Explosion

extends StaticBody2D

const type = 'explosion'

func _ready():
	$AnimatedSprite2D.play()
	$SoundExplosion.play()

func _on_animated_sprite_2d_animation_finished():
	queue_free()

World

extends Node2D

const Ship = preload("res://ship.tscn")
const Bomb = preload("res://bomb.tscn")
const Enemy = preload("res://enemy.tscn")
const Explosion = preload("res://explosion.tscn")
var score = 0
var is_game_over = false
var screensize

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

func _process(_delta):
	if is_game_over:
		if Input.is_action_just_pressed("ui_accept"):
			_reset()

func _reset():
	is_game_over = false
	score = 0
	$Score.text = str(score)
	var ship = Ship.instantiate()
	ship.position = Vector2(screensize.y - 10, screensize.x / 2)
	add_child(ship)
	$GameOver.visible = false
	$Music.play()
	$EnemyTimer.start()

func change_score(pts):
	score += pts
	$Score.text = str(score)

func game_over():
	is_game_over = true
	$GameOver.visible = true
	$Music.stop()
	$EnemyTimer.stop()

func new_explosion(pos):
	var explosion = Explosion.instantiate()
	explosion.position = pos
	add_child(explosion)

func new_bomb(pos):
	var bomb = Bomb.instantiate()
	bomb.position = pos
	add_child(bomb)

func _on_enemy_timer_timeout():
	if is_game_over:
		return
	var enemy = Enemy.instantiate()
	add_child(enemy)
	$EnemyTimer.wait_time = (randi() % 2) + 1
	$EnemyTimer.start()