20 Haziran 2012 Çarşamba

Pygame (3)

Merhaba arkadaşlar! Okul, sınavlar falan derken uzun zamandır yazı yazmadım. Hazır finaller de bitmiş şimdi tam zamanı dedim. En son derste NES'ten bildiğimiz Star Force benzeri bir oyunun taslağını yapmıştık, bu derste de resim ve yazı ekleyeceğiz. İşe yazı ile başlayalım. Önce kullanacağımız fontu tanıtmamız lazım, bunu pencereyi tanımladığımız satırın altında bir yerlerde şu şekilde yapıyoruz:

bizim_font = pygame.font.SysFont("arial", 30)

Bu komut sistemin mevcut fontlarına bakacak, içlerinden arial isimli fontu bulacak ve istediğimiz zaman 30 piksel büyüklüğünde yazdıracak. Yazdırma işlemi iki adımda olacak:


yazı_yaz = bizim_font.render("Trololo", True, (0, 255, 0))
pencere.blit(yazı_yaz, (0, 0))


İlk satırda ne yazacağımızı ve hangi renkle yazacağımızı belirledik, ikinci satırda "blit" fonksiyonunu kullanarak yazıları ekrana çizdirdik (resimleri de hemen hemen aynı şekilde çizdireceğiz). Oyuna skor ve can göstergelerini eklemek için gereken her şeyi biliyoruz. Daha önce can sayacını oyuncu sınıfını içine eklemiştik, şimdi aynı şekilde skor sayacını da ekleyelim.


class oyuncu():
    def __init__(self, renk, boyut):
        self.skor = 0 #skor sayacını buraya ekledik
        self.can = 10
        self.boyut = boyut
        self.kare = pygame.Rect((350, çözünürlük[1] - self.boyut[1]), self.boyut)
        self.renk = renk
        self.sağa = False
        self.sola = False
    def hareket(self, yön):
        if yön == "sağa":
            self.sağa = True
        elif yön == "sola":
            self.sola = True
    def hareket_iptal(self, yön):
        if yön == "sağa":
            self.sağa = False
        elif yön == "sola":
            self.sola = False


Şimdi de skoru arttırması için çarpışma fonksiyonunda düzeltmeler yapalım:


def çarpışma():
    global oyuncu1, düşman_listesi, mermi_listesi
    for i in düşman_listesi:
        for k in mermi_listesi:
            if i.kare.colliderect(k.kare):
                düşman_listesi.remove(i)
                mermi_listesi.remove(k)
                oyuncu1.skor += 1 #skoru arttır
        if i.kare.colliderect(oyuncu1.kare):
            düşman_listesi.remove(i)
            oyuncu1.can -= 1


Canın azalmasını zaten önceden yapmıştık. Fontumuzu daha önce gösterdiğim şekilde tanımladıktan sonra pygame.display.update() fonksiyonundan hemen önce yazılarımızı yazdıralım:


#skoru ve canı yazıya çevirme
    can_yazı = bizim_font.render(str(oyuncu1.can), True, (0, 255, 0))
    skor_yazı = bizim_font.render(str(oyuncu1.skor), True, (255, 0, 0))


# Yazı yazdırma:
    pencere.blit(can_yazı, (5, 5))
    pencere.blit(skor_yazı, (5, 35))

    pygame.display.update()


Gördüğünüz gibi oyuncu1.can'ı ve oyuncu1.skor'u önce "string" tipine çevirdim çünkü render fonksiyonu sayılarla değil, sadece karakterlerle çalışıyor. Daha sonra da can_yazı'yı ve skor_yazı'yı 5, 5 ve 5, 35 koordinatlarına çizdirdim. İsterseniz bir de "while devam:" satırının hemen altına


if oyuncu1.can == 0:
        devam = False


ekleyin ki canınız bittiğinde oyun da bitsin. Bu şekilde oyunu açarsanız sol üst köşede yeşil can ve kırmızı skor göstergelerini göreceksiniz. Ayrıca print(oyuncu1.can) satırlarını da silebilirsiniz, onlarla işimiz kalmadı.

Şimdi gelelim resim eklemeye. Aynı yazıda olduğu gibi resmi çizdirmeden önce onu tanımlamalıyız, bunu pygame.image.load("resmin_adı") fonksiyonu ile yapıyoruz. Resmin adını yazarken uzantısını da unutmamaya dikkat edin. Eğer resim .py uzantılı dosyanın olduğu klasörde değil de bir alt klasördeyse adresi olduğu gibi yazabilirsiniz. Örnek vereyim, oyunum klasörünün içinde oyun.py dosyası ve resimler diye bir klasör varsa ve uzay_gemizi.jpg resmi resim klasörünün içindeyse kodunuz şu şekilde olmalı: pygame.image.load("resimler/uzay_gemisi.jpg")

Ekrana çizdirme işini yine blit ile yapıyoruz. Hemen bir örnek yazayım:

benim_resmim = pygame.image.load("resim.gif")
pencere.blit(benim_resmim, (15, 15))


Tabi ki bunları pencereyi tanımladıktan sonra yazmalısınız. Hemen oyuncu sınıfına resim tanımlama işini verelim o halde:


class oyuncu():
    def __init__(self, renk, boyut, resim):
        self.skor = 0
        self.can = 10
        self.boyut = boyut
        self.resim = pygame.image.load(resim) #resmi burada tanımladık.
        self.kare = pygame.Rect((350, çözünürlük[1] - self.boyut[1]), self.boyut)
        self.renk = renk
        self.sağa = False
        self.sola = False
    def hareket(self, yön):
        if yön == "sağa":
            self.sağa = True
        elif yön == "sola":
            self.sola = True
    def hareket_iptal(self, yön):
        if yön == "sağa":
            self.sağa = False
        elif yön == "sola":
            self.sola = False



