Bölüm Seviyesi: Orta 

Bir önceki bölümde RPG oynumuz için bir envanter oluşturmuştuk. Bu envanterdeki eşyalar ekrana yansıtılıyordu. Bu bölümde, hareket eden bir karakter oluşturacağız. Projeyi temiz tutmak için, envanter sistemini ekranın sol üst köşesine aldım.Eşyaların da sadece isimleri ve seviyeleri olacak şekilde tanımladım. Şu anda ekranım şöyle gözüküyor:

Şimdi, her RPG bir karakter gerektirir. Bu bölümde, bu karakteri nasıl hareket ettireceğimizi öğreneceğiz.

Öncelikle, karakter için koordinatlar tanımlayalım. Karakterin özelliklerinin bir tablo içinde olacağını tahmin edebilirsiniz tabii.

Bu koordinatlarda, oyuncuyu bir kare olarak çizmek istiyoruz. Şimdi, bunun için love.graphics.rectangle() fonksiyonunu kullanacağız.

love.graphics.rectangle(mod, x,y,genişlik,yükseklik) şeklinde yazılan bu fonksiyonun “mod” parametresinin yerine “line” veya “fill” gelir ve buna bağlı olarak çizilen dikdörtgenin içi dolu veya boş olur. Şimdi, bunu kullanarak 64×64 boyutunda bir kare çizelim. Bunu tabii ki de love.draw() fonksiyonu içerisinde yaparız.

Her şeyi doğru yaptıysak ekranda öylece duran bir kare vardır. Şimdi, bunu hareket ettirmeyi öğreneceğiz. Bunun için love.update(dt)’a ilk kez kod yazacağız.

love.keyboard.isDown(tuş) fonksiyonu, “tuş” parametresinin basılı olup olmadığını kontrol eder ve eğer basılı ise “true”, değilse “false” çıktısı verir. Peki bunu nasıl kullanacağız?

Bu kod, her bir döngüde (love.update sürekli devam eder), eğer “d” tuşu basılı ise oyuncunun x koordinatına 32’nin dt ile çarpımını ekler. love.update(dt) fonksiyonundaki dt ne anlama gelir?

dt, oyunun bir önceki frame’inin (sahne) üzerinden geçen süreyi belirtir. İdeal olarak çok küçük bir sayıdır ve ekranın framerate (sahne hızı) ile eşittir. Modern bir bilgisayar saniyede 60 sahne değiştirir dolayısıyla modern bilgisayar oyunları filmlere göre bile daha akıcıdır. (Bir sinema filmi genelde saniyede 24 sahneye sahiptir)

Bilgisayar, oyunu kaldıramadığı zaman  framerate drop veya fps drop denen bir olay gerçekleşir. Bu durumda bilgisayar oyunun kodunu çalıştırmak için 1 saliseden daha uzun süreye ihtiyaç duyar dolayısıyla da sahne geç yüklenir. Bu ne demek oluyor:

Eğer oyun içinde sahne geç yüklenirse, oyuncu da geç hareket eder ve yavaşlar (Çünkü aynı sürede daha az mesafe kateder). Ama biz hızın sabit olmasını istiyoruz. dt, bir önceki sahneden beri geçen süreye tekamül eder ve bunu istediğimiz hızla çarparak, oyuncunun bu mesafeyi tam 1 saniyede gitmesini sağlarız.

Bunu aklınızda şu şekilde canlandırabilirsiniz:

Eğer bir film siz izlerken durursa ve siz filmin sonunda bir yere yetişmek istiyorsanız, filmin zamanında bitmesi için onu ileri almak zorunda kalırsınız.

Yukarıda yazılan kodu, elseif ile a için de yazabiliriz:

Her tuş için ayrı bir if ifadesi yazabilecekken, bu şekilde yazmak daha düzenli gözükür. Yukarıdaki kod, “d” basılı ise “a”yı kontrol etmeyeceğinden, eğer “a” ve “d” birlikte basılı tutulursa oyuncu düşündüğü gibi durmaz, sağ gider. Bu, şu sebeple bir sorun ifade etmez: “a” ve “d” tuşuna birlikte basmak mantıklı olmadığı için oyuncunun mantıklı bir sonuç beklemesi hatadır.

Şimdi, bu kodu aynı şekilde, “w” tuşu ile yukarıya doğru (-y) ve “s” ile aşağıya (+y) doğru hareket etmek için yazalım.

Karakterin hızını istediğiniz gibi değiştirebilirsiniz. Saniyede 64-128 piksel yaygın bir değerdir.

Hazır hız değiştirmek demişken, hızı bir değişken yapalım. Bunun için oyuncunun özelliklerini içeren tabloya hız için bir değişken ekleyelim. Hızın değişkene bağlı olması için de hareket kodunu biraz değiştirelim.

Tebrikler, artık karemizi WASD tuşları ile hareket ettirebiliyoruz.

Bir sonraki bölümde karakterimizin yerde bulduğu eşyaları envanterine ekleyebilmesini sağlayacağız.

print(“Görüşürüz!”)

love.event.quit()

4
like
0
love
0
haha
0
wow
0
sad
0
angry
  Abone ol  
Bildir