Skip to content

Commit 96593b2

Browse files
committed
tutorial 3 updated to 4.3
1 parent 662dd5b commit 96593b2

6 files changed

Lines changed: 122 additions & 108 deletions

File tree

docs/tutorials/tutorial-3/README.md

Lines changed: 122 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ Program Python dapat langsung berjalan tanpa melalui proses kompilasi terlebih d
3838
Contoh lain bahasa _script_ adalah JavaScript.
3939
Kode JavaScript akan dijalankan oleh _runtime_ seperti _engine_ JavaScript di dalam _browser_ atau _runtime_ khusus untuk menjalankan kode JavaScript di luar browser seperti Node atau Deno.
4040

41-
_Engine_ Godot versi 3 mendukung empat (4) bahasa pemrograman: GDScript, Visual Script, C#, dan C++.
41+
_Engine_ Godot versi 4 mendukung empat (4) bahasa pemrograman: GDScript, Visual Script, C#, dan C++.
4242
Pada mata kuliah Game Development ini, kamu akan belajar sintaks dan cara penggunaan bahasa GDScript.
4343
Beberapa alasan mengapa GDScript dipilih sebagai bahasa pemrograman utama adalah:
4444

@@ -57,84 +57,93 @@ Beberapa alasan mengapa GDScript dipilih sebagai bahasa pemrograman utama adalah
5757
Contoh sebuah _script_ yang dituliskan dalam GDScript adalah berikut:
5858

5959
```
60-
# example.gd
61-
60+
# Everything after "#" is a comment.
6261
# A file is a class!
6362
64-
# Inheritance
65-
66-
extends BaseClass
63+
# (optional) icon to show in the editor dialogs:
64+
@icon("res://path/to/optional/icon.svg")
6765
68-
# (optional) class definition with a custom icon
66+
# (optional) class definition:
67+
class_name MyClass
6968
70-
class_name MyClass, "res://path/to/optional/icon.svg"
69+
# Inheritance:
70+
extends BaseClass
7171
72-
# Member Variables
7372
73+
# Member variables.
7474
var a = 5
7575
var s = "Hello"
7676
var arr = [1, 2, 3]
77-
var dict = {"key": "value", 2:3}
77+
var dict = {"key": "value", 2: 3}
78+
var other_dict = {key = "value", other_key = 2}
7879
var typed_var: int
7980
var inferred_type := "String"
8081
81-
# Constants
82-
82+
# Constants.
8383
const ANSWER = 42
8484
const THE_NAME = "Charly"
8585
86-
# Enums
87-
86+
# Enums.
8887
enum {UNIT_NEUTRAL, UNIT_ENEMY, UNIT_ALLY}
8988
enum Named {THING_1, THING_2, ANOTHER_THING = -1}
9089
91-
# Built-in Vector Types
92-
90+
# Built-in vector types.
9391
var v2 = Vector2(1, 2)
9492
var v3 = Vector3(1, 2, 3)
9593
96-
# Function
9794
98-
func some_function(param1, param2):
99-
var local_var = 5
95+
# Functions.
96+
func some_function(param1, param2, param3):
97+
const local_const = 5
10098
101-
if param1 < local_var:
102-
print(param1)
103-
elif param2 > 5:
104-
print(param2)
105-
else:
106-
print("Fail!")
99+
if param1 < local_const:
100+
print(param1)
101+
elif param2 > 5:
102+
print(param2)
103+
else:
104+
print("Fail!")
107105
108-
for i in range(20):
109-
print(i)
106+
for i in range(20):
107+
print(i)
110108
111-
while param2 != 0:
112-
param2 -= 1
109+
while param2 != 0:
110+
param2 -= 1
113111
114-
var local_var2 = param1 + 3
115-
return local_var2
112+
match param3:
113+
3:
114+
print("param3 is 3!")
115+
_:
116+
print("param3 is not 3!")
116117
117-
# Functions override functions with the same name on the base/parent class.
118-
# If you still want to call them, use '.' (like 'super' in other languages).
118+
var local_var = param1 + 3
119+
return local_var
119120
121+
122+
# Functions override functions with the same name on the base/super class.
123+
# If you still want to call them, use "super":
120124
func something(p1, p2):
121-
.something(p1, p2)
125+
super(p1, p2)
126+
127+
128+
# It's also possible to call another function in the super class:
129+
func other_something(p1, p2):
130+
super.something(p1, p2)
122131
123-
# Inner Class
124132
133+
# Inner class
125134
class Something:
126-
var a = 10
135+
var a = 10
127136
128-
# Constructor
129137
138+
# Constructor
130139
func _init():
131-
print("Constructed!")
132-
var lv = Something.new()
133-
print(lv.a)
140+
print("Constructed!")
141+
var lv = Something.new()
142+
print(lv.a)
134143
```
135144

