Merhabalar değerli e-bergi takipçileri! Bu ay PyGame ile nasıl oyun geliştirebileceğimizi anlattığımız yazı dizisinin üçüncüsüne geldik. İlk yazımızda PyGame ile “Merhaba Dünya” yazmayı öğrenmiş ve geçtiğimiz ay da basit bir araba oyununa giriş yapmıştık. Bu ayki yazımızda ise geçen ay yarım bıraktığımız oyunu biraz daha eğlenceli hale getirmeye çalışacağız. Öncelikle oyuna rakip arabalar ekleyeceğiz ve bu arabalarınekranda rastgelebelirmelerini ayarlayacağız. Daha sonra arabaların birbirleriyle çarpışmalarını kontrol edeceğiz. Rakip arabalar karışmasın diye farklı renkte benzer arabalar oluşturduk; bu arabaları aşağıdaki bağlantılardan indirebilirsiniz.

Yine yazımızı yazarken daha önceki yazılarımızı okuduğunuzu varsayıyoruz; bu nedenle aşağıdaki kodun tamamını anlatmak yerine bu ay yeni eklenen bölümlerini neden eklediğimizi anlatacağım. Yeni eklenen bölümlerin başlangıcını ve bitişini Python dilinde yorum yapmamızı sağlayan '#' işareti ile belirttim; böylece siz de kodunuza sadece o kısımları ekleyerek oyunu çalıştırabilirsiniz. Aşağıda kodun tamamını bulabilirsiniz.

