ADS

Adegan Permainan Utama

 

Adegan permainan utama

Sekarang saatnya untuk menyatukan semua yang kita lakukan menjadi sebuah adegan permainan yang dapat dimainkan.

Buat adegan baru dan tambahkan Node bernama Main. (Alasan kami menggunakan Node, bukan Node2D, adalah karena node ini akan menjadi wadah untuk menangani logika permainan. Node ini sendiri tidak memerlukan fungsionalitas 2D.)

Klik tombol Instance (diwakili oleh ikon rantai) dan pilih file yang telah Anda simpan player.tscn.

../../_images/instance_scene.webp

Sekarang, tambahkan node berikut sebagai anak dari Main, dan beri nama seperti yang ditunjukkan:

  • Timer (bernamaMobTimer) - untuk mengontrol seberapa sering monster muncul

  • Timer (bernamaScoreTimer) - untuk menambah skor setiap detik

  • Timer (bernamaStartTimer) - untuk memberikan penundaan sebelum memulai

  • Marker2D (bernamaStartPosition) - untuk menunjukkan posisi awal pemain

Tetapkan properti setiap node sebagai berikut (nilai dalam hitungan detik):Wait TimeTimer

  • MobTimer:0.5

  • ScoreTimer:1

  • StartTimer:2

Selain itu, atur properti menjadi "Aktif" dan atur node ke.One ShotStartTimerPositionStartPosition(240, 450)

Memunculkan gerombolan

Node Utama akan memunculkan monster baru, dan kami ingin mereka muncul di lokasi acak di tepi layar. Tambahkan node Path2DMobPath yang diberi nama sebagai anak dari Main. Saat Anda memilih Path2D, Anda akan melihat beberapa tombol baru di bagian atas editor:

../../_images/path2d_buttons.webp

Pilih yang tengah ("Add Point") dan gambar jalur dengan mengeklik untuk menambahkan titik-titik di sudut yang ditampilkan. Agar titik-titik tersebut menempel pada grid, pastikan "Use Grid Snap" dan "Use Smart Snap" dipilih. Opsi-opsi ini dapat ditemukan di sebelah kiri tombol "Lock", yang muncul sebagai magnet di samping beberapa titik dan garis yang berpotongan.

../../_images/grid_snap_button.webp

Penting

Gambarkan jalur searah jarum jam , atau gerombolan Anda akan muncul dengan arah keluar, bukan ke dalam !

../../_images/gambar_jalur2d.gif

Setelah menempatkan titik 4dalam gambar, klik tombol "Tutup Kurva" dan kurva Anda akan selesai.

Setelah jalur didefinisikan, tambahkan simpul PathFollow2D sebagai anak dari MobPathdan beri nama MobSpawnLocation. Simpul ini akan secara otomatis berputar dan mengikuti jalur saat bergerak, sehingga kita dapat menggunakannya untuk memilih posisi dan arah acak di sepanjang jalur.

Adegan Anda akan terlihat seperti ini:

../../_images/main_scene_nodes.webp

Skrip utama

Tambahkan skrip ke Main. Di bagian atas skrip, kami menggunakan untuk memungkinkan kami memilih adegan Mob yang ingin kami contohkan.@export var mob_scene: PackedScene

extends Node

@export var mob_scene: PackedScene
var score

using Godot;

public partial class Main : Node
{
// Don't forget to rebuild the project so the editor knows about the new export variable.

[Export]
public PackedScene MobScene { get; set; }

private int _score;
}

Klik Mainnode tersebut dan Anda akan melihat properti di Inspektur di bawah "Main.gd".Mob Scene

Anda dapat menetapkan nilai properti ini dengan dua cara:

  • Tarik mob.tscndari dok "FileSystem" dan letakkan di properti Mob Scene .

  • Klik tanda panah bawah di samping "[kosong]" dan pilih "Muat". Pilih mob.tscn.

Selanjutnya, pilih contoh adegan Playerdi bawah Mainnode di dock Scene, dan akses dock Node di bilah sisi. Pastikan untuk memilih tab Signals di dock Node.

Anda akan melihat daftar sinyal untuk Playernode tersebut. Temukan dan klik dua kali hitsinyal dalam daftar (atau klik kanan dan pilih "Hubungkan..."). Ini akan membuka dialog koneksi sinyal. Kita ingin membuat fungsi baru bernama game_over, yang akan menangani apa yang perlu terjadi saat permainan berakhir. Ketik "game_over" di kotak "Receiver Method" di bagian bawah dialog koneksi sinyal dan klik "Hubungkan". Anda ingin sinyal hitdipancarkan Playerdan ditangani dalam Mainskrip. Tambahkan kode berikut ke fungsi baru, serta new_gamefungsi yang akan menyiapkan semuanya untuk permainan baru:

func game_over():
$ScoreTimer.stop()
$MobTimer.stop()

func new_game():
score = 0
$Player.start($StartPosition.position)
$StartTimer.start()

public void GameOver()
{
GetNode<Timer>("MobTimer").Stop();
GetNode<Timer>("ScoreTimer").Stop();
}