136145
> Catatan: contoh di atas diambil dari dokumentasi resmi Godot berikut:
137-
> https://docs.godotengine.org/en/3.5/tutorials/scripting/gdscript/gdscript_basics.html
146+
> https://docs.godotengine.org/en/stable/tutorials/scripting/gdscript/gdscript_basics.html
138147
139148
Beberapa hal yang perlu kita bahas:
140149

@@ -155,7 +164,7 @@ Pada tutorial ini, kita akan mengimplementasikan mekanika dasar sebuah permainan
155164
Pemain akan dapat menggerakkan sebuah objek ke kiri dan ke kanan serta melompat.
156165
Tutorial ini akan mendemonstrasikan:
157166

158-
- Membuat sebuah objek `Kinematic2D` dengan _child node_ `Collision2D` dan `Sprite`.
167+
- Membuat sebuah objek `CharacterBody2D` dengan _child node_ `Collision2D` dan `Sprite2D`.
159168
- Membuat _script_ dan memasangkan _script_ tersebut ke objek di dalam permainan.
160169
- Implementasi _physics_ dasar.
161170

@@ -172,20 +181,23 @@ Kita akan menaruh objek yang dapat bergerak disana.
172181

173182
![Tampilan Main.tscn](images/main_scene.png)
174183

175-
Buat _scene_ baru dan tambahkan _root node_ `Kinematic2D` pada _scene_ tersebut.
184+
Buat _scene_ baru dan tambahkan _root node_ `CharacterBody2D` pada _scene_ tersebut.
176185
Ubah nama _node_ tersebut menjadi `Player`.
177-
Tambahkan _child node_ `Sprite` dan `CollisionShape2D` dengan menggunakan menu Add Child Node.
186+
Tambahkan _child node_ `Sprite2D` dan `CollisionShape2D` dengan menggunakan menu Add Child Node.
178187

179188
![Dialogue box New Scene](images/new-scene-menu.png)
189+
180190
![Dialogue box Node Selection](images/node-selection.png)
191+
181192
![Dialogue box Node Selection](images/child-node-selection.png)
193+
182194
![Susunan Scene](images/tree-structure.png)
183195

184196
Pilih node CollisionShape2D dan buka panel Inspector. Tambahkan Shape pada node tersebut dengan memilih new RectangleShape2D.
185197

186198
![Inspector CollisionShape2D](images/collision-inspector.png)
187199

188-
Pilih node Sprite dan buka panel Inspector. Pada menu texture, pilih menu Load dan buka folder Assets, kemudian pilih salah satu dari sprite pesawat yang ada.
200+
Pilih node Sprite2D dan buka panel Inspector. Pada menu texture, pilih menu Load dan buka folder Assets, kemudian pilih salah satu dari sprite pesawat yang ada.
189201

190202
![Inspector Sprite](images/sprite-inspector.png)
191203

@@ -199,9 +211,9 @@ Tampilan Godot Editor terdiri dari beberapa panel yang akan dijelaskan pada subb
199211

200212
Pada panel Scene, klik kanan pada node Player. Pilih Attach Script pada menu yang muncul. Akan muncul dialog untuk membuat script. Akan ada beberapa pilihan yang tersedia, diantaranya nama script, bahasa script, dll.
201213

202-
Karena script akan dipasang pada KinematicBody2D, script otomatis meng-_inherit_ class tersebut. Pada dasarnya, ini adalah skema dari GDScript, karena kita ingin menambahkan fungsionalitas baru pada node yang kita inginkan.
214+
Karena script akan dipasang pada CharacterBody2D, script otomatis meng-_inherit_ class tersebut. Pada dasarnya, ini adalah skema dari GDScript, karena kita ingin menambahkan fungsionalitas baru pada node yang kita inginkan.
203215

