ADS

Mendengarkan Masukan Pemain

 

Mendengarkan Masukan Pemain

Berdasarkan pelajaran sebelumnya, Membuat skrip pertama Anda , mari kita lihat fitur penting lain dari setiap permainan: memberikan kendali kepada pemain. Untuk menambahkannya, kita perlu mengubah sprite_2d.gdkode kita.

../../_images/scripting_first_script_moving_with_input.gif

Anda memiliki dua alat utama untuk memproses masukan pemain di Godot:

  1. Panggilan balik input bawaan, terutama _unhandled_input(). Seperti _process(), ini adalah fungsi virtual bawaan yang dipanggil Godot setiap kali pemain menekan tombol. Ini adalah alat yang ingin Anda gunakan untuk bereaksi terhadap kejadian yang tidak terjadi setiap frame, seperti menekan Spaceuntuk melompat. Untuk mempelajari lebih lanjut tentang panggilan balik input, lihat Menggunakan InputEvent .

  2. Singleton Input. Singleton adalah objek yang dapat diakses secara global. Godot menyediakan akses ke beberapa skrip. Ini adalah alat yang tepat untuk memeriksa input setiap frame.

Kita akan menggunakan Inputsingleton di sini karena kita perlu tahu apakah pemain ingin berputar atau bergerak di setiap frame.

Untuk melakukan perputaran, kita harus menggunakan variabel baru: direction. Dalam _process() fungsi kita, ganti baris dengan kode di bawah ini.rotation += angular_speed * delta

var direction = 0
if Input.is_action_pressed("ui_left"):
direction = -1
if Input.is_action_pressed("ui_right"):
direction = 1

rotation += angular_speed * direction * delta

var direction = 0;
if (Input.IsActionPressed("ui_left"))
{
direction = -1;
}
if (Input.IsActionPressed("ui_right"))
{
direction = 1;
}

Rotation += _angularSpeed * direction * (float)delta;

Variabel lokal kita directionadalah pengali yang mewakili arah yang ingin dituju pemain. Nilai 0berarti pemain tidak menekan tombol panah kiri atau kanan. Nilai 1berarti pemain ingin berbelok ke kanan, dan -1berarti mereka ingin berbelok ke kiri.

Untuk menghasilkan nilai-nilai ini, kami memperkenalkan kondisi dan penggunaan Input. Kondisi dimulai dengan ifkata kunci dalam GDScript dan diakhiri dengan titik dua. Kondisi adalah ekspresi antara kata kunci dan akhir baris.

Untuk memeriksa apakah tombol ditekan pada frame ini, kita memanggil Input.is_action_pressed(). Metode ini mengambil string teks yang mewakili tindakan input dan mengembalikan true jika tindakan ditekan, falsejika tidak.

Dua tindakan yang kami gunakan di atas, "ui_left" dan "ui_right", telah ditetapkan sebelumnya di setiap proyek Godot. Tindakan tersebut masing-masing dipicu saat pemain menekan tombol panah kiri dan kanan pada keyboard atau tombol panah kiri dan kanan pada D-pad gamepad.

Catatan

Anda dapat melihat dan mengedit tindakan masukan pada proyek Anda dengan membuka Proyek -> Pengaturan Proyek dan mengeklik tab Peta Masukan.

Terakhir, kami menggunakan sebagai pengali saat kami memperbarui directionpada node tersebut .rotationrotation += angular_speed * direction * delta

Berikan komentar pada baris-baris tersebut dan sukai baris-baris berikut:var velocity = Vector2.UP.rotated(rotation) * speedposition += velocity * delta

#var velocity = Vector2.UP.rotated(rotation) * speed

#position += velocity * delta

//var velocity = Vector2.Up.Rotated(Rotation) * _speed;

//Position += velocity * (float)delta;

Ini akan mengabaikan kode yang memindahkan posisi ikon dalam lingkaran tanpa masukan pengguna dari latihan sebelumnya.

Jika Anda menjalankan adegan dengan kode ini, ikon akan berputar saat Anda menekan Leftdan Right.

Bergerak saat menekan "atas"

Untuk bergerak hanya saat tombol ditekan, kita perlu mengubah kode yang menghitung kecepatan. Hapus komentar pada kode dan ganti baris yang dimulai dengan kode di bawah ini.var velocity

var velocity = Vector2.ZERO
if Input.is_action_pressed("ui_up"):
velocity = Vector2.UP.rotated(rotation) * speed

var velocity = Vector2.Zero;
if (Input.IsActionPressed("ui_up"))
{
velocity = Vector2.Up.Rotated(Rotation) * _speed;
}

Kami menginisialisasi velocitydengan nilai Vector2.ZERO, konstanta lain dari tipe bawaan Vectoryang mewakili vektor 2D dengan panjang 0.

Jika pemain menekan aksi "ui_up", kami kemudian memperbarui nilai kecepatan, yang menyebabkan sprite bergerak maju.

Naskah lengkap

Berikut sprite_2d.gdberkas lengkapnya untuk referensi.

extends Sprite2D

var speed = 400
var angular_speed = PI

func _process(delta):
var direction = 0
if Input.is_action_pressed("ui_left"):
direction = -1
if Input.is_action_pressed("ui_right"):
direction = 1

rotation += angular_speed * direction * delta

var velocity = Vector2.ZERO
if Input.is_action_pressed("ui_up"):
velocity = Vector2.UP.rotated(rotation) * speed

position += velocity * delta

using Godot;

public partial class MySprite2D : Sprite2D
{
private float _speed = 400;
private float _angularSpeed = Mathf.Pi;

public override void _Process(double delta)
{
var direction = 0;
if (Input.IsActionPressed("ui_left"))
{
direction = -1;
}
if (Input.IsActionPressed("ui_right"))
{
direction = 1;
}

Rotation += _angularSpeed * direction * (float)delta;

var velocity = Vector2.Zero;
if (Input.IsActionPressed("ui_up"))
{
velocity = Vector2.Up.Rotated(Rotation) * _speed;
}

Position += velocity * (float)delta;
}
}

Jika Anda menjalankan adegan, Anda sekarang dapat memutar dengan tombol panah kiri dan kanan dan bergerak maju dengan menekan Up.

../../_images/scripting_first_script_moving_with_input.gif

Ringkasan

Singkatnya, setiap skrip di Godot mewakili sebuah kelas dan memperluas salah satu kelas bawaan mesin. Tipe simpul yang diwarisi kelas Anda memberi Anda akses ke properti, seperti rotationdan positiondalam kasus sprite kita. Anda juga mewarisi banyak fungsi, yang tidak dapat kita gunakan dalam contoh ini.

Dalam GDScript, variabel yang Anda tempatkan di bagian atas berkas adalah properti kelas Anda, yang juga disebut variabel anggota. Selain variabel, Anda dapat menentukan fungsi, yang sebagian besar akan menjadi metode kelas Anda.

Godot menyediakan beberapa fungsi virtual yang dapat Anda definisikan untuk menghubungkan kelas Anda dengan mesin. Fungsi-fungsi ini meliputi _process(), untuk menerapkan perubahan pada node setiap frame, dan _unhandled_input(), untuk menerima peristiwa input seperti penekanan tombol dari pengguna. Masih banyak lagi.

Singleton Inputmemungkinkan Anda untuk bereaksi terhadap masukan pemain di mana saja dalam kode Anda. Secara khusus, Anda akan dapat menggunakannya dalam _process()loop.

Dalam pelajaran berikutnya, Menggunakan sinyal , kita akan membangun hubungan antara skrip dan node dengan membuat node memicu kode dalam skrip.

Tidak ada komentar:

Posting Komentar