BuildRoad - Tienrakennusfunktio

Oletko tehnyt jotain, mistä muut voisivat hyötyä. Postita vinkit tänne.
Post Reply
naputtelija
Devoted Member
Posts: 718
Joined: Wed Nov 03, 2010 7:56 pm
Location: Joku piste pohjoisessa.

BuildRoad - Tienrakennusfunktio

Post by naputtelija »

Tulipas tällainen tässä tehtyä. Elikkä siis funktio, joka rakentaa tietä tilekartalla.
Funktio tarvitsee cbSDK:n cbMap:n toimiakseen!

Tällä hetkellä funktio on varsin "tyhmä" eli se osaa rakentaa vain mutkaista, yksisuuntaista tietä jonka mutkat täytyvät olla yli 2 tilen päässä toisistaan. Eli ei siis mitään hienoa neljän/kolmen tien risteyksiä tai eritasoliittymiä :cry: Funktio päivittyy riippuen siitä, kuinka paljon jaksan sitä koodata.

Ja tässä funktio:

Code: Select all

//naputtelijan Tienrakennusfunktio v 1.0_1
'---------------------------------------------------------------------------------------------
Function BuildRoad(buildx,buildy,VERTR=0,HORR=0,BTR=0,BTL=0,TOR=0,TOL=0)
    If VERTR=0 Then
        PutTile2(MAP_BACK,buildx,buildy,HORROAD)
        PutTile2(MAP_OVER,buildx,buildy,0)
        If GetTile2(MAP_BACK,buildx,buildy+1)=HORROAD Or GetTile2(MAP_BACK,buildx,buildy+1)=VERTROAD Then
            PutTile2(MAP_BACK,buildx,buildy,VERTROAD)
            If GetTile2(MAP_BACK,buildx+1,buildy+1)=HORROAD And GetTile2(MAP_BACK,buildx-1,buildy+1)=HORROAD Then
                
            ElseIf GetTile2(MAP_BACK,buildx+1,buildy+1)=HORROAD Then
                PutTile2(MAP_BACK,buildx,buildy+1,BTML)
            ElseIf GetTile2(MAP_BACK,buildx-1,buildy+1)=HORROAD Then
                PutTile2(MAP_BACK,buildx,buildy+1,BTMR)
            EndIf
        EndIf
            
        If GetTile2(MAP_BACK,buildx,buildy-1)=HORROAD Or GetTile2(MAP_BACK,buildx,buildy-1)=VERTROAD Then
            PutTile2(MAP_BACK,buildx,buildy,VERTROAD)
            If GetTile2(MAP_BACK,buildx+1,buildy-1)=HORROAD And GetTile2(MAP_BACK,buildx-1,buildy-1)=HORROAD Then
                
            ElseIf GetTile2(MAP_BACK,buildx+1,buildy-1)=HORROAD Then
                PutTile2(MAP_BACK,buildx,buildy-1,TOPL)
            ElseIf GetTile2(MAP_BACK,buildx-1,buildy-1)=HORROAD Then
                PutTile2(MAP_BACK,buildx,buildy-1,TOPR)
            EndIf
        EndIf
            
        If GetTile2(MAP_BACK,buildx+1,buildy)=HORROAD Or GetTile2(MAP_BACK,buildx+1,buildy)=VERTROAD Then
            If GetTile2(MAP_BACK,buildx+1,buildy+1)=VERTROAD And GetTile2(MAP_BACK,buildx+1,buildy-1)=VERTROAD Then
                
            ElseIf GetTile2(MAP_BACK,buildx+1,buildy-1)=VERTROAD Then
                PutTile2(MAP_BACK,buildx+1,buildy,BTMR)
            ElseIf GetTile2(MAP_BACK,buildx+1,buildy+1)=VERTROAD Then
                PutTile2(MAP_BACK,buildx+1,buildy,TOPR)
            EndIf
        EndIf
            
        If GetTile2(MAP_BACK,buildx-1,buildy)=HORROAD Or GetTile2(MAP_BACK,buildx-1,buildy)=VERTROAD Then
            If GetTile2(MAP_BACK,buildx-1,buildy+1)=VERTROAD And GetTile2(MAP_BACK,buildx-1,buildy-1)=VERTROAD Then
                
            ElseIf GetTile2(MAP_BACK,buildx-1,buildy-1)=VERTROAD Then
                PutTile2(MAP_BACK,buildx-1,buildy,BTML)
            ElseIf GetTile2(MAP_BACK,buildx-1,buildy+1)=VERTROAD Then
                PutTile2(MAP_BACK,buildx-1,buildy,TOPL)
            EndIf
        EndIf
        If GetTile2(MAP_BACK,buildx,buildy-1)=HORROAD Then PutTile2(MAP_BACK,buildx,buildy-1,VERTROAD)
        If GetTile2(MAP_BACK,buildx,buildy+1)=HORROAD Then PutTile2(MAP_BACK,buildx,buildy+1,VERTROAD)
    Else
        PutTile2(MAP_BACK,buildx,buildy,HORR)
        PutTile2(MAP_OVER,buildx,buildy,0)
        If GetTile2(MAP_BACK,buildx,buildy+1)=HORR Or GetTile2(MAP_BACK,buildx,buildy+1)=VERTR Then
            PutTile2(MAP_BACK,buildx,buildy,VERTR)
            If GetTile2(MAP_BACK,buildx+1,buildy+1)=HORR And GetTile2(MAP_BACK,buildx-1,buildy+1)=HORR Then
                
            ElseIf GetTile2(MAP_BACK,buildx+1,buildy+1)=HORR Then
                PutTile2(MAP_BACK,buildx,buildy+1,BTL)
            ElseIf GetTile2(MAP_BACK,buildx-1,buildy+1)=HORR Then
                PutTile2(MAP_BACK,buildx,buildy+1,BTR)
            EndIf
        EndIf
            
        If GetTile2(MAP_BACK,buildx,buildy-1)=HORR Or GetTile2(MAP_BACK,buildx,buildy-1)=VERTR Then
            PutTile2(MAP_BACK,buildx,buildy,VERTR)
            If GetTile2(MAP_BACK,buildx+1,buildy-1)=HORR And GetTile2(MAP_BACK,buildx-1,buildy-1)=HORR Then
                
            ElseIf GetTile2(MAP_BACK,buildx+1,buildy-1)=HORR Then
                PutTile2(MAP_BACK,buildx,buildy-1,TOL)
            ElseIf GetTile2(MAP_BACK,buildx-1,buildy-1)=HORR Then
                PutTile2(MAP_BACK,buildx,buildy-1,TOR)
            EndIf
        EndIf
            
        If GetTile2(MAP_BACK,buildx+1,buildy)=HORR Or GetTile2(MAP_BACK,buildx+1,buildy)=VERTR Then
            If GetTile2(MAP_BACK,buildx+1,buildy+1)=VERTR And GetTile2(MAP_BACK,buildx+1,buildy-1)=VERTR Then
                
            ElseIf GetTile2(MAP_BACK,buildx+1,buildy-1)=VERTR Then
                PutTile2(MAP_BACK,buildx+1,buildy,BTR)
            ElseIf GetTile2(MAP_BACK,buildx+1,buildy+1)=VERTR Then
                PutTile2(MAP_BACK,buildx+1,buildy,TOR)
            EndIf
        EndIf
            
        If GetTile2(MAP_BACK,buildx-1,buildy)=HORR Or GetTile2(MAP_BACK,buildx-1,buildy)=VERTR Then
            If GetTile2(MAP_BACK,buildx-1,buildy+1)=VERTR And GetTile2(MAP_BACK,buildx-1,buildy-1)=VERTR Then
                
            ElseIf GetTile2(MAP_BACK,buildx-1,buildy-1)=VERTR Then
                PutTile2(MAP_BACK,buildx-1,buildy,BTL)
            ElseIf GetTile2(MAP_BACK,buildx-1,buildy+1)=VERTR Then
                PutTile2(MAP_BACK,buildx-1,buildy,TOL)
            EndIf
        EndIf
        If GetTile2(MAP_BACK,buildx,buildy-1)=HORR Then PutTile2(MAP_BACK,buildx,buildy-1,VERTR)
        If GetTile2(MAP_BACK,buildx,buildy+1)=HORR Then PutTile2(MAP_BACK,buildx,buildy+1,VERTR)
    EndIf