204-
Ubah nama script menjadi `Player.gd` kemudian simpan script pada folder `scenes`.
216+
Ubah nama script menjadi `Player.gd` kemudian simpan script pada folder `scenes`. Pastikan template yang digunakan adalah `Node:default` karena kita akan mengimplementasi _player movement_ sendiri.
205217

206218
![Attach Script Box](images/attach-node-dialogue.png)
207219

@@ -222,22 +234,22 @@ Sebuah script jika dipasang ke suatu node akan memberikan node tersebut atribut
222234
Tujuan kita adalah menggerakan node Player secara horizontal. Tambahkan cuplikan kode ini pada `Player.gd`:
223235

224236
```
225-
extends KinematicBody2D
237+
extends CharacterBody2D
238+
239+
@export var walk_speed = 200
226240
227-
export (int) var speed = 400
241+
func _physics_process(delta):
228242
229-
var velocity = Vector2()
243+
if Input.is_action_pressed("ui_left"):
244+
velocity.x = -walk_speed
245+
elif Input.is_action_pressed("ui_right"):
246+
velocity.x = walk_speed
247+
else:
248+
velocity.x = 0
230249
231-
func get_input():
232-
velocity = Vector2()
233-
if Input.is_action_pressed('right'):
234-
velocity.x += speed
235-
if Input.is_action_pressed('left'):
236-
velocity.x -= speed
250+
# "move_and_slide" already takes delta time into account.
251+
move_and_slide()
237252
238-
func _physics_process(delta):
239-
get_input()
240-
velocity = move_and_slide(velocity)
241253
```
242254

243255
Jika kamu sedang mengambil atau pernah mengambil mata kuliah aljabar linier,
@@ -253,12 +265,12 @@ _Game engine_ biasanya sudah menyertakan fungsi-fungsi terkait manipulasi objek
253265

254266
Mari mulai dengan contoh sederhana di tutorial ini, yaitu menggerakkan objek. Perhatikan hal-hal berikut:
255267

256-
1. `export (int) var speed = 400` merupakan deklarasi variabel. Export membuat variabel speed dapat diakses lewat visual editor.
257-
2. `var velocity = Vector2()` adalah deklarasi private variable Vector2. Vector2 adalah tipe data Vector built-in Godot yang memiliki dua arah (x,y).
258-
3. `get_input()` adalah wrapper function untuk membaca input kemudian menambahkan velocity (kecepatan) pada Player.
259-
3. `Input.is_action_pressed(String signal)` merupakan fungsi bawaan Godot yang membaca input.
260-
4. `_physics_processs(delta)` dipanggil secara berkala untuk membaca input.
261-
4. `move_and_slide(Vector2 vector)` merupakan fungsi KinematicBody2D. Ketika fungsi ini dipanggil, KinematicBody2D akan bergerak sebanyak input Vector2.
268+
1. `@export var walk_speed = 200` merupakan deklarasi variabel. Export membuat variabel speed dapat diakses lewat _inspector_.
269+
2. `velocity` adalah salah satu properties Vector2 dari CharacterBody2D yang menyatakan kecepatan dalam satuan pixels per second. Vector2 adalah tipe data Vector built-in Godot yang memiliki dua arah (x,y).
270+
3. `move_and_slide()` adalah salah satu methods dari CharacterBody2D yang bertujuan menggerakkan body sesuai _velocity_. Jika body tersebut bertabrakan (_collide_) dengan body lain, body tersebut akan meluncur (_slide along_) sepanjang body lain daripada berhenti. Jika bertabrakan dengan CharacterBody2D atau RigidBody2D, body tersebut akan terpengaruh oleh gerakan body lainnya. Anda dapat menggunakan ini untuk membuat platform bergerak dan berputar, atau untuk membuat node mendorong node lainnya.
271+
4. `Input.is_action_pressed(String signal)` merupakan fungsi bawaan Godot yang membaca input.
272+
5. `_physics_processs(delta)` dipanggil secara berkala untuk membaca input.
273+
6. `velocity.x = 0` memastikan bahwa Player akan berhenti apabila tidak ada tombol yang ditekan.
262274

