ClearSight() - ObjectSight:n sukulainen

Oletko tehnyt jotain, mistä muut voisivat hyötyä. Postita vinkit tänne.
Post Reply
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

ClearSight() - ObjectSight:n sukulainen

Post 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
Last edited by MaGetzUb on Mon Jul 04, 2011 5:30 pm, edited 3 times in total.
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
Sly_Jack0
Devoted Member
Posts: 612
Joined: Mon Dec 10, 2007 8:25 am

Re: ClearSight() - ObjectSight:n sukulainen

Post by Sly_Jack0 »

Vaihdappa esimerkkikoodissa DirSight() -> ClearSight() ja poista toinen ClearSight()-funktion määrittely.
phons
Guru
Posts: 1056
Joined: Wed May 14, 2008 10:11 am

Re: ClearSight() - ObjectSight:n sukulainen

Post 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
Image
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: ClearSight() - ObjectSight:n sukulainen

Post 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. -.-
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
User avatar
esa94
Guru
Posts: 1855
Joined: Tue Sep 04, 2007 5:35 pm

Re: ClearSight() - ObjectSight:n sukulainen

Post by esa94 »

MaGetzUb wrote:Typot ovat tavara____________merkkini, koska viimmeistään täälä
Huomaan.
Viltzu
Guru
Posts: 1132
Joined: Sun Aug 26, 2007 5:45 pm
Location: Alavieska
Contact:

Re: ClearSight() - ObjectSight:n sukulainen

Post 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.
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: ClearSight() - ObjectSight:n sukulainen

Post by MaGetzUb »

Oon kyl nii väsyksis ettei mikää tunnu onnistuvan. Noniin nyt on korjattuna.
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
Post Reply