Menu
CoddyTech

Ç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 = true

Boom, 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.

challenge icon

Görev

Orta

Bir kaya gemiye çarptığında oyunu bitir.

  1. rock.gd içinde signal hit_ship ekle ve gövde Ship olduğunda sinyali gönder.
  2. main.gd içinde, spawn_rock fonksiyonunda bu sinyali _on_hit_ship fonksiyonuna bağla; bu fonksiyon Game Over mesajını gösterir, gemiyi gizler, $Boom efektini geminin bulunduğu yerde oluşturur ve oyunu duraklatır.
  3. 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
quiz iconKendini test et

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

Kendi başına pratik yap: Godot playground