1\.  import pygame, sys, time, random
2\.  from pygame.locals import *
3.
4\.  pencereGenis = 800
5\.  pencereYuksek = 600
6\.  Siyah = (0, 0, 0)
7\.  Beyaz = (255, 255, 255)
8.
9\.  def cikis():
10\.    pygame.quit()
11\.    sys.exit()
12.
13\. def yaziYaz(yazi, tip, yuzey, x, y):
14\.           yaziS = tip.render(yazi, 1, Beyaz)
15\.           yaziRect = yaziS.get_rect()
16\.           yaziRect.topleft = (x, y)
17\.           yuzey.blit(yaziS, yaziRect)
18.
19\. #----------------Baslangis------------------------------------------------------------------------------------------------
20\. def carpisma(arabaBirRect, arabaIkiRect):
21\.    if arabaBirRect.colliderect(arabaIkiRect):
22\.       return True
23\.    else:
24\.       return False
25\. #----------------Bitis--------------------------------------------------------------------------
26.
27\. pygame.init()
28.
29\. saat = pygame.time.Clock()
30.
31\. pencereYuzeyi = pygame.display.set_mode((pencereGenis, pencereYuksek), 0, 32)
32\. pygame.display.set_caption('ODTU Bilgisayar Toplulugu - Araba Oyunu')
33.
34\. tip = pygame.font.SysFont(None, 48)
35\. #----------------Baslangis--------------------------------------------------------------------
36\. araba = pygame.Rect(400, 450, 60, 100)
37\. solBariyer = pygame.Rect(150, -200, 10, 1000)
38\. sagBariyer = pygame.Rect(640, -200, 10, 1000)
39\. arabaResim = pygame.image.load('araba.gif')
40\. araba1Resim = pygame.image.load('araba1.gif')
41\. araba2Resim = pygame.image.load('araba2.gif')
42\. araba3Resim = pygame.image.load('araba3.gif')
43\. yol = pygame.Rect(0, -200, 800, 1000)
44\. yolResim = pygame.image.load('yol.jpg')
45\. bariyer = pygame.image.load('bariyer.jpg')
46\. #----------------Bitis--------------------------------------------------------------------------
47\. gitSola = False
48\. gitSaga = False
49\. gitYukari = False
50\. gitAsagi = False
51\. Hizlan = False
52\. Yavasla = False
53\. YolDisi = False
54.
55\. #----------------Baslangis--------------------------------------------------------------------
56\. arabaBelir = False
57\. sariArabaBelir = False
58\. elFreni = False
59\. #kirmizi rakip = rakip
60\. rakipSayac = 0
61\. sariRakip = 200
62\. rakip = 100
63\. sariRakipSayac = 0
64\. beyazRakip = 500
65\. beyazRakipSayac = 0
66\. arabalar = []
67\. sariArabalar = []
68\. beyazArabalar = []
69\. #----------------Bitis--------------------------------------------------------------------------
70.
71\. Hiz = 0.0
72.
73\. while True:
74.
75\.    for olay in pygame.event.get():
76\.       if olay.type == QUIT:
77\.          pygame.quit()
78\.          sys.exit()
79\.       if olay.type == KEYDOWN:
80\.          if olay.key == K_LEFT:
81\.             gitSaga = False
82\.             gitSola = True
83\.          if olay.key == K_RIGHT:
84\.             gitSola = False
85\.             gitSaga = True
86\. #----------------Baslangis--------------------------------------------------------------------
87\.             arabaBelir = True
88\. #----------------Bitis--------------------------------------------------------------------------
89\.          if olay.key == K_UP:
90\.             elFreni = False
91\.             Yavasla = False
92\.             gitYukari = True
93\.             gitAsagi = False
94\.             Hizlan = True
95\. #----------------Baslangis--------------------------------------------------------------------
96\.             sariArabaBelir = True
97\. #----------------Bitis--------------------------------------------------------------------------
98\.          if olay.key == K_DOWN:
99\.             if Hiz > 0:
100\.               Yavasla = False
101\.               elFreni = True
102\.               Hizlan = False
103\.            else:
104\.               gitAsagi = True
105\.         if olay.key == K_SPACE:
106\.            Yavasla = False
107\.            elFreni = True
108\.            Hizlan = False
109.
110\.      if olay.type == KEYUP:
111\.         if olay.key == K_ESCAPE:
112\.            pygame.quit()
113\.            sys.exit()
114\.         if olay.key == K_LEFT:
115\.            gitSola = False
116\.         if olay.key == K_RIGHT:
117\.            gitSaga = False
118.#----------------Baslangis--------------------------------------------------------------------
119\.            arabaBelir = False
120.#----------------Bitis--------------------------------------------------------------------------
121\.         if olay.key == K_UP:
122\.            Hizlan = False
123\.            Yavasla = True
124.#----------------Baslangis--------------------------------------------------------------------
125\.            sariArabaBelir = False
126\.            arabaBelir = False
127.#----------------Bitis--------------------------------------------------------------------------
128\.         if olay.key == K_DOWN:
129\.            gitAsagi = False
130\.            elFreni = False
131\.         if olay.key == K_SPACE:
132\.            Yavasla = True
133\.            elFreni = False
134.
135.#Hizlanip yavaslamayi saglayan bolum...
136\. if Hiz == 20:
137\.      Hizlan = False
138.
139\. if araba.right >= 640 or araba.left <= 160:
140\.     YolDisi = True
141\. if araba.right < 640 and araba.left > 160:
142\.     YolDisi = False
143.
144\. if Hizlan and Hiz < 20:
145\.      if araba.right < 640 and araba.left > 160:
146\.         Hiz += 0.08
147\.      else:
148\.         Hiz -= 0.05
149\. if Yavasla:
150\.      if Hiz <= 1:
151\.         Hiz = 0
152\.      else:
153\.         Hiz -= 0.05
154\. if YolDisi:
155\.      if Hiz <= 1:
156\.         Hiz = 1
157\.      else:
158\.         Hiz -= 0.1
159\. if elFreni:
160\.      if Hiz > 0.3:
161\.         Hiz -= 0.3
162\.      if Hiz <= 0.5:
163\.         Hiz = 0
164\. if Hiz >= 3:
165\.      yanHiz = Hiz / 3
166\. else:
167\.      yanHiz = Hiz
168\. if Hiz == 0:
169\.      gitYukari = False
170.
171.#----------------Baslangis--------------------------------------------------------------------
172.#Rakip arabalarin ortaya ciktigi yer...
173\.   if sariArabaBelir and Hiz > 12:
174\.      sariRakipSayac += 1
175\.   if sariRakipSayac == sariRakip:
176\.      sariRakipSayac = 0
177\.      yeniAraba = {'rect': pygame.Rect(random.randint(161, 589), -20, 60, 100), 'speed': random.randint(10,19)}
178\.      for b in sariArabalar:
179\.         while b['rect'].left in range(yeniAraba['rect'].left, yeniAraba['rect'].right) or b['rect'].right in       range(yeniAraba['rect'].left, yeniAraba['rect'].right):
180\.            yeniAraba = {'rect': pygame.Rect(random.randint(161, 589), -20, 60, 100), 'speed':       random.randint(10,19)}
181\.      sariArabalar.append(yeniAraba)
182.
183\. for b in sariArabalar:
184\.      b['rect'].move_ip(0, Hiz - b['speed'])
185.
186\. if sariArabaBelir and Hiz > 19:
187\.      beyazRakipSayac += 1
188\. if beyazRakipSayac == beyazRakip:
189\.      beyazRakipSayac = 0
190\.      yeniAraba = {'rect': pygame.Rect(random.randint(161, 589), -20, 60, 100), 'speed': random.randint(10,19)}
191\.      for b in beyazArabalar:
192\.         while b['rect'].left in range(yeniAraba['rect'].left, yeniAraba['rect'].right) or b['rect'].right in       range(yeniAraba['rect'].left, yeniAraba['rect'].right):
193\.            yeniAraba = {'rect': pygame.Rect(random.randint(161, 589), -20, 60, 100), 'speed':       random.randint(10,19)}
194.
195\.      beyazArabalar.append(yeniAraba)
196\. for b in beyazArabalar:
197\.      b['rect'].move_ip(0, Hiz - b['speed'])
198.
199.
200\. if arabaBelir and Hiz > 10:
201\.      rakipSayac += 1
202\. if rakipSayac == rakip:
203\.      rakipSayac = 0
204\.      yeniAraba = {'rect': pygame.Rect(random.randint(161, 589), -20, 60, 100), 'speed': random.randint(10,19)}
205\.      for b in arabalar:
206\.         while b['rect'].left in range(yeniAraba['rect'].left, yeniAraba['rect'].right) or b['rect'].right in       range(yeniAraba['rect'].left, yeniAraba['rect'].right):
207\.            yeniAraba = {'rect': pygame.Rect(random.randint(161, 589), -20, 60, 100), 'speed':       random.randint(10,19)}
208\.      arabalar.append(yeniAraba)
209\. for b in arabalar:
210\.      b['rect'].move_ip(0, Hiz - b['speed'])
211.
212.
213.#Carpisma Kontrolu:
214\. for b in arabalar:
215\.      for c in sariArabalar:
216\.         if carpisma(b['rect'], c['rect']):
217\.            if b['rect'].bottom > 0 or c['rect'].bottom > 0:
218\.               b['rect'].move_ip(0, Hiz)
219\.               c['rect'].move_ip(0, Hiz)
220\.            else:
221\.               sariArabalar.remove(c)
222\.      for d in beyazArabalar:
223\.         if carpisma(b['rect'], d['rect']):
224\.            if b['rect'].bottom > 0 or c['rect'].bottom > 0:
225\.               b['rect'].move_ip(0, Hiz)
226\.               d['rect'].move_ip(0, Hiz)
227\.            else:
228\.               beyazArabalar.remove(d)
229\. for b in sariArabalar:
230\.      for c in beyazArabalar:
231\.         if carpisma(b['rect'], c['rect']):
232\.            if b['rect'].bottom > 0 or c['rect'].bottom > 0:
233\.               b['rect'].move_ip(0, Hiz)
234\.               c['rect'].move_ip(0, Hiz)
235\.            else:
236\.               sariArabalar.remove(b)
237\. for b in arabalar:
238\.      if carpisma(araba, b['rect']) and araba.top > b['rect'].top:
239\.         Hiz = 0
240\.         yanHiz = 0
241\.      elif carpisma(araba, b['rect']):
242\.         Hiz = 1
243\.         yanHiz = 0
244\.         b['speed'] = 0
245\. for b in sariArabalar:
246\.      if carpisma(araba, b['rect']) and araba.top > b['rect'].top:
247\.         Hiz = 0
248\.         yanHiz = 0
249\.      elif carpisma(araba, b['rect']):
250\.         Hiz = 1
251\.         yanHiz = 0
252\.         b['speed'] = 0
253\. for b in beyazArabalar:
254\.      if carpisma(araba, b['rect']) and araba.top > b['rect'].top:
255\.         Hiz = 0
256\.         yanHiz = 0
257\.      elif carpisma(araba, b['rect']):
258\.         Hiz = 1
259\.         yanHiz = 0
260\.         b['speed'] = 0
261.
262.#----------------Bitis--------------------------------------------------------------------------
263.
264.#Bizim arabanin haraketine karar veren bolum...
265\. if gitAsagi:
266\.      if yol.bottom > pencereYuksek:
267\.         yol.bottom -= Hiz
268\. if gitYukari:
269\.      if yol.top < 0:
270\.         yol.top += Hiz
271\.      else:
272\.         yol.top = -180
273\. if gitSaga and araba.right < pencereGenis:
274\.      if gitYukari or gitAsagi:
275\.         araba.right += yanHiz
276\. if gitSola and araba.left > 0:
277\.      if gitYukari or gitAsagi:
278\.         araba.left -= yanHiz
279.
280\. pencereYuzeyi.blit(yolResim, yol)
281\. yaziYaz('HIZ: %s ' % (int(10 * Hiz)), tip, pencereYuzeyi, 10, 400)
282\. pencereYuzeyi.blit(bariyer, sagBariyer)
283\. pencereYuzeyi.blit(bariyer, solBariyer)
284\. pencereYuzeyi.blit(arabaResim, araba)
285.#----------------Baslangis--------------------------------------------------------------------
286\. for b in arabalar:
287\.      pencereYuzeyi.blit(araba1Resim, b['rect'])
288\. for b in sariArabalar:
289\.      pencereYuzeyi.blit(araba3Resim, b['rect'])
290\. for b in beyazArabalar:
291\.      pencereYuzeyi.blit(araba2Resim, b['rect'])
292.#----------------Bitis--------------------------------------------------------------------------
293\. pygame.display.update()
294\. saat.tick(40)

