You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
@@ -38,7 +38,7 @@ Program Python dapat langsung berjalan tanpa melalui proses kompilasi terlebih d
38
38
Contoh lain bahasa _script_ adalah JavaScript.
39
39
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.
40
40
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++.
42
42
Pada mata kuliah Game Development ini, kamu akan belajar sintaks dan cara penggunaan bahasa GDScript.
43
43
Beberapa alasan mengapa GDScript dipilih sebagai bahasa pemrograman utama adalah:
44
44
@@ -57,84 +57,93 @@ Beberapa alasan mengapa GDScript dipilih sebagai bahasa pemrograman utama adalah
57
57
Contoh sebuah _script_ yang dituliskan dalam GDScript adalah berikut:
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.
189
201
190
202

191
203
@@ -199,9 +211,9 @@ Tampilan Godot Editor terdiri dari beberapa panel yang akan dijelaskan pada subb
199
211
200
212
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.
201
213
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.
203
215
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.
@@ -222,22 +234,22 @@ Sebuah script jika dipasang ke suatu node akan memberikan node tersebut atribut
222
234
Tujuan kita adalah menggerakan node Player secara horizontal. Tambahkan cuplikan kode ini pada `Player.gd`:
223
235
224
236
```
225
-
extends KinematicBody2D
237
+
extends CharacterBody2D
238
+
239
+
@export var walk_speed = 200
226
240
227
-
export (int) var speed = 400
241
+
func _physics_process(delta):
228
242
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
230
249
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()
237
252
238
-
func _physics_process(delta):
239
-
get_input()
240
-
velocity = move_and_slide(velocity)
241
253
```
242
254
243
255
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
253
265
254
266
Mari mulai dengan contoh sederhana di tutorial ini, yaitu menggerakkan objek. Perhatikan hal-hal berikut:
255
267
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.
262
274
263
275
> 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.
264
276
@@ -267,42 +279,37 @@ Jalankan _scene_ dan gunakan tombol panah arah. Player dapat bergerak secara hor
267
279
### Latihan: Implementasi _Physics_ Sederhana (Gravitasi dan Loncat)
268
280
269
281
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_.
271
283
Sedangkan untuk dapat membuat objek terpentaruh _physics_, maka seharusnya objek tersebut menggunakan _node_ lain bertipe `RigidBody2D`.
272
284
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.
274
286
275
287
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`:
276
288
277
289
```
278
-
extends KinematicBody2D
279
-
280
-
export (int) var speed = 400
281
-
export (int) var GRAVITY = 1200
290
+
extends CharacterBody2D
282
291
283
-
const UP = Vector2(0,-1)
292
+
@export var gravity = 200.0
293
+
@export var walk_speed = 200
284
294
285
-
var velocity = Vector2()
295
+
func _physics_process(delta):
296
+
velocity.y += delta * gravity
286
297
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
293
304
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()
298
307
```
299
308
300
309
Beberapa hal yang ditambahkan:
301
310
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).
306
313
307
314
Jalankan scene. Objek Player akan jatuh.
308
315
@@ -315,28 +322,34 @@ Sekarang Player kita butuh sebuah pijakan. Buka Scene Main.tscn. Tambahkan Scene
315
322
Apabila kita ingin Player melompat, salah satu cara yang bisa digunakan adalah mengubah `velocity.y` menjadi negatif. Tambahkan cuplikan kode pada `Player.gd`:
316
323
317
324
```
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
+
334
347
```
335
348
336
349
Perhatikan bahwa:
337
350
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.
340
353
341
354
Jalankan Scene. Player sekarang bisa melompat.
342
355
@@ -384,9 +397,10 @@ Tenggat waktu pengumpulan adalah **28 Februari 2024 pukul 21:00**.
384
397
385
398
## Referensi
386
399
387
-
-[Kinematic Character (2D)](https://docs.godotengine.org/en/3.1/tutorials/physics/kinematic_character_2d.html)
0 commit comments