Käyttäjän työkalut

Sivuston työkalut


tormays

Tämä on vanha versio dokumentista!


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()
tormays.1354172259.txt.gz · Viimeksi muutettu: 2015/08/13 04:18 (ulkoinen muokkaus)