İlk olarak oyunumuza arabaların çarpışmasını kontrol edecek bir fonksiyon yazıyoruz. Burada PyGame'in oyunlarda en çok kullanılan colliderect() metodunu kullanıyoruz. Kullanımı 21. satırda gördüğünüz gibi; fonksiyonda değişken olarak gelen birinci araba ile ikinci arabanın (aslında Rect nesnelerinin) çarpışmasını kontrol ediyor ve eğer çarpıştılarsa True dönüyor. Biz de 'colliderect' yazmaktansa 'carpisma' yazarak kodun anlaşılırlığını sağlıyoruz.

Yeni Arabaları Oyuna Ekleme

40\. araba1Resim = pygame.image.load('araba1.gif')
41\. araba2Resim = pygame.image.load('araba2.gif')
42\. araba3Resim = pygame.image.load('araba3.gif')

40, 41 ve 42. satırlarda daha önceki derslerde gösterdiğimiz şekilde 3 farklı rakip arabayı oyuna ekliyoruz.

Yeni Değişkenler

56\. arabaBelir = False
57\. sariArabaBelir = False
58\. elFreni = False
59.
60\. rakipSayac = 0
61\. sariRakip = 200
62\. rakip = 100
63\. sariRakipSayac = 0
64\. beyazRakip = 500
65\. beyazRakipSayac = 0
66\. arabalar = []
67\. sariArabalar = []
68\. beyazArabalar = []

