22 Haziran 2013 Cumartesi

Çarpışma Kontrolü

Geldik bu bölümün son yazısına.Daha önce harekete giriş kısmında cismimizi hareket ettirip,ekranımızdan çıkmaması için koordinatları kontrol etmiştik.Aslında orada çarpışma kontrolünü yaptık.Şimdi iki cismin çarpışıp çarpışmadığını kontrol edeceğiz.Bildiğiniz gibi cisimlerimizi ekrana yerleştirirken çeşitli parametreler kullanıyorduk:top,left,bottom...Resim üzerinden konuşursak
right > x >left  ve  bottom > y >top olduğunda çarpışma gerçekleşmiş demektir.Şimdi bunu koda dökelim.
İlk aklımıza gelen,
def isPointInside(x,y,rect):
 if (x > rect.left) and (x < rect.right) and (y > rect.top) and (y < rect.bottom):
  return True
 else:
  return False
şeklinde bir fonksiyon tanımlayıp bütün parametreleri teker teker kontrol etmek.Ama buna hiç gerek yok.Bu işi bizim yerimize yapan bir fonksiyon var:colliderect().
Fonksiyonun kullanımı şu şekilde:
obj.colliderect(hedefObj)
Buradaki obj pygame.Rect sınıfından türemiş bir nesne.Aynı şekilde hedefObj de bir Rect nesnesi.Şimdi bu bilgiyi kullanarak iki cismin çarpışmasını kontrol edelim.Daha önce yazdığımız hareket koduna detectCollision metodu ekleyelim:
def detectCollision(obj1,obj2):
 
 if obj1.pos.colliderect(obj2.pos):
  if obj1.dir == Direction.UPLEFT:
   obj1.dir = Direction.DOWNRIGHT
  
  if obj2.dir == Direction.DOWNRIGHT: 
   obj2.dir = Direction.UPLEFT
  
  if obj1.dir == Direction.DOWNLEFT:
   obj1.dir = Direction.UPRIGHT
  
  if obj2.dir == Direction.UPRIGHT: 
   obj2.dir = Direction.DOWNLEFT
  
  if obj1.dir == Direction.DOWNRIGHT:
   obj1.dir = Direction.UPLEFT
  
  if obj2.dir == Direction.UPLEFT: 
   obj2.dir = Direction.DOWNRIGHT
  
  if obj1.dir == Direction.UPRIGHT:
   obj1.dir = Direction.DOWNLEFT
  
  if obj2.dir == Direction.DOWNLEFT: 
   obj2.dir = Direction.UPRIGHT
İlk if şartı çarpışma olup olmadığını kontrol ediyor.Diğer if durumları ise duruma göre yönümüzü değiştirmemizi sağlıyor.Ana döngümüz ise şu şekilde:
while True:
 ...
 detect_collision(nesne1,nesne2)
 nesne1.move(time_passed_seconds)
 nesne2.move(time_passed_seconds)
 
  
 pygame.draw.rect(window,GREEN,nesne1.pos)
 pygame.draw.rect(window,RED,nesne2.pos)
 
 pygame.display.flip()
Hareket metodunu çalıştırmadan önce çarpışma olup olmadığını kontrol ediyoruz.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 Cisim"""
 
 def __init__(self):
  self.pos = pygame.Rect((200,200), (20, 20))
  self.pixel_per_second= 100
  self.dir = Direction.UPLEFT

 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

  if self.dir == Direction.DOWNRIGHT:
   self.pos.left += self.pixel_per_second * second
   self.pos.top += self.pixel_per_second * second

  if self.dir == Direction.UPLEFT:
   self.pos.left -= self.pixel_per_second * second
   self.pos.top -= self.pixel_per_second * second

  if self.dir == Direction.UPRIGHT:
   self.pos.left += self.pixel_per_second * second
   self.pos.top -= self.pixel_per_second * second

  # check if the block has move out of the window
  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:
  # poslock has moved past the posottom
   if self.dir == Direction.DOWNLEFT:
    self.dir = Direction.UPLEFT
   if self.dir == Direction.DOWNRIGHT:
    self.dir = Direction.UPRIGHT
  if self.pos.left < 0:
  # poslock has moved past the left side
   if self.dir == Direction.DOWNLEFT:
    self.dir = Direction.DOWNRIGHT
   if self.dir == Direction.UPLEFT:
    self.dir = Direction.UPRIGHT
  if self.pos.right > 800:
  # poslock has moved past the right side
   if self.dir == Direction.DOWNRIGHT:
    self.dir = Direction.DOWNLEFT
   if self.dir == Direction.UPRIGHT:
    self.dir =Direction. UPLEFT


def detect_collision(obj1,obj2):
 
 if obj1.pos.colliderect(obj2.pos):
  if obj1.dir == Direction.UPLEFT:
   obj1.dir = Direction.DOWNRIGHT
  
  if obj2.dir == Direction.DOWNRIGHT: 
   obj2.dir = Direction.UPLEFT
  
  if obj1.dir == Direction.DOWNLEFT:
   obj1.dir = Direction.UPRIGHT
  
  if obj2.dir == Direction.UPRIGHT: 
   obj2.dir = Direction.DOWNLEFT
  
  if obj1.dir == Direction.DOWNRIGHT:
   obj1.dir = Direction.UPLEFT
  
  if obj2.dir == Direction.UPLEFT: 
   obj2.dir = Direction.DOWNRIGHT
  
  if obj1.dir == Direction.UPRIGHT:
   obj1.dir = Direction.DOWNLEFT
  
  if obj2.dir == Direction.DOWNLEFT: 
   obj2.dir = Direction.UPRIGHT
  
pygame.init()
WINDOWWIDTH = 800
WINDOWHEIGHT = 600
FPS = 60
WHITE = (255,255,255)
GREEN = (0,  255, 0)
RED =   (255, 0, 0)
BLUE =  (0, 0,139)
window = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
clock = pygame.time.Clock()
nesne1 = Obj()
nesne2 = Obj()

nesne2.dir = Direction.UPRIGHT
  
while True:
 window.fill(WHITE)
 time_passed = clock.tick(FPS)
 time_passed_seconds = time_passed/1000.0
 detect_collision(nesne1,nesne2)
 nesne1.move(time_passed_seconds)
 nesne2.move(time_passed_seconds)
 
  
 pygame.draw.rect(window,GREEN,nesne1.pos)
 pygame.draw.rect(window,RED,nesne2.pos)
 
 pygame.display.flip()
 

0 yorum :

Yorum Gönder