PyGame ile 2D RPG Oyunu Yapalım (1. Bölüm)
Çoktandır blogla ilgilenmiyordum. Dün akşam tasarımı baştan aşağı değiştirdikten sonra tekrar yazma isteği uyandı. Ne yazabilirim diye düşünürken, yarım kalan projeler içindeki RPG oyununu buldum. Hem Türkçe kaynak olur hem de projeyi tamamlarım diyerekten bu yazı dizisini başlatmaya karar verdim.

Haritadaki bozuklukların sebebi spritesheet'i internetten bulmak yerine elle çizmeyi tercih etmem. Her kareyi (tile) ihtiyaç oldukça çiziyordum. Neyse...
Proje Yapısı
Önce oyun projesini oluşturup gerekli klasörleri, modülleri vs. oluşturalım.
Proje Dizini ├── core │ ├── characters │ │ ├── __init__.py │ │ └── player.py │ │ │ ├── managers │ │ ├── __init__.py │ │ ├── resourcemanager.py │ │ └── tilemanager.py │ │ │ ├── maps │ │ ├── __init__.py │ │ └── island.py │ │ │ ├── mobs │ │ └── __init__.py │ │ │ ├── tiles │ │ └── __init__.py │ │ │ └── __init__.py │ ├── data │ ├── maps │ ├── sprites │ └── tiles │ └── main.py
Oyun modülleri core klasöründe, resim, map ya da xml gibi kaynak dosyaları da data klasöründe duracak.
Klasörlerin içindeki __init__.py dosyaları, klasörleri python paketi olarak görmesini sağlamak için. Çalıştığımız dosyaya from characters.player import Player gibi import etmemize yarayacak.
Oyun Modülü ve Yaşam Döngüsü
Oyunun ana modülü main.py olacak. PyGame benim sistemde kurulu olduğu için virtualenv kullanma gereği duymadım eğer isterseniz şuraya bakabilirsiniz.
Şimdi main.py içine gelip aşağıdaki gibi ya da buna benzer bir sınıf oluşturun.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pygame
class Game:
def __init__(self, display, flags, depth):
pygame.init()
pygame.display.set_caption("2D RPG")
self.screen = pygame.display.set_mode(display, flags, depth)
self.running = True
clock = pygame.time.Clock()
fps = 30
__pressed = {}
def start(self):
self.load()
self.loop()
def load(self):
pass
def loop(self):
while self.running:
self.events()
self.update()
self.render()
self.clock.tick(self.fps)
def update(self):
pass
def render(self):
self.screen.fill((255, 255, 255))
# render işleri
pygame.display.update()
def events(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
self.running = False
pygame.quit()
elif event.type == pygame.KEYDOWN or event.type == pygame.KEYUP:
self.__pressed[str(event.key)] = event.type == pygame.KEYDOWN
if __name__ == "__main__":
game = Game((800, 600), 0, 32)
game.start()
Game sınıfı içinde önce __init__ fonksiyonunda PyGame'i hazırlayıp, pencere başlığını belirleyip, çalışma alanını (self.screen) belirledik. Pencere değişkenleri sınıfın oluşturulması esnasında parametre olarak geliyor.
Sınıf içindeki clock oyun zamanını, fps bir saniyede oynatılacak görüntü sayısını, __pressed o an basılı olan klavye tuşlarını tutacak.
Oyun döngesi loop fonksiyonu içinde. Sırasıyla events ile oyun olaylarını (tıklama, tuşa basma vs.) kontrol edecek, update ile -oyuncu, düşman gibi- oyun objelerinin özelliklerini belirleyecek, render ile ekrana basılması gereken resimleri çizecek ve son olarak clock.tick ile oyun saatini ilerletecek.
Events fonksiyonunda o anda oyun içinde gerçekleşen olaylar (pygame.event.get) içinden işimize yarayan eventleri aldık. Oyun kapatıldığında oyun yaşam döngüsünü kontrol eden running değişkeni False oldu. Eğer klavyeden bir tuşa basılmış (Key Down) ya da tuştan el çekilmişse (Key Up) __pressed içindeki tuş değeri True ya da False oldu.
Son olarak oyun sınıfının -gerekli parametreleri vererek- bir örneğini oluşturup start fonksiyonu ile başlattık. Hiç bir sorun yoksa python main.py yaptığınızda karşınıza siyah bir ekran gelecektir.
Sonraki bölüm: Oyuncu Hareketi ve Animasyon