Zamanda Yolculuk

Terminator: Sarah Connor Chronicles’ı izlerken aklıma lise yıllarım geldi. O zamanlar ingilizce hocamız popüler konularda tartışıp bizlerle kaynaşmaya çalışırdı yine böyle bir konuda “Zamanda Yolculuk” konusunda tartışırken şöyle bir soru sordu “Sizce mümkün mü? Değilse neden?” O sırada yanımda oturan Ali isimli arkadaşın da gazıyla bunun mümkün olmadığını çünkü Allah’ın böyle bir şeye izin vermeyeceğini söyledim. Görüşüm eğer böyle bir şeyin mümkün olması halinde evrenin tüm dengesinin allak bullak olacağı ve insanlığın böyle bir güce erişemeyeceği yönündeydi.

Yıllar geçti arada İstanbul Üniversite Fizik Bölümü’nde bir kaç fizik dersi de aldım. Hocalarım çeşitli yetenekleriyle beni bilimden de soğuttular ama yinede işte böyle filmleri(burada dizi) gördükçe ara sırada olsa bilime merak sarıp bazı teoriler üzerinde düşünmüyor değilim. Lise yıllarında temelini attığım bu paradoksun şuan hala arkasındayım ama burada işi tanrıdan çıkarıp insanın limitleriyle açıklayacağım. Zira bize direkt bir müdehale olmadan da zaten yaşadığımız evrendeki fizik kuralları gereği sınırlı durumdayız.

Zaman kavramının aslında insanla birlikte ortaya çıktığını söylemek yanlış olmaz ama biz biraz daha genişletip zaman kavramının madde ile ortaya çıktığını söylemeliyiz. Big Bang teorisi artık uçuk bir teori olmaktan çıkmış durumda. Evrenin tek bir noktadan büyük bir patlama ile oluştuğunu biliyoruz; galaksiler birbirlerinden uzaklaşıyor ve biz gittikçe o başlama noktasıyla bağımızı koparıyoruz. -Düşündümde bu yazıyı yazmayı uzun zamandır istiyordum şimdi nasip oldu, umarım birilerinin zihinleri açmaya faydalı olur(yada hata mesajı verdirmeye)- O patlamadan önce ne olduğunu merak ediyorsanız bunu bilimle ve özellikle fizikle açıklamaya çalışmamak zorundasınız. Fiziğin konusu o patlamadan sonrasını içerir, fizik bizim doğamızı incelediğinden dolayı bu doğa oluşmadan önce olanlar konusunda açıklama getirmeye pek yanaşmaz.

İşte zamanda madde ile birlikte(hatta maddenin yapı taşlarıyla birlikte diyelim daha doğru olsun)bu patlamadan sonra ortaya çıktı. Zamanı açıklarken kullandığımız tüm ifadeler, formülizasyonlar bu patlamanın sonrasını incelemekte ve dediğim o insan sınırları o patlama ile başlamakta. Aslında zamanın olmadığını söyleyeceğim yada hepimizin kafasında ki o mutlak zaman kavramının olmadığını. İnsan mantığının patlama öncesini anlayamaması ve zamanı o patlama önceside varmış gibi düşünmesi belkide tarihteki en büyük yanılsamadır. Bizler zaten sınırlandığımız bu evrende zamanda yolculuk yapıyoruz şuan, hala, şimdi bile… Bu yolculuk geleceğe doğru bir akış şeklinde olmakta. Ama burada dikkat etmemiz gereken aslında akış var mı yok mu değil bunun sadece bizim beynimizle oluşturduğumuz bir kavram üzerinden ifade edildiğidir. Zamanı ölçmek için yaptığımız aletler, fizik kanunları, dünyanın dönmesi, güneşin dönmesi, evrenin dönmesi neresinden bakacak olursanız olun hepsi temelde insanın kabullenimlerinden ortaya çıkmakta. Bir maddenin en küçük yapısı için zaman diye birşey yoktur. Bir kara delik için zaman yoktur. Zaman sadece insan için vardır ve oda görelidir. Onu ifade ederken hızlardan yararlanırız yada bir yoldan, yolu ifade ederken aslında sabit olmayan bir noktayı referans kabul ederiz bu nokta sadece bizim için bir referans noktasıdır. Başka biri için başka bir nokta referans kabul edilebilir ve bunun üzerinden başka bir zaman tanımı yapılırsa kimin neyin zamanına göre yolculuk yapıldığı soru işareti haline gelir.

