12 Mayıs 2013 Pazar

Time-Based Hareket


Bir önceki dersimizde ekrana yeşil kutu çizdirip her bir frame'de pozisyon değiştirerek hareket ettirmiştik.Bu frame-based harekettir ve tamamen kullandığımız bilgisayarın görüntüyü işleme hızına bağlıdır.Bu bağımlılıktan kurtulmak için uygulamamızı time-based hale getireceğiz.Yalnız bu demek değil ki uygulamamız yavaş makinelerde de çok hızlı çalışacak.Biz sadece iki frame arasında geçen süreyi hesaplayarak hareketimizi bu süreye göre belirleyeceğiz.

Bildiğiniz gibi clock nesnesinin  tick fonksiyonu bir oyun döngüsünün ne kadar zamanda icra edildiğini hesaplıyor.Bu bilgiyi kullanarak iki frame arasında geçen süreyi hesaplayalım:

time_passed = clock.tick(FPS)
time_passed_seconds = time_passed/1000.0

Böylece saniye cinsinden döngü süremizi hesaplamış olduk.Şimdi ise bunu move fonksiyonu içerisinde kullanalım.Tabiki move fonksiyonunda bazı düzenlemeler yapmamız gerekiyor.

def move(self,second):
 if self.dir == Direction.DOWNLEFT:
  self.pos.left -= self.pixel_per_second * second
  self.pos.top += self.pixel_per_second * second
        ...

Burada pixel_per_second nesnemizin saniye de kaç pixel hareket edeceğini belirliyor.Ben öntanımlı olarak 100 değerini verdim.Bu değeri artırarak yada azaltarak oyun hızında ki değişimi gözlemleye bilirsiniz.Bu yaptığımız değişiklikle hareketimizi zamana bağlı hale getirmiş olduk.
Bir önceki dersteki kodun aynısını kullandığım için sadece değişiklik yaptığımız kısımları ekliyorum.
def __init__(self):
  ...
 self.pixel_per_second= 100
  ...

def move(self,second):
  ...
   ... -= self.pixel_per_second * second
   ... += self.pixel_per_second * second

  ...
   ... += self.pixel_per_second * second
   ... += self.pixel_per_second * second

  ...
   ... -= self.pixel_per_second * second
   ... -= self.pixel_per_second * second

  ...
   ... += self.pixel_per_second * second
   ... -= self.pixel_per_second * second
...        
time_passed = clock.tick(FPS)
time_passed_seconds = time_passed/1000.0
nesne.move(time_passed_seconds)
...

0 yorum :

Yorum Gönder