Mapin skannaus

Voit pyytää apua ohjelmointiongelmiin täältä.
Post Reply
kasperi
Newcomer
Posts: 10
Joined: Sat Oct 24, 2009 4:59 am

Mapin skannaus

Post by kasperi »

Miten kannattaisi tehdä sellainen toiminto että mapin alussa map "skannataan" ja tiettyihin data kerroksen kohtiin esim. syntyy jokin objekti tai jotain tapahtuu siihen kohtaan? Miten sen saa helpoiten tavallaan skannattua sen mapin läpi?
User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: Mapin skannaus

Post by Jonez »

Niinkin yksinkertaisesti, että käydään x- ja y-koordinaatit läpi kahdessa silmukassa. Kaikkien karttojen koko tileissä on 1 - (viiva, ei miinus) MapWidth() ja 1 - MapHeight().

GetMap2() palauttaa tiedot annetusta tilestä, riippuen syötetyistä argumenteista. Parametrit ovat: "kerros" (tausta, päällys, törmäys tai data), "x" ja "y".

Eli seuraavasti:
(Huomaa että funktioita LuoUkko() ja LuoVihu() ei ole, joten koodi ei luonnollisestikaan toimi vain tällaisenaan.)

Code: Select all

map = LoadMap( "media\cdm2.til", "media\tileset.bmp" )

For x = 1 To MapWidth()
    For y = 1 To MapHeight()
        _data = GetMap2( 3, x, y )
        
        If _data = UKON_ALOITUS Then
            LuoUkko( x, y )
        ElseIf _data = VIHU_721 Then
            LuoVihu( x, y, 721 )
        EndIf
    Next y
Next x
Kaivoin pikaisesti CBKK:sta funktion (made by jafna), joka asettaa objektin maailmaan tilekoordinaattien perusteella:
Eli syötettävät koordinaatit x ja y ovat TILEKOORDINAATTEJA, eivät objektin koordinaatteja.

Code: Select all

Function PositionObject2(objekti,kartta,x,y)
    mapX = ObjectSizeX(kartta)
    mapY = ObjectSizeY(kartta)
    tileX = mapX / MapWidth()
    tileY = mapY / MapHeight()
    PositionObject objekti, (ObjectX(kartta)-mapX/2)+tileX*(X-1)+tileX/2, (ObjectY(kartta)+mapY/2)-tileY*(Y-1)-tileY/2
EndFunction
Edit. pieniä lauserakennemuutoksia, jotta selitys olisi mahdollisimman selkeä, plus tpyos!
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
kasperi
Newcomer
Posts: 10
Joined: Sat Oct 24, 2009 4:59 am

Re: Mapin skannaus

Post by kasperi »

Jonez wrote:Niinkin yksinkertaisesti, että ...

Code: Select all

...For x = 1 To MapWidth()
    For y = 1 To MapHeight()...
Kiitos paljon vastauksesta.
Ajattelinkin että jotenkin noin se pitäisi tehdä mutta en tajunnut käyttää yllä olevaa koodin kohtaa, noinhan se on erittain helppo tehdä. :)
phons
Guru
Posts: 1056
Joined: Wed May 14, 2008 10:11 am

Re: Mapin skannaus

Post by phons »

Sanon tähän että tuo on todella huono vaihtoehto. Tai no riippuu, itse tein pelin, tai teen vieläkin, jossa asetetaan joku määrä botteja tiettyihin paikkoihin ja paikat luki data kerroksessa, mapin koko oli about 70*80, se sitten skannattii noin 12 kertaa(bottien määrä), siihen meni n. puolitoista minuuttia... Tosin tämä kone on vanha p***a.
EDIT:

tuhoojabotti wrote:Eikös niitä kahtatoista bottia olisi voinut sijoittaa yhdellä skannauksella?
No joo, kyllä kai mutta olisi silti aika raskas ollut jos mappi on vaikka 100*120 ja botteja 20 niin helpompaa on lukea positiot jostain filusta.[/edit]
Last edited by phons on Fri Oct 30, 2009 6:22 pm, edited 1 time in total.
Image
tuhoojabotti
Advanced Member
Posts: 485
Joined: Tue Aug 28, 2007 3:53 pm
Location: Suomi, Finland
Contact:

