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