Pilihan yang tepat banget 🎨✨
GDevelop itu memang ideal buat proyek seperti ini — kamu bisa bikin doodle fighting PVP tanpa coding sama sekali, hanya dengan sistem event visual logic.
Mari kita buat panduannya step-by-step dari awal sampai bisa jadi .exe 👇
---
🧩 Langkah-langkah Membuat “Doodle Fighting PVP” di GDevelop
🟢 1. Siapkan Bahan
Buat dulu aset sederhana (bisa coretan tangan):
player1.png → karakter kiri
player2.png → karakter kanan
projectile1.png, projectile2.png → bola energi masing-masing pemain
background.png → gambar arena
(opsional) hit_effect.png → efek pukulan
Gunakan gaya doodle sesukamu — hitam putih juga keren.
---
⚙️ 2. Buat Proyek Baru
1. Buka GDevelop → Create a new project.
2. Pilih Empty game.
3. Simpan dengan nama: DoodleFightingPVP.
---
🧱 3. Tambahkan Objek
Masuk ke Scene 1 (scene utama).
Tambahkan objek:
Nama Jenis Keterangan
Player1 Sprite Pilih player1.png, tambahkan animasi idle dan attack (opsional)
Player2 Sprite Pilih player2.png
Projectile1 Sprite Pilih projectile1.png
Projectile2 Sprite Pilih projectile2.png
Background Sprite background.png
HP1Text Text Tulisan “HP1: 100”
HP2Text Text Tulisan “HP2: 100”
---
🎮 4. Tentukan Posisi Awal
Letakkan Background di tengah layar.
Player1 di kiri bawah (misal X=150, Y=400).
Player2 di kanan bawah (misal X=650, Y=400).
Pastikan keduanya menghadap satu sama lain (gunakan flip horizontal kalau perlu).
---
🔧 5. Tambahkan Variabel
Klik kanan pada scene → Scene Variables → tambahkan:
Player1HP = 100
Player2HP = 100
---
⌨️ 6. Buat Event untuk Gerakan
Klik tab Events → tambahkan event berikut:
🕹️ Player 1 (A, D, W, S)
Kondisi Aksi
Key “A” is pressed Add -200 × TimeDelta() to X position of Player1
Key “D” is pressed Add 200 × TimeDelta() to X position of Player1
Key “W” is pressed (Jika jarak ke Player2 < 100) → Subtract 10 from Player2HP
Key “S” is pressed Create object Projectile1 at Player1 position; Add a force of 400 to the right
🕹️ Player 2 (←, →, ↑, ↓)
Kondisi Aksi
Left key is pressed Add -200 × TimeDelta() to X position of Player2
Right key is pressed Add 200 × TimeDelta() to X position of Player2
Up key is pressed (Jika jarak ke Player1 < 100) → Subtract 10 from Player1HP
Down key is pressed Create object Projectile2 at Player2 position; Add a force of -400 to the left
---
💥 7. Deteksi Tabrakan Projektil
Tambahkan event:
Kondisi Aksi
Projectile1 collides with Player2 Subtract 20 from Player2HP; Delete Projectile1
Projectile2 collides with Player1 Subtract 20 from Player1HP; Delete Projectile2
---
❤️ 8. Update HP Text
Tambahkan event tanpa kondisi:
Do = "HP1: " + ToString(Player1HP) to text of HP1Text
Do = "HP2: " + ToString(Player2HP) to text of HP2Text
---
🏁 9. Cek Kemenangan
Tambahkan:
Kondisi Aksi
Player1HP ≤ 0 Display text “Player 2 Wins!”; Pause the game
Player2HP ≤ 0 Display text “Player 1 Wins!”; Pause the game
---
💾 10. Ekspor ke .exe
1. Klik File → Export
2. Pilih Local folder → Windows (.exe)
3. Tunggu proses build, nanti kamu dapat folder berisi file .exe yang siap dimainkan.
---
💡 Tips Tambahan
Kamu bisa menambahkan animasi “attack” sederhana dengan change animation saat tombol pukul ditekan.
Tambahkan sedikit camera shake saat pukulan kena agar terasa “impact”.
Kalau mau karakter lompat, tambahkan variabel y_speed dan logika gravitasi sederhana.
---
Kalau kamu mau, aku bisa bantu buatin:
🔸 Template GDevelop (.json project) siap diimpor ke GDevelop,
atau
🔸 Daftar event visual lengkap (copy-paste format GDevelop) biar kamu tinggal masukkan manual.
Kamu mau saya bantu dengan yang mana?
---
Pertanyaan yang super penting dan sangat tepat 😄
Jadi begini — GDevelop tidak memakai tulisan atau kode sama sekali seperti bahasa pemrograman.
Semua logika (logic) yang aku tulis di atas itu hanya penjelasan untuk manusia supaya kamu paham apa yang akan kamu buat.
Sedangkan di dalam GDevelop, kamu membuat logika itu dengan sistem visual event, yaitu berupa blok-blok seperti ini:
---
🧠 Cara GDevelop “membaca” logika (bukan tulisan, tapi blok)
Contohnya:
🎮 Event: Gerak Kiri (Player1)
Kamu tidak mengetik:
if A is pressed → move player left
Tapi kamu klik-klik saja:
1. Klik tab Events.
2. Klik tombol Add a new event.
3. Di kolom “Condition” klik Add condition → Keyboard → Key pressed → pilih huruf A.
4. Di kolom “Action” klik Add action → Player1 → Add to position (X).
5. Isikan nilai: -200 * TimeDelta()
Hasil visualnya di layar seperti:
Condition: Key A is pressed
Action: Add -200 * TimeDelta() to Player1.X
Semua itu tampil dalam bentuk blok visual, bukan teks kode.
---
⚔️ Event: Serang Dekat
1. Add new event.
2. Condition → Keyboard → Key pressed → pilih W.
3. Tambah kondisi kedua (opsional): Compare two numbers → distance(Player1.X, Player2.X) < 100
4. Action → Variables → Value of a scene variable → pilih Player2HP, lalu “Subtract 10”.
---
🔮 Event: Serangan Spesial (Projektil)
1. Condition → Key “S” is pressed
2. Action 1 → Create object → Projectile1 at position of Player1.
3. Action 2 → Add a permanent force to Projectile1 (misal ke kanan 400).
---
❤️ Event: HP Text
1. Add new event tanpa condition.
2. Action → Modify the text of HP1Text →
isi: "HP1: " + ToString(Player1HP)
3. Lakukan hal yang sama untuk HP2Text.
---
💥 Event: Collision
1. Condition → Collision → Check collision between two objects → pilih Projectile1 dan Player2.
2. Action → Subtract 20 from Player2HP, lalu Delete object Projectile1.
---
Semua langkah itu dilakukan dengan klik dan isi kolom, bukan menulis skrip manual.
Makanya GDevelop sangat ramah buat pemula — kamu tinggal logis saja berpikir "kapan sesuatu terjadi dan apa yang harus dilakukan".
---
Kalau kamu mau, aku bisa kirimkan tangkapan contoh tampilan event-nya (dalam teks simulasi) agar kamu tahu seperti apa bloknya di GDevelop —
atau aku bantu tulis versi “event list siap klik” (step per step tinggal kamu ikuti urutan di GDevelop).
Kamu mau saya bantu buatkan yang mana:
🅰️ contoh tampilan event visual (simulasi blok GDevelop),
atau
🅱️ daftar event klik-step yang bisa langsung kamu praktekkan di aplikasi GDevelop?
---
Pertanyaan ini bagus banget, dan menunjukkan kamu mulai berpikir seperti game designer sejati 😄
Jawabannya:
➡️ Tidak wajib sama, tapi sebaiknya proporsional dan konsisten.
Mari kita bahas dengan cara yang praktis dan gampang diterapkan di GDevelop 👇
---
🎨 1. Ukuran Sprite Player
Tidak harus sama persis, tapi sebaiknya tidak terlalu beda jauh.
Tujuannya supaya jarak serangan, posisi pukul, dan hitbox terasa adil.
✏️ Rekomendasi ukuran umum untuk game fighting 2D sederhana:
Elemen Ukuran disarankan Catatan
Player1 64×64 px – 128×128 px Cukup jelas di layar 800×600 atau 1280×720
Player2 Sama kisaran, boleh beda sedikit (misal 10–20%)
Projectile (bola energi) 16×16 px – 32×32 px Kecil tapi terlihat jelas
Latar/Arena 800×450 px atau 1280×720 px Ukuran layar game keseluruhan
➡️ Intinya:
Kalau Player1 berukuran 80×100 px dan Player2 90×110 px, itu masih normal.
Yang penting, ukuran visual dan jarak jangkauan serang terasa seimbang.
---
⚔️ 2. Kenapa Sebaiknya Konsisten
Animasi & collision jadi lebih mudah.
Hitbox serangan bisa pakai jarak sama (tanpa harus diatur berbeda tiap karakter).
Camera framing tidak perlu diatur ulang untuk tiap karakter.
Kalau salah satu karakter jauh lebih kecil (misal 50×50 vs 120×120),
maka yang kecil sulit dipukul dan tidak adil secara gameplay.
---
🔮 3. Ukuran Projektil
Untuk bola energi, bebas — tapi sebaiknya:
Lebarnya sekitar ¼ sampai ½ lebar karakter. (Kalau player 100 px, bola 25–50 px sudah cukup.)
Gunakan bentuk yang jelas terlihat, misalnya lingkaran putih/bercahaya.
Pastikan punya collision box sedikit lebih kecil dari gambar (agar tidak terasa “curang”).
---
🧱 4. Aturan Praktis yang Aman di GDevelop
Elemen Contoh Aman Catatan
Player sprites 96×96 px Sama tinggi antar karakter
Projectile 24×24 px Bergerak cepat tapi tetap jelas
Ground / Floor Sprite 800×50 px di bawah Untuk batas lantai
Arena BG 800×450 px Latar belakang statis
---
🧩 5. Tips di GDevelop
Kalau ukuran sprite kamu beda, kamu bisa atur scale langsung di editor:
Pilih objek → tab “Properties” → ubah Scale X dan Scale Y (misal jadi 0.8 atau 1.2).
Kalau karakter kamu punya ruang kosong di tepi gambar (canvas terlalu besar),
crop dulu di editor gambar supaya ukuran visualnya sesuai realitas di game.
---
Kalau kamu mau, aku bisa bantu buatkan template ukuran kanvas (dalam pixel) buat:
Player 1 & 2
Projektil
Arena
Jadi kamu tinggal gambar doodle-nya di ukuran yang tepat biar pas di GDevelop.
Apakah kamu mau saya buatkan template ukuran dan posisi dasar itu?
---
Wah 😄🔥 itu ide desain karakter yang keren banget — dan kamu baru saja masuk ke ranah game balancing, salah satu bagian paling menarik di pembuatan game fighting!
Konsepmu ini sudah logis banget:
Karakter besar → HP tinggi, tapi serangan & kecepatan kecil.
Karakter kurus → HP rendah, tapi projektilnya kuat & cepat.
Mari aku bantu rapikan konsepnya supaya fun, seimbang, dan gampang diatur di GDevelop. 👇
---
⚔️ Konsep Gameplay Doodle Fighting Kamu
Karakter Tipe HP Kecepatan Gerak Serangan Dekat Serangan Jarak Jauh
Player 1 (Besar, Tank) Kuat & lambat 150–200 Lambat (150 px/s) Kuat (20 dmg) Tidak punya / kecil
Player 2 (Kurus, Blaster) Cepat & lemah 80–100 Cepat (250 px/s) Lemah (10 dmg) Projektil besar (30 dmg, cepat)
---
⚙️ Cara Terapkan di GDevelop
🎮 1. Atur variabel khusus di setiap player
Pilih Player1 object, klik tab Variables, tambahkan:
Speed = 150
HP = 200
AttackDamage = 20
Lalu di Player2 object, tambahkan:
Speed = 250
HP = 100
AttackDamage = 10
ProjectileDamage = 30
Dengan begitu, setiap karakter punya “DNA” sendiri 😁
---
⚡ 2. Gunakan variabel itu dalam event
Untuk gerak:
When key A pressed → Add -Player1.Variable(Speed) * TimeDelta() to X position
→ jadi karakter besar bergerak lebih lambat.
Untuk serangan:
Subtract Player1.Variable(AttackDamage) from Player2HP
Untuk projektil:
Ketika Projectile2 menabrak Player1:
Subtract Player2.Variable(ProjectileDamage) from Player1HP
Delete Projectile2
---
💥 3. Bikin efek visual pembeda
Player besar: tubuh lebar, warna lebih gelap atau armor.
Player kurus: tubuh ramping, aura/bola energi besar.
Projektil Player2 bisa:
Ukuran 48×48 px
Kecepatan force 600–800
Warna cerah (misal biru atau ungu muda).
---
🎯 4. Tips Balancing
Agar gameplay tetap seru dan tidak berat sebelah:
Aturan Keseimbangan Kenapa
Selisih HP × kecepatan × damage total kira-kira sama Supaya peluang menang relatif seimbang
Projektil besar tapi mudah dihindari (lambat sedikit) Biar tidak OP
Serangan dekat karakter besar knockback-nya lebih jauh Menambah kesan kekuatan fisik
Contoh perhitungan kasar:
Player1 total daya tahan: 200 HP × 1.0 kecepatan × 20 damage = 4000
Player2 total daya tahan: 100 HP × 2.0 kecepatan × 10 (close) / 30 (ranged) ≈ seimbang
---
🧩 5. (Opsional) Tambahkan cooldown serangan
Biar tidak bisa “spam” terus:
Tambahkan variabel canAttack = 1.
Saat serang ditekan, ubah ke 0 dan mulai Timer 0.5 detik.
Setelah 0.5 detik, ubah lagi ke 1.
---
Kalau kamu mau, aku bisa bantu tuliskan event logic GDevelop-nya (dalam bentuk urutan klik) untuk membuat perbedaan kekuatan ini secara penuh —
mulai dari variabel, event serangan, sampai efek HP.
Apakah kamu mau saya lanjutkan dengan panduan klik-step di GDevelop supaya perbedaan karakter besar & kurus itu langsung bisa jalan di proyekmu?
---
Mantap! 💪🔥
Kita lanjut ke panduan klik-step GDevelop biar kamu bisa langsung buat dua karakter dengan perbedaan kekuatan dan HP — tanpa perlu coding, cukup lewat klik dan isi nilai aja.
Panduan ini bisa kamu ikuti di GDevelop versi offline maupun online, sama persis tampilannya.
---
🧩 Langkah-Langkah Membuat Dua Karakter Berbeda di GDevelop
---
🟢 1. Siapkan Objek
Buka proyek kamu → buka Scene utama → pastikan sudah ada:
Nama Jenis Catatan
Player1 Sprite Karakter besar (tank)
Player2 Sprite Karakter kurus (blaster)
Projectile2 Sprite Bola energi Player2
HP1Text & HP2Text Text Menampilkan HP
---
⚙️ 2. Tambahkan Variabel di Tiap Player
Klik Player1 → tab Variables → tambah tiga variabel:
Nama Nilai
Speed 150
HP 200
AttackDamage 20
Klik Player2 → tambah empat variabel:
Nama Nilai
Speed 250
HP 100
AttackDamage 10
ProjectileDamage 30
---
🎮 3. Event untuk Gerakan Player
➤ Player1 (A & D)
1. Add new event
2. Condition → Keyboard → Key pressed → pilih A
3. Action → Player1 → Add to X position → nilai -Player1.Variable(Speed) * TimeDelta()
4. Tambah event baru → Condition: Key D pressed
→ Action: Add to X position Player1.Variable(Speed) * TimeDelta()
---
➤ Player2 (← & →)
1. Condition → Left key pressed
→ Action: Player2 → Add to X position -Player2.Variable(Speed) * TimeDelta()
2. Condition → Right key pressed
→ Action: Player2 → Add to X position Player2.Variable(Speed) * TimeDelta()
---
🥊 4. Event Serangan Dekat
➤ Player1 (W)
1. Condition → Key W pressed
(tambahkan kondisi kedua opsional: Distance between Player1 and Player2 < 100)
2. Action → Subtract Player1.Variable(AttackDamage) from Player2.Variable(HP)
---
➤ Player2 (↑)
1. Condition → Up key pressed
(tambahkan kondisi kedua opsional: Distance between Player2 and Player1 < 100)
2. Action → Subtract Player2.Variable(AttackDamage) from Player1.Variable(HP)
---
🔮 5. Serangan Projektil (Jarak Jauh)
➤ Player2 (↓)
1. Condition → Down key pressed
2. Action 1 → Create object Projectile2 at Player2.X(); Player2.Y()
3. Action 2 → Add permanent force (angle 180°, speed 600) to Projectile2
(Karena Player2 ada di kanan, proyektil diarahkan ke kiri; kalau sebaliknya, ubah jadi angle 0°.)
---
💥 6. Tabrakan Projektil
1. Condition → Collision between Projectile2 and Player1
2. Action →
Subtract Player2.Variable(ProjectileDamage) from Player1.Variable(HP)
Delete object Projectile2
---
❤️ 7. Update Tampilan HP
Tambahkan event tanpa kondisi (selalu jalan):
Aksi
Do = "HP1: " + ToString(Player1.Variable(HP)) to text of HP1Text
Do = "HP2: " + ToString(Player2.Variable(HP)) to text of HP2Text
---
🏁 8. Kondisi Menang
Kondisi Aksi
Player1.Variable(HP) <= 0 Create text “PLAYER 2 WINS!”; Pause the game
Player2.Variable(HP) <= 0 Create text “PLAYER 1 WINS!”; Pause the game
---
💡 Tips Bonus
Supaya tidak “spam attack”, tambahkan cooldown:
Buat variabel canAttack = 1 di tiap player.
Saat menyerang: set canAttack = 0, mulai timer “AttackDelay”.
Event lain: Timer > 0.5 detik → set canAttack = 1.
Tambahkan efek “hit” (misalnya flash putih atau teks “-20”) pakai objek teks kecil sementara.
---
Kalau kamu mau, aku bisa bantu susunkan layout posisi awal di layar (koordinat X/Y yang ideal biar dua player pas saling berhadapan di arena 800×450),
dan event tambahan untuk knockback sederhana (lawan terdorong saat kena pukul).
Kamu mau lanjut ke bagian posisi & knockback itu sekarang?
---
Keren banget kamu udah mikirin UI-nya 💪 — ini langkah penting biar game fighting kamu terasa “utuh” seperti game beneran, bukan cuma percobaan scene.
Kita buat bareng UI-nya yang simpel tapi jelas: menu Start → masuk ke arena game.
---
🎨 Struktur UI Dasar untuk Game Fighting 2D
Kita butuh dua Scene di GDevelop:
Scene Fungsi
MenuScene Halaman utama: tombol “Start Game”, “Exit”
FightScene Arena pertarungan dua player
---
🧩 1️⃣ Buat Scene Menu
📌 Langkah:
1. Di kiri atas GDevelop, klik Project Manager → Scenes → Add a new scene
2. Ganti nama jadi MenuScene
3. Buka MenuScene
---
🎮 2️⃣ Tambahkan Objek UI
Kita pakai Text Object sebagai tombol sederhana (belum butuh grafis rumit):
1. Klik kanan di area “Objects” → Add a new object → Text
Nama: StartText
Tulisan: START GAME
Font size: 48
Warna: putih
Posisi: tengah layar (misal X=300, Y=200)
2. Ulangi lagi buat:
ExitText
Tulisan: EXIT
Font size: 36
Posisi: X=330, Y=300
---
⚙️ 3️⃣ Buat Event untuk Tombol
Klik tab Events → tambahkan logika berikut:
---
🎬 Event: Klik Start Game
Condition:
> Mouse button released
Cursor/touch is on StartText
Action:
> Change scene to "FightScene"
---
🚪 Event: Klik Exit
Condition:
> Mouse button released
Cursor/touch is on ExitText
Action:
> Exit the game
(Gunakan action: “Quit the game” di kategori Game management)
---
🌈 (Opsional) Efek Hover
Biar tombol terasa hidup:
Condition: Cursor/touch is on StartText
Action: Change text color to yellow
Condition: Cursor/touch is not on StartText
Action: Change text color to white
(Sama juga untuk ExitText.)
---
⚡ 4️⃣ Jalankan Game dari Menu
Sekarang buka Project Manager → Game settings → Startup scene,
ubah dari default (biasanya Scene1) ke MenuScene.
Jadi saat kamu klik “Preview”, yang pertama muncul adalah menu utama.
---
🎯 5️⃣ (Opsional) Tambahkan Logo atau Judul
Biar keren:
Tambahkan Text Object dengan tulisan DOODLE FIGHTER di atas tombol Start.
Tambahkan latar belakang warna gelap atau gradient (bisa pakai Sprite object).
---
💡 Tips Tambahan
Kalau nanti kamu mau versi controller, tombol bisa diganti dengan key (misal Enter = Start).
Untuk transisi lebih halus: tambahkan efek fade in/out pakai layer hitam semi transparan.
Kalau ingin pakai sprite tombol (bukan teks), tinggal buat Sprite → event-nya sama, hanya ganti “Cursor on object StartSprite”.
---
Kalau kamu mau, aku bisa bantu buat template scene Menu lengkap (layout + event) dalam bentuk daftar klik-klik langkah di GDevelop — biar kamu tinggal ikuti seperti resep.
Apakah kamu mau versi teks step-by-step praktis itu, atau mau versi visual diagram logika event-nya (yang mirip flowchart)?
---
Keren banget — kamu sudah sampai ke tahap flow game lengkap! 🔁🔥
Jadi alurnya seperti ini:
➡️ Menu Scene → Fight Scene → (Player menang) → Result Scene → kembali ke Menu Scene
Mari kita buat langkah-langkahnya satu per satu, biar bisa langsung kamu klik di GDevelop tanpa coding.
---
🧭 ALUR SINGKAT
1️⃣ MenuScene → Tombol “Start” → buka FightScene
2️⃣ FightScene → Jika HP salah satu = 0 → buka ResultScene
3️⃣ ResultScene → Tombol “Main Lagi” → kembali ke MenuScene
---
⚙️ 1. Buat Scene Baru untuk Hasil Pertarungan
Klik Project Manager → Scenes → Add a new scene
Nama: ResultScene
Buka Scene tersebut.
Tambahkan 2 objek Text:
Nama Isi Posisi Keterangan
WinnerText “PLAYER 1 WINS!” X=250, Y=180 Teks hasil (nanti bisa diganti otomatis)
BackText “BACK TO MENU” X=270, Y=280 Tombol kembali ke menu
---
🧩 2. Simpan Siapa yang Menang (di FightScene)
Kamu perlu Global Variable agar hasil menang bisa dibawa antar-scene.
➤ Langkah:
1. Di kiri → klik Project Manager → Game Variables (ikon bumi)
2. Tambah variabel baru:
Nama: WinnerName
Tipe: String (kosong)
➤ Tambahkan event di FightScene:
Event 1:
Condition → Player1.Variable(HP) <= 0
Action →
Set GlobalVariable WinnerName = "PLAYER 2"
Change scene to "ResultScene"
Event 2:
Condition → Player2.Variable(HP) <= 0
Action →
Set GlobalVariable WinnerName = "PLAYER 1"
Change scene to "ResultScene"
---
🖼️ 3. Tampilkan Pemenang di ResultScene
Masuk ke ResultScene → Events
Tambahkan event tanpa kondisi:
Action:
> Do = GlobalVariableString(WinnerName) + " WINS!" to text of WinnerText
---
🖱️ 4. Tombol “Back to Menu”
Tambahkan event:
Condition:
> Mouse button released
Cursor/touch is on BackText
Action:
> Change scene to "MenuScene"
---
🌀 5. (Opsional) Tombol “Main Lagi”
Kalau kamu mau langsung ulang pertarungan tanpa ke menu:
Tambahkan PlayAgainText (isi: “PLAY AGAIN”) di ResultScene.
Event-nya:
Condition:
> Mouse button released
Cursor/touch is on PlayAgainText
Action:
> Change scene to "FightScene"
---
💡 Tambahan Estetika
Tambahkan fade-in/out effect:
Buat layer hitam semi transparan, ubah opacity saat scene berubah.
Atau tambahkan animasi teks “WINS!” dengan scale tween biar terasa berenergi.
---
Kalau kamu mau, aku bisa bantu tuliskan template urutan event lengkap (Menu → Fight → Result) dalam format yang bisa langsung kamu tiru klik per klik di GDevelop — seperti resep siap pakai.
Kamu mau versi itu?
---
Nah, pertanyaan ini penting banget 💡 — dan bagus kamu tanyakan sekarang, karena ini titik di mana game kamu bisa naik kelas dari “doodle” ke “game yang terasa hidup” tanpa harus rumit.
Jawaban singkatnya:
👉 Tidak, karakter tidak harus cuma satu gambar.
Kamu bisa (dan sebaiknya) memberi beberapa frame animasi di GDevelop supaya gerakan seperti jalan, pukul, diam, kena serang tampak hidup.
---
🎨 Konsep Dasar: Sprite dengan Animasi di GDevelop
Setiap karakter (Player1, Player2) adalah 1 objek Sprite,
tapi di dalamnya kamu bisa punya banyak animasi,
dan di setiap animasi ada beberapa frame gambar.
---
📁 Contoh Struktur Player
Animasi Deskripsi File yang dibutuhkan
Idle Diam di tempat idle_1.png, idle_2.png, ...
Walk Jalan maju/mundur walk_1.png, walk_2.png, walk_3.png
Punch Serangan dekat punch_1.png, punch_2.png, punch_3.png
Hit Saat kena pukul hit_1.png, hit_2.png
Dead Saat kalah dead_1.png, dead_2.png
---
⚙️ Cara Menambah Animasi di GDevelop
1️⃣ Klik objek Player1 di panel kiri → Edit object
2️⃣ Di tab “Animations”, kamu bisa tambahkan baris baru dengan tombol (+) Add animation
3️⃣ Beri nama sesuai (misal “Idle”, “Walk”, dll)
4️⃣ Klik “Add sprite(s)” dan masukkan frame-frame gambarnya
5️⃣ Centang “Loop” untuk animasi yang berulang (seperti Idle atau Walk)
---
🧠 Cara Mengontrol Animasi (pakai Event)
Kamu tinggal atur logika di Event Sheet. Contoh untuk Player1:
---
🟢 Diam
Condition: Key A not pressed AND Key D not pressed
Action: Change the animation of Player1 to "Idle"
---
🟡 Jalan
Condition: Key A pressed OR Key D pressed
Action: Change the animation of Player1 to "Walk"
---
🔴 Serangan
Condition: Key W pressed
Action: Change the animation of Player1 to "Punch"
---
⚫ Saat kena serang
Condition: Player1 collides with Projectile2
Action: Change animation to "Hit"
(set timer kecil biar balik ke Idle setelah 0.3 detik)
---
☠️ Saat kalah
Condition: Player1.Variable(HP) <= 0
Action: Change animation to "Dead"
---
🧩 Catatan Penting
Semua gambar di satu animasi harus punya ukuran sama (misal 64×64 px).
Kalau Player1 dan Player2 punya ukuran beda, tidak masalah — asalkan tiap animasi dalam satu karakter konsisten ukurannya.
Kamu bisa balik arah karakter yang menghadap kiri-kanan dengan Action:
Flip the object horizontally = Yes
---
💡 Tips untuk Gaya Doodle Sederhana
Kamu gak perlu animasi halus. Cukup:
2 frame untuk idle (karakter sedikit goyang atau berkedip)
3 frame untuk punch
1 frame untuk hit
Sudah cukup bikin hidup.
---
Kalau kamu mau, aku bisa bantu bikin template tabel animasi untuk Player1 dan Player2, lengkap dengan urutan frame, nama file, dan logika transisi antar animasi (klik-step GDevelop-nya).
Kamu mau saya bantu susunkan yang itu biar kamu tinggal ikuti?
---
🎯 Wah, kamu nangkep logikanya dengan tajam banget — dan pertanyaanmu ini justru inti dari “kenapa banyak game fighting 2D terasa hidup”.
Jawabannya:
➡️ Bisa banget!
Kamu boleh dan sebaiknya juga membuat pukulan jarak dekat (melee attack) yang punya deteksi tabrakan seperti projektil.
Cuma, karena pukulan itu bagian dari tubuh karakter, bukan objek terpisah seperti peluru, maka pendekatannya sedikit beda.
---
💡 Kenapa Projektil Lebih Mudah Dideteksi Collide
Projektil (misalnya bola energi) dibuat sebagai objek terpisah, jadi GDevelop bisa mendeteksi tabrakan dengan mudah:
> Collision between Projectile2 and Player1
Tapi kalau serangan dekat berasal dari animasi atau tangan Player1, GDevelop nggak tahu bagian mana yang dianggap "pukulan", karena seluruh tubuh Player1 dihitung satu kotak besar (bounding box).
Makanya pukulannya sering tidak terdeteksi secara tepat kalau cuma pakai:
> Collision between Player1 and Player2
---
🧩 Solusi: “Hitbox” atau “AttackZone” Sederhana
Kita bikin objek kecil tak terlihat yang muncul sesaat ketika Player menyerang.
Objek ini akan jadi detector pukulan.
---
⚙️ Langkah-langkahnya
🟢 1. Buat objek baru
Nama: Player1Hitbox
Jenis: Sprite (1×1 px transparan atau kecil saja, bisa warna merah waktu debug)
Centang “Destroy outside of screen”
---
🟢 2. Saat Player1 menekan tombol serang (misal W)
Tambahkan event:
Condition: Key W pressed
Action 1: Create object Player1Hitbox at Player1.X() + 40; Player1.Y() + 0
Action 2: Add permanent force angle 0°, speed 0
Action 3: Set timer "Punch1" to 0
(posisi X +40 biar muncul di depan tubuhnya, sesuaikan arah)
---
🟡 3. Deteksi Tabrakan
Condition: Player1Hitbox collides with Player2
Action 1: Subtract Player1.Variable(AttackDamage) from Player2.Variable(HP)
Action 2: Change animation of Player2 to "Hit"
Action 3: Delete object Player1Hitbox
---
🔴 4. Hapus Hitbox Setelah 0.3 Detik (biar nggak nabrak terus)
Condition: Timer "Punch1" > 0.3
Action: Delete object Player1Hitbox
---
⚫ 5. Balik arah pukulan
Kalau Player1 bisa menghadap kiri atau kanan, buat dua posisi spawn:
Kalau menghadap kanan → Player1.X() + 40
Kalau menghadap kiri → Player1.X() - 40
Gunakan kondisi tambahan:
Condition: Player1 is flipped horizontally
Action: Create Player1Hitbox at Player1.X() - 40; Player1.Y()
---
✨ Hasilnya
Saat kamu tekan tombol pukul, muncul hitbox kecil di depan karakter.
Kalau menyentuh lawan → lawan kena damage dan animasi “Hit” aktif.
Setelah 0.3 detik → hitbox otomatis hilang.
Dengan ini, logika serangan dekat jadi seefektif peluru, tapi tetap realistis karena hanya aktif sebentar.
---
Kalau kamu mau, aku bisa bantu tuliskan versi klik per klik GDevelop-nya (tanpa penulisan manual) untuk membuat hitbox pukulan ini lengkap dengan arah kanan-kiri dan efek knockback sederhana.
Kamu mau saya lanjutkan ke situ?
---
Pertanyaanmu sangat tajam lagi 🔥 — dan memang, bagian “flip karakter” ini adalah titik yang sering bikin bingung banyak pembuat game pemula di GDevelop.
Mari aku jelaskan secara terstruktur dan simpel supaya kamu paham betul: kapan perlu flip, apa efeknya, dan bagaimana supaya logika lain (gerak, hitbox, projektil, dsb) tetap aman ✅
---
🧠 1️⃣ Apa Itu “Flip” di GDevelop
“Flip horizontally” artinya:
> GDevelop membalik gambar karakter ke arah berlawanan di layar,
tanpa mengubah koordinat posisi X sama sekali.
Jadi:
Kalau semula menghadap kanan, lalu kamu flip → ia tampak menghadap kiri.
Tapi posisi koordinat X tetap sama (tidak berpindah tempat).
Artinya:
👉 Secara logika game, Player1 tetap di X = 300,
tapi secara visual dia berubah arah.
---
🎮 2️⃣ Kapan Kamu Perlu Flip
Kamu perlu “flip” saat pemain menekan arah berlawanan.
Contoh untuk Player1 (kontrol A/D):
Condition: Key D pressed
Action:
- Add to Player1.X position = +Speed * TimeDelta()
- Flip Player1 horizontally = No (menghadap kanan)
Condition: Key A pressed
Action:
- Add to Player1.X position = -Speed * TimeDelta()
- Flip Player1 horizontally = Yes (menghadap kiri)
Itu saja sudah cukup untuk membuat karakter menoleh ke arah gerakan.
---
⚙️ 3️⃣ Apakah Flip Mempengaruhi Logika Lain?
Jawaban:
➡️ Tidak langsung, tapi bisa memengaruhi posisi spawn objek baru
(seperti hitbox, projektil, atau efek serangan*).
Kenapa?
Karena ketika kamu membuat objek baru (misal peluru atau hitbox), kamu biasanya meletakkannya di:
Player1.X() + 40
Artinya di depan karakter kalau ia menghadap kanan.
Tapi kalau karakter lagi flip (menghadap kiri),
“depan”-nya justru di arah -40, bukan +40.
---
🔄 4️⃣ Jadi Solusinya: Kondisi Arah saat Spawn
Kamu hanya perlu tambahkan kondisi arah saat membuat objek.
Contoh untuk hitbox atau projektil:
Condition: Key W pressed
Sub-condition: Player1 is flipped horizontally = No
Action: Create object Player1Hitbox at Player1.X() + 40; Player1.Y()
Condition: Key W pressed
Sub-condition: Player1 is flipped horizontally = Yes
Action: Create object Player1Hitbox at Player1.X() - 40; Player1.Y()
Dengan begitu:
Kalau Player1 menghadap kanan → hitbox muncul di kanan.
Kalau Player1 menghadap kiri → hitbox muncul di kiri.
---
🧩 5️⃣ Efek ke Projektil
Logikanya sama.
If Player2 is flipped horizontally = No → arah peluru ke kanan (angle 0°)
If Player2 is flipped horizontally = Yes → arah peluru ke kiri (angle 180°)
---
⚖️ Kesimpulan
Komponen Terpengaruh Flip? Solusi
Gerak (A/D) Tidak Hanya ubah arah flip-nya
Animasi Tidak Bisa pakai animasi sama
Hitbox serangan Ya Buat dua posisi (kanan & kiri)
Projektil Ya Atur arah & posisi sesuai flip
HP/damage Tidak Tidak terpengaruh sama sekali
---
Dengan kata lain:
👉 Flip itu cuma visual, bukan logika posisi,
tapi kamu perlu menyesuaikan posisi objek yang muncul di depan karakter agar tetap sesuai arah menghadapnya.
---
Kalau kamu mau, aku bisa bantu tuliskan template event GDevelop lengkap untuk satu karakter yang sudah:
Bisa jalan kiri–kanan,
Otomatis flip arah,
Punya serangan dekat dengan hitbox dinamis kanan/kiri,
Dan animasi berpindah dengan benar.
Kamu mau saya buatkan versi itu (format klik-klik event GDevelop, bukan teks kode)?
---