Bölüm Seviyesi: Orta

Şimdiye kadar olan bölümlerde, sadece bir envanter değil, WASD ile hareket edebilen bir karakter kodladık! Bu bölümde karakterimizin yerden ganimet toplayabilmesini sağlayacağız. Bunun için, öncelikle yerde bulunan eşyaları içeren bir tablo oluşturalım. Bu bölüme geldiyseniz, zaten nasıl yapılacağını biliyorsunuz 🙂

Şimdi, yerde olan eşyaların, kendilerine ait özelliklerin dışında, bir de koordinatları olmalı. Bunu şu şekilde yazabiliriz:

Şimdi, tablomuzun içinde yerdeki eşya bir tablo şeklinde yazılmakla beraber, eşyanın özelliklerini farklı bir tablo yaptık. Bunun sebebini az sonra göreceksiniz.

Şimdi, eşyaları koordinatlarında çizen bir kod yazalım. Bunun için ipairs yineleyicisini kullanacağız.

Yukarıdaki kod, “loot” tablosundaki bütün eşyalar için, o eşyanın özelliklerini içeren tablodan ismini alarak x ve y koordinatlarına yazar.

Eğer doğru yaptıysanız şöyle görünecektir:

Şimdi, istediğiniz kadar eşyayı tablonuza ekleyebilirsiniz. Tablo elemanlarının arasında virgül kullanmayı unutmayınız.

Bunu yaptıktan sonra, eşyaları toplamaya geçelim. Bunu birçok şekilde tasarlayabilirsiniz ve yaratıcı fikirler görmek hep isterim. Benim yaklaşımım şu olacak:

‘ “E” tuşuna basıldığında eğer oyuncunun yakınında bir eşya var ise o eşya oyuncunun envanterine eklensin.’

Şimdi, ilk aşama olarak, oyuncu her “E” tuşuna bastığında çalışan bir kod yazmalıyız. Bunun için yeni bir löve2d fonksiyonu öğreneceğiz.

love.keypressed(key), oyuncu herhangi bir tuşa bastığında çalışır ve “key” parametresi basılan tuştur.

Yukarıdaki gibi yazarak, basılan tuşun “e” olup olmadığını deneriz. Eğer if döngüsü yazmasaydık, herhangi bir tuşun basılması ile kodumuz çalışırdı. Bunu da şu şekilde deneyebilirsiniz:

Bunu herhangi bir tuş için kullanabilirsiniz! Hazır herhangi bir tuşa basınız demişken, en sevdiğim The Simpsons alıntılarından birisini paylaşayım:

Şimdi, “E” tuşuna basıldığında, loot tablosundaki bütün eşyalar ile oyuncu arasındaki mesafe ölçülecek. Peki iki nokta arasındaki uzaklık nasıl ölçülür?

Pisagor teoremi ile.

Kısacası, iki noktanın arasındaki çizgiyi hipotenüsü (en uzun kenarı) alan bir dik üçgen çizerek ve bu dik üçgenin diğer kenarlarını (a ve b) bularak, pisagor teoremi denilen ve a ve b’nin karelerinin toplamının d’yi ( yani aradaki mesafeyi) vereceğini belirten matematiksel teorem ile mesafeyi buluruz.

Fonksiyon Tanımlama

Şimdi, bunu bir fonksiyon haline getirelim. Evet, kendi fonksiyonumuzu tanımlıyoruz. Bunu yapmak için önce fonksiyonların temelini hatırlayalım. Bir girdi alırlar ve çıktı verirler. Bundan yola çıkarak, bir fonksiyon şöyle tanımlanır:

Bu fonksiyon kısadır, dolayısı ile 2 satır yeterlidir tanımı için. Bu fonksiyon, 4 argüman alır (bunlar, iki noktanın koordinatlarıdır) ve sonuç olarak da (‘return’ ile ‘end’ arasında yazılan değişken veya değerler fonksiyonun çıktısıdır) bunların arasındaki mesafeyi verir. Bunun gibi bir başka fonksiyon tanımı şöyle yapılabilir:

Pek yaratıcı olmayan bu fonksiyon, x değeri 2’den büyük ise true, değil ise false verir. print(ikidenBuyuk(3)) true verecektir. Örnekler bu şekilde çoğaltılabilir.

Şimdi, mesafe fonksiyonumuzu yazdığımıza göre, artık kullanabiliriz. Oyuncu her “E” ye bastığında bütün eşyalar ile arasındaki mesafeyi ölçelim ve eğer bu mesafe 64 pikselden küçük ise çalışan bir if ifadesi yazalım.

Şimdi, bu da çalıştığına göre, e’ye basılınca eşya envantere eklensin. Bunu sağlamak için, eşyanın özelliklerinin tıpkısına sahip bir eleman, envanter tablosuna eklenmeli. Neyse ki yerdeki eşyanın özellikleri, ‘item’ tablosu olarak yerdeki eşyada barınıyor.

Dolayısıyla:

Şimdi, bunu çalıştırırsanız bir şey fark edeceksiniz. Eşya yerden alınarak envantere gelmiyor. Yerdeki eşya envantere kopyalanıyor. Ve bu böyle doğru. Eşyanın yerden giderek envantere gelmesi bir illüzyon olacak. Nasıl mı?

Oyuncu kendisine yakın olan eşyayı envanterine kopyaladıktan milisaniyeler sonra, o eşyayı (yani i endeksli tablo elemanını) yerdeki eşyaların tablosundan çıkarırız.

Şimdi, her şey çalışıyor ise, tebrikler,artık ganimetini savaş alanından toplayabilirsin kahraman! Eğer çalışmıyorsa, kodlarken yaptığınız hatalarınızı gözden geçirin. Ve yukarıdakinden farklı bir yol ile bunu yapabildiyseniz, neden bana söylemiyorsunuz? Tüm sorularınız, istekleriniz ve fikirleriniz ile bana Twitter’da @denizcanTulan‘dan ulaşabilirsiniz!

Şimdi ev ödeviniz, yaratıcı olun! Şimdiye kadar öğrendiklerinizi kullanmaya çalışın ve eğer sevdiğiniz bir şey yaratacak olursanız, paylaşmaktan sakınmayın.

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

love.event.quit()

2
like
0
love
1
haha
0
wow
0
sad
0
angry
1 Yorum konuları
1 Konu cevapları
0 İzleyiciler
 
En çok tepki verilen yorum
En yeni yorumlar
2 Yorum yazarları
DenizcanTuğçe Açıkgöz Son yorum yazarları
  Abone ol  
En Yeniler Eskiler Beğenilenler
Bildir
Tuğçe Açıkgöz
Üye

oha
sen bu konuda bayağı iyisin ağabey!