Alla koodi joka toimii ihan hyvin mutta miten saisi kulmaosumatilanteessa tiedon siitä mihin neljästä kulmasta pallo osui?Joudunko laskemaan etäisyydet kulmiin?
Aion näet kehittää vielä pallojen kimpoilua niin että jos kulmaosuma tapahtuu esimerkiksi palikan oikeaan yläkulmaan ja sen palikan yläpuolella on palikka niin silloin ei tehdä täydellistä kulmaosumaa.....
Function Lahempana(dx, dy, r) xhit=1 yhit=1 Return dx * dx + dy * dy < r * r End Function Function Osuma(x0, y0, x1, y1, xk, yk, r) xhit=0 yhit=0 ; Sivujen suuntaiset tilanteet: If x0 <= xk And xk <= x1 Then xhit=1 Return y0 - r < yk And yk < y1 + r End If If y0 <= yk And yk <= y1 Then yhit=1 Return x0 - r < xk And xk < x1 + r End If ; Kulmittaiset tilanteet: If xk < x0 And yk < y0 Then Return Lahempana(x0 - xk, y0 - yk, r) If xk > x1 And yk < y0 Then Return Lahempana(x1 - xk, y0 - yk, r) If xk > x1 And yk > y1 Then Return Lahempana(x1 - xk, y1 - yk, r) If xk < x0 And yk > y1 Then Return Lahempana(x0 - xk, y1 - yk, r) End Function
Koodin lopussa on neljä if-lausetta, yksi kutakin kulmaa kohti, joten siinähän sinulla on jo suoraan tieto, mikä kulma on kyseessä.
Katoppas vaan:)
Function Osuma(x0, y0, x1, y1, xk, yk, r) xhit=0 yhit=0 ; Sivujen suuntaiset tilanteet: If x0 <= xk And xk <= x1 Then xhit=1 Return y0 - r < yk And yk < y1 + r End If If y0 <= yk And yk <= y1 Then yhit=1 Return x0 - r < xk And xk < x1 + r End If ; Kulmittaiset tilanteet: If xk < x0 And yk < y0 Then KULMA=1 Return Lahempana(x0 - xk, y0 - yk, r) End If If xk > x1 And yk < y0 Then KULMA=2 Return Lahempana(x1 - xk, y0 - yk, r) End If If xk > x1 And yk > y1 Then KULMA=3 Return Lahempana(x1 - xk, y1 - yk, r) End If If xk < x0 And yk > y1 Then KULMA=4 Return Lahempana(x0 - xk, y1 - yk, r) End If End Function
Lisäsin globaalin apumuuttujan kulma mutta en haluaisi tehdä turhaa työtä ennenkuin tiedän että olen tehnyt oikein eli näin:
1 2 +--+ | | +--+ 3 4
Olenko tajunnut nuo 4 iffiä oikein että mitä kulmaa ne merkkaavat?
2 ylempää on (yk < y0), ja 2 keskimmäistä (xk > x1)
1 2 +--+ | | +--+ 4 3
Ja jos oikein ymmärsin, niin tuo...
If x0 <= xk And xk <= x1 Then xhit=1 Return y0 - r < yk And yk < y1 + r End If
...tarkottaa osumaa ylä- tai ala-seinään. Sinällään nimi xhit on vähän harhaanjohtava, kun tilanteen jälkeen peilattava koordinaatti on Y.
Eli muutan vaan kahta viimeistä if lausetta niin että 3 ja 4 vaihtaavat paikkaansa?
Alla olevassa koodissa pakko olla joku vika sillä KULMA saa yleensä aina arvon kolme riippumatta kulmasta mihin osuu....
Function Osuma(x0, y0, x1, y1, xk, yk, r) xhit=0 yhit=0 ; Sivujen suuntaiset tilanteet: If x0 <= xk And xk <= x1 Then yhit=1 Return y0 - r < yk And yk < y1 + r End If If y0 <= yk And yk <= y1 Then xhit=1 Return x0 - r < xk And xk < x1 + r End If ; Kulmittaiset tilanteet: If xk < x0 And yk < y0 Then KULMA=1 Return Lahempana(x0 - xk, y0 - yk, r) End If If xk > x1 And yk < y0 Then KULMA=2 Return Lahempana(x1 - xk, y0 - yk, r) End If If xk > x1 And yk > y1 Then KULMA=4 Return Lahempana(x1 - xk, y1 - yk, r) End If If xk < x0 And yk > y1 Then KULMA=3 Return Lahempana(x0 - xk, y1 - yk, r) End If End Function
Ainoa huomaamani vika tuossa koodissa on, että et nollaa alussa KULMA-muuttujaa. Varsinainen ongelmasi on selvästi jossain muualla. Tarkistatko esimerkiksi funktion paluuarvoa ollenkaan? Nythän asetat muuttujiin arvoja silloinkin, kun törmäystä ei tapahdu. Jos suoritat tuota funktiota vaikka silmukassa muutaman kerran ja yrität vasta lopuksi lukea KULMA-muuttujan arvon, se voi hyvinkin olla 3, vaikka törmäystä ei olisi tapahtunut ollenkaan.
Aihe on jo aika vanha, joten et voi enää vastata siihen.