====== Suorakaiteiden törmäys ======
Verrataan x- ja y-koordinaatteja.
# -*- coding: utf-8 -*-
import pygame
naytto = pygame.display.set_mode((640, 400))
pygame.display.set_caption("Laatikoiden törmäys")
def main():
laatikko1_x = 100
laatikko1_y = 50
laatikko1_korkeus = 100
laatikko1_leveys = 100
laatikko2_x = 250
laatikko2_y = 100
laatikko2_korkeus = 50
laatikko2_leveys = 50
while True:
tapahtuma = pygame.event.poll()
if tapahtuma.type == pygame.QUIT:
break
naytto.fill((0, 0, 0))
pygame.draw.rect(naytto, (255, 0, 0), (laatikko1_x, laatikko1_y, laatikko1_korkeus, laatikko1_leveys))
if tapahtuma.type == pygame.KEYDOWN:
if tapahtuma.key == pygame.K_RIGHT:
laatikko2_x = laatikko2_x + 10
if tapahtuma.key == pygame.K_LEFT:
laatikko2_x = laatikko2_x - 10
if tapahtuma.key == pygame.K_DOWN:
laatikko2_y = laatikko2_y + 10
if tapahtuma.key == pygame.K_UP:
laatikko2_y = laatikko2_y - 10
tormaa = False
# Testataan ensin, ovatko laatikoiden x-koordinaatit päällekkäin. Jos ovat, niin testataan y-koordinaatit
if laatikko1_x < laatikko2_x + laatikko2_leveys and laatikko2_x < laatikko1_x + laatikko1_leveys:
if laatikko1_y < laatikko2_y + laatikko2_korkeus and laatikko2_y < laatikko1_y + laatikko1_korkeus:
tormaa = True
if (tormaa):
pygame.draw.circle(naytto, (0,255,0), (10, 10), 5)
else:
pygame.draw.circle(naytto, (255,0,0), (10, 10), 5)
pygame.draw.rect(naytto, (255, 255, 0), (laatikko2_x, laatikko2_y, laatikko2_korkeus, laatikko2_leveys))
pygame.display.flip()
main()
====== Pallon ja suorakaiteen törmäys ======
Ei ole helpoimpia tapauksia.
# -*- coding: utf-8 -*-
import pygame
import math
naytto = pygame.display.set_mode((640, 400))
pygame.display.set_caption("Piirtäminen")
def main():
pallo_x = 300
pallo_y = 200
pallo_sade = 40
laatikko_x = 100
laatikko_y = 50
laatikko_korkeus = 100
laatikko_leveys = 100
while True:
tapahtuma = pygame.event.poll()
if tapahtuma.type == pygame.QUIT:
break
naytto.fill((0, 0, 0))
pygame.draw.rect(naytto, (255, 0, 0), (laatikko_x, laatikko_y, laatikko_korkeus, laatikko_leveys))
if tapahtuma.type == pygame.KEYDOWN:
if tapahtuma.key == pygame.K_RIGHT:
pallo_x = pallo_x + 10
if tapahtuma.key == pygame.K_LEFT:
pallo_x = pallo_x - 10
if tapahtuma.key == pygame.K_DOWN:
pallo_y = pallo_y + 10
if tapahtuma.key == pygame.K_UP:
pallo_y = pallo_y - 10
# Törmäyksen laskenta otettu sivulta http://stackoverflow.com/questions/401847/circle-rectangle-collision-detection-intersection/402010#402010
tormaa = False
#lasketaan keskipisteiden etäisyys toisistaan
pallon_etaisyys_x = math.fabs(pallo_x - (laatikko_x + laatikko_leveys/2))
pallon_etaisyys_y = math.fabs(pallo_y - (laatikko_y + laatikko_korkeus/2))
if (pallon_etaisyys_x > laatikko_leveys/2 + pallo_sade):
tormaa = False
elif (pallon_etaisyys_y > laatikko_korkeus/2 + pallo_sade):
tormaa = False
elif pallon_etaisyys_x <= laatikko_leveys/2.0:
tormaa = True
elif pallon_etaisyys_y <= laatikko_korkeus/2:
tormaa = True
else:
nurkan_etaisyyden_nelio = (pallon_etaisyys_x - laatikko_leveys/2)**2 + (pallon_etaisyys_y - laatikko_korkeus/2)**2
if (nurkan_etaisyyden_nelio <= pallo_sade**2):
tormaa = True
if (tormaa):
pygame.draw.circle(naytto, (0,255,0), (10, 10), 5)
else:
pygame.draw.circle(naytto, (255,0,0), (10, 10), 5)
pygame.draw.circle(naytto, (255, 255, 0), (pallo_x, pallo_y), pallo_sade)
pygame.display.flip()
main()
====== Pallojen törmäys ======
Verrataan keskipisteiden etäisyyksiä. Jos etäisyys on pienempi kuin yhteenlaskettu säteiden pituus, niin pallot koskettavat.
# -*- coding: utf-8 -*-
import pygame
import math
naytto = pygame.display.set_mode((640, 400))
pygame.display.set_caption("Kaksi palloa")
def main():
pallo1_x = 200
pallo1_y = 100
pallo1_sade = 40
pallo2_x = 300
pallo2_y = 200
pallo2_sade = 40
while True:
tapahtuma = pygame.event.poll()
if tapahtuma.type == pygame.QUIT:
break
naytto.fill((0, 0, 0))
pygame.draw.circle(naytto, (255, 0, 0), (pallo1_x, pallo1_y), pallo1_sade)
if tapahtuma.type == pygame.KEYDOWN:
if tapahtuma.key == pygame.K_RIGHT:
pallo2_x = pallo2_x + 10
if tapahtuma.key == pygame.K_LEFT:
pallo2_x = pallo2_x - 10
if tapahtuma.key == pygame.K_DOWN:
pallo2_y = pallo2_y + 10
if tapahtuma.key == pygame.K_UP:
pallo2_y = pallo2_y - 10
tormaa = False
#lasketaan keskipisteiden etäisyys toisistaan
pallojen_etaisyys_x = math.fabs(pallo1_x - pallo2_x)
pallojen_etaisyys_y = math.fabs(pallo1_y - pallo2_y)
if (pallojen_etaisyys_x )**2 + (pallojen_etaisyys_y)**2 <= (pallo1_sade + pallo2_sade)**2:
tormaa = True
if (tormaa):
pygame.draw.circle(naytto, (0,255,0), (10, 10), 5)
else:
pygame.draw.circle(naytto, (255,0,0), (10, 10), 5)
pygame.draw.circle(naytto, (255, 255, 0), (pallo2_x, pallo2_y), pallo2_sade)
pygame.display.flip()
main()