Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: muu kieli: Blitz3D Pallo ja palikat

Sivun loppuun

DumTom [05.04.2013 17:18:01]

#

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

Metabolix [05.04.2013 23:40:05]

#

Koodin lopussa on neljä if-lausetta, yksi kutakin kulmaa kohti, joten siinähän sinulla on jo suoraan tieto, mikä kulma on kyseessä.

DumTom [06.04.2013 05:50:04]

#

Katoppas vaan:)

DumTom [08.04.2013 01:47:43]

#

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?

User137 [08.04.2013 12:45:13]

#

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.

DumTom [09.04.2013 20:30:28]

#

Eli muutan vaan kahta viimeistä if lausetta niin että 3 ja 4 vaihtaavat paikkaansa?

DumTom [14.04.2013 18:21:38]

#

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

Metabolix [14.04.2013 18:27:06]

#

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.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta