Viivalle törmäys

Voit pyytää apua ohjelmointiongelmiin täältä.
Post Reply
Jurri3
Newcomer
Posts: 38
Joined: Tue Oct 14, 2008 4:57 pm

Viivalle törmäys

Post by Jurri3 »

Miten pystyy tekemään viivalle törmäyksen?, ja kiitos jo etukäteen. :D
Tekeillä uusi peli!
Cérebro
Newcomer
Posts: 35
Joined: Wed Jul 16, 2008 8:56 pm

Re: Viivalle törmäys

Post by Cérebro »

cbLib | XMap
In development: EasyBasic - Basic-tyylinen peliohjelmointikieli
Jurri3
Newcomer
Posts: 38
Joined: Tue Oct 14, 2008 4:57 pm

Re: Viivalle törmäys

Post by Jurri3 »

Eihän tossa oo mitään törmäystä :( , tarkotin että objecti ei voi mennä viivan läpi.
Tekeillä uusi peli!
Jonhu
Active Member
Posts: 186
Joined: Mon Aug 04, 2008 5:45 pm

Re: Viivalle törmäys

Post by Jonhu »

Esimerkki Sputen function käytöstä:
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




Post Reply