56. satırdan itibaren yeni değişkenler atamaya başlıyoruz. arabaBelir değişkeni kırmızı arabalar için oluşturduğumuz sayacın artırılacağı zaman True olarak değiştirilecek, sariArabaBelir de aynı şekilde sarı arabalar için kullanılacak.

60. satırda ise sayaçları belirliyoruz. Yine rakipSayaç kırmızı arabalar için, sariRakipSayac sari arabalar için ve bir de beyaz arabalar için mevcut. Peki bu sayaçlar ne işe yarıyor? Mesela kendi belirlediğimiz bir durumda sariArabaBelir değişkenini True yapacağız ve sariRakipSayac değişkenini her döngüde artıracağız, sariRakip değişkenine yani 200'e eşitlendiğinde de ekranın rastgele bir yerinde yine rastgele bir hızda sarı araba oluşacak. Yani sayacı bir yolla artıracağız ve hedef sayıya ulaştığında sıfırlayacağız.

Gelelim 66. satırdaki “arabalar = []” bölümüne. Bu bölümde ise dinamik bir yapıda kırmızı arabaları tutuyoruz. Yani oyun çalışırken yeni araba ekleyip eskilerini silebileceğimiz bir dizi oluşturuyoruz. Aynı şekilde sarı ve beyaz arabalar için de birer dizi oluşturuyoruz.

