PyGame İle Resim Oynatmak

Oyunlarda karşımıza çıkan animasyonların aslında ard arda gelen resimler olduğunu düşünürsek. Bir oyun yapmaya çalışırken temelde resim oynatmayı bilmenin ne kadar önemli olduğunu fark ederiz. Orjinal dökümanlarda resim oynatma mantığı üzerine uzunca örnekler verilmiş ben bunları geçiyor ve hemen işimize dönüyorum.

Blit

Animasyon konusunda acemi olanlar için(benim gibi) blit terimi kısaca bir resimdeki bir grafiği başka bir resme kopyama anlamına geldiğini söyleyebiliriz. Belli bir alandaki yada belli pikseller arasındaki bir grafiği diyerek daha da açabiliriz bu konuyu 🙂 Örneğimize geçersek:


background = [terrain1, terrain1, terrain2, terrain2, terrain2, terrain1]
screen = create_graphics_screen()
for i in range(6):
screen.blit(background[i], (i*10, 0))
playerpos = 3
screen.blit(playerimage, (playerpos*10, 0))

Şimdi animasyonumuzun arka planı için terrain1 ve terrain2 resimlerini kullandık. Bunun yanında ehr grafiğimizi 10 piksel genişliğinde kabul ettiğimize dikkat edin. Şimdi playerimage’ini bir kare hareket ettirelim.

screen.blit(background[playerpos], (playerpos*10, 0))
playerpos = playerpos - 1
screen.blit(playerimage, (playerpos*10, 0))

Gördüğünüz gibi çok basit bir işlem. Bu kodla bir arka plan üzerine karakter yerleştirmeyi nasıl yapacağımızı öğrenmiş olduk.

Sayfa Kordinatları

Bir nesnenin ekrandaki yerini belirlerken blit() fonksiyonuna bunun yerini belirtmemiz gerekir. Pygame’de bunu (X,Y) kordinatları şeklinde kullanabiliriz(kim demiş analitik geometrinin gereksiz olduğunu?). Yüzeyin sol-üst köşesi (0,0)’dır. Sağa kaydırırsak (10,0) olur. Aşağı indirelim bir de (10,10) oldu. İlk verdiğimiz kordinat bulunduğu yeri gösteriyordu sol-üst konumu yön tayin ederken belirtiriz.

Pygame bu kordinat işleri için kullanışlı bir özellik getirmiştir: Rect. Rect kısaca size bu kordinatlar çerçevesinde dikdörgensi bir alan sunar, size bu alan içersinde hareket etmeyi ve pozisyonlandırmayı sağlayan metotlar sunar. Ayrıca şunuda belirtmeliyiz ki pygame’de ki rect dahil bir çok fonksiyon 4 elementli tüpleri kabul eder(left, top, width, height).


Arkaplanı Değiştirme

Bazen sabit arkaplanlar kullansakta oyunlarda genelde arkaplan değişir. Bu işlemi yapmadan önce ekranı erase() fonksiyonu ile temizlemek gerekir. Yeniden çizimimizi yaptıktan sonra “pygame.display.update()” fonksiyonu ile çizdiklerimizi ekrana dökeriz.

Bir sonraki konuda daha düzgün bir hareket inceliyeceğiz, şimdi yemek zamanı. 😀

PyGame Import ve Başlangıç

PyGame”in programınıza yüklenmesi ve kullanıma hazırlanması oldukça basit bir işlem. Bu işlem olabildiğince de esnek bu şekilde neler olduğuna daha fazla hakim olabilirsiniz. PyGame bir çok modülün birleşmesinden oluşan bir paket olarak düşünülebilir. Bazı paketleri hiçbir zaman kullanmayacaksınız ama bu onları bilmenize engel değil 🙂

Import

Öncelikle paketimizi import etmemiz gerekmekte. 1.4 versiyonundan beri bu işlem daha da basitleşmiş durumda. Çoğu oyun Pygame’i şu şekilde import etmekte:


import pygame
from pygame.locals import *

