5 Mayıs 2013 Pazar

Harekete Giriş


Ekrana şekiller çizdirmeye başladığımıza göre artık hareket konusuna giriş yapabiliriz.Öncelikle şunu anlamalıyız:ekranda hiçbir şey hareket etmez.Hareket bir illüzyondur.Biz sadece pikselleri bir yerden başka bir yere kopyalarız.Bunu saniye de birkaç kez yaptığımızda da hareket etkisi yaratılmış olur.
Şimdi ekrana yeşil bir kutu çizdirip hareket ettirelim.Kutumuz diagonal hareket edecek.
Bu yüzden yönleri belirtmemiz gerekiyor. Kodumuzun daha derli toplu olması için Direction isminde bir class tanımlayacağız.
class Direction(object):
  DOWNLEFT = 1
  DOWNRIGHT = 3
  UPLEFT = 7
  UPRIGHT = 9

Ardından Obj class 'ını tanımlayalım.
class Obj(object):
 """docstring for Cisim"""
 
 def __init__(self):
  self.pos = pygame.Rect(200,200, 20, 20)
  self.MOVESPEED = 4
  self.dir = Direction.UPLEFT
Nesnemizi oluştururken pygame'in Rect sınıfını kullandık.Aslında bunu daha önce de yaptık.Hatırlarsanız ekrana yazı yada resim eklerken koordinatlar için get_rect() isimli bir fonksiyon kullanmıştık.İşte bu fonksiyon aslında pygame.Rect sınıfından nesne türetiyor ve biz bu nesnenin koordinatlarına cismimizi yerleştiriyoruz.Burada (200,200) nesnenin koordinatları ve (20,20) ise genişlik ve yükseklik değeri.self.dir ise başlangıç yönümüz.

Nesnemizin hareket fonksiyonu,
def move(self):
 if self.dir == Direction.DOWNLEFT:
  self.pos.left -= self.MOVESPEED
  self.pos.top += self.MOVESPEED

 if self.dir == Direction.DOWNRIGHT:
  self.pos.left += self.MOVESPEED
  self.pos.top += self.MOVESPEED

 if self.dir == Direction.UPLEFT:
  self.pos.left -= self.MOVESPEED
  self.pos.top -= self.MOVESPEED

 if self.dir == Direction.UPRIGHT:
  self.pos.left += self.MOVESPEED
  self.pos.top -= self.MOVESPEED
left, dikdörtgenin sol-üst x değeri; top, dikdörtgenin sol-üst y değeri.Benzer şekilde sağ-üst x değeri right ve sol-alt y değeri de bottom.Koordinat sistemini düşünürsek,sol-alt tarafa doğru hareket etmek için,left değerini azaltıp sürekli top değerini artırmalıyız.Benzer şekilde sol-yukarı tarafa hareket etmek için de left ve top değerini azaltmalıyız.

Nesnemizin ekrandan dışarı çıkmaması için çarpışma kontrolü ve buna bağlı olarak yön değiştirme de yapmalıyız.Bunun için kodumuz şu şekilde:
if self.pos.top < 0:
 if self.dir == Direction.UPLEFT:
  self.dir = Direction.DOWNLEFT
 if self.dir == Direction.UPRIGHT:
  self.dir = Direction.DOWNRIGHT
if self.pos.bottom > 600:
 if self.dir == Direction.DOWNLEFT:
  self.dir = Direction.UPLEFT
 if self.dir == Direction.DOWNRIGHT:
  self.dir = Direction.UPRIGHT
if self.pos.left < 0:
 if self.dir == Direction.DOWNLEFT:
  self.dir = Direction.DOWNRIGHT
 if self.dir == Direction.UPLEFT:
  self.dir = Direction.UPRIGHT
if self.pos.right > 800:
 if self.dir == Direction.DOWNRIGHT:
  self.dir = Direction.DOWNLEFT
 if self.dir == Direction.UPRIGHT:
  self.dir =Direction.UPLEFT