End Function 
KÄYTTÖOHJEET:


Parametrit:

buildx: Mihin tie rakennetaan. Vaakasuuntainen tilekoordinaatti.
buildy: Mihin tie rakennetaan. Pystysuuntainen tilekoordinaatti.

Valinnaiset:

VERTR: Tilekartan vaakasuora tiepalikka.
HORR: Tilekartan pysysuora tiepalikka.
BTR: Tilekartan vasemmalta ylös-palikka.
BTL: Tilekartan oikealta ylös-palikka.
TOR: Tilekartan alhaalta vasemmalle-palikka.
TOL: Tilekartan alhaalta oikealle-palikka.

Voit myös jättää valinnaiset pois, jolloin täytyy käyttää ohjelman alussa määriteltyjä vakioita. Vakionimet eroavat Parametrinimistä näin:
VERTR=VERTROAD
HORR=HORROAD
BTR=BTMR
BTL=BTML
TOR=TOPR
TOL=TOPL

Sitten pannaan vielä kunnon testiohjelma:
Road Builder.rar
(726.69 KiB) Downloaded 348 times
Last edited by naputtelija on Sat Jun 18, 2011 9:31 pm, edited 2 times in total.
<Ize> Pitäs tehä allekirjotus..
<Ize> Vois keksiä jonkin nasahtavan sanonnan..
<Ize> Siitä tulis upea legenda ja kaikki vaihtaisivat allekirjoituksensa siihen.
<Ize> Ehkä ei kuitenkaa...
User avatar
Peltsi
Active Member
Posts: 121
Joined: Thu Sep 30, 2010 12:16 pm

