====== 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()