Mapin skannaus
Mapin skannaus
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?
Re: Mapin skannaus
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.)
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.
Edit. pieniä lauserakennemuutoksia, jotta selitys olisi mahdollisimman selkeä, plus tpyos!
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
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
Re: Mapin skannaus
Kiitos paljon vastauksesta.Jonez wrote:Niinkin yksinkertaisesti, että ...Code: Select all
...For x = 1 To MapWidth() For y = 1 To MapHeight()...
Ajattelinkin että jotenkin noin se pitäisi tehdä mutta en tajunnut käyttää yllä olevaa koodin kohtaa, noinhan se on erittain helppo tehdä.
Re: Mapin skannaus
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:
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]tuhoojabotti wrote:Eikös niitä kahtatoista bottia olisi voinut sijoittaa yhdellä skannauksella?
Last edited by phons on Fri Oct 30, 2009 6:22 pm, edited 1 time in total.
-
- Advanced Member
- Posts: 485
- Joined: Tue Aug 28, 2007 3:53 pm
- Location: Suomi, Finland
- Contact:
Re: Mapin skannaus
Eikös niitä kahtatoista bottia olisi voinut sijoittaa yhdellä skannauksella?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.
Re: Mapin skannaus
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).
Re: Mapin skannaus
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.
Re: Mapin skannaus
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ä.kasperi wrote:toki hiastuu kun laitan mahdollisesti syntyviä objekteja lisää peliin.
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 )
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.