Daha güzel bir noktaya bakalım. Zaman big bang’den sonra ortaya çıkmış bir kavramsa. Bir makine ile big bang öncesine gitmeye çalışırsanız ne olur? Onu geçelim bu evrenin bir gün yok olacağını biliyoruz evren tamamiyle yok olduğundan sonrasına makine ile gitmeye çalışırsanız ne olacak? Dizide de böyle bir saçmalık söz konusu, gelecekten gelen robotlar ve isyancılarla SkyNet’in insanlığa açtığı savaş durdurulmaya çalışıyor ama atlanılan bir nokta var. Eğer başarılı olsalardı zaten gelecekte bir savaş çıkmayacak kimse gelecekten geçmişe gelmeyecekti. Daha saçma olan kısmı aslında daha yapılmamış olan bir makinenin zamanda yolculuk yapıp kendisini yaptırmasıdır. Mantıken böyle bir şeyin olmaması gerekir. Şöyle bir örnek vereyim bir makine olsa ve siz geçmişe girip babanızı daha annenizle tanışmadan önce öldürseniz ne olur? Babanız annenizle tanışmadığına göre sizde dünyaya gelmemişsinizdir, siz dünyaya gelmediğinize göre geçmişe gidip babanızı öldürmüş olamazsınız, babanızı öldürmemişseniz o halde siz varsınız ama aynı zamanda yoksunuzda?

Sonuç ne oldu? Bu kadar uzun yazmaya gerek olmadığı ortaya çıktı 🙂 Zamanda yolculuk denilen kurgu bizi paradokslara götürür ve bu onun varolamayacağının kanıtıdır zira evrenin yapısını bozacak bu tarz şeyler mümkün değildir. Mümkün olsalardı biz burda olmazdık. Yoksa… biz burada değilmiyiz? asdkasdkaskda

Pygame Draw Modülü(Bitmedi)

pygame.draw.rect
pygame.draw.rect(Surface, color, Rect, width=0): return Rect
Bu diskdörtgensi bir şekil çizer. width kenarlığın değeridir. Verilen Rect dikdörtgenin alanıdır.

pygame.draw.polygon

pygame.draw.polygon(Surface, color, pointlist, width=0): return Rect
İstenilen sayıda köşesi olan bir şekil çizer. Pointlist argümanı köşe sayısını belirtir.

pygame.draw.circle
pygame.draw.circle(Surface, color, pos, radius, width=0): return Rect
Bir çember çizer. Pos argümanı çemberin merkezini radius ise büyüklüğünü belirtir.

pygame.draw.ellipse
pygame.draw.ellipse(Surface, color, Rect, width=0): return Rect
Eliptik bir şekil çizer. Rect argümanı elipsin doldurulacağı alanı belirtir.

pygame.draw.arc
pygame.draw.arc(Surface, color, Rect, start_angle, stop_angle, width=1): return Rect
Yüzeye eliptik bir yay çizer. Angle değerleri başlangıç ve bitiş açılarını belirtir.

pygame.draw.line
pygame.draw.line(Surface, color, start_pos, end_pos, width=1): return Rect
Düzgün bir satır çizer.

pygame.draw.lines
pygame.draw.lines(Surface, color, closed, pointlist, width=1): return Rect
Çoklu satır çizer.

pygame.draw.aaline
pygame.draw.aaline(Surface, color, startpos, endpos, blend=1): return Rect


pygame.draw.aalines
pygame.draw.aalines(Surface, color, closed, pointlist, blend=1): return Rect

GmsFrekans v0.1

http://gmsfrekans.googlecode.com/files/gmsfrekansv01.py

Bu adresten ilk versiyonu indirebilirsiniz. Versiyon 0.2 üzerinde ki yapısal çalışmalar bitti, şimdi sıra veritabanına kanalları yüklemeye geldi.

Versiyon 0.2 ile birlikte gelen yenilikler:

-daha çok kanal,
-program bundan böyle kanalları veritabanından alacak,
-uydu seçme(aktif değil)

PyGame Maymun

Bu örnekte hareket eden bir şempanzeye vurmaya çalışıyoruz. Arkada vurduğumuz takdirde para kazanacağımızı söyleyen bir reklam var. Bu örnekte kodu parça parça inceleyip PyGame’in nasıl çalıştığını daha iyi anlamaya çalışacağız. Orjinal dökümana bu adresten ulaşabilirsiniz(ingilizcedir).

