Page 1 of 1

ClearSight() - ObjectSight:n sukulainen

Posted: Mon Jul 04, 2011 6:50 am
by MaGetzUb
Jooh päätinpä tehdä funktion, jolla pystyt tarkistamaan onko kahden pisteen välillä kartalla näkyvyyttä. :) Oikeastaan muokkasin tämän koodin vain wanhasta Bresenhamin kaavalla toteutetusta linja funktiosta. :)

Funktio & esimerkki:

Code: Select all

Global HitX, HitY
DrawToWorld ON //Primitiivien piirto maailmaan mahdolliseksi

//Kartta..
map = LoadMap("Media\cdm2.til", "Media\tileset.bmp")


Repeat 
    
    
    näkyvyys = ClearSight(0, 0, MouseWX(), MouseWY())
    DrawGame 
    If Not näkyvyys Then 
        pointX = HitX
        pointY = HitY
        Color cbred
        Circle pointX - 5, pointY + 5, 10, 0
    EndIf 
    
    Color cbwhite
    Line 0, 0, MouseWX(), MouseWY()

DrawScreen
Forever



Function ClearSight(AloitusX, AloitusY, LopetusX, LopetusY)
    If AloitusX = LopetusX And AloitusY = LopetusY Then Return True //Palautetaan 1 jos koordinaatit ovat päällekäin.
    If GetMap(2, AloitusX, AloitusY) Then HitX = LopetusX : HitY = LopetusY : Return False //Heti ekassa kohdassa oli seinää, palautetaan 0.
    Hyppy = False
    ErotusX = LopetusX - AloitusX 
    If ErotusX > 0 Then
        HyppyX = 1
    Else
        HyppyX = -1
    EndIf
    ErotusY = LopetusY - AloitusY
    If ErotusY > 0 Then
        HyppyY = 1
    Else
        HyppyY = -1
    EndIf
    ErotusX = Abs(ErotusX)
    ErotusY = Abs(ErotusY)
    If ErotusY > ErotusX Then
        Hyppy = True
        RdX = AloitusX
        AloitusX = AloitusY
        AloitusY = RdX
        RdX = ErotusX
        ErotusX = ErotusY
        ErotusY = RdX 
        RdX = HyppyX
        HyppyX = HyppyY
        HyppyY = RdX
    EndIf
    Erotus = (ErotusY + ErotusY) - ErotusX
    For i = 0 To ErotusX
        Color cbred
        If Hyppy Then
            If GetMap(2, AloitusY, AloitusX) Then HitX = AloitusY : HitY = AloitusX : Return False //O-ou tuli seinä vastaan palautetaan 0.
        Else
            If GetMap(2, AloitusX, AloitusY) Then HitX = AloitusX : HitY = AloitusY : Return False //Ja taas tuli seinä vastaan palautetaan 0. 
        EndIf
        While Erotus => 0
            AloitusY = AloitusY + HyppyY
            Erotus = Erotus - (ErotusX + ErotusX)
        Wend
        AloitusX = AloitusX + HyppyX
        Erotus = Erotus + (ErotusY + ErotusY)
    Next i
    //Jos päästiin tänne asti, niin näköyhteys on selvä ja palautetaan 1. \o/
    Return True  
EndFunction
Pelkkä funktio:

Code: Select all

Function ClearSight(AloitusX, AloitusY, LopetusX, LopetusY)
    If AloitusX = LopetusX And AloitusY = LopetusY Then Return True //Palautetaan 1 jos koordinaatit ovat päällekäin.
    If GetMap(2, AloitusX, AloitusY) Then HitX = LopetusX : HitY = LopetusY : Return False //Heti ekassa kohdassa oli seinää, palautetaan 0.
    Hyppy = False
    ErotusX = LopetusX - AloitusX 
    If ErotusX > 0 Then
        HyppyX = 1
    Else
        HyppyX = -1
    EndIf
    ErotusY = LopetusY - AloitusY
    If ErotusY > 0 Then
        HyppyY = 1
    Else
        HyppyY = -1
    EndIf
    ErotusX = Abs(ErotusX)
    ErotusY = Abs(ErotusY)
    If ErotusY > ErotusX Then
        Hyppy = True
        RdX = AloitusX
        AloitusX = AloitusY
        AloitusY = RdX
        RdX = ErotusX
        ErotusX = ErotusY
        ErotusY = RdX 
        RdX = HyppyX
        HyppyX = HyppyY
        HyppyY = RdX
    EndIf
    Erotus = (ErotusY + ErotusY) - ErotusX
    For i = 0 To ErotusX
        Color cbred
        If Hyppy Then
            If GetMap(2, AloitusY, AloitusX) Then HitX = AloitusY : HitY = AloitusX : Return False //O-ou tuli seinä vastaan palautetaan 0.
        Else
            If GetMap(2, AloitusX, AloitusY) Then HitX = AloitusX : HitY = AloitusY : Return False //Ja taas tuli seinä vastaan palautetaan 0. 
        EndIf
        While Erotus => 0
            AloitusY = AloitusY + HyppyY
            Erotus = Erotus - (ErotusX + ErotusX)
        Wend
        AloitusX = AloitusX + HyppyX
        Erotus = Erotus + (ErotusY + ErotusY)
    Next i
    //Jos päästiin tänne asti, niin näköyhteys on selvä ja palautetaan 1. \o/
    Return True  