Re: BuildRoad - Tienrakennusfunktio

Post by Peltsi »

Aika hieno tuo on! Parannettavaa olisi siinä miten se niitä palikoita laittaa, oletuksena tie lähtee rakentumaan vasemmalta oikealle tai päinvastoin (tai sitten olen käyttänyt sitä väärin :D). Voisi laittaa vaikka että hiiren toisella napilla rakentaisi ylös tai alas päin. :)
naputtelija
Devoted Member
Posts: 718
Joined: Wed Nov 03, 2010 7:56 pm
Location: Joku piste pohjoisessa.

Re: BuildRoad - Tienrakennusfunktio

Post by naputtelija »

Peltsi wrote:Aika hieno tuo on! Parannettavaa olisi siinä miten se niitä palikoita laittaa, oletuksena tie lähtee rakentumaan vasemmalta oikealle tai päinvastoin (tai sitten olen käyttänyt sitä väärin :D). Voisi laittaa vaikka että hiiren toisella napilla rakentaisi ylös tai alas päin. :)
Siis tämä on "älykäs" tienrakentaja, joka tekee mutkat tiehen automaattisesti kun esim. rakennat tien tulemaan vasemmalta ja sitten käännät sen ylöspäin niin se tekee mutkan tiehen. Sopii esim. kaupunginrakennuspeleihin. Jos funktio havaitsee, että palikan alla tai yllä on toinen, se kääntää sen pystyyn. (Toista palikkaa ei vielä käännetä ups...)
EDIT:

Päivitin sorsan ja esimerkin. Nyt molemmat palikat käännetään.

<Ize> Pitäs tehä allekirjotus..
<Ize> Vois keksiä jonkin nasahtavan sanonnan..
<Ize> Siitä tulis upea legenda ja kaikki vaihtaisivat allekirjoituksensa siihen.
<Ize> Ehkä ei kuitenkaa...
Post Reply