Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: muu kieli: Pallon osuma BlitzBasicilla

DumTom [24.11.2012 21:38:48]

#

Mikä olisi yksinkertaisin tapa tarkistaa pallon säteellä olevat pikselit,siis että ovatko ne osuneet palikkaan?

Kokeilin tälläistä ja ei tunnu oikein toimivan.

Function CheckUpHits(b%)
ox%=-1
oy%=-1
bx%=BallX(b)
by%=BallY(b)
Color 255,255,255
If OSUMA=False
For paikka%=0 To paikka<7
bax%=bx+uphitx(paikka)
bay%=by+uphity(paikka)
;Plot bax,bay
    For y%=0 To 14
     For x%=0 To 10
     If BrickOn(y,x)=1 Then
	   If (bax>BrickLx(y,x)-1 And bax<BrickLx(y,x)+47 And bay>BrickLy(y,x)-1 And bay<BrickLy(y,x)+1) Then
        OSUMA=True
	     If ox=-1 Then ox=x
         If oy=-1 Then oy=y
         If (ox>-1 And ox<11 And oy>-1 And oy<15) Then
         BrickOn(oy,ox)=0
         If (HEAVYBALL=False) Then
         BallDir(b)=360-BallDir(b);
         BallX(b)=BallEX(b)
         BallY(b)=BallEY(b)
         End If
       End If
      End If
     End If
     Next
    Next
Next

End If

End Function

Siis tein noita funktioita neljä,joka suuntaan yhden.

Banaani sille joka kertoo järkevämmän tavan....:)

kaviaari [24.11.2012 21:46:25]

#

Asiassa voinee helpottaa Pythagoraan lause.

DumTom [25.11.2012 01:23:25]

#

Voisitko selostaa ideaasi hieman tarkemmin?

kaviaari [25.11.2012 01:26:40]

#

Pythagoraan lauseen avulla saat selvitettyä karteesisissa koordinaateissa kahden pisteen välisen etäisyyden. Kaikki pisteet joiden etäisyys ympyrän keskipisteestä on ympyrän sädettä pienempi, ovat ympyrän sisällä ja siten törmänneet ympyrään.

Metabolix [25.11.2012 01:49:36]

#

On hölmöä tarkistaa jokainen pikseli erikseen, kun voi yksinkertaisella matematiikalla laskea, onko ympyrä osunut vaakasuorassa olevaan suorakulmioon. Olkoot laatikon kulmat (x0, y0) ja (x1, y1) ja ympyrän keskipiste (xk, yk) ja säde r. Jos keskipiste on x-akselilla laatikon reunojen välissä (x0 <= xk <= x1), tarkistetaan törmäys y-akselilla helposti katsomalla, onko y-koordinaatti reunojen välissä tai enintään säteen mitan päässä (y0 - r < yk < y1 + r). Sama toimii tietenkin myös toisin päin. Jos taas ympyrä on laatikkoon nähden kulmittain, tarkistetaan Pythagoraan lauseen avulla, onko ympyrän keskipiste alle säteen päässä laatikon kulmasta.

Function Lahempana(dx, dy, r)
	Return dx * dx + dy * dy < r * r
End Function
Function Osuma(x0, y0, x1, y1, xk, yk, r)
	; Sivujen suuntaiset tilanteet:
	If x0 <= xk And xk <= x1 Then Return y0 - r < yk And yk < y1 + r
	If y0 <= yk And yk <= y1 Then Return x0 - r < xk And xk < x1 + r
	; 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

DumTom [25.11.2012 02:55:39]

#

Ymmärrän kyllä tuon periaatteen mutta mitä tuo funktio osuma palauttaa?

Lisäys: Palauttaako se true vai false?

Lisäys:

Sain toimimaan niin että pallo syö nyt palikoita käyttäen metabolixin funktioita.
Nyt pitäs varmaan luoda pari globaalia muuttujaa jotka kertoo törmäyksen että onko se ylös/alas vai vasen/oikea törmäys?
No kokeilen tässä intoa täynnä.....:)

Lisäys: Sain toimimaan täydellisesti. Kiitos kaviaari ja Metabolix!:)

Vastaus

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

Tietoa sivustosta