83\.          if olay.key == K_RIGHT:
84\.             gitSola = False
85\.             gitSaga = True
86\. #----------------Baslangis------------------------------------------------------------------------------------------------
87\.             arabaBelir = True
88\. #----------------Bitis----------------------------------------------------------------------------------------------------
89\.          if olay.key == K_UP:
90\.             elFreni = False
91\.             Yavasla = False
92\.             gitYukari = True
93\.             gitAsagi = False
94\.             Hizlan = True
95\. #----------------Baslangis------------------------------------------------------------------------------------------------
96\.             sariArabaBelir = True
97\. #----------------Bitis----------------------------------------------------------------------------------------------------

Oyunumuzun olay kontrol bölümüne de hangi durumda sayaçları artıracağımızı yani arabaBelir, sariArabaBelir değişkenlerini True yapacağımızı ve hangi durumlarda sayaçları durduracağımızı, değişkenleri False yapacağımızı söylüyoruz. Burada 87. satırda klavyede sağ ok tuşuna basıldığında arabaBelir'i True yapacağımızı yani kırmızı arabalar için sayacı çalıştıracağımızı belirttik. Aynı şekilde 96. satırda da klavyenin yukarı ok tuşuna basılırsa sariArabaBelir'i True olarak değiştiriyoruz. Aslında burada hangi durumda sayacı artıracağımız tamamen bize kalmış bir şeydir. İstersek sol tuşa basıldığında da bu değişkenleri True yapabilirdik veya bir tuşa basmaktansa oyundaki başka herhangi bir durum gerçekleştiğinde de aynı değişikliği yapabilirdik. Bu konuda beyaz arabaların belirmesini biraz daha değişik yapacağız.

116\.         if olay.key == K_RIGHT:
117\.            gitSaga = False
118.#----------------Baslangis------------------------------------------------------------------------------------------------
119\.            arabaBelir = False
120.#----------------Bitis----------------------------------------------------------------------------------------------------
121\.         if olay.key == K_UP:
122\.            Hizlan = False
123\.            Yavasla = True
124.#----------------Baslangis------------------------------------------------------------------------------------------------
125\.            sariArabaBelir = False
126\.            arabaBelir = False
127.#----------------Bitis----------------------------------------------------------------------------------------------------

Biraz önce True olarak değiştirdiğimiz değişkenleri bu kez ne durumda False yapacağımızı belirliyoruz. 119. satırda sağ ok tuşundan elimizi çektiğimizde arabaBelir'i False yapıyoruz ve 125. satırda yukarı ok tuşundan elimizi çektiğimizde sariArabaBelir'i False yapıyoruz. 126. satırda ise arabaBelir'i yukarı ok tuşundan elimizi çektiğimizde false yapıyoruz. Bunun nedeni ise araba hiç ilerlemezken sürekli sağ ok tuşuna basarsak kırmızı araba çıkmasını önlemek istememiz; çünkütıpkı bizim arabamızın ilerliyor görünmesi için yolu geri götürdüğümüz gibi arabaları da yukardan aşağıya doğru göndereceğiz. Bizim arabamız dururken kırmızı bir arabanın ekranın üstünden altına doğru gitmesi hoş bir görüntü olmayacaktır. :)

Rakip Arabalar Ekranda Belirsin

173\.  if sariArabaBelir and Hiz > 12:
174\.      sariRakipSayac += 1
175\.  if sariRakipSayac == sariRakip:
176\.      sariRakipSayac = 0
177\.      yeniAraba = {'rect': pygame.Rect(random.randint(161, 589), -20, 60, 100), 'speed': random.randint(10,19)}
178\.      for b in sariArabalar:
179\.         while b['rect'].left in range(yeniAraba['rect'].left, yeniAraba['rect'].right) or b['rect'].right in       range(yeniAraba['rect'].left, yeniAraba['rect'].right):
180\.            yeniAraba = {'rect': pygame.Rect(random.randint(161, 589), -20, 60, 100), 'speed':       random.randint(10,19)}
181\.      sariArabalar.append(yeniAraba)

173. satırda sarı arabalar için oluşturduğumuz sayacı ne zaman artıracağımızı belirtiyoruz. Eğer yukarı ok tuşuna basılıyorsa sariArabaBelir değişkeni True dönüyordu ve hızımız da 12'den fazlaysa sayacı her döngüde bir kez artırıyoruz. Sayaç ise sariRakip değişkenine (200'e) eşit olduğunda önce sayacı sıfırlıyoruz ve yeni araba ekliyoruz. Yeni araba ekleme bölümü ise 177. satırda başlıyor. Öncelikle yeniAraba diye kendi oluşturduğumuz bir yapıya değişken oluşturuyoruz. Bu yapı iki bölümden oluşuyor: birincisi 'rect' (rect nesnesinin koordinatlarını ve boyutlarını tutuyor) ve ikincisi de 'speed' (arabanın hızını tutuyor). Bu yapıyı oluştururken verdiğimiz 'rect' ve 'speed' isimlerinin tamamen bize kalmış bir seçim olduğunusöyleyeyim; fakat 'rect' bölümünde bir rect nesnesi oluşturduğumuzu unutmayalım. Her rect nesnesi oluştururken yaptığımız gibi yine koordinat belirtmemiz gerekiyor. Arabanın koordinatlarını belirlerken y eksenini sürekli sabit tutuyoruz; çünkü arabanın ekranın üstünde oluşmasını istiyoruz ve -20 olarak ayarlıyoruz. x eksenini iserandom.randint fonksiyonu ile belirliyoruz. Bu fonksiyon iki değişken arasında rastgele bir sayı seçiyor. 161 ve 589 arasında seçmemizin sebebi yolun dışında araba oluşmasını engellemek. 178. satırda ise sariArabalar[] diye belirlediğimiz dizide aynı koordinatlarda başka arabaolup olmadığınabakıyoruz ve eğer aynı koordinatlarda başka araba varsa yeni bir koordinat belirliyoruz. En sonunda da 181. satırda sariArabalar[] dizisine yeni arabamızı ekliyoruz.

Rakip Arabaların Hareketi

183\. for b in sariArabalar:
184\.      b['rect'].move_ip(0, Hiz - b['speed'])

Rakip arabaların yukarıdan aşağıya doğru hareket edeceğini söylemiştik. Böyle bir hareket için PyGame'in move_ip() metodunu kullanıyoruz. Bu metodun aldığı ilk değişken rect nesnesinin kaç piksel sağa gideceğini, diğeri de kaç piksel aşağı gideceğini belirtiyor. Rakip arabalara şimdilik sağa gitme gibi bir özellik eklemek gerekmediği için onu 0 yapıyoruz. Kaç piksel aşağı gideceğini ise (Hiz – b['speed']) belirliyor; çünkü bizim kontrolümüzdeki arabanın hızı da karşıdan gelen arabanın bize nasıl görüneceği konusunda önemli oluyor. move_ip metodunu uygulayacağımız cismi de b['rect'] ile belirliyoruz. Bu da sariArabalar[] dizisinin içindeki tüm arabaların tek tek 'rect' kısmına, yani koordinatlarına ulaşıyor. 186. satırdan itibaren ise buraya kadar anlattığımız bölümlerin beyaz arabalar ve kırmızı arabalar için tekrarlarını görüyoruz. Yalnız beyaz arabalar için özel bir beyazArabaBelir gibi değişken yapmaktansa sarı arabalarda kullandığımız değişkeni kullandık. 186. satırda gördüğünüz gibi Hiz değişkeni 19'dan büyükse ve sariArabaBelir değişkeni True ise beyaz arabalar için yaptığımız sayacı artırmaya başlıyoruz.

Rakip Arabaların Çarpışma Kontrolü

213.#Carpisma Kontrolu:
214\. for b in arabalar:
215\.      for c in sariArabalar:
216\.         if carpisma(b['rect'], c['rect']):
217\.            if b['rect'].bottom > 0 or c['rect'].bottom > 0:
218\.               b['rect'].move_ip(0, Hiz)
219\.               c['rect'].move_ip(0, Hiz)
220\.            else:
221\.               sariArabalar.remove(c)
222\.      for d in beyazArabalar:
223\.         if carpisma(b['rect'], d['rect']):
224\.            if b['rect'].bottom > 0 or c['rect'].bottom > 0:
225\.               b['rect'].move_ip(0, Hiz)
226\.               d['rect'].move_ip(0, Hiz)
227\.            else:
228\.               beyazArabalar.remove(d)

