0Pricing
Lua Academy · Ders

Hareket ve Çarpışmalar

Oynanabilir bir sahne oluşturun.

Hareket ve Çarpışmalar, CoddyKit'te ücretsiz bir Lua Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Lua Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Lua Academy kursu toplamda 4 dersten oluşur.

Konum ve Hız

LÖVE'de hareket, bir nesnenin konumunu zaman içinde değiştirmek anlamına gelir. x ve y değerlerini saklayın, ardından love.update içinde hızı dt ile ölçekleyerek ekleyin.

Hızı saniye başına dx ve dy olarak tutmak, çapraz hareketi ve fiziği temiz ve kare hızından bağımsız hale getirir.

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

Girdiyle Yönlendirilen Hareket

Bir nesneyi yönlendirmek için yoklamayı hız ile birleştirin. Yön tuşlarını love.update içinde okuyun ve hız çarpı dt değerini uygulayın.

love.keyboard.isDown her karede denetlendiği için oyuncu tuş basılı tutulduğu sürece akıcı biçimde hareket eder.

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

Çapraz Hızı Normalleştirme

İki yön tuşuna aynı anda basmak, her iki eksene de tam hız eklendiği için çapraz hareketi hızlandırır. Bunu düzeltmek için hareket vektörünü normalleştirin.

Yönü uzunluğuna bölerek büyüklüğünü 1 yapın, ardından hız ile çarpın. Böylece çapraz hareket, düz hareketle aynı mesafeyi alır.

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

Ekran İçinde Tutma

Nesnelerin ekranda kalması için konumu sınırlandırın. Pencere boyutunu love.graphics.getWidth ve getHeight ile okuyup koordinatlara sınır uygulayın.

math.max ve math.min birlikte kullanıldığında bir değeri minimum ve maksimum arasında düzgün biçimde sınırlar.

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

Eksenlere Hizalı Sınırlayıcı Kutular

En basit çarpışma yöntemi, eksenlere hizalı sınırlayıcı kutuların kısaltması olan AABB adı verilen dikdörtgenleri kullanır. Her nesnenin x, y, genişlik ve yükseklik değerleri vardır.

İki kutu, aynı anda hem yatay hem de dikey eksenlerde kesiştiklerinde üst üste gelir. Bu denetim hızlıdır ve çoğu 2B oyun için yeterlidir.

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

AABB Çakışma Denetimi

İki dikdörtgen, eksenlerin hiçbirinde birinin sol kenarı diğerinin sağ kenarını geçmiyorsa üst üste gelir. Klasik denetim dört karşılaştırmayı birleştirir.

Dört karşılaştırmanın tümü doğruysa kutular kesişir. Bu tek koşul, 2B çarpışma tespitinin temel aracıdır.

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

Çarpışmaya Tepki Verme

overlaps true döndürdüğünde ne olacağına karar verin: bir parayı alın, hasar alın veya hareketi durdurun. Çarpışmaları hareket ettikten sonra love.update içinde denetleyin.

Toplanabilir nesneler için öğeyi kaldırmanız veya puanı artırmanız yeterlidir. Katı duvarlar için oyuncuyu geriye, dışarı doğru itersiniz.

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

Daire Çarpışmaları

Yuvarlak nesneler için uzaklığa dayalı çarpışma daha doğrudur. İki daire, merkezleri arasındaki uzaklık yarıçaplarının toplamından küçük olduğunda çarpışır.

Kare uzaklıkları karşılaştırmak, maliyetli karekök işlemini önler. Bu, çok sayıda nesneyi denetlerken yaygın bir iyileştirmedir.

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

Duvar Çarpışmalarını Çözümleme

Bir oyuncuyu duvarda durdurmak için basit bir yaklaşım, her eksende ayrı ayrı hareket etmek ve çakışmaya neden olan adımı geri almaktır.

x yönünde hareket edin ve denetleyin; çarpışma varsa x değerini geri yükleyin. Aynısını y için tekrarlayın. Bu eksenleri ayıran çözümleme, köşelere takılmayı önler.

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

Yerçekimi Uygulama

Platform oyunları sabit bir aşağı yönlü ivme ekler. Her karede dikey hızı yerçekimi çarpı dt kadar artırın, ardından hızı konuma uygulayın.

Oyuncu zemine indiğinde düşmeyi durdurmak için dikey hızı sıfırlayın. Zıplama, negatif bir dikey hız belirler.

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

Etkisiz Nesneleri Kaldırma

Çarpışmalardan sonra çoğu zaman nesneleri kaldırmanız gerekir. Bir listeyi sondan başlayarak dolaşın ve silme sırasında indislerin geçerli kalması için table.remove çağrısını kullanın.

Geriye doğru dolaşmak, döngünün ortasında öğe kaldırmak için güvenli Lua deyimidir; ileriye doğru dolaşmanın neden olacağı atlanan öğeleri önler.

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

Hızlı Kontrol

LÖVE'de hareket ve çarpışmalar konusundaki anlayışınızı sınayın.

Özet

Hareket; konum, hız ve dt değerlerini birleştirir. Adil çapraz hareket için normalleştirme, nesneleri ekranda tutmak için de sınırlandırma kullanılır. Çarpışmalar AABB çakışma denetimleriyle başlar; yuvarlak nesneler için daire uzaklığı denetimleri kullanılır.

Duvarları eksen başına hareketleri geri alarak çözümleyin, platform oyunları için yerçekimi ekleyin ve etkisiz nesneleri table.remove ile sondan başlayarak dolaşarak kaldırın.

Sıkça Sorulan Sorular

“Hareket ve Çarpışmalar” dersi ücretsiz mi?

Evet — “Hareket ve Çarpışmalar” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Lua Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Lua Academy kursu toplamda 4 dersten oluşur.

“Hareket ve Çarpışmalar” dersinde ne öğreneceğim?

Oynanabilir bir sahne oluşturun. Lua Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Lua Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Lua Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“Hareket ve Çarpışmalar” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Lua Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Lua Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. LOVE Oyun Döngüsü
  2. Şekil ve Görüntü Çizme
  3. Girdiyi Yönetme
  4. Hareket ve Çarpışmalar
← Lua Academy Sayfasına Dön