Re: Mapin skannaus

Post by tuhoojabotti »

phons wrote:Sanon tähän että tuo on todella huono vaihtoehto. Tai no riippuu, itse tein pelin, tai teen vieläkin, jossa asetetaan joku määrä botteja tiettyihin paikkoihin ja paikat luki data kerroksessa, mapin koko oli about 70*80, se sitten skannattii noin 12 kertaa(bottien määrä), siihen meni n. puolitoista minuuttia... Tosin tämä kone on vanha p***a.
Eikös niitä kahtatoista bottia olisi voinut sijoittaa yhdellä skannauksella?
Imagedev.tuhoojabotti.com — “Programmer (noun): An organism that turns caffeine into code.”
Astigma
Moderator
Moderator
Posts: 195
Joined: Sun Aug 26, 2007 5:56 pm
Location: Kuopio, Finland
Contact:

Re: Mapin skannaus

Post by Astigma »

Ei 70*80 kartan skannaukseen noin kauaa pitäis kyllä mennä mitenkään. Ja jos kartan skannaus tehdään vain kerran ennen pelin alkua niin sekunnin parin viivästys tuskin haittaa niin hirveästi etteikö niitä voisi lukea skannaamalla karttaa. On tietenkin nopeampaa lukea ne tiedostosta, mutta toisaalta tiedoston lukeminen on melko hidasta muistiin ladatun kartan lukemiseen verrattuna ja jos botteja alkaa oikeasti olla huomattava määrä, niin enpä menisi sanomaan mikä on nopein vaihtoehto. (Mikäli siis bottien asettaminen toteutetaan yhdellä skannauksella).
kasperi
Newcomer
Posts: 10
Joined: Sat Oct 24, 2009 4:59 am

Re: Mapin skannaus

Post by kasperi »

Olen tehnyt jo jonezin kertomalla koodilla, ja toimii hyvin, viivästystä en huomaa, tosin ei kovin iso kartta, koko on 50x50 jossa tilet on 50 pixeliä. Ja kun lyö pelin rullaamaan niin ei mitään viivästystä, salamana skannattu, toki hiastuu kun laitan mahdollisesti syntyviä objekteja lisää peliin.
User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: Mapin skannaus

Post by Jonez »

kasperi wrote:toki hiastuu kun laitan mahdollisesti syntyviä objekteja lisää peliin.
Hidastumista ei pitäisi tapahtua, ellet sitten lisää niitä objekteja satamäärin yhdellä kertaa. Avainsana on optimointi. Tuota minun näyttämää koodia kuuluu käyttää vain _kerran_. Ylimääräiset kutsut eivät ole järkeviä.

Jos haluat asettaa objektin satunnaiseen kohtaan kesken pelin, se tapahtuu suunnilleen näin:

Code: Select all

While True
    _x = Rand( 1, MapWidth() )
    _y = Rand( 1, MapHeight() )
    
    If GetMap2( 0, _x, _y ) <> 0 And GetMap2( 2, _x, _y ) = 0 Then
        Exit
    EndIf
Wend
AsetaObjekti( _x, _y, _obj )
Tietenkin tuossa on omat ongelmansa (esim. objekti saattaa ilmestyä tyhjästä ruudulle, joka näyttää tyhmältä), mutta se olikin mahdollisimman yksinkertainen esimerkki.

Jos haluat tietyt "spawnaus-pointit", kannattaa ottaa ne ylös taulukkoon, juuri tuolla _ensimmäisellä_ mapin-skannaus-kerralla. Tulevaisuudessa voit arpoa solun taulukosta, johon uusi objekti luodaan salamannopeasti.

Muista että voit tehdä kaiken mitä haluat itse tilekartalle käyttämällä skannaus-koodia vain kerran.
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
Post Reply