Kod yazmaya başlamadan önce dokümentasyon yapalım. Yazacağımız oyunda düşmanlar yukarıdan, rastgele bir yerden düz bir şekilde inecek. Yani bir düşman class'ına ihtiyacımız var. Tabi ki bir oyuncu da olacak, oyuncu sağa sola hareket edip ateş edebilecek. O halde bir oyuncu ve mermi class'ı yaratalım, ya da ikisini bir class'ın içinde de yazabiliriz. while döngüsünün içinde objeleri çizdirmenin dışında üç şey yapacağız; her objenin hareketini hesaplama (yeni pozisyonunu hesaplama), objelerin çarpışması ve yeni düşman ekleme. Düşman bir mermiye çarptığı zaman hem mermi hem düşman silinecek, düşman oyuncuya çarptığı ya da ekranın altına geldiği zaman oyuncunun canı gidecek.
Şimdilik bu kadar yeter. Kodumuza başlayabiliriz. (Not: kodu yazarken bazı yerlerde bir satıra sığmadığı için yeni bir satıra geçilmiş. Ona kafanızı takmayın. Kodu incelerseniz görürsünüz zaten. Bir de kopyalayıp yapıştırırsanız kod çalışacaktır)
import pygame, time, random
pygame.init()
#### DEĞİŞKENLER ####
çözünürlük = (800, 600)
devam = True
pencere = pygame.display.set_mode(çözünürlük)
#### CLASSLAR ####
class oyuncu():
def __init__(self, renk, boyut):
self.can = 10
self.boyut = boyut
self.kare = pygame.Rect((350, çözünürlük[1] - self.boyut[1]), self.boyut) #çözünürlük[1]'in ne demek
#olduğunu birazdan açıklarım.
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
#### 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
oyuncu1 = oyuncu((255, 0, 0), (50, 50))
while devam:
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.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()
pencere.fill((0, 0, 0))
pygame.draw.rect(pencere, oyuncu1.renk, oyuncu1.kare)
pygame.display.update()
time.sleep(0.0025)
pygame.quit()
Bu kodu yazdığınızda kırmızı renk, 50x50, oyuncu1 adında bir kare çizilecek ve kareyi sağa sola hareket ettirebileceğiz. Bu parametreleri değiştirmek isterseniz oyuncu1 = oyuncu((255, 0, 0), (50, 50)) yerine başka bir şeyler de yazabilirsiniz. Şimdi çözünürlük[1] ve boyut[1] derken ne demek istediğimi anlatayım. Hatırlarsanız listelerde her öğenin bir numarası vardı, listenin ilk elemanın numarası (ya da sırası) 0'idi, ikincinin 1'idi. her ne kadar (800, 600) bir liste olmasa da (tam olarak tupple oluyor bu. Türkçesi demeç, istihza.com'dan bakmanızı öneririm) çok benzer bir yapıdır. çözünürlük[1] dediğimde çözünürlük'ün ikinci elemanına, yani ekranımızın yüksekliğine ulaşmış oluyorum.
Şimdi de ateş etmeyi ekleyelim. Bunun için mermi diye bir class yaratacağım, mermileri mermi_listesi diye bir listede tutacağım ve bu listedeki her elemanın pozisyonunu hareketler() fonksiyonunda hesaplayacağım son olarak da ekrana çizdireceğim.
import pygame, time, random
pygame.init()
#### DEĞİŞKENLER ####
çözünürlük = (800, 600)
devam = True
pencere = pygame.display.set_mode(çözünürlük)
#### CLASSLAR ####
class oyuncu():
def __init__(self, renk, boyut):
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
class mermi(): #mermi diye bir class oluşturduk
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))
#### 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: #mermi listesi'ndeki her elemanı üç piksel yukarıya alıyoruz
i.kare.top -= 3
if i.kare.bottom < 0:
mermi_listesi.remove(i) #mermi ekran dışına çıkarsa siliyoruz
oyuncu1 = oyuncu((255, 0, 0), (50, 50))
#### LİSTELER ####
mermi_listesi = [] #mermilerle daha kolay işlem yapabilmek için bir liste oluşturuyoruz
while devam:
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: #space'e basınca bir mermi objesi yaratıyoruz
mermi_listesi.append(mermi(oyuncu1)) #ve mermi_listesi'ne eklyoruz
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()
pencere.fill((0, 0, 0))
pygame.draw.rect(pencere, oyuncu1.renk, oyuncu1.kare)
for i in mermi_listesi: #mermi_listesi'ndeki her elemanı çizidiyoruz
pygame.draw.rect(pencere, (255, 255, 255), i.kare)
for i in mermi_listesi: #mermi_listesi'ndeki her elemanı çizidiyoruz
pygame.draw.rect(pencere, (255, 255, 255), i.kare)
pygame.display.update()
time.sleep(0.0025)
pygame.quit()
Burada açıklanacak bir şey yok.
Şimdi de aynı şekilde düşman ekleyelim. Tek fark düşmanın her 3 saniyede bir kendiliğinden oluşacak olması. Bunun için pygame.time.get_ticks() fonksiyonundan faydalanacağız. Bu fonksiyon oyun başladığından beri kaç milisaniye geçmiş onu söyleyecek.
import pygame, time, random
pygame.init()
#### DEĞİŞKENLER ####
çözünürlük = (800, 600)
devam = True
son_düşman_ekleme = pygame.time.get_ticks() #Bununla son düşmanı en son ne zaman eklendiğine
#bakacağız
pencere = pygame.display.set_mode(çözünürlük)
#### CLASSLAR ####
class oyuncu():
def __init__(self, renk, boyut):
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
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(): #düşman class'ı
def __init__(self):
pos_x = random.randint(0, çözünürlük[0] - 50) #x pozisyonu rastgele belirlenecek
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: #düşman_listesi'ndeki her öğenin hareketini hesaplıyoruz
i.kare.bottom += 1
if i.kare.top > çözünürlük[1]:
düşman_listesi.remove(i) #düşman_listesi'ndeki bir öğe ekran dışına çıkarsa siliyoruz
def düşman_ekle(): #düşman ekleme fonksiyonu
global son_düşman_ekleme
if pygame.time.get_ticks() - son_düşman_ekleme > 3000: #düşman üç saniyede bir gelsin diyoruz
son_düşman_ekleme = pygame.time.get_ticks()
düşman_listesi.append(düşman())
oyuncu1 = oyuncu((255, 0, 0), (50, 50))
#### LİSTELER ####
mermi_listesi = []
düşman_listesi = [] #düşmanları daha kolay kontrol edebilmek için liste oluşturduk
while devam:
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: #space'e basınca bir mermi objesi yaratıyoruz
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() #düşman eklenmesinin gerekli olup olmadığını kontrol ediyoruz
pencere.fill((0, 0, 0))
pygame.draw.rect(pencere, oyuncu1.renk, oyuncu1.kare)
for i in mermi_listesi:
pygame.draw.rect(pencere, (255, 255, 255), i.kare)
for i in düşman_listesi: #düşman_listesi'ndeki her bir objeyi ekrana çizdiriyoruz.
pygame.draw.rect(pencere, (255, 255, 255), i.kare)
for i in mermi_listesi:
pygame.draw.rect(pencere, (255, 255, 255), i.kare)
for i in düşman_listesi: #düşman_listesi'ndeki her bir objeyi ekrana çizdiriyoruz.
pygame.draw.rect(pencere, (255, 255, 255), i.kare)
pygame.display.update()
time.sleep(0.0025)
pygame.quit()
Burada da yeni bir şey yok. Şimdi objelerin çarpışıp çarpışmadığına bakacağız. Bunun için çarpışmalar() diye bir fonksiyon yazacağız.
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)
#### CLASSLAR ####
class oyuncu():
def __init__(self, renk, boyut):
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
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 #düşman ekran dışına çıkarsa oyuncunun bir canı gider
print(oyuncu1.can)
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(): #çarpışma fonksiyonunu yazdık
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)
if i.kare.colliderect(oyuncu1.kare):
düşman_listesi.remove(i)
oyuncu1.can -= 1
print(oyuncu1.can)
oyuncu1 = oyuncu((255, 0, 0), (50, 50))
#### LİSTELER ####
mermi_listesi = []
düşman_listesi = [] #düşmanları daha kolay kontrol edebilmek için liste oluşturduk
while devam:
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() #çarpışma fonksiyonunu çağırıyoruz
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)
#### CLASSLAR ####
class oyuncu():
def __init__(self, renk, boyut):
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
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 #düşman ekran dışına çıkarsa oyuncunun bir canı gider
print(oyuncu1.can)
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(): #çarpışma fonksiyonunu yazdık
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)
if i.kare.colliderect(oyuncu1.kare):
düşman_listesi.remove(i)
oyuncu1.can -= 1
print(oyuncu1.can)
oyuncu1 = oyuncu((255, 0, 0), (50, 50))
#### LİSTELER ####
mermi_listesi = []
düşman_listesi = [] #düşmanları daha kolay kontrol edebilmek için liste oluşturduk
while devam:
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() #çarpışma fonksiyonunu çağırıyoruz
pencere.fill((0, 0, 0))
pygame.draw.rect(pencere, oyuncu1.renk, 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)
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)
pygame.display.update()
time.sleep(0.0025)
pygame.quit()
Son olarak da çarpışma() fonksiyonunu ekledik. Biraz incelerseniz nasıl çalıştığını anlarsınız.
Pygame'in temeli yaklaşık olarak bu kadar. Bir sonraki derste oyunu biraz daha geliştirip resim, ses falan ekleriz.
Son olarak da çarpışma() fonksiyonunu ekledik. Biraz incelerseniz nasıl çalıştığını anlarsınız.
Pygame'in temeli yaklaşık olarak bu kadar. Bir sonraki derste oyunu biraz daha geliştirip resim, ses falan ekleriz.