Viivalle törmäys
Viivalle törmäys
Miten pystyy tekemään viivalle törmäyksen?, ja kiitos jo etukäteen.
Tekeillä uusi peli!
Re: Viivalle törmäys
Eihän tossa oo mitään törmäystä , tarkotin että objecti ei voi mennä viivan läpi.
Tekeillä uusi peli!
Re: Viivalle törmäys
Esimerkki Sputen function käytöstä:
Tämä on tosin toteutettu imageilla, mutta helposti nuo objekteille muuttaa.
Tämä on tosin toteutettu imageilla, mutta helposti nuo objekteille muuttaa.
Code: Select all
SCREEN 800, 600
Type LINET
Field x1 As Float
Field y1 As Float
Field y2 As Float
Field x2 As Float
EndType
pallo = MakeImage(24,24)
DrawToImage pallo
Color cbyellow:Circle 0,0,ImageWidth(pallo)
DrawToScreen
PAINOVOIMA#=0.2
pallox = 200 : palloy# = 100
viiva(200,200,300,200)
viiva(600,400,350,250)
Repeat
If ilmassa=ON Then kiihtyvyys#=kiihtyvyys#+PAINOVOIMA# Else kiihtyvyys#=0
palloy#=palloy#+kiihtyvyys#
ilmassa=ON
For an.LINET=Each LINET
If CircleToLineSegIsect(pallox+KzM(pallo,1), palloy#+KzM(pallo,0), 12, an\x1, an\y1, an\x2, an\y2)>0 Then ilmassa=OFF
DrawLine(an\x1, an\y1, an\x2, an\y2)
Next an
DrawImage pallo,pallox,palloy#
DrawGame
Text 1,100, "FPS: "+FPS()
DrawScreen
Until EscapeKey()
Function DrawLine(xx1#,yy1#,xx2#,yy2#)
Line xx1#,yy1#,xx2#,yy2#
EndFunction
Function viiva(xx1#,yy1#,xx2#,yy2#)
aa.LINET=New(LINET)
aa\x1=xx1#
aa\x2=xx2#
aa\y1=yy1#
aa\y2=yy2#
EndFunction
Function KzM(img,valit)
' If valit=1 Then aa#=ImageWidth(obj)/2+ScreenWidth()/2 Else aa#=ImageHeight(obj)/2+ScreenHeight()/2
If valit=1 Then aa#=ImageWidth(img)/2 Else aa#=ImageHeight(img)/2
Return aa#
EndFunction
//CircleToLineSegIsect
//
//Palauttaa:
// TRUE (1) kun:
// Ympyrä [keskipiste = (cx, cy); säde = r]
// leikkaa janan, joka kulkee pisteiden (l1x, l1y) & (l2x, l2y) kaitta
// FALSE (0) muulloin
Function CircleToLineSegIsect(cx#, cy#, r#, l1x#, l1y#, l2x#, l2y#)
//Ympyrän keskipisteen ja (ainakin toisen) janan päätepisteen etäisyys < r
//-> leikkaus
If Distance(cx, cy, l1x, l1y) <= r Or Distance(cx, cy, l2x, l2y) <= r Then Return True
//Vektorit (janan vektori ja vektorit janan päätepisteistä ympyrän keskipisteeseen)
SegVecX# = l2x - l1x
SegVecY# = l2y - l1y
PntVec1X# = cx - l1x
PntVec1Y# = cy - l1y
PntVec2X# = cx - l2x
PntVec2Y# = cy - l2y
//Em. vektorien pistetulot
dp1# = SegVecX * PntVec1X + SegVecY * PntVec1Y
dp2# = -SegVecX * PntVec2X - SegVecY * PntVec2Y
//Tarkistaa onko toisen pistetulon arvo 0
//tai molempien merkki sama
If dp1 = 0 Or dp2 = 0 Then
ElseIf (dp1 > 0 And dp2 > 0) Or (dp1 < 0 And dp2 < 0) Then
Else
//Ei kumpikaan -> ei leikkausta
Return False
EndIf
//Janan päätepisteiden kautta kulkevan suoran 'yhtälö' (ax + by + c = 0)
a# = (l2y - l1y) / (l2x - l1x)
b# = - 1
c# = - (l2y - l1y) / (l2x - l1x) * l1x + l1y
//Ympyrän keskipisteen etäisyys suorasta
d# = Abs(a * cx + b * cy + c) / Sqrt(a * a + b * b)
//Ympyrä on liian kaukana
//-> ei leikkausta
If d > r Then Return False
//Jos päästään tänne saakka, ympyrä ja jana leikkaavat (tai ovat sisäkkäin)
Return True
EndFunction