pos.top < 0 ifadesi nesnemizin ekranın üst kısmına çarpma durumu(top değeri,sol-üst y değeriydi.Bu değerin sıfır olduğu tek yer x ekseni).Bu durumda iki ihtimal var:Hareket yönümüz ya yukarı-sol yada yukarı-sağ.Duruma göre yönü aşağı-sol yada aşağı-sağ olarak değiştiriyoruz. Aynı şekilde pos.bottom > 600 ifadesi de nesnemizin ekranın alt kısmına çarpma durumunu ifade ediyor.Bu durumda da hareket yönümüz sol-aşağı yada sağ-aşağı.Duruma göre yönümüzü değiştiriyoruz. Diğer kısımlar ise ekranın sağ tarafına yada sol tarafına çarpma durumları.

Ana döngümüz ise şu şekilde:
pygame.init()
WINDOWWIDTH = 800
WINDOWHEIGHT = 600
FPS = 25
WHITE = (255,255,255)
GREEN = (0,  255,  0)
window = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
clock = pygame.time.Clock()
nesne = Obj()  
while True:
 window.fill(WHITE)
 nesne.move()
 pygame.draw.rect(window,GREEN,nesne.pos)
 pygame.display.flip()
 clock.tick(FPS)

Gördüğünüz gibi bu sefer clock diye bir değişken tanımladık.Bununla oyun döngümüzün saniyede kaç kere icra edileceğini belirleyebiliyoruz.Bu uygulamada döngü hızımız saniyede 25 kare.
Algoritmamız gayet basit:
  • Ekranı temizle 
  • Move fonksiyonunu çalıştır
  • Obj bulunduğu pozisyona nesneyi çiz
  • Ekranı güncelle

Kodumuzun tamamı:
#!/usr/bin/env python
import pygame
from pygame.locals import *

class Direction(object):
 DOWNLEFT = 1
 DOWNRIGHT = 3
 UPLEFT = 7
 UPRIGHT = 9
  
class Obj(object):
 """docstring for Obj"""
 def __init__(self):
  self.pos = pygame.Rect(200,200, 20, 20)
  self.MOVESPEED = 4
  self.dir = Direction.UPLEFT

 def move(self):
  if self.dir == Direction.DOWNLEFT:
   self.pos.left -= self.MOVESPEED
   self.pos.top += self.MOVESPEED

  if self.dir == Direction.DOWNRIGHT:
   self.pos.left += self.MOVESPEED
   self.pos.top += self.MOVESPEED

  if self.dir == Direction.UPLEFT:
   self.pos.left -= self.MOVESPEED
   self.pos.top -= self.MOVESPEED

  if self.dir == Direction.UPRIGHT:
   self.pos.left += self.MOVESPEED
   self.pos.top -= self.MOVESPEED

  
  if self.pos.top < 0:
   if self.dir == Direction.UPLEFT:
    self.dir = Direction.DOWNLEFT
   if self.dir == Direction.UPRIGHT:
    self.dir = Direction.DOWNRIGHT
  if self.pos.bottom > 600:
   if self.dir == Direction.DOWNLEFT:
    self.dir = Direction.UPLEFT
   if self.dir == Direction.DOWNRIGHT:
    self.dir = Direction.UPRIGHT
  if self.pos.left < 0:
   if self.dir == Direction.DOWNLEFT:
    self.dir = Direction.DOWNRIGHT
   if self.dir == Direction.UPLEFT:
    self.dir = Direction.UPRIGHT
  if self.pos.right > 800:
   if self.dir == Direction.DOWNRIGHT:
    self.dir = Direction.DOWNLEFT
   if self.dir == Direction.UPRIGHT:
    self.dir =Direction. UPLEFT

  
  
pygame.init()
WINDOWWIDTH = 800
WINDOWHEIGHT = 600
FPS = 25
WHITE = (255,255,255)
GREEN = (0,  255,  0)
window = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
clock = pygame.time.Clock()
nesne = Obj()  

while True:
 window.fill(WHITE)
 nesne.move()
 pygame.draw.rect(window,GREEN,nesne.pos)
 pygame.display.flip()
 clock.tick(FPS)

Kaynakça:

0 yorum :

Yorum Gönder