Millä tavalla tehdä mapin uudelleen generointi

Voit pyytää apua ohjelmointiongelmiin täältä.
Post Reply
Mapin generointi ongelma

Millä tavalla tehdä mapin uudelleen generointi

Post by Mapin generointi ongelma »

Kiitos jos joku auttaa. Eli mapin uudelleen generointi on ongelma.

1 Vika tässä on se että uuden mapin generointi ei toimi enään deletemap()in jälkeen.
Mitenkä tämän voisi kiertää?

2 Uuden mapin generointi toimii mutta se generoituu vanhan päälle ja kun deletemap()
niin se poistaa molemmat mapit ja sen jälkeen ei pysty generoimaan uutta mappia.
Lisäksi uuden mapin generoimisen jälkeen edellisen mapin collisionit on toiminnassa.

3 Millä tavalla olisi järkevää toteuttaa uuden mapin generointI?
Jonkinlainen sanallinen kuvaus koodista tai esimerkkikoodi kommenteilla auttaisi.

Koodi:

Code: Select all

Global map
Global newmap
Global newmap 

map=MakeMap(32,32,32,32)
generatemap(mn)

u=LoadObject("Media\guy.bmp",72)
SetupCollision u,map,2,4,2

tileset=LoadImage("Media\tileset.bmp")
PaintObject map,tileset

Repeat

    If UpKey() Then MoveObject u,2
    If DownKey() Then MoveObject u, -2
    If LeftKey() Then TurnObject u,5
    If RightKey() Then TurnObject u, -5
    
If newmap=1 And KeyDown(57) Then generatemap(mn)
    
If KeyHit(57) Then 
    generatemap(mn)
    oldmap-1
EndIf 
    
If KeyHit(34) Then 
    deletemap() 
EndIf
   
    CloneCameraPosition u
    
    DrawScreen
Forever

Function generatemap(mn)

For y=1 To MapHeight()
For x=1 To MapWidth()
    If Rand(1,5)=5 Then 
        EditMap map,0,x,y,2 'drawing
        EditMap map,2,x,y,1 'collision
    Else 
        EditMap map,0,x,y,145
    EndIf
Next x
Next y

newmap=0
oldmap=0
    
End Function 

Function deletemap()
    DeleteObject map
    newmap +1
End Function 
Aavesoturi
Active Member
Posts: 163
Joined: Fri Aug 31, 2007 7:07 pm
Location: Helsinki
Contact:

Re: Millä tavalla tehdä mapin uudelleen generointi

Post by Aavesoturi »

Jos poistat kartan DeleteMapilla niin tilalle täytyy luoda uusi MakeMapilla (tai loadmapilla) ja siihenkin pitää lisätä tilesetti. Huomaa myös että jos luot uuden kartan makemapilla jälkeenpäin, se täytyy asettaa piirtojärjestyksessä alimmaiseksi objectorderilla (jotta muut objektit tulisivat sen päälle).

Törmäykset saa pois ClearCollisionilla.
Uusia kysymyksiä

Re: Millä tavalla tehdä mapin uudelleen generointi

Post by Uusia kysymyksiä »

Kiitokset vastauksesta. Mutta mitä tein väärin koodissani kun tuntuu hitaalta.

1: Onko järkevämpää tai nopeampaa tapaa kuin goton käyttäminen?

2: Onko ehkä järkevämpää tehdö kentän generointi, functiolla kuin näin suoraan koodiin?
Mutta onko functioitten suorittaminen nopeampi kuin aliohjelman?

3 Millä tavalla saisin tiettyihin latausväleihin, esim lataus 50%.
Riittääkö pelkät Addtextit? Esim Addtext " lataus 50%"

Code: Select all

FrameLimit 60

alku:
kentta=0
map=MakeMap(32,32,32,32)

u=LoadObject("Media\guy.bmp",72)
SetupCollision u,map,2,4,2

tileset=LoadImage("Media\tileset.bmp")
PaintObject map,tileset

For y=1 To MapHeight()
For x=1 To MapWidth()
    If Rand(1,5)=5 Then 
        EditMap map,0,x,y,2 'drawing
        EditMap map,2,x,y,1 'collision
    Else 
        EditMap map,0,x,y,145
    EndIf
Next x
Next y

Goto ali

kenttai:

map=MakeMap(32,32,32,32)

u=LoadObject("Media\guy.bmp",72)
SetupCollision u,map,2,4,2

tileset=LoadImage("Media\tileset.bmp")
PaintObject map,tileset

For y=1 To MapHeight()
For x=1 To MapWidth()
    If Rand(1,5)=5 Then 
        EditMap map,0,x,y,2 'drawing
        EditMap map,2,x,y,1 'collision
    Else 
        EditMap map,0,x,y,145
    EndIf
Next x
Next y

ali:

Repeat

    If UpKey() Then MoveObject u,2
    If DownKey() Then MoveObject u, -2
    If LeftKey() Then TurnObject u,5
    If RightKey() Then TurnObject u, -5
    
If KeyHit(34) Then

 DeleteObject map
  
    ClearObjects
   
    kentta +1
 
    If kentta=1 Then Goto kenttai
   If kentta=2 Then Goto alku
