0Pricing
Lua Academy · Pelajaran

Gerakan dan Tabrakan

Buat adegan yang dapat dimainkan.

Gerakan dan Tabrakan adalah pelajaran Lua Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Lua Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Lua Academy mencakup 4 pelajaran total.

Posisi dan Kecepatan

Gerakan dalam LÖVE berarti mengubah posisi suatu objek seiring waktu. Simpan x dan y, lalu tambahkan kecepatan di dalam love.update yang diskalakan dengan dt.

Menyimpan kecepatan sebagai dx dan dy per detik membuat gerakan diagonal dan fisika lebih rapi serta tidak bergantung pada laju bingkai.

function love.update(dt)
  player.x = player.x + player.dx * dt
  player.y = player.y + player.dy * dt
end

Gerakan yang Dikendalikan Masukan

Gabungkan pemeriksaan berkala dengan kecepatan untuk mengarahkan objek. Baca tombol arah di dalam love.update, lalu terapkan kecepatan dikalikan dt.

Karena love.keyboard.isDown diperiksa pada setiap bingkai, pemain bergerak dengan lancar selama tombol ditahan.

function love.update(dt)
  if love.keyboard.isDown('left') then player.x = player.x - player.speed*dt end
  if love.keyboard.isDown('right') then player.x = player.x + player.speed*dt end
end

Menormalkan Kecepatan Diagonal

Menekan dua tombol arah sekaligus membuat gerakan diagonal lebih cepat karena kedua sumbu menambahkan kecepatan penuh. Untuk memperbaikinya, normalkan vektor gerakan.

Bagi arah dengan panjangnya agar besarannya menjadi 1, lalu kalikan dengan kecepatan. Kini gerakan diagonal sama cepatnya dengan gerakan lurus.

local dx, dy = ix, iy
local len = math.sqrt(dx*dx + dy*dy)
if len > 0 then
  player.x = player.x + (dx/len) * player.speed * dt
end

Menjaga Objek Tetap di Dalam Layar

Batasi posisi agar objek tetap berada di layar. Baca ukuran jendela dengan love.graphics.getWidth dan getHeight, lalu batasi koordinatnya.

math.max dan math.min bersama-sama membatasi nilai di antara nilai minimum dan maksimum dengan rapi.

local w = love.graphics.getWidth()
player.x = math.max(0, math.min(player.x, w - player.size))

Kotak Pembatas Sejajar Sumbu

Tabrakan paling sederhana menggunakan persegi panjang yang disebut AABB, singkatan dari kotak pembatas sejajar sumbu. Setiap objek memiliki x, y, lebar, dan tinggi.

Dua kotak saling tumpang tindih ketika keduanya beririsan pada sumbu horizontal dan vertikal secara bersamaan. Pemeriksaan ini cepat dan cukup untuk sebagian besar permainan 2D.

-- box: { x, y, w, h }

Pengujian Tumpang Tindih AABB

Dua persegi panjang saling tumpang tindih ketika tidak ada sumbu yang membuat sisi kiri salah satunya melewati sisi kanan yang lain. Pengujian klasik ini menggabungkan empat perbandingan.

Jika keempatnya bernilai benar, kotak-kotak tersebut beririsan. Satu kondisi ini menjadi dasar utama pendeteksian tabrakan 2D.

function overlaps(a, b)
  return a.x < b.x + b.w and
         b.x < a.x + a.w and
         a.y < b.y + b.h and
         b.y < a.y + a.h
end

Menanggapi Tabrakan

Setelah overlaps mengembalikan nilai true, tentukan tindakan yang harus terjadi: ambil koin, terima kerusakan, atau hentikan gerakan. Periksa tabrakan di dalam love.update setelah bergerak.

Untuk benda yang dapat diambil, cukup hapus bendanya atau tambah skor. Untuk dinding padat, dorong pemain kembali ke luar.

function love.update(dt)
  movePlayer(dt)
  if overlaps(player, coin) then
    score = score + 1
    coin.dead = true
  end
end

Tabrakan Lingkaran

Untuk objek berbentuk bulat, tabrakan berdasarkan jarak lebih akurat. Dua lingkaran bertabrakan ketika jarak antara titik tengahnya lebih kecil daripada jumlah jari-jarinya.

Membandingkan jarak kuadrat menghindari perhitungan akar kuadrat yang mahal, sebuah pengoptimalan umum saat memeriksa banyak objek.

function circlesHit(a, b)
  local dx, dy = a.x - b.x, a.y - b.y
  local rsum = a.r + b.r
  return dx*dx + dy*dy < rsum*rsum
end

Menyelesaikan Tabrakan dengan Dinding

Untuk menghentikan pemain di dinding, pendekatan sederhana adalah bergerak pada setiap sumbu secara terpisah dan membatalkan langkah yang menyebabkan tumpang tindih.

Gerakkan x, lalu uji; jika terjadi tabrakan, kembalikan x. Ulangi untuk y. Penyelesaian yang memisahkan sumbu ini mencegah objek tersangkut di sudut.

player.x = player.x + vx * dt
if overlaps(player, wall) then player.x = player.x - vx * dt end
player.y = player.y + vy * dt
if overlaps(player, wall) then player.y = player.y - vy * dt end

Menerapkan Gravitasi

Permainan platform menambahkan percepatan konstan ke bawah. Tingkatkan kecepatan vertikal sebesar gravitasi dikalikan dt pada setiap bingkai, lalu terapkan kecepatan itu pada posisi.

Saat pemain mendarat di tanah, nolkan kecepatan vertikal agar ia berhenti jatuh. Lompatan menetapkan kecepatan vertikal negatif.

function love.update(dt)
  player.dy = player.dy + GRAVITY * dt
  player.y = player.y + player.dy * dt
end

Menghapus Objek yang Sudah Tidak Aktif

Setelah terjadi tabrakan, Anda sering kali perlu menghapus objek. Telusuri daftar dari belakang dan panggil table.remove agar indeks tetap valid saat menghapus.

Penelusuran dari belakang adalah cara Lua yang aman untuk menghapus item di tengah pengulangan, sehingga entri tidak terlewati seperti yang dapat terjadi pada penelusuran dari depan.

for i = #coins, 1, -1 do
  if coins[i].dead then
    table.remove(coins, i)
  end
end

Pemeriksaan Singkat

Uji pemahaman Anda tentang gerakan dan tabrakan dalam LÖVE.

Ringkasan

Gerakan menggabungkan posisi, kecepatan, dan dt, dengan normalisasi untuk membuat gerakan diagonal tetap seimbang serta pembatasan agar objek tetap di layar. Tabrakan dimulai dengan pengujian tumpang tindih AABB, disertai pemeriksaan jarak lingkaran untuk objek bulat.

Selesaikan tabrakan dengan dinding dengan mengembalikan gerakan per sumbu, tambahkan gravitasi untuk permainan platform, dan hapus objek yang sudah tidak aktif dengan menelusuri daftar dari belakang menggunakan table.remove.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Gerakan dan Tabrakan” gratis?

Ya — teks lengkap “Gerakan dan Tabrakan” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Lua Academy, upgrade ke CoddyKit PRO. Kursus Lua Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Gerakan dan Tabrakan”?

Buat adegan yang dapat dimainkan. Kamu berlatih Lua Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Lua Academy?

Tidak diperlukan pengalaman sebelumnya. Lua Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Gerakan dan Tabrakan” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Lua Academy ini?

Ya. Setiap pelajaran Lua Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Loop Gim LOVE
  2. Menggambar Bentuk dan Gambar
  3. Menangani Masukan
  4. Gerakan dan Tabrakan
← Kembali ke Lua Academy