Modülleri Import Edelim

import os, sys
import pygame
from pygame.locals import *

if not pygame.font: print 'Warning, fonts disabled'
if not pygame.mixer: print 'Warning, sound disabled'

İlk satırda os ve sys modüllerini çağırdık bunlar platformdan bağımsız dosya yollarını belirleme gibi işlemlerde kullanılıyor.
İkinci satırda pygame import edildi ardındansa local bölümünden kullanışlı bazı fonksiyonlar modüller yükleniyor. Alttaki kısımda ise hata mesajları var eğer font ve ses modülleri yüklenememişse bu hatalar verilecek.

Kaynakları Yükleyelim


def load_image(name, colorkey=None):
fullname = os.path.join('data', name)
try:
image = pygame.image.load(fullname)
except pygame.error, message:
print 'Cannot load image:', name
raise SystemExit, message
image = image.convert()
if colorkey is not None:
if colorkey is -1:
colorkey = image.get_at((0,0))
image.set_colorkey(colorkey, RLEACCEL)
return image, image.get_rect()

Yukar ki kısımda ise oyun için gerekli kaynakları yüklüyoruz. Colorkey özelliği none olarka ifade edilmiş, saydam grafikler için kullanılan bir özellikmiş bu…
Alt kısımda image.load işlemi yapımış. Bir önceki yazıda bahsettiğimiz gibi load() can kurtaran gibi yetişiyor 🙂 Load() hadisesini birde try,except hata sistemine sokmuşuz eğer image.load edilemezse hata mesajı alacağız. Ardından bir convert() işlemi yapmışız bu resmin renk formatını ve derinliği kopyalayıp ekrana oldukça hızlı bir şekilde vermemize yarayacak. Ardından colokey konusuna bir dönüş yapıyoruz. Eğer kullanıcı colorkey için bir argüman sağlarsa biz bu değişkeni resmin colorkey değeri olarak kullanıyoruz. Burada -1 şeklinde bu işlemi geçiştirirsek program ekranın sol üst kısmındaki pixele bakarak oradaki değeri atar. Şimdi sesleri yükleyelim:


def load_sound(name):
class NoneSound:
def play(self): pass
if not pygame.mixer:
return NoneSound()
fullname = os.path.join('data', name)
try:
sound = pygame.mixer.Sound(fullname)
except pygame.error, message:
print 'Cannot load sound:', wav
raise SystemExit, message
return sound

Yukarda ne yapıldığına gelirse şimdi program önce mixer modülünün yüklenip yüklenmediğine bakıyor eğer yüklenmemişse sessiz şekilde çalışıyor eğer yüklenmişse uygulamam normal şekilde çalışıyor.

Oyun Obje Sınıfları