Gerekli olan sadece ilk satır ikincisi ise opsiyonel. İlk satırda kullanılabilen tüm modüller yüklenirken ikinci satırda sık kullanılan fonksiyonlarla limitli halde bir yükleme yapılıyor.
Bu arada aklınızda bulundurmanız gereken bir husus yukarıda belirttiğim gibi bir çok PyGame modülü opsiyoneldir örneğin font modülü müsaitse import edilir yoksa pygame.font fonksiyonu yüklenmez.

Init

PyGame ile çalışmadan önce onu kullanıma hazır etmek gerekir bunu yapmak içinde:


pygame.init()

Bu komut pygame modüllerini kullanıma hazır hale getirecektir. Bundan sonra herhangi bir modülü kullanıma hazır hale getirmek istediğinizde aşağıdaki ifadeyi kullanabilirsiniz:


pygame.font.init()

Modülle işiniz bittiğinde “quit()” fonksiyonuyla kendisini temizleyebilirsiniz. Bu arada çağırdığınız modüllerin içersinde “get_init()” fonksiyonun hazır olduğundan emin olunuz aksi takdirde oyununuz içersine bu modülleri çağıramazsınız.

PyGame Tanıtım

PyGame, 2000 yılının yaz aylarında Pete Shinners’ın Python ve SDL(Simple DirectMedia Layer) ile tanışmasıyla başlamıştır. Python dilini çoğumuz biliyoruz, SDL ise birçok platformda kullanılabilen bir C kütüphanesidir.

“Acaba python oyun yapımı için uygun mu?” sorusunun cevabı, “Oyuna bağlı”.

Python’un oyun yazımı konusunda yeterli bir dil olduğunu rahatça söyleyebiliriz. Hatta size 30 milisaniyenin altına inerek süprizde yapabilir ama oyunlar geliştikçe değerlerin tavan yaptığını ve bilgisayarınızı tam performansta çalıştırmaya başladığınızı göreceksiniz.

Geçen yıllarda dillerin iki alanda kullanıldığına şahit olduk. Oyun motoru ve oyun mantığı. Motor(engine) olabildiğince hızlı olmalıydı, mantıksa(logic) esas işin yapıldığı kısımdı. Python bu iki alanda da kullanışlı olduğunu bir çok başarılı oyunla kanıtladı. 2001 yılının başlarında, geliştirici Rebel Act stüdyosu Severance: Blade of Darkness isimli oyunlarını bitirdi. Kendi 3D motoruna sahip oyunun geri kalan kısmında tamamen python kullanıldı. Freedom Force, Star Trek: Bridge Commander, Civilization IV gibi başka oyunlarda da python kullanıldığına şahit olduk. PyGame ve SDL, 2D oyunlarda başarılı bir C motoru gibi çalışmakta. SDL grafik donanımınızla saniyede 40-200 arası Frame değerleri almanızı sağlarken Python’un oyunlarla iyi anlaşabileceğini bir kez daha görmüş oluyorsunuz.

PyGame ve SDL’in birçok plartformda zahmet vermeden kullanılabildiğindende bahsetmek gerek. Geliştirici Pete Shinners’ın 2001 yılında yayınladığı SolarWolf isimli oyun tamamen windows üzerinde geliştirilmesine rağmen herhangi bir patch gerektirmeden Linux, Mac OSX ve bir çok Unix tabanlı işletim sisteminde çalıştırılmış.

Elbette bazı sınırların olduğunuda unutmamalıyız. Her plartforma donanım desteği verilememekte. Bazen de SDL tam ekran çalıştırılan oyunların çökmesine yada oldukça yavaşlamasına sebep olabiliyor. Pygame’in gelişmiş oyunlar yazmaya başladığınızda düşük seviye kaldığını söyleyebiliriz ama bu onu geliştirmenize ve kendi fonksiyonlarınızı eklemenize engel değil. Yeni başlayanların öğrenecekleri çok şey olmakla birlikte PyGame kullanarak bir kaç hafta içersinde sizi eğlendirebilecek ufak oyunlar yapabilirsiniz.