263275
> Catatan: _physics_process(delta) tidak jauh berbeda dari _process(delta). Fungsi ini dipanggil secara berkala, namun memiliki waktu panggil yang konstan tanpa bergantung pada fps.
264276
@@ -267,42 +279,37 @@ Jalankan _scene_ dan gunakan tombol panah arah. Player dapat bergerak secara hor
267279
### Latihan: Implementasi _Physics_ Sederhana (Gravitasi dan Loncat)
268280

269281
Jika dilihat, `Player` hanya bergerak horizontal dan tidak dipengaruhi gravitasi. Objek Player tetap diam diatas meskipun tidak berada pada suatu pijakan.
270-
Hal ini merupakan karakteristik dari `KinematicBody2D`, dimana _node_ **tidak** dipengaruhi oleh _physics_ yang tersedia dari _game engine_.
282+
Hal ini merupakan karakteristik dari `CharacterBody2D`, dimana _node_ **tidak** dipengaruhi oleh _physics_ yang tersedia dari _game engine_.
271283
Sedangkan untuk dapat membuat objek terpentaruh _physics_, maka seharusnya objek tersebut menggunakan _node_ lain bertipe `RigidBody2D`.
272284

273-
Salah satu alasan mengapa kita tidak memakai `RigidBody2D` yang dapat dipengaruhi physics Game Engine adalah konsistensi. Dengan memakai KinematicBody2D, objek yang digerakan oleh pemain akan selalu merespon terhadap input yang diberikan, dimana objek RigidBody2D akan mudah terpengaruh oleh physics diluar kendali pemain.
285+
Salah satu alasan mengapa kita tidak memakai `RigidBody2D` yang dapat dipengaruhi physics Game Engine adalah konsistensi. Dengan memakai CharacterBody2D, objek yang digerakan oleh pemain akan selalu merespon terhadap input yang diberikan, dimana objek RigidBody2D akan mudah terpengaruh oleh physics diluar kendali pemain.
274286

275287
Apabila kita ingin membuat Player kita melompat, maka kita harus bisa membuat Player dipengaruhi gravitasi. Setidaknya, Player harus bisa jatuh. Untuk itu, kita harus menambahkan fungsi physics sendiri, karena kita tidak bisa menggunakan gravitasi Game Engine. Tambahkan baris berikut pada `Player.gd`:
276288

277289
```
278-
extends KinematicBody2D
279-
280-
export (int) var speed = 400
281-
export (int) var GRAVITY = 1200
290+
extends CharacterBody2D
282291
283-
const UP = Vector2(0,-1)
292+
@export var gravity = 200.0
293+
@export var walk_speed = 200
284294
285-
var velocity = Vector2()
295+
func _physics_process(delta):
296+
velocity.y += delta * gravity
286297
287-
func get_input():
288-
velocity.x = 0
289-
if Input.is_action_pressed('right'):
290-
velocity.x += speed
291-
if Input.is_action_pressed('left'):
292-
velocity.x -= speed
298+
if Input.is_action_pressed("ui_left"):
299+
velocity.x = -walk_speed
300+
elif Input.is_action_pressed("ui_right"):
301+
velocity.x = walk_speed
302+
else:
303+
velocity.x = 0
293304
294-
func _physics_process(delta):
295-
velocity.y += delta * GRAVITY
296-
get_input()
297-
velocity = move_and_slide(velocity, UP)
305+
# "move_and_slide" already takes delta time into account.
306+
move_and_slide()
298307
```
299308

300309
Beberapa hal yang ditambahkan:
301310

302-
1. Variabel `GRAVITY` sebagai angka arbitrer.
303-
2. Konstanta `UP` merupakan _shorthand_ untuk Vector2 yang mengarah keatas. Pada Godot Engine, koordinat y negatif mengarah keatas.
304-
3. `velocity.x = 0` memastikan bahwa Player akan berhenti apabila tidak ada tombol yang ditekan.
305-
4. `velocity.y += delta * GRAVITY` merupakan fungsi gravitasi untuk Player. Setiap diproses, `velocity.y` Player ditambahkan sejumlah konstanta gravitasi (mengarah kebawah).
311+
1. Variabel `gravity` sebagai angka arbitrer.
312+
2. `velocity.y += delta * gravity` merupakan fungsi gravitasi untuk Player. Setiap diproses, `velocity.y` Player ditambahkan sejumlah konstanta gravitasi (mengarah kebawah).
306313

