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)