public void NewGame()
{
_score = 0;

var player = GetNode<Player>("Player");
var startPosition = GetNode<Marker2D>("StartPosition");
player.Start(startPosition.Position);

GetNode<Timer>("StartTimer").Start();

Sekarang hubungkan timeout()sinyal setiap node Timer ( StartTimerScoreTimer, dan MobTimer) ke skrip utama. StartTimerakan memulai dua timer lainnya. ScoreTimerakan menambah skor sebesar 1.

func _on_score_timer_timeout():
score += 1

func _on_start_timer_timeout():
$MobTimer.start()
$ScoreTimer.start()

// We also specified this function name in PascalCase in the editor's connection window.
private void OnScoreTimerTimeout()
{
_score++;
}

// We also specified this function name in PascalCase in the editor's connection window.
private void OnStartTimerTimeout()
{
GetNode<Timer>("MobTimer").Start();
GetNode<Timer>("ScoreTimer").Start();
}

Di _on_mob_timer_timeout(), kita akan membuat instance mob, memilih lokasi awal acak di sepanjang Path2D, dan mengatur mob agar bergerak. PathFollow2DNode akan otomatis berputar saat mengikuti jalur, jadi kita akan menggunakannya untuk memilih arah mob serta posisinya. Saat kita memunculkan mob, kita akan memilih nilai acak antara 150.0dan 250.0untuk seberapa cepat setiap mob akan bergerak (akan membosankan jika semuanya bergerak dengan kecepatan yang sama).

Perhatikan bahwa contoh baru harus ditambahkan ke adegan menggunakan add_child().

func _on_mob_timer_timeout():
# Create a new instance of the Mob scene.
var mob = mob_scene.instantiate()

# Choose a random location on Path2D.
var mob_spawn_location = $MobPath/MobSpawnLocation
mob_spawn_location.progress_ratio = randf()

# Set the mob's direction perpendicular to the path direction.
var direction = mob_spawn_location.rotation + PI / 2

# Set the mob's position to a random location.
mob.position = mob_spawn_location.position

# Add some randomness to the direction.
direction += randf_range(-PI / 4, PI / 4)
mob.rotation = direction

# Choose the velocity for the mob.
var velocity = Vector2(randf_range(150.0, 250.0), 0.0)
mob.linear_velocity = velocity.rotated(direction)

# Spawn the mob by adding it to the Main scene.
add_child(mob)
// We also specified this function name in PascalCase in the editor's connection window.
private void OnMobTimerTimeout()
{
// Create a new instance of the Mob scene.
Mob mob = MobScene.Instantiate<Mob>();

// Choose a random location on Path2D. var mobSpawnLocation = GetNode<PathFollow2D>("MobPath/MobSpawnLocation"); mobSpawnLocation.ProgressRatio = GD.Randf(); // Set the mob's direction perpendicular to the path direction. float direction = mobSpawnLocation.Rotation + Mathf.Pi / 2; // Set the mob's position to a random location. mob.Position = mobSpawnLocation.Position; // Add some randomness to the direction. direction += (float)GD.RandRange(-Mathf.Pi / 4, Mathf.Pi / 4); mob.Rotation = direction; // Choose the velocity. var velocity = new Vector2((float)GD.RandRange(150.0, 250.0), 0); mob.LinearVelocity = velocity.Rotated(direction); // Spawn the mob by adding it to the Main scene. AddChild(mob); }

Penting

Mengapa PI? Dalam fungsi yang memerlukan sudut, Godot menggunakan radian , bukan derajat. Pi mewakili setengah putaran dalam radian, sekitar 3.1415(ada juga TAUyang sama dengan ). Jika Anda lebih nyaman bekerja dengan derajat, Anda perlu menggunakan fungsi dan untuk mengonversi antara keduanya.2 * PIdeg_to_rad()rad_to_deg()

Menguji adegan

Mari kita uji adegan tersebut untuk memastikan semuanya berfungsi. Tambahkan new_game panggilan ini ke _ready():

func _ready():
new_game()

public override void _Ready()
{
NewGame();
}

Mari kita tetapkan juga Mainsebagai "Adegan Utama" - yang berjalan secara otomatis saat permainan diluncurkan. Tekan tombol "Putar" dan pilih main.tscnsaat diminta.

Tip

Jika Anda sudah menetapkan adegan lain sebagai "Adegan Utama", Anda dapat mengklik kanan main.tscnpada dock FileSystem dan memilih "Tetapkan Sebagai Adegan Utama".

Anda harus dapat menggerakkan pemain, melihat gerombolan muncul, dan melihat pemain menghilang saat diserang gerombolan.

Jika Anda yakin semuanya berfungsi, hapus panggilan ke new_game()dari _ready()dan ganti dengan pass.

Apa yang kurang dari game kita? Antarmuka pengguna. Dalam pelajaran berikutnya, kita akan menambahkan layar judul dan menampilkan skor pemain.


Tidak ada komentar:

Posting Komentar