EndFunction

Re: ClearSight() - ObjectSight:n sukulainen

Posted: Mon Jul 04, 2011 11:10 am
by Sly_Jack0
Vaihdappa esimerkkikoodissa DirSight() -> ClearSight() ja poista toinen ClearSight()-funktion määrittely.

Re: ClearSight() - ObjectSight:n sukulainen

Posted: Mon Jul 04, 2011 12:47 pm
by phons
Sly_Jack0 wrote:Vaihdappa esimerkkikoodissa DirSight() -> ClearSight() ja poista toinen ClearSight()-funktion määrittely.
Magetzuppi oli lähettänyt tuon näköjää 5:50 am, kertoo varmaan vähän miksi tollasia typoja löytyy :D Mutta kun nuo yllämainitut korjaukset teki, niin funktio toimi ihan näppärästi, joku ObjectPick tjs. kikkailuhan CB:stä kai löytyykin millä tuon pystyi toteuttamaan, mutta en itse oikein ikinä ymmärtänyt niitä. GJ

Re: ClearSight() - ObjectSight:n sukulainen

Posted: Mon Jul 04, 2011 3:53 pm
by MaGetzUb
phons wrote:
Sly_Jack0 wrote:Vaihdappa esimerkkikoodissa DirSight() -> ClearSight() ja poista toinen ClearSight()-funktion määrittely.
Magetzuppi oli lähettänyt tuon näköjää 5:50 am, kertoo varmaan vähän miksi tollasia typoja löytyy :D Mutta kun nuo yllämainitut korjaukset teki, niin funktio toimi ihan näppärästi, joku ObjectPick tjs. kikkailuhan CB:stä kai löytyykin millä tuon pystyi toteuttamaan, mutta en itse oikein ikinä ymmärtänyt niitä. GJ
Typot ovat tavara merkkini, koska viimmeistään täälä foorumilla tulee hinku lähteä muokkaamaan koodia, ja kyllä 5:50am ei ole paras aika lähettää koodia. :) Ja minulla on vielä epätarkempi versiokin, joka toimii GetMap2:la, mutta jotenkin tilekoordinaatit menevät aina päin sitä nimeltä mainitsematonta juttua.. Ne tuntuvat olevan aina yhden vaaka että pysty tilerivin sivussa. -.-

Re: ClearSight() - ObjectSight:n sukulainen

Posted: Mon Jul 04, 2011 5:15 pm
by esa94
MaGetzUb wrote:Typot ovat tavara____________merkkini, koska viimmeistään täälä
Huomaan.

Re: ClearSight() - ObjectSight:n sukulainen

Posted: Mon Jul 04, 2011 5:28 pm
by Viltzu
MaGetzUb wrote:
phons wrote:
Sly_Jack0 wrote:Vaihdappa esimerkkikoodissa DirSight() -> ClearSight() ja poista toinen ClearSight()-funktion määrittely.
Magetzuppi oli lähettänyt tuon näköjää 5:50 am, kertoo varmaan vähän miksi tollasia typoja löytyy :D Mutta kun nuo yllämainitut korjaukset teki, niin funktio toimi ihan näppärästi, joku ObjectPick tjs. kikkailuhan CB:stä kai löytyykin millä tuon pystyi toteuttamaan, mutta en itse oikein ikinä ymmärtänyt niitä. GJ
Typot ovat tavara merkkini, koska viimmeistään täälä foorumilla tulee hinku lähteä muokkaamaan koodia, ja kyllä 5:50am ei ole paras aika lähettää koodia. :) Ja minulla on vielä epätarkempi versiokin, joka toimii GetMap2:la, mutta jotenkin tilekoordinaatit menevät aina päin sitä nimeltä mainitsematonta juttua.. Ne tuntuvat olevan aina yhden vaaka että pysty tilerivin sivussa. -.-
Vieläkään et ole ottanut tuota toista funktion määrittelyä pois.

Re: ClearSight() - ObjectSight:n sukulainen

Posted: Mon Jul 04, 2011 5:29 pm
by MaGetzUb
Oon kyl nii väsyksis ettei mikää tunnu onnistuvan. Noniin nyt on korjattuna.