snake adlı oluşturduğum nesnenin hemen üstünde all_sprites_group adında pygame Group container oluşturuyorum. Tüm spriteları buraya ekleyeceğiz:
all_sprites_group = pygame.sprite.Group()
Önceki yazı ile paralel gittiğim için draw metotunu siliyoruz. Çünkü artık ona ihtiyacımız olmayacak sprite groups'tan dolayı. Snake sınıfına ait __init__ yani kurucu metotu parametresine Sprite Groups container'ı ekliyoruz. Sonrasında bunu groups adlı değişkene atayıp, super kurucu fonksiyona ikinci parametre olarak pass ediyoruz.
Kısacası Snake sprite sınıfımızı şu hale gelmiş oluyor:
class Snake(pygame.sprite.Sprite):
# constructor
def __init__(self, all_sprites_group, x, y, w, h, color):
# ana sınıfı çağır
self.groups = all_sprites_group
pygame.sprite.Sprite.__init__(self, self.groups)
self.image = pygame.Surface([w, h])
self.image.fill(color)
# image boyutlarına göre dikdörtgen nesnesi döndürülür
self.rect = self.image.get_rect()
# nesnenin pozisyonunu ayarla
self.rect.x = x
self.rect.y = y
Sonrasında ise snake adlı nesneyi oluştururken aşağıdaki gibi küçük bir ekleme yani sprite groups container pass ediliyor:
snake = Snake(all_sprites_group, 150, 60, 32, 32, (255, 0, 0))
Bu işlemden sonra tek yapmamız gereken oyun döngüsü içinde sprite group aracılığı ile karakter çizimi sağlamak. Döngü aşağıdaki gibi oluyor:
while True:
for event in pygame.event.get():
...
# çizim
...
# sprite group içindeki tüm spritelar display yani ekrana çizdirilsin
all_sprites_group.draw(display)
pygame.display.flip()
Daha sonra çalıştırıldığında düzgün bir şekilde karakterin eklendiği görülecektir. Bu şekilde tüm spriteları tek bir grup içinde toplayıp aynı anda güncelleyip, çizdirebiliriz.Yılan Nesnesini Hizalama
Çözmemiz gereken bir diğer sorun ise yılan nesnesini ızgaraya göre hizalama. Grid hücrelerine tam olarak oturtmak. Eğer farkettiyseniz her bir grid boyutu 32px boyutunda keza yılan nesnesi de 32px boyutunda. O zaman yapmamız gereken yılan nesnesini px değer ile konumlamak yerine grid miktarına göre konumlandırmak. Örneğin, ekranda genişlik olarak 22, yükseklik olarak 15 hücre bulunmakta. Yani toplamda 22 x 15 hücreden oluşmaktadır. Aşağıdaki resimde işaretli alanda yılan nesnesini başlangıç olarak konumlandırmak istediğimizi düşünelim:
Bizim yapmamız gereken işlem sadece x ekseni olduğunu varsayarsak 2, y ekseni olduğunu var sayarsak 1 değerini vermek olacaktır. 2*32'den ve 1*32'den yılan nesnesi tam olarak grid üstüne oturacaktır. Bunu yapabilmek için Snake sınıfında kurucu fonksiyonu aşağıdaki gibi gerekli yerleri düzenliyoruz:
class Snake(pygame.sprite.Sprite):
# constructor
def __init__(self, all_sprites_group, x, y, w, h, color):
...
# nesnenin pozisyonunu ayarla
self.rect.x = x * 32
self.rect.y = y * 32
Sonrasında snake nesnesi oluştururken parametrelerde x: 2 ve y: 1 olarak verilir:
snake = Snake(all_sprites_group, 2, 1, 32, 32, (255, 0, 0))
Artık hizalama aşağıda olduğu gibi gerçekleşmiştir:
Kodun tam hali:
import pygame, sys
pygame.init()
display = pygame.display.set_mode((720, 480))
pygame.display.set_caption('Merhaba Dünya')
white = (255, 255, 255)
class Snake(pygame.sprite.Sprite):
# constructor
def __init__(self, all_sprites_group, x, y, w, h, color):
# ana sınıfı çağır
self.groups = all_sprites_group
pygame.sprite.Sprite.__init__(self, self.groups)
self.image = pygame.Surface([w, h])
self.image.fill(color)
# image boyutlarına göre dikdörtgen nesnesi döndürülür
self.rect = self.image.get_rect()
# nesnenin pozisyonunu ayarla
self.rect.x = x * 32
self.rect.y = y * 32
all_sprites_group = pygame.sprite.Group()
snake = Snake(all_sprites_group, 2, 1, 32, 32, (255, 0, 0))
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
# çizim
for x in range(0, 720, 32):
pygame.draw.line(display, white, (x,0), (x,480))
for y in range(0, 480, 32):
pygame.draw.line(display, white, (0,y), (720,y))
all_sprites_group.draw(display)
pygame.display.flip()
sys.exit()
Hiç yorum yok:
Yorum Gönderme