Arabaların çarpışmalarını kontrol ettiğimiz bu bölümde arabaların birbirleriyle olan tüm çarpışma kombinasyonlarının gerçekleşip gerçekleşmediğine bakıyoruz. Mesela 214. satırda arabalar[] dizisinin içindeki her bir arabanın sariArabalar[] dizisinin içindeki her bir araba için ayı ayrı çarpışıp çarpışmadığına bakıyoruz. 216. satırda çarpisma fonksiyonunu kullaniyoruz ve True dönerse çarpışan arabaların altlarının y ekseni değerinin (bottom) 0'dan büyük olup olmadığına yani ekranda görünüp görünmediğine bakıyoruz (ekranın sol üst köşesinin x=0, y=0 olduğunu hatırlayalım). Eğer ekranda görünüyorlarsa onların hızlarını sıfırlamamız gerekiyor; bu da o arabaların bizim arabanın hızı ile aşağı hareket etmesi demek oluyor. bunu da 218 ve 219. satırlarda belirtiyoruz. 221. satırda ise eğer arabaların ikisi de ekranın üstünde çarpıştılarsa, yani oluşturuldukları anda çarpıştılarsa arabalardan birini remove() metodu ile siliyoruz. Mesela 221. satırda sariArabalar dizisindeki arabayı siliyoruz; ama bu da bizim tercihimiz: istersek kırmızı arabayı da silebilirdik. Öyle isteseydik arabalar.remove(b) yazmamız gerekirdi. 222. satırdan itibaren de aynı kontrolü beyaz arabalar ile kırmızı arabalar arasında yapıyoruz.

Bizim Arabamızın Çarpışma Kontrolü

237\. for b in arabalar:
238\.      if carpisma(araba, b['rect']) and araba.top > b['rect'].top:
239\.         Hiz = 0
240\.         yanHiz = 0
241\.      elif carpisma(araba, b['rect']):
242\.         Hiz = 1
243\.         yanHiz = 0
244\.         b['speed'] = 0

Bu bölümde rakip arabaların bizim arabamızla çarpışıp çarpışmadığına bakıyoruz. Bu bölümü sadece çarpışma fonksiyonu ile yapmıyoruz; çünkü bizim arabamıza arkadan çarparlarsa ve hızımızı sıfırlarsak çarpışma fonksiyonu sürekli True döndüğünden arabamız olduğu yerde kilitlenebilir. Bunu önlemek içinilk olarak arabamızın önü mü arkası mı çarptı diye bakıyoruz. Bunun için araba.top ile b['rect'].top değerlerini kıyaslıyoruz. Eğer araba.top daha büyükse y değeri aşağı doğru arttığı için bizim arabamızın daha aşağıda olduğunu anlarız ve önündeki bir arabaya çarptığını söyleyebiliriz. Bu durumda öndeki arabanın hızını hiç değiştirmemeyi tercih ediyorum ben; fakat istersek onun da hızını azaltabiliriz. Onun yerine böyle bir çarpışma durumunda bizim arabamızın hızını ve yan hızını (Hiz ve yanHiz değişkenlerini) sıfırlıyoruz. Eğer araba.top daha büyük değilse bizim arabanın hızını tamamen sıfırlamayıp 1'e düşürüyoruz ve rakip arabanın hızını (b['speed'] değişkenini) sıfırlıyoruz; çünkü arkadan çarpan her zaman suçludur. :) 245. satırdan sonra da aynı kontrolü sarı ve beyaz arabalar için yazıyoruz.

Rakip Arabaları Ekrana Çizme

286\. for b in arabalar:
287\.      pencereYuzeyi.blit(araba1Resim, b['rect'])
288\. for b in sariArabalar:
289\.      pencereYuzeyi.blit(araba3Resim, b['rect'])
290\. for b in beyazArabalar:
291\.      pencereYuzeyi.blit(araba2Resim, b['rect'])

286. satırdan itibaren ise daha önceden üstünde durduğumuz pencere yüzeyine resim çizme tekniği ile arabalar, sariArabalar ve beyazArabalar dizilerinin içindeki tüm arabaları ekrana çiziyoruz.

Böylece basit araba oyunumuza küçük özellikler eklemiş olduk. İstersek bu özelliklere yakıt ve bir bitiş çizgisi ekleyebiliriz. Bitiş çizgisi için bir sayaçla arabanın ne kadar yol aldığını sayıp sayaç belli bir sayıya ulaştığında bir bitiş çizgisi çizebiliriz. Yakıt için de bir yakıt değişkeni tutup, arabanın belli hız aralıklarında bu değişkeni farklı miktarda azaltarak sıfırlandığında arabanın hızını kesebiliriz. Bunlar gibi aklımıza yeni özellikler geldikçe ve daha da önemlisi şimdiye kadar öğrendiklerimizle yapamayacağımız eklentiler buldukça bu yazı dizisine kaldığımız yerden devam edeceğiz. Hoşçakalın :)