307314
Jalankan scene. Objek Player akan jatuh.
308315

@@ -315,28 +322,34 @@ Sekarang Player kita butuh sebuah pijakan. Buka Scene Main.tscn. Tambahkan Scene
315322
Apabila kita ingin Player melompat, salah satu cara yang bisa digunakan adalah mengubah `velocity.y` menjadi negatif. Tambahkan cuplikan kode pada `Player.gd`:
316323

317324
```
318-
extends KinematicBody2D
319-
320-
export (int) var speed = 400
321-
export (int) var jump_speed = -600
322-
.
323-
.
324-
func get_input():
325-
velocity.x = 0
326-
if is_on_floor() and Input.is_action_just_pressed('up'):
327-
velocity.y = jump_speed
328-
if Input.is_action_pressed('right'):
329-
velocity.x += speed
330-
if Input.is_action_pressed('left'):
331-
velocity.x -= speed
332-
.
333-
.
325+
extends CharacterBody2D
326+
327+
@export var gravity = 200.0
328+
@export var walk_speed = 200
329+
@export var jump_speed = -300
330+
331+
func _physics_process(delta):
332+
velocity.y += delta * gravity
333+
334+
if is_on_floor() and Input.is_action_just_pressed('ui_up'):
335+
velocity.y = jump_speed
336+
337+
if Input.is_action_pressed("ui_left"):
338+
velocity.x = -walk_speed
339+
elif Input.is_action_pressed("ui_right"):
340+
velocity.x = walk_speed
341+
else:
342+
velocity.x = 0
343+
344+
# "move_and_slide" already takes delta time into account.
345+
move_and_slide()
346+
334347
```
335348

336349
Perhatikan bahwa:
337350

338-
1. `is_on_floor()` merupakan fungsi bawaan KinematicBody2D dimana node akan mengecek otomatis apabila Collider yang sedang bersentuhan merupakan floor atau bukan.
339-
2. `Input.is_action_just_pressed('up')` merupakan fungsi input Godot Engine yang mengecek input pertama dari sebuah tombol.
351+
1. `is_on_floor()` merupakan fungsi bawaan CharacterBody2D dimana node akan mengecek otomatis apabila Collider yang sedang bersentuhan merupakan floor atau bukan.
352+
2. `Input.is_action_just_pressed('ui_up')` merupakan fungsi input Godot Engine yang mengecek input pertama dari sebuah tombol.
340353

341354
Jalankan Scene. Player sekarang bisa melompat.
342355

@@ -384,9 +397,10 @@ Tenggat waktu pengumpulan adalah **28 Februari 2024 pukul 21:00**.
384397

385398
## Referensi
386399

387-
- [Kinematic Character (2D)](https://docs.godotengine.org/en/3.1/tutorials/physics/kinematic_character_2d.html)
388-
- [Scripting](https://docs.godotengine.org/en/3.1/getting_started/step_by_step/scripting.html#scripting-a-scene)
389-
- [2D Movement Overview](https://docs.godotengine.org/en/3.1/tutorials/2d/2d_movement.html)
400+
- [Kinematic Character (2D)](https://docs.godotengine.org/en/stable/tutorials/physics/kinematic_character_2d.html)
401+
- [Scripting](https://docs.godotengine.org/en/stable/tutorials/scripting/gdscript/gdscript_basics.html)
402+
- [2D Movement Overview](https://docs.godotengine.org/en/stable/tutorials/2d/2d_movement.html)
390403
- [Kenney Assets](https://kenney.nl/assets/platformer-characters-1)
404+
- [CharacterBody2D](https://docs.godotengine.org/en/stable/classes/class_characterbody2d.html)
391405
- Materi tutorial pengenalan Godot Engine, kuliah Game Development semester
392406
gasal 2020/2021 Fakultas Ilmu Komputer Universitas Indonesia.
10.5 KB
Loading
14.9 KB
Loading
11.9 KB
Loading
12.3 KB
Loading
-95 Bytes
Loading

0 commit comments

Comments
 (0)