class Fist(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image, self.rect = load_image('fist.bmp', -1)
self.punching = 0

def update(self):
pos = pygame.mouse.get_pos()
self.rect.midtop = pos
if self.punching:
self.rect.move_ip(5, 10)

def punch(self, target):
if not self.punching:
self.punching = 1
hitbox = self.rect.inflate(-5, -5)
return hitbox.colliderect(target.rect)

def unpunch(self):
self.punching = 0

Yukarısı biraz karışık oldu biliyorum biraz daha açalım o zaman. Yukarıda yaptığımız oyuncunun yumruğunu oluşturmak. update metodu yumruğun faremizi takip etmesi için kullanıyor pos = pygame.mouse.get_pos() ile farenin pozisyonunu alıyoruz.


class Chimp(pygame.sprite.Sprite):
"""maymunu karşı tarafa geçirir vurursa döndürür"""
def __init__(self):
pygame.sprite.Sprite.__init__(self) #call Sprite intializer
self.image, self.rect = load_image('chimp.bmp', -1)
screen = pygame.display.get_surface()
self.area = screen.get_rect()
self.rect.topleft = 10, 10
self.move = 9
self.dizzy = 0

def update(self):
"yürüme veya dönme, maymunun durumuna göre"
if self.dizzy:
self._spin()
else:
self._walk()

def _walk(self):
"maymunu ekranın karşısına getirir oradan da geri döndürür"
newpos = self.rect.move((self.move, 0))
if not self.area.contains(newpos):
if self.rect.left < self.area.left or
self.rect.right > self.area.right:
self.move = -self.move
newpos = self.rect.move((self.move, 0))
self.image = pygame.transform.flip(self.image, 1, 0)
self.rect = newpos

def _spin(self):
"maymun resmini hareket ettirir, döndürür"
center = self.rect.center
self.dizzy += 12
if self.dizzy >= 360:
self.dizzy = 0
self.image = self.original
else:
rotate = pygame.transform.rotate
self.image = rotate(self.original, self.dizzy)
self.rect = self.image.get_rect(center=center)

def punched(self):
"maymuna vurulduğunda dönüşe başlattıracak"
if not self.dizzy:
self.dizzy = 1
self.original = self.image

Gittikeç karmaşıklaşıyor 🙂 bende anlatmakta zorlanıyorum ama ne demiş babaşakanımız “durmak yok yola devam!” Gördüğünüz gibi chimp sınıfı yumruğa göre daha fazla iş yapıyor. Bu sınıf maymunu hareket ettiriyor oyunda maymuna vurunca maymun dönüyor ve hızlanıyor ardından tekrardan normale dönüyor.

Kullanıma Hazırlayalım


pygame.init()
screen = pygame.display.set_mode((468, 60))
pygame.display.set_caption('Monkey Fever')
pygame.mouse.set_visible(0)


Arka Planı Oluşturalım

Ekranımızla aynı ölçüde bir bg oluşturuyoruz. ardından convert() yardımıyla bu ekran ile bg’ın aynı formatta olduğunu deklare ediyoruz. fill() ilede RGB rengini belirliyoruz o üç argüman rengi belirtiyor.(beyaza kaçan bir renk)

background = pygame.Surface(screen.get_size())
background = background.convert()
background.fill((250, 250, 250))

Arka Plana Yazıyı Oturtalım
öncelikle pygame.font modülünün yüklenmiş olduğundan emin olmamız lazım yoksa bu adımı geçiniz efendim. önce font objesini oluşturmamız ardından bunu yeni yüzeyimize render etmemiz gerekiyor. fontu oluştururken normalde none yerine font tipinizi yazabilirsiniz şimdi biz none değeri vererek default font’u kullanıyoruz. ardından rect objesi yardımıyla ortalıyoruz ardındn blit metoduyla yazımızı backgroun’a kopyalamış oluyoruz(blit kopyala/yapıştır işini görüyor)

if pygame.font:
font = pygame.font.Font(None, 36)
text = font.render("Pummel The Chimp, And Win $$$", 1, (10, 10, 10))
textpos = text.get_rect(centerx=background.get_width()/2)
background.blit(text, textpos)

Arka Planı Yükleyelim

screen.blit(background, (0, 0))
pygame.display.flip()

Objeleri Kullanıma Hazırlayalım
Iskalama sesini ve vuruş sesini sırayla yüklüoyurz. Ardından maymunu sonrada yumruğu kullanıma hazırlıyoruz. Clock objesi oyunun frame rateini kontrol etmemizi sağlıyor. allsprite adında bir grup oluşturarak bunu RenderPlanin grubuna bağlıyoruz RenderPlain tüm çizimlerin ekrana dökülmesini sağlıyor. Daha gelişmiş Render grupları mevcut ama bu örnekte sadece basit çizimler kullanıyoruz.

whiff_sound = load_sound('whiff.wav')
punch_sound = load_sound('punch.wav')
chimp = Chimp()
fist = Fist()
allsprites = pygame.sprite.RenderPlain((fist, chimp))
clock = pygame.time.Clock()

Main Loop
Burda pek bişi yapılmıyor saniyeden 60 frameden hızlı olmamasını sağladık oyunun.

while 1:
clock.tick(60)

Tüm verigirişlerini halledelim
Aşağıda artık veri girişlerini hallediyoruz, vuruş kısmına dikkat ses ekliyoruz 😉

for event in pygame.event.get():
if event.type == QUIT:
return
elif event.type == KEYDOWN and event.key == K_ESCAPE: #Esc basınca oyundan çık
return
elif event.type == MOUSEBUTTONDOWN:
if fist.punch(chimp):
punch_sound.play() #vurduysak bu ses çıkacak
chimp.punched()
else:
whiff_sound.play() #ıskaladıysak bu ses çıkacak
elif event.type == MOUSEBUTTONUP:
fist.unpunch()

Spriteları Güncelle(sprite konusuna da gelicez)
Sprite modülü update() metoduna sahip bu sayede tüm objeler etrafta dönmeye başlayacak. Maymun bir köşeden diğerine gidecek vurduğumuzda dönecez

allsprites.update()

Sahneyi Çizelim
Objeler doğru yerdeler, şimdi sıra onları çizmeye geldi. İlk blit arka planı çiziyor.draw() ile screen’i çiziyoruz son olarak flip() ile çizdiğimiz herşeyi ekrana vermiş oluyoruz.

screen.blit(background, (0, 0))
allsprites.draw(screen)
pygame.display.flip()

PyGame İle Resim Oynatmak – 2

Evet, konumuza devam ediyoruz.


screen = create_screen()
player = load_player_image()
background = load_background_image()
screen.blit(background, (0, 0)) #arkaplanı çiziyoruz
position = player.get_rect()
screen.blit(player, position) #player'ı çiziyoruz
pygame.display.update() #hepsini gösteriyoruz
for x in range(100): #100 frame canlandır
screen.blit(background, position, position) #temizle
position = position.move(2, 0) #player'ı hareket ettir
screen.blit(player, position) #yeni player'ı çiz
pygame.display.update() #hepsini göster
pygame.time.delay(100) #programı 1/10 saniye durdur

Evet biraz daha mantıklı bir oyun yaptık. Tabi buradan ileriye gitmemiz gerek, gelin devam edelim 🙂

“pygame.image.load()” fonksiyonu tamda işimizi görecek bir fonksiyon. Şöyle yaptık diyelim:


player = pygame.image.load('player.bmp').convert()
background = pygame.image.load('liquid.bmp').convert()

Burada verilen isimli resimleri yükledik. “convert()” metodu sayesinde bu yüklediğimiz resimler daha aynı piksel formatına sahip olacaklar bu sayede hızlı bir şekilde “blit()” fonksiyonunu kullanabileceğiz. Eğer bu resimleri convert etmeseydik blit işlemi uzun sürecekti.
Farkettiyseniz convert ve load fonksiyonlarının ikiside yeni yüzeyler oluşturdular. Bunun anlamı bu iki satırdada ikişer yüzey oluşturuyoruz. Normalde başka dillerde bu hafıza kaybına yol açar ama python bunuda hallediyor ve pygame kullanmadığımız yüzeyi temizliyor.
Yeni öğrendiğimiz bir diğer fonksiyon ise create_screen() pygame ile grafikler için yeni pencereler oluşturmak çok kolay örneğin 640*480’lik bir pencere oluşturmak için yapacağımız tek şey: screen = pygame.display.set_mode((640, 480))

Biraz veri alalım

Tüm oyunlarda kullanıcılar veri girer. Bu bir kalvye tuşu yoluyla olabileceği gibi bir mouse hareketi de olabilir. İşte size 100 frame ile bitmeyen, kullanıcı isteyene kadar hareket eden bir uygulama. “event” bizi ilgilendiren kısım 🙂


while 1:
for event in pygame.event.get():
if event.type in (QUIT, KEYDOWN):
sys.exit()
move_and_draw_all_game_objects()

Eğer birden çok resim hareket ettirmek istiyorsak şöyle bir örnek uygulayabiliriz:

class GameObject:
def __init__(self, image, height, speed):
self.speed = speed
self.image = image
self.pos = image.get_rect().move(0, height)
def move(self):
if self.pos.right > 600:
if self.pos.right > 600:
self.pos.left = 0

Birden fazla obje hareket edeceği zaman bunlarla başetmenin en güzel yolu bir sınıf oluşturmaktır. Yukarıda gördüğünüz gib iiki fonksiyon oluşturduk birisi(init) onjemizi oluştururken move fonksiyonu ile hareket ettirdik. Eğer çok fazla uzaklaşırsa tekrardan sola getiriyoruz objeyi.

Son bir örnek

screen = pygame.display.set_mode((640, 480))
player = pygame.image.load('player.bmp').convert()
background = pygame.image.load('background.bmp').convert()
screen.blit(background, (0, 0))
objects = []
for x in range(10): #10 obje oluşturduk
o = GameObject(player, x*40, x)
objects.append(o)
while 1:
for event in pygame.event.get():
if event.type in (QUIT, KEYDOWN):
sys.exit()
for o in objects:
screen.blit(background, o.pos, o.pos)
for o in objects:
o.move()
screen.draw(o.image, o.pos)
pygame.display.update()
pygame.time.delay(100)

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.