Çarpış ve Yeniden Başla
Coddy'nin Godot Journey'sinin Projeler bölümünün bir parçası. Ders 21 / 36.
Gemi kayaların arasından uçar. Gemiye dokunan bir kaya oyunu bitirmelidir. rock.gd dosyasındaki _on_body_entered içinde gemi, Ship adlı gövdedir. Kaya bir hit_ship sinyali gönderir. main.gd, bu sinyale spawn_rock içinde bağlanır ve oyunu bitirir:
func _on_hit_ship():
$HUD/Message.text = "Game Over"
$Ship.hide()
$Boom.position = $Ship.position
$Boom.emitting = true
get_tree().paused = trueBoom, tek seferlik bir CPUParticles2D'dir. emitting değerini true olarak ayarladığında parçacıklar bir kez patlar. Main'in bir alt öğesidir ve Main her zaman çalıştığından oyun duraklatıldığında da efekt oynatılır.
Son olarak, Breakout'ta olduğu gibi, duraklatılmış durumdayken Enter'ın yeni bir oyun başlatmasını sağlayın: önce duraklatmayı kaldırın, ardından reload_current_scene() çağrısını yapın. Bu, kazandıktan sonra da çalışır.
Görev
OrtaBir kaya gemiye çarptığında oyunu bitir.
rock.gdiçindesignal hit_shipekle ve gövdeShipolduğunda sinyali gönder.main.gdiçinde,spawn_rockfonksiyonunda bu sinyali_on_hit_shipfonksiyonuna bağla; bu fonksiyonGame Overmesajını gösterir, gemiyi gizler,$Boomefektini geminin bulunduğu yerde oluşturur ve oyunu duraklatır.- Oyun duraklatılmışken Enter tuşuna basmak duraklatmayı kaldırır ve sahneyi yeniden yükler.
“Oyna” düğmesine bas ve bir kayaya çarp: gemi patlar. Ardından “Kontrol et” düğmesine bas.
Kendin dene
extends Node2D
const ROCK = preload("res://rock.tscn")
var score = 0
var rocks_left = 4
func _ready():
for i in 4:
spawn_rock(Vector2(randf_range(0, 640), 0), Vector2(randf_range(-90, 90), randf_range(40, 90)), 2)
$HUD/Score.text = "Score: 0"
func spawn_rock(where, velocity, size):
var rock = ROCK.instantiate()
rock.position = where
rock.velocity = velocity
rock.size = size
rock.broken.connect(_on_rock_broken)
add_child(rock)
func _on_rock_broken(rock):
if rock.size == 2:
spawn_rock.call_deferred(rock.position, rock.velocity.rotated(0.8) * 1.5, 1)
spawn_rock.call_deferred(rock.position, rock.velocity.rotated(-0.8) * 1.5, 1)
score += 20
rocks_left += 2
else:
score += 50
rocks_left -= 1
$HUD/Score.text = "Score: %d" % score
if rocks_left == 0:
$HUD/Message.text = "You win!"
get_tree().paused = true
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Projeler bölümündeki tüm dersler
2Proje: Asteroit Nişancısı
Gemiyi DöndürMotoru ÇalıştırKendi başına pratik yap: Godot playground