oyuncu1 = oyuncu((255, 0, 0), (50, 50), "uzay_gemisi.gif") #resmi de ekledik

Artık oyuncu yaratırken renk ve boyutun yanında bir de resim adresi vereceğiz. Resmi pencereye çizdirmek için de

pygame.draw.rect(pencere, oyuncu1.renk, oyuncu1.kare)


satırını

pencere.blit(oyuncu1.resim, oyuncu1.kare)


ile değiştirmemiz yeterli olacaktır. Artık oyuncu karesinin rengi ile ilgilenmediğimize göre o oyuncu sınıfının içindeki self.renk satırını ve onunla ilgili her şeyi silebiliriz. Kodunuzun son hali böyle bir şey olmalı:


import pygame, time, random

pygame.init()

#### DEĞİŞKENLER ####

çözünürlük = (800, 600)
devam = True
son_düşman_ekleme = pygame.time.get_ticks()

pencere = pygame.display.set_mode(çözünürlük)

bizim_font = pygame.font.SysFont("arial", 30) #Fontu yarattık


#### CLASSLAR ####

class oyuncu():
    def __init__(self, boyut, resim): #renk argümanını ve self.renk değişkenini sildik
        self.skor = 0
        self.can = 10
        self.boyut = boyut
        self.resim = pygame.image.load(resim)
        self.kare = pygame.Rect((350, çözünürlük[1] - self.boyut[1]), self.boyut)
        self.sağa = False
        self.sola = False
    def hareket(self, yön):
        if yön == "sağa":
            self.sağa = True
        elif yön == "sola":
            self.sola = True
    def hareket_iptal(self, yön):
        if yön == "sağa":
            self.sağa = False
        elif yön == "sola":
            self.sola = False



class mermi():
    global çözünürlük
    def __init__(self, oyuncu):
        self.kare = pygame.Rect((oyuncu.kare.left + oyuncu.boyut[0] / 2, çözünürlük[1] - oyuncu.boyut[1]), (2,
                                                                                                            3))



class düşman():
    def __init__(self):
        pos_x = random.randint(0, çözünürlük[0] - 50)
        self.kare = pygame.Rect((pos_x, -50), (50, 50))


#### FONKSİYONLAR ####


def hareketler():
    global oyuncu1, çözünürlük, mermi_listesi
    if oyuncu1.sağa and oyuncu1.kare.right < çözünürlük[0]:
        oyuncu1.kare.left += 1
    if oyuncu1.sola and oyuncu1.kare.left > 0:
        oyuncu1.kare.left -= 1

    for i in mermi_listesi:
        i.kare.top -= 3
        if i.kare.bottom < 0:
            mermi_listesi.remove(i)

    for i in düşman_listesi:
        i.kare.bottom += 1
        if i.kare.top > çözünürlük[1]:
            düşman_listesi.remove(i)
            oyuncu1.can -= 1


def düşman_ekle():
    global son_düşman_ekleme
    if pygame.time.get_ticks() - son_düşman_ekleme > 3000:
        son_düşman_ekleme = pygame.time.get_ticks()
        düşman_listesi.append(düşman())


def çarpışma():
    global oyuncu1, düşman_listesi, mermi_listesi
    for i in düşman_listesi:
        for k in mermi_listesi:
            if i.kare.colliderect(k.kare):
                düşman_listesi.remove(i)
                mermi_listesi.remove(k)
                oyuncu1.skor += 1 #skoru arttır
        if i.kare.colliderect(oyuncu1.kare):
            düşman_listesi.remove(i)
            oyuncu1.can -= 1

oyuncu1 = oyuncu((50, 50), "uzay_gemisi.gif") #resmi ekledik ve renk değişkenini kaldırdık

#### LİSTELER ####


mermi_listesi = []
düşman_listesi = []


while devam:
    if oyuncu1.can == 0: #Can sıfırlandığında oyun bitsin
        devam = False
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            devam = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                oyuncu1.hareket("sola")
            if event.key == pygame.K_RIGHT:
                oyuncu1.hareket("sağa")

            if event.key == pygame.K_SPACE:
                mermi_listesi.append(mermi(oyuncu1))

        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT:
                oyuncu1.hareket_iptal("sola")
            if event.key == pygame.K_RIGHT:
                oyuncu1.hareket_iptal("sağa")


    hareketler()

    düşman_ekle()
    çarpışma()



    pencere.fill((0, 0, 0))
    #pygame.draw.rect(pencere, oyuncu1.renk, oyuncu1.kare)
    pencere.blit(oyuncu1.resim, oyuncu1.kare)

    for i in mermi_listesi:
        pygame.draw.rect(pencere, (255, 255, 255), i.kare)

    for i in düşman_listesi:
        pygame.draw.rect(pencere, (255, 255, 255), i.kare)
    #skoru ve canı yazıya çevirme
    can_yazı = bizim_font.render(str(oyuncu1.can), True, (0, 255, 0))
    skor_yazı = bizim_font.render(str(oyuncu1.skor), True, (255, 0, 0))


    # Yazı yazdırma:
    pencere.blit(can_yazı, (5, 5))
    pencere.blit(skor_yazı, (5, 35))

    pygame.display.update()
    time.sleep(0.0025)

pygame.quit()


Evet, bir dersin daha sonuna geldik arkadaşlar. Bir sonraki derste menü yapmanın pratik yollarını ve ses eklemeyi öğreteceğim. Kendinize çok iyi bakın.

Hiç yorum yok:

Yorum Gönder