Daha önceki Python ile Oyun Yapımı – Car Race yazımda Python ile araba oyunu yapmıştık.
Bu yazımda Pyhon Pygame kütüphanesini kullanarak bir uzay oyunu yapacağız.
Kodları ve içerikleri indirebileceğiniz GitHub Linki : GitHub
Şimdi adım adım kodlarımıza geçelim.
1-Adım gerekli olarak kütüphanelerimizi ekliyoruz :
1 2 3 4 5 |
# wwPHP.com Space Game 19-02-2022 # Kerem Bilgehan Gül # Adding Required Libraries. import pygame; import random; |
2-Adım oyunumuzun ana çervesinin başlığını ve ikonunu tanımlıyoruz :
1 2 3 |
programIcon = pygame.image.load('wwphp.png'); pygame.display.set_icon(programIcon); pygame.display.set_caption('wwPHP Space Game'); |
3-Adım oyunumuzun pencere genişliğini tanımlıyoruz :
1 2 3 |
# Game screen WIDTH and HEIGHT.(800x600) SCREEN_WIDTH = 800; SCREEN_HEIGHT = 600; |
4-Adım pygame kütüphanesine ait kullanacağımız ek parametreleri tanımlıyoruz :
1 2 3 4 5 6 7 8 9 10 11 12 |
# Import pygame.locals parameters to use supported features. from pygame.locals import ( RLEACCEL, K_UP, K_DOWN, K_LEFT, K_RIGHT, K_ESCAPE, K_SPACE, KEYDOWN, QUIT, ); |
5-Bu adımda oyuncumuza ait sınıfı tanımlıyoruz. Bu sınıf içerisinde _init_ fonksiyonunda ilk çağırılacak sabit özellikleri örn; karakterimize ait görsel, özellik vb. parametrelerin tanımını yapıyoruz.
update fonksiyonunda ise karakterimizin oyun içerisinde güncellenecek örneği hareket parametreleri, varsa can vb. özelliklerin tanımlamasını yapıyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# Define the Player object. class Player(pygame.sprite.Sprite): def __init__(self): super(Player, self).__init__(); # Set player object image. self.surf = pygame.image.load("Player-Plane.png").convert_alpha(); self.surf.set_colorkey((255, 255, 255), RLEACCEL); self.rect = self.surf.get_rect(); # Key Presses Event. def update(self, pressed_keys): if pressed_keys[K_UP]: self.rect.move_ip(0, -5); # if gamer press UP key on keyboard. if pressed_keys[K_DOWN]: self.rect.move_ip(0, 5); # if gamer press DOWN key on keyboard. if pressed_keys[K_LEFT]: self.rect.move_ip(-5, 0); # if gamer press LEFT key on keyboard. if pressed_keys[K_RIGHT]: self.rect.move_ip(5, 0); # if gamer press RIGHT key on keyboard. # Keep player on the screen if self.rect.left < 0: self.rect.left = 0; elif self.rect.right > SCREEN_WIDTH: self.rect.right = SCREEN_WIDTH; if self.rect.top <= 0: self.rect.top = 0; elif self.rect.bottom >= SCREEN_HEIGHT: self.rect.bottom = SCREEN_HEIGHT; |
6-Bu adımda oluşturulacak düşmanlara ait sınıfı tanımlıyoruz. Burada dikkat düşmanların görsel tanımlaması vb işlemler yer alıyor fakat ben düşmanların belli bir alanda rastgele oluşmasını ve farklı hızlarda olmasını istiyorum bunun için ; self.rect parametresine random olarak ekran boyutuna göre konum bilgisi atanmasını sağlıyorum. Hız için ise self.speed parametresine 5 ila 20 arası değişken bir değer atıyorum. Daha sonra update fonksiyonunda bu düşmanların sağdan sola doğru self.speed parametresinde random belirlenen hızlarda hareket etmesini sağlıyorum. self.rect.right < 0: satırında ise eğer düşmanın konumu sola kenarı geçti ise düşmanı yok ediyorum.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# Define the enemy object. class Enemy(pygame.sprite.Sprite): def __init__(self): super(Enemy, self).__init__(); self.surf = pygame.image.load("Enemy.png").convert_alpha(); self.surf.set_colorkey((255, 255, 255), RLEACCEL); self.rect = self.surf.get_rect( center=( random.randint(SCREEN_WIDTH + 20, SCREEN_WIDTH + 100), random.randint(0, SCREEN_HEIGHT), ) ); self.speed = random.randint(5, 20); # Move enemy. def update(self): self.rect.move_ip(-self.speed, 0); if self.rect.right < 0: self.kill(); |
7-Bu adımda oyuncumuz tarafından ateşlenecek mermi sınıfını tanımlıyorum.__init__ fonksiyonu altında mermimize ait resimi belirliyorum ve self.rect parametresinde meminin oyuncudan çıkıyormuş gibi gözükmesi için oyuncuya ait konuma göre merminin çıkış pozisyonunu belirtiyorum. update fonksiyonunda merminin soldan sağa doğru haraket etmesini ve eğer ekranın sol yanına taşarsa yok olmasını sağlayacak kodları yazıyorum.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
class Bullet(pygame.sprite.Sprite): def __init__(self): super(Bullet, self).__init__(); self.surf = pygame.image.load("Player-Laser-Bullet.png").convert_alpha(); self.surf.set_colorkey((255, 255, 255), RLEACCEL); self.rect = self.surf.get_rect( center=( player.rect.left+30, player.rect.top+12, ) ); # Move bullet. def update(self): self.rect.move_ip(25, 0); if self.rect.left > SCREEN_WIDTH: self.kill(); |
8-Bu adımda oyunumuzun çerçevesini 3. adımda tanımladığımız parametreleri de kullanarak oluşturuyoruz ve çerçevemize bir arkaplan görseli atıyoruz.
1 2 3 4 5 |
# Initialize pygame pygame.init(); # Create game screen and set background image. screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)); background_image = pygame.image.load("background.png").convert(); |
9-Bu adımda player sınıfımızı çağırıyoruz ve pygame clock nesnemizi oluşturuyoruz. Clock nesnesini aşağıdaki adımlarda sonsuz döngüye alacağımız oyunumuz için bir frame rate sınırlayıcı olarak kullanacağız.
1 2 3 4 5 |
# Create player. player = Player(); # Setup the clock for a decent framerate clock = pygame.time.Clock() |
10-Bu adımda pygame timer nesnesini kulanarak her 250 milisaniyede bir otomatik olarak düşman oluşturmasını sağlamak için ADDENEMY olayının çağırılmasını sağlayacağız. Bu olayın aşağıdaki adımlarda sonsuz döngümüz içerisinde kontrolünü sağlayıp düşmanı oluşturacağız.
1 2 3 4 |
# Create custom enemy. # Clock object call ADDENEMY event. ADDENEMY = pygame.USEREVENT + 1 pygame.time.set_timer(ADDENEMY, 250) |
11-Bu adımda pygame sprite group özelliğini kullanarak düşmanlar, mermiler için ve genel olarak sprite grupları oluşturacağız. bu gruplara oluşturulan her bir nesneyi ekleyeceğiz bu olası çakışmalar ve farklı özellikler için ileride kullanmamızı sağlayacak.
1 2 3 4 5 6 7 |
# Create groups to hold enemy and bullets sprites, and each sprite. enemies = pygame.sprite.Group() bullets = pygame.sprite.Group() # Create group to hold all sprites.(render) all_sprites = pygame.sprite.Group() all_sprites.add(player) |
12-Bu adımda oyuncumuza ait skor metnini çerçevemize yerleştireceğiz, sonraki adımlarda sonsuz döngümüz içerisinde oyuncumuz bir düşmanı vurduğu zaman skorunun artmasını sağlayacağız.
1 2 3 4 5 6 |
# Player score. PlayerScore = 0; # Score text font and size. myfont = pygame.font.SysFont("Helvatica", 30) # Score text put on screen. label = myfont.render("Score : " + str(PlayerScore), 1, (0,100,0)) |
13-Bu adımda sonsuz döngmüzü oluşturuyoruz ve olayları yakalamak için pygame.event.get() parametremizi döngü içerisinde çağırıyoruz.
1 2 3 4 |
running = True # Mail loop. while running: for event in pygame.event.get(): |
14-Bu adımda klavye olaylarını yakalıyoruz. ESC tuşuna basıldığında oyunun sonlanmasını, SPACE tuşuna basıldığında Bullet sınıfımızı çağırarak oyuncumuzun ateş etmesini sağlıyoruz.
1 2 3 4 5 6 7 |
if event.type == KEYDOWN: if event.key == K_ESCAPE: # if gamer press ESC on keyboard end the game. running = False if event.key == K_SPACE: # if gamer press SPACE on keyboard create new bullet object. new_bullet = Bullet() bullets.add(new_bullet) all_sprites.add(new_bullet) |
15-Bu adımda 10. adımda timer ile çağırdığımız ADDENEMY olayı çağırıldığında yapılacak işlemleri tanımlıyoruz. Bu olay çağırıldığında düşman yaratılması için Enemy sınıfını çağıracağız.
1 2 3 4 5 6 7 |
elif event.type == QUIT: running = False elif event.type == ADDENEMY: # ADDENEMY event called by the clock.(LINE 110) new_enemy = Enemy() enemies.add(new_enemy) all_sprites.add(new_enemy) |
16-Bu adımda pygame.key.get_pressed() parametresi ile klavye üzerinde basılan tuşlara ait bilgileri player.update() fonksiyonumuza yolluyoruz. Bu sayede player sınıfımızın update fonksiyonunda belirttiğimiz hareket olaylarının gerçekleşmesini sağlıyoruz.
1 2 |
pressed_keys = pygame.key.get_pressed() player.update(pressed_keys) |
17-Bu adımda daha önce oluşturduğumuz Düşmanlar ve Mermilerin sürekliliği ve hareketini sağlamak için sonsuz döngümüz içerisinde iki sınıfa da ait update fonksiyonlarını çağırıyoruz.
1 2 3 |
# Update the position enemies and bullets. enemies.update() bullets.update(); |
18-Bu adımda arka plan resmimizin çerçeveye tam olarak sığmasını sağlayacak parametreyi yazıyoruz ve tüm objeleri ekrana çiziyoruz.
1 2 3 4 5 |
# Background image. Fill screen. screen.blit(background_image, [0, 0]) # Draw all sprites on screen. for entity in all_sprites: screen.blit(entity.surf, entity.rect) |
19-Bu adımda pygame pygame.sprite.spritecollideany parametresini kullanarak oyuncumuz ile düşmanlar arasında bir çakışma varmı kontrol ediyoruz. Eğer var ise player nesnemizi yok edip oyunu sonlandırıyoruz.
1 2 3 4 |
# if any enemies have collided with the player if pygame.sprite.spritecollideany(player, enemies): player.kill() running = False |
20-Bu adımda oyuncumuz tarafından ateşlenen mermiler ile düşmanlar arasında bir çakışma varmı bunu kontrol ediyoruz, eğer bir çakışma var ise çakışan nesneleri yok edip oyuncumuzun skoruna 1 ekliyoruz.
1 2 3 4 5 |
# if any bullets have colliaded with the enemy EnemyShot = pygame.sprite.groupcollide(bullets, enemies, True, True); if EnemyShot: PlayerScore = PlayerScore+1; label = myfont.render("Score : " + str(PlayerScore), 1, (0,100,0)) |
21-Son adım olarak skor etiketimizi ekrana çiziyoruz ve framerate yi sınırlamak için clock nesnemizi çağırıyoruz.
1 2 3 |
screen.blit(label, (700, 10)); pygame.display.flip() clock.tick(30); # Framerate. |
Kodlarımız bu kadar, oyun içerisinde kullanılan resimler ve kodların tamamına yazının başında verdiğim github linki üzerinden ulaşabilirsiniz.
Sorularınız için aşağıda yer alan yorum bölümünü kullanabilirsiniz.
HOCAM Ben yaptım ama oyunu nasıl çalıştıyoruz
Merhaba,
Windows İşletim Sistemi altında ;
Python’un kurulu olduğu dizini buluyoruz Örn : c:\Python3.1\python.exe
Daha sonra kodumuzun olduğu dizini buluyoruz Örn : c:\users\kerem\desktop\oyun.py
Komut Penceresini (cmd) açıyoruz ve cd komutu ile c:\Python3.1\python.exe dizinine geçiyoruz. Örn : cd c:\Python3.1\python.exe
Daha Sonra komut satırına python c:\users\kerem\desktop\oyun.py yazarak kodumuzu çalıştırıyoruz.
Linux İşletim Sistemi altında ;
Kodumuzun olduğu dizini buluyoruz Örn : /home/kerem/oyun.py
Daha sonra komut satırına python /home/kerem/oyun.py yazarak kodumuzu çalıştırıyoruz.