YsoShooter
Unziplenen YsoShooter dizini içinde:
javac src/Guns/*.java src/Zombies/*.java src/GameClasses/*.java
java src/GameClasses/Game.java
Wasd ya da oklar ile hareket edilebilir.
X ya da sol fare ile ateş edilebilir, R ile şarjörü yeniden doldulabilir, 12345 ile silah seçileilir, Q ile sol E ile sağ silaha geçilebilir.
Esc ile oyun durdurulabilir. Durdurulduğunda bir daha Esc ile devam edilebilir, G ile yeni oyuna başlatılabilir, F ile kaydedilebilir, L ile şuan kaydedilmiş olan oyun durumu yüklenebilir.
Dalga bittiğinde oyun C ile geçişi bekler. Beklerken hareket edilerek mermi toplanabilir, silah değiştirlebilir ve denenebilir ayrıca oyun dosyaya kaydediliebilir ve dosyadan yüklenebilir.
Ortasında c olan beyaz daire sağlık paketlerin üstünden geçilerek sağlık değeri bir arttırılabilir.
Sol üstteki seçili silah numarası ile aynı numaralı siyah sağ üstünde numara olan siyah daire şarjörlerin üstünden geçilerek seçili silahın şarjör sayısı arttırılabilir.
Jframe oluşturur ve bu frame’e GamePanel bağlar.
Oyundaki diğer nesnelerin sınıfları bu abstract sınıftan türer. Serializable marker interface’ini kullanır. x, y koordinatlarını ve objenin x ekseniyla yaptğı açıyı tutar.
Player ve Zombie sınıfları bu sınıftan türer. WIDTH, HEIGHT ve collisionRadius statik sınıf değişkenlerini tutar. Up, down left, right booleanları ile hareket yönünü belirler. collidedWith() ve move() ilgili yerlerde metotlorı çağırıldığında başka bir nesne ile çerpıştığınıda tepki vermesini ve hareket etmesini sağlar. move() metodunda Player sınıfının nesnesi olup olmadığını kontrol eder ve öyle ise mermlerin move() metodunu çağırarak mermileri de hareket ettirir.
GameMover sınıfından türer. GameState sınıfının bir nesnesine sabit bir referans tutar. Shoot, reload booleanları ile silah kullanır. Farenin anlık yerini tutan mouseX ve mouseY tam sayıları kullanarak karakterin dönme açısını override edilen move() metodunda belirler.
Silahtan çıkan mermileri ve asit tükürüklerini birer HashMap’te tutar. Silah envanterini silahları bir ArrayList’te tutarak ve gunIndex ile sağlar.
Can ve skor değerlerini health ve score tam sayılarında tutar.
Test modunda karakterin ölmemesini INVINCIBLE booleanını kullanarak changeHealth() metodunda sağlar.
Silah değiştirmek için changeGun() ve sol, sağ değiştirme metotları vardır.
Karakteri sıfırlayan refresh() metodu vardır.
Oyunun durumunu tutar ve dalga geçişlerini ayarlar. Serializable marker interface’ini kullanır. Player sınıfının bir nesnesine sabit bir referans tutar. Zombie, Explosion, Ammo ve HealthPack sınıfların LinkedListlerini tutar. running ve transition booleanları ile oyunun durdulma durumu ve dalga geçiş durumunu tutar. wave ve unlockedGuns tam sayıları ile hangi dalgada olduğunu ve verilen silahları tutar.
checkState() metodu dalganın bitip bitmediğini kontrol eder ve bitmişse yeni dalgaya geçiş sürecini başlatır. nextWave() metodu sonraki dalgaya geçer. lose(), esc() metotları durum değişikliği yapar. refresh() metodu durumu sıfırlar. testZombie() her zombi tipinden 300 tane olacak şekilde toplam 1200 tane zombi ekler ve karakterin INVINCIBLE booleanını doğru yapar.
GamePanel’a bağlanarak klavye ve mouse girdilerini alır. KeyListener, MouseMotionListener, MouseListener interfacelerini kullanır. Player, GameState, GamePanel sınıflarının nesnelerine referans tutar.
Dalgaları oluştur. Zombi, Ammo ve Healthpack sınıflarının LinkedListinin tutar ve doldurur. addZombie(), addAmmo() ve addHealthPack() yardımcı metotlarını kullanır. GameState’te state değiştirilirken nesneye kaydedilmeden kullanılır.
Oyun döngüsünü ve tüm çizimleri yapar. Jpanel’den türer Runnable interface’ini kullanır GameState, Collision ve Player sınıflarının objelerin birer referans tutar. Önce tüm çizimleri bir BufferedImage’e yapar sonra override edilen drawComponent() metodunda sadece o BuffereImage’i çizer.
Override edilen run() fonksiyonunda sonsuz dögü içinde oyun döngüsünü gameLoop(), System.nanoTime() ve Thread.sleep() kullanarak kurar ve fps hesabı yapar. 30 fps hedefler.
gameLoop() metodunda gameUpdate(), gameRender(), renderTransition(), renderMenu(), renderLoseMenu() metotlarını kullanarak duruma göre çizim ve güncelleme yapar. Sadece Explosion sınıfının draw() metodunu çağırır. Çok büyük çaplı bir proje olmadığından öbür sınıflara draw() metodu yazmadım onları direk metotta çiziyorum. Çizilen her sınıfın draw() metodu olması OOP prensiplerine daha uygun.
gameUpdate() metodu player.move(), her zombi için zombie.move(), collision.detectCollisions() ve state.checkState() metotlarını çağırır.
save() ve load() fonksiyonları oyunu “.save” dosyasına kaydetme ve dosyadan yüklemeyi sağlar.
Tüm çarpışmaları kontrol eder. Serializable marker interface’ini kullanır. Player sınıfının nesnesine bir referans tutar. Zombie, Explosion ve Ammo sınıflarının LinkedList’ini tutar. Her hareket eden nesnenin birbirleriyle, mermilerin zombilerle, patlama ve tükürüklerin her hareket eden nesne ile çarpışmasını Iterator yardımıyla kontrol eder. Hareket edenler için checkCollision(), mermiler için checkBullet() yardımcı metotlarını kullanır.
HealthPack, Explosion, ExplodingBuller, Ammo sınıflarının çarpışma durumanda ne yapacağı da checkCollision() tarafından belirlenir.
GameObject sınıfından türer. radius ve health tam sayı değişkenlerini tutar.
GameObject sınıfından türer. Statik color değişkeni var. penetrate booleanı ile zombinin içinden geçip geçemediğini, speed tam sayısı ile hızını tutar.
Abstract sınıftır. Serializable marker interface’ini kullanır. magazineCapacity ve cooldownSeconds sabit sınıf değişkenlerini tutar. addMagazine(), getTotalBullets(), getBullets(), shoot(), reload() metotları vardır.
Gun sınıfından türerler ve üstüne gerekli değişkenler ekler ve gerekirse shoot() ve reload() metotlarını override ederler
Bullet sınıfından türer. radius sınıf değişkeni patlamanın yarıçapını tutar.
GameObject sınıfından türer. radius, damage, x, y tam sayı değişkenlerini tutar. draw() metodu ile çizilir.
GameObject sınıfından türer. radius ve type tam sayı değişkenlerini tutar.
GameMover sınıfından türer. bulletsToDie, speed, damage, points tam sayı değişkenlerini tutar. ImageIcon olarak resmini ve Player sınıfının nesnesine bir referans tutar. hit() metodu ile canını bir azaltır. collidedWith() ve move() metotlarını override eder.
Zombie sınıfından türerler. Gerektiği zamana move() metodunu override ederler. Zombie sınıfının değişkenlerine kendi özelliklerine göre değer verirler.
CrawlerZombie jump() metodu ile zıplar. AcidSpittingZombie spit() metoduyla AcidSpit tükürür.
ExplodingBullet sınıfından türer. COLOR statik renk değişkeni ve damage tam sayı değişkenini tutar.
Fix bugs, add sound...