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 | + | 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 = $ | + | h = $Sprite2D.texture.get_height() |
− | half_w = $ | + | 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 | + | 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 = $ | + | w = $Sprite2D.texture.get_width() |
− | h = $ | + | 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 | + | var collision = move_and_collide(vec * delta) |
− | if | + | if collision: |
− | var | + | var entity = collision.get_collider() |
− | if ' | + | if 'ship' in entity.type: |
kill() | 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() | ||
− | |||
</syntaxhighlight> | </syntaxhighlight> | ||
== Bomb == | == Bomb == | ||
− | <syntaxhighlight lang=gdscript> | + | <syntaxhighlight lang="gdscript"> |
− | extends | + | 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 | + | var collision = move_and_collide(Vector2(0, -speed) * delta) |
− | if | + | if collision: |
− | var | + | var entity = collision.get_collider() |
− | if ' | + | if 'enemy' in entity.type: |
− | + | 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(): | ||
− | $ | + | $AnimatedSprite2D.play() |
$SoundExplosion.play() | $SoundExplosion.play() | ||
− | func | + | 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 | ||
− | + | 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 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. | + | 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. | + | 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. | + | var bomb = Bomb.instantiate() |
bomb.position = pos | bomb.position = pos | ||
add_child(bomb) | add_child(bomb) | ||
− | func | + | func _on_enemy_timer_timeout(): |
if is_game_over: | if is_game_over: | ||
return | return | ||
− | var enemy = Enemy. | + | 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
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()