EndIf 

    CloneCameraPosition u
    
    DrawScreen
Forever
User avatar
valscion
Moderator
Moderator
Posts: 1599
Joined: Thu Dec 06, 2007 7:46 pm
Location: Espoo
Contact:

Re: Millä tavalla tehdä mapin uudelleen generointi

Post by valscion »

Uusia kysymyksiä wrote:Kiitokset vastauksesta. Mutta mitä tein väärin koodissani kun tuntuu hitaalta.

1: Onko järkevämpää tai nopeampaa tapaa kuin goton käyttäminen?

2: Onko ehkä järkevämpää tehdö kentän generointi, functiolla kuin näin suoraan koodiin?
Mutta onko functioitten suorittaminen nopeampi kuin aliohjelman?

3 Millä tavalla saisin tiettyihin latausväleihin, esim lataus 50%.
Riittääkö pelkät Addtextit? Esim Addtext " lataus 50%"
1. On, tee mielummin If-lausekkeella (tässä tapauksessa) tarkistus missä kartassa mennään ja muuta sitä sen mukaan.

2. On järkevämpää tehdä funktiolla, se tekee koodista paljon selkeämmän. Funktiot suoritetaan aivan yhtä nopeasti kuin aliohjelmatkin, ehkäpä jopa nopeammin (en laita päätäni pantiksi tästä).

3. Käytä vaikka Text-komentoa ja sitä ennen piirrä vaikka musta koko ruudun kokoinen laatikko taustalle ja tulosta sitten lopputulos DrawScreenillä, alla pieni esimerkki. Voit myös käyttää kuvaa laatikon sijasta. Muista muuten käyttää DrawGame komentoa ennen piirtokomentoja, jotta mahdolliset objektit jäisivät piirtokomentojen alle.

Code: Select all

SCREEN 640,480 'näytön asetukset

latausTeksti$ = "% ladattu..." 'muuttujan nimikin sen jo sanoo

DrawGame 'Piirrä objektit ennen muita
Color cbBlack : Box 0, 0, ScreenWidth(), ScreenHeight() 'Koko ruudun peittävä musta laatikko
// Luo suurinpiirtein ruudun keskelle latausteksti
Text ( ScreenWidth() - TextWidth(latausTeksti) ) / 2, ScreenWidth() / 2, "0" + latausTeksti
DrawScreen

WaitKey 'esimerkki liikkuu eteenpäin näppäintä painettaessa

//-------------------------------------------------
// Ladataan vaikkapa kartta tässä vaiheessa
//-------------------------------------------------

DrawGame
Color cbBlack : Box 0, 0, ScreenWidth(), ScreenHeight()
Text ( ScreenWidth() - TextWidth(latausTeksti) ) / 2, ScreenWidth() / 2, "40" + latausTeksti
DrawScreen

WaitKey 'esimerkki liikkuu eteenpäin näppäintä painettaessa

//-------------------------------------------------
// Ladataan esim. kuvia muistiin
//-------------------------------------------------

DrawGame
Color cbBlack : Box 0, 0, ScreenWidth(), ScreenHeight()
Text ( ScreenWidth() - TextWidth(latausTeksti) ) / 2, ScreenWidth() / 2, "60" + latausTeksti
DrawScreen

WaitKey 'esimerkki liikkuu eteenpäin näppäintä painettaessa

//-------------------------------------------------
// Ladataan vaikka vielä objektit
//-------------------------------------------------

DrawGame
Color cbBlack : Box 0, 0, ScreenWidth(), ScreenHeight()
Text ( ScreenWidth() - TextWidth(latausTeksti) ) / 2, ScreenWidth() / 2, "100" + latausTeksti
DrawScreen

WaitKey 'esimerkki liikkuu eteenpäin näppäintä painettaessa

//vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
// Itse peli sitten tänne alapuolelle
//vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
cbEnchanted, uudelleenkirjoitettu runtime. Uusin versio: 0.4.1 — Nyt myös sorsat GitHubissa!
NetMatch - se kunnon nettimättö-deathmatch! Avoimella lähdekoodilla varustettu
vesalaakso.com
mikeful
Moderator
Moderator
Posts: 523
Joined: Mon Aug 27, 2007 8:36 pm
Location: Vaasa, Finalnd
Contact:

Re: Millä tavalla tehdä mapin uudelleen generointi

Post by mikeful »

Itsellä iski omaa karttageneraattoria tehdessä jännä muistivuotobugi jatkuvan DeleteMap- ja MakeMap-komentojen kanssa. Peli hidastui pikkuhiljaa aivan törkeän hitaaksi.

Ratkaisuksi löytyi yhden kartan pitäminen jatkuvasti käytössä ja sen muokkaaminen lennossa. Oma generaattorini generoi ensin kartan tiedot taulukkoon, sitten tilemap alustetaan perustilellä ja kartta siirretään taulukosta tilekerttaan EditMapilla. Törmäykset voidaan muokata toimimaan EditMapilla ja SetupCollisionia ei tarvitse kutsua joka välissä, kun käytössä on aina sama kartta. Taulukkokoordinaattien ja tilekarttakoordinaattien muutokset keskenään on sitten hauskaa pähkäiltävää. >:)

Funktioiden käyttö jyrää GoTo:t 100-0. Opettele käyttämään niitä jo nyt, niin säästät hermoja tulevaisuudessa.

Allekirjoituksessa on muutama tekemäni peli, jotka käyttää karttageneraattoria. Kokeile niitä ja katso mallia.
Pelejä: Pelasta puhe, Grinder
Muuta: Blogi, Twitter
Kysymyksiä

Re: Millä tavalla tehdä mapin uudelleen generointi

Post by Kysymyksiä »

Kiitokset kaikille vastanneille. Generoitu kenttä on nyt mahdollista tallentaa.

Ongelma on nyt sellainen että pitäisi saada tehtyä kentän valinta. Eli kansion tiedostot haen startsearchilla
ja ne mapit mitä on näkyy listassa.

Millä tavalla voisin tehdä listaan mapin valinnan ja kun mapin valitsee niin se latautuu.
Lähinnä pelaajan pitäisi pystyä valitsemaan mikä tahansa til päätteinen mappi.
Itselläni ei ole mitään hajua mitenkä tämä onnistuisi.

Code: Select all

Repeat
tie$ = Input ("karttatiedoston pääte")
If KeyHit(cbkeyreturn) Then Exit
DrawScreen
Forever

StartSearch

   count=0
   Repeat
   
       file$=FindFile()
       
       If file$="" Then Exit 
       
       If Lower(Right(file$,4))=""+tie$ Then
           Print file$
           
           count=count+1
       EndIf
   
   Forever

EndSearch

Print "Found "+count+" files"
WaitKey
Esimerkkiä kiitos?

Re: Millä tavalla tehdä mapin uudelleen generointi

Post by Esimerkkiä kiitos? »

mikeful wrote:Ratkaisuksi löytyi yhden kartan pitäminen jatkuvasti käytössä ja sen muokkaaminen lennossa. Oma generaattorini generoi ensin kartan tiedot taulukkoon, sitten tilemap alustetaan perustilellä ja kartta siirretään taulukosta tilekerttaan EditMapilla.
Saisikos tästä Mikefulin tavasta esimerkkikoodia? Kiitos.
mikeful
Moderator
Moderator
Posts: 523
Joined: Mon Aug 27, 2007 8:36 pm
Location: Vaasa, Finalnd
Contact:

Re: Millä tavalla tehdä mapin uudelleen generointi

Post by mikeful »

Generaattorisysteemissä on tällä hetkellä noin 300 riviä koodia ilman kunnollista kommentointia, joten sen muuttaminen toimivaksi ja selkeäksi esimerkkikoodiksi liian iso urakka. Tuo edellinen viestini kuvaa pääpiirteittäin miten systeemini toimii ja sen pohjalta saa kyllä tehtyä oman. Voin kyllä vastata yksityiskohta koskeviin kysymyksiin, mutta suosittelen, että opettelet mahdollisimman paljon itse.
Pelejä: Pelasta puhe, Grinder
Muuta: Blogi, Twitter
Ongelma on

Re: Millä tavalla tehdä mapin uudelleen generointi

Post by Ongelma on »

Saisiko yksityiskohtaisen selostuksen, kuinka kartan tiedot voi siirtää taulukosta karttaan?
En aivan tajunnut kuinka editmapilla sen voi tehdä.

Käsittääkseni kartan tiedot voi generoida taulukkoon näin?

Code: Select all

Dim kartta(32,32)

Const tilemaara = 30

For i = 1 To 32
For o = 1 To 32
    kartta(i,o) = rand(tilemaara)
Next o
Next i
mikeful
Moderator
Moderator
Posts: 523
Joined: Mon Aug 27, 2007 8:36 pm
Location: Vaasa, Finalnd
Contact:

Re: Millä tavalla tehdä mapin uudelleen generointi

Post by mikeful »

Juu. Noin voi tehdä, mutta kartan koko tulee olemaan ongelma. Itse muuttelin kartan kokoa jatkuvasti se aiheutti pikkuhiljaa myös hidastumista alkuperäisessä systeemissä. Nyt on käytössä 500x500 tilen kokoinen kartta, jonka keskelle laitetaan tavaraa. Tämä aiheuttaa taas ongelmia muutamankin koordinaatteja tarvitsevan asian kanssa, koska silloin pitää tehdä kaikenlaisia muunnoskikkailuja tilekoordinaattien ja maailmakoordinaattien välillä.

Mutta jees. Kartan sisällön voi tökkiä taulukkoon ihan normaaleina numeroina. Itsellä on 0 seinää, 1 käytävää, 2 huonetta, jne. Kun taulukko on täytetty, se muutetaan tilemapiksi käymällä taulukko läpi kahdella sisäkkäisellä for-loopilla ja laittamalla EditMap-komennolla taulukon mukaisia tilejä sopiviin kerroksiin.
Pelejä: Pelasta puhe, Grinder
Muuta: Blogi, Twitter
Post Reply