Tyhmät kysymykset (II/2009)
Re: Tyhmät kysymykset (II/2009)
Tilesterin ja vastaavien luomat .til-tiedostot ovat vain tietynlaista dataa. Jos tiedät miten data on tiedostoon kirjoitettu, saat sen sieltä myös ulos. Jos osaat kirjottaa oikeanlaista dataa, saat coolbasicin lataamaan sen karttana.
Ehkä tiedät tämän, ehkä et. Mutta Tilesterin kansiossa pitäisi olla manuaali ko. ohjelmaan, jossa kerrotaan täsmälleen miten .til-tiedostot luodaan. Niitä lukemalla voit helposti tehdä oman tile-editorin (coolbasicille) vaikka cb:llä tai c++:lla.
Ehkä tiedät tämän, ehkä et. Mutta Tilesterin kansiossa pitäisi olla manuaali ko. ohjelmaan, jossa kerrotaan täsmälleen miten .til-tiedostot luodaan. Niitä lukemalla voit helposti tehdä oman tile-editorin (coolbasicille) vaikka cb:llä tai c++:lla.
Re: Tyhmät kysymykset (II/2009)
Laatimani kirjasto mapin avaamiselle ja tallentamiselle(ei tällä hetkellä tuon kummempaa dokumentaatiota, funktioiden pitäisi olla melko selvät käyttää), ja tilesterin helpissä on yksityiskohtaiset dokumentaatiot .til formaatin rakenteesta
Code: Select all
Dim TileAnim(1,1) //TileAnim -taulukko sisältää tilejen animoinnin(koska coolbasicissa ei voi tarkistaa sitä jälkikäteen), TileAnim(TILE, ANIMAATION_PITUUS = 0/ANIMAATION_HITAUS = 1
Function OpenMap(FileName$, Tileset$="", PrintHeader = 0)
f = OpenToEdit(FileName)
' If Not(ReadByte(f) = 40 And ReadByte(f) = 192 And ReadByte(f) = 13 And ReadByte(f) = 139) Then MakeError "Can't load map "+FileName+". Map is not valid Tilester 1.3 file"
If PrintHeader Then
Print ReadByte(f) + " " + ReadByte(f) + " " + ReadByte(f) + " " + ReadByte(f)
WaitKey
EndIf
If Tileset = "" Then
SeekFile f, 564
For i = 0 To 255
b = ReadByte(f)
If b = 0 Then Exit Else Tileset = Tileset + Chr(b)
Next i
EndIf
SeekFile f, 820
TileCount = ReadInt(f)
TileWidth = ReadInt(f)
TileHeight = ReadInt(f)
Map = MakeMap(ReadInt(f), ReadInt(f), TileWidth, TileHeight)
TilesetImg = LoadImage(Tileset)
PaintObject Map, TilesetImg
For i = 0 To 3
If Not(ReadByte(f) = 254-i And ReadByte(f) = 45-i And ReadByte(f) = 12-i And ReadByte(f) = 166-i) Then MakeError "Can't load map "+FileName+". Map layer "+i+" was corrupted"
For Y = 1 To MapHeight()
For X = 1 To MapWidth()
EditMap Map, i + (i = 1) - (i = 2), X, Y, ReadInt(f)
Next X
Next Y
Next i
If Not(ReadByte(f) = 250 And ReadByte(f) = 41 And ReadByte(f) = 8 And ReadByte(f) = 162) Then MakeError "Can't load map "+FileName+". Tile animation was corrupted"
ReDim TileAnim(TileCount-1, 1)
For i = 0 To TileCount-1
TileAnim(i, 0) = ReadInt(f)
TileAnim(i, 1) = ReadInt(f)
SetTile i, TileAnim(i, 0), TileAnim(i, 1)
Next i
SeekFile f, 520
MaskObject Map, ReadByte(f), ReadByte(f), ReadByte(f)
CloseFile f
Return Map
End Function
Function SaveMap(Map, FileName$, TilesetImg, Tileset$ = "", MaskRED = 0, MaskGREEN = 0, MaskBLUE = 0, Comment$ = "")
f = OpenToWrite(FileName)
WriteByte f, 40 : WriteByte f, 192 : WriteByte f, 13 : WriteByte f, 139
WriteFloat f, 1.3
For i = 1 To 512
If i < Len(Comment) And i < 256 Then
WriteByte f, Asc(Mid(Comment, i, 1))
Else
WriteByte f, 0
EndIf
Next i
WriteByte f, MaskRED : WriteByte f, MaskGREEN : WriteByte f, MaskBLUE : WriteByte f, 0
For i = 1 To 40
WriteByte f, 0
Next i
For i = 1 To 256
If i < Len(Tileset) Then
WriteByte f, Asc(Mid(Tileset, i, 1))
Else
WriteByte f, 0
EndIf
Next i
TileCount = (ImageWidth(TilesetImg)/(ObjectSizeX(Map) / MapWidth())) * (ImageHeight(TilesetImg)/(ObjectSizeY(Map) / MapHeight()))
WriteInt f, TileCount
WriteInt f, ObjectSizeX(Map) / MapWidth()
WriteInt f, ObjectSizeY(Map) / MapHeight()
WriteInt f, MapWidth()
WriteInt f, MapHeight()
For i = 0 To 3
WriteByte f, 254-i : WriteByte f, 45-i : WriteByte f, 12-i : WriteByte f, 166-i
For Y = 1 To MapHeight()
For X = 1 To MapWidth()
WriteInt f, GetMap2(i + (i = 1) - (i = 2), X, Y)
Next X
Next Y
Next i
WriteByte f, 250 : WriteByte f, 41 : WriteByte f, 8 : WriteByte f, 162
For i = 0 To TileCount-1
WriteInt f, TileAnim(i, 0)
WriteInt f, TileAnim(i, 1)
Next i
CloseFile f
EndFunction
Taulukoista asiaa...
Olisi yksi kysymys taulukoinnista:
Jos minulla on esimerkiksi taulukko DIM vihu (x,y) niin voiko siinä olla sekä Inttejä, Floatteja että Stringeja?.
Siis voiko vaikka vihu% (0,1) = 7 kun taas vihu$ (0,2) = "Hello World"?
Kiitän jo etukäteen.
Jos minulla on esimerkiksi taulukko DIM vihu (x,y) niin voiko siinä olla sekä Inttejä, Floatteja että Stringeja?.
Siis voiko vaikka vihu% (0,1) = 7 kun taas vihu$ (0,2) = "Hello World"?
Kiitän jo etukäteen.
Re: Tyhmät kysymykset (II/2009)
Ei voi normaaleilla menetelmillä, mutta voit itse tehdä sellaisen systeemin käyttämällä muistipaloja:
LuoMuisti on siis periaatteessa sama kuin MakeMemBlock(). LisääTekstiä() katsoo tekstin pituuden, uudelleenvenyttää muistipalaa ja lisää tekstin muistipalaan käyttämällä esim. tavuja. LisääKokLuku() vielä helpompi.
Edit. Tässä tarkempi esimerkki. Toivottavasti ei tullut virheitä; muistipalojen kanssa saa olla tarkkana.
Kannattaa vielä tämän lisäksi laittaa jokaisen muistipalan alkuun tavu, joka kertoo ohjelmalle minkälaista tietoa säilötään. Näin voit yhdellä (monimutkaisella) silmukalla tulostaa kaiken tiedon, eikä vahingossa yritetän tulostaa liukulukua kun onkin säilötty tavuja.
Code: Select all
Dim taulu( 10 )
taulu( 0 ) = LuoMuisti()
taulu( 1 ) = LuoMuisti()
LisääTekstiä( taulu( 0 ), "Hello World!" )
LisääKokLuku( taulu( 1 ), 42 )
Edit. Tässä tarkempi esimerkki. Toivottavasti ei tullut virheitä; muistipalojen kanssa saa olla tarkkana.
Code: Select all
Dim taulu( 10 )
taulu( 0 ) = LuoMuisti()
taulu( 1 ) = LuoMuisti( 4 )
LisääTeksti( taulu( 0 ), "Hello World!" )
LisääKokLuku( taulu( 1 ), 42 )
For i = 0 To MEMBlockSize( taulu( 0 ) ) - 1
_str$ = _str$ + Chr( PeekByte( taulu( 0 ), i ) )
Next i
MakeError "Taulu 0: '" + _str$ + "', taulu 1: '" + PeekInt( taulu( 1 ), 0 ) + "'"
Function LisääKokLuku( _id, _nbr )
PokeInt _id, 0, _nbr
EndFunction
Function LisääTeksti( _id, _str As String )
ResizeMEMBlock _id, Len( _str )
For i = 0 To MEMBlockSize( _id )
PokeByte _id, i, Asc( Mid( _str, i + 1, 1 ) )
Next i
EndFunction
Function LuoMuisti( _size = 1 )
Return MakeMEMBlock( 1 )
EndFunction
Re: Tyhmät kysymykset (II/2009)
Terve.
Tässä olen puuhannut erään kokeilumielisen pelini parissa, ja koittanut tehdä hahmolle väliaikaista sprinttiä. Siinä en ole kuitenkaan onnistunut. Lyhyesti sanottuna voisiko joku kertoa miten saan tehtyä niin, että kun vaikkapa Shiftiä painetaan, ukko alkaa juoksemaan kovempaa, mutta hetken päästä väsähtää ja tämän pitää odottaa että tietty aika on kulunut ennen kuin voi taas vetää hetken kipaisun?
Lihavoitua kohtaa en millään saa aikaiseksi. Ukko joko juoksee kiihtyvällä vauhdilla niin kauan kuin Shift on pohjassa tai ei liiku ollenkaan. Onko vaikeakin toteuttaa ja saisiko mitään esimerkkiä vaikka sovellettuna räiskintätutoriaalin ukolle?
Tässä olen puuhannut erään kokeilumielisen pelini parissa, ja koittanut tehdä hahmolle väliaikaista sprinttiä. Siinä en ole kuitenkaan onnistunut. Lyhyesti sanottuna voisiko joku kertoa miten saan tehtyä niin, että kun vaikkapa Shiftiä painetaan, ukko alkaa juoksemaan kovempaa, mutta hetken päästä väsähtää ja tämän pitää odottaa että tietty aika on kulunut ennen kuin voi taas vetää hetken kipaisun?
Lihavoitua kohtaa en millään saa aikaiseksi. Ukko joko juoksee kiihtyvällä vauhdilla niin kauan kuin Shift on pohjassa tai ei liiku ollenkaan. Onko vaikeakin toteuttaa ja saisiko mitään esimerkkiä vaikka sovellettuna räiskintätutoriaalin ukolle?
Re: Tyhmät kysymykset (II/2009)
Tässä yhdenlainen juoksutyyli. Luulen, ettei tämä ole täsmälleen kuten halusit, mutta sille ei voi mitään. Ukko juoksee kun shiftiä painaa ja kesto riittää. Kun kesto = 0, on palautumisaika (joka on tässä kaksinkertainen juoksuaikaan). Kesto ei palaudu ellei olla väsähtäneitä.
Jos haluat että ukko juoksee kun shiftiä on painettu vain kerran, tarvitset ajastimen. Tässä vähän pseudo-esimerkkiä miten toteutettaisiin: (toivottavasti siinä ei ole huolimattomuusvirheitä). Katso manuaalista funktio Timer().
Code: Select all
Dim AMMUS_ELOSSA(100) 'onko ammus elossa vai vapaa
Dim AMMUS_OBJ(100) 'sisältää ammuksen ukkoektin
FrameLimit 40 'rajoita nopeutta
ukko=LoadObject("Media\soldier.bmp",72)
pati=LoadObject("Media\bullet.bmp")
ShowObject pati,OFF
AddText "Nuolista ohjaa, CTRL=ampuu"
kesto# = 100
Repeat
'Ammu-systeemi. Vain, jos ase on ladattu
If KeyDown(cbKeyRControl) And reload=0 Then
GoSub LisääAmmus
EndIf
vauhti = 2 'vauhti oletuksena 2.
//Jos painetaan oikeata shiftiä.
If KeyDown( CbKeyRShift ) Then
If kesto > 0 And bVäsähtänyt = False Then 'jos kestoa riittää eikä olla väsyneitä
kesto - 1 'kesto tippuu
vauhti = 4 'vauhti on suurempi (juostaan)
Else
bVäsähtänyt = True 'jos kesto = 0, väsähdetään
EndIf
EndIf
If bVäsähtänyt Then 'jos ollaan väsyneitä....
kesto + 0.5 'kesto palautuu puolella nopeudella
If kesto >= 100 Then bVäsähtänyt = False 'kun kesto = 100, ei olla enää väsyneitä.
EndIf
'Ohjaa ukkoa NUOLILLA
If LeftKey() Then TurnObject ukko,5
If RightKey() Then TurnObject ukko,-5
If UpKey() Then MoveObject ukko,vauhti
If DownKey() Then MoveObject ukko,-2
'päivitä aseen lataaminen
If reload>0 Then reload=reload-1
'Päivitä kaikki ammukset
GoSub PäivitäAmmukset
'tämä ennen muuta grafiikkaa (box)
DrawGame
'piirrä "kenttä"
Color cbOrange
Box 20,20,360,260,OFF
Color cbWhite
Text 20, 20, "Kunto: " + kesto
DrawScreen
Until EscapeKey()
End
'-----------------------------------------------
LisääAmmus:
'ammutaan, eli luodaan uusi pati
'monistamalla ladattu pati ja asettamalla
'se samaan paikkaan kuin ukko.
'ensin tarkastetaan, onko paikoja vapaana
For i=1 To 100
If AMMUS_ELOSSA(i)=OFF Then
'vapaa paikka löytyi, luodaan pati
AMMUS_ELOSSA(i)=ON
AMMUS_OBJ(i)=CloneObject(pati)
'asetetaan pati samaan paikkaan
CloneObjectPosition AMMUS_OBJ(i),ukko
'käännetään pati samaan suuntaan
CloneObjectOrientation AMMUS_OBJ(i),ukko
reload=5 'aseen lataus
'enempää paikka-tarkistuksia ei tarvita,
'joten voimme paeta silmukasta
Exit
EndIf
Next i
Return 'palaa takaisin pääsilmukkaan
'-----------------------------------------------
PäivitäAmmukset:
'liikutetaan kaikkia ammuksia, ja katsotaan
'törmäävätkö ne oransseihin seiniin. Jos
'törmäävät, niin ne poistetaan ammuslistasta,
'ja paikka vapautuu uudelle ammukselle.
'käydään KAIKKI läpi
For i=1 To 100
If AMMUS_ELOSSA(i) Then
MoveObject AMMUS_OBJ(i),6
'tämä on inhottavan pitkä rivi-------------> -------------> -------------> -------------> ------------->
'voit kuitenkin pilkkoa sen mielessäsi
'OR:n erottamiin osiin...
If ObjectX(AMMUS_OBJ(i))<-180 Or ObjectX(AMMUS_OBJ(i))>180 Or ObjectY(AMMUS_OBJ(i))<-130 Or ObjectY(AMMUS_OBJ(i))>130 Then
'ammus ylittää rajan -> tuhoa se
DeleteObject AMMUS_OBJ(i)
'vapauta paikka tyhjäksi
AMMUS_ELOSSA(i)=OFF
EndIf
EndIf
Next i
Return 'palaa takaisin pääsilmukkaan
Code: Select all
If paina_juoksunäppäintä And ei_juosta and ( Not väsynyt ) Then alkuaika = Timer()
If Timer() - JUOKSUAIKA < alkuaika And ( Not väsynyt ) Then
juokse()
Else
väsynyt = True
alkuaika = Timer()
EndIf
If väsynyt Then
If Timer() - VÄSYMYSAIKA < alkuaika Then
väsynyt = False
EndIf
EndIf
Re: Tyhmät kysymykset (II/2009)
Jos tekee muuttujan "Sprintti", jonka arvo on esmes 1000, ja jos shift pohjassa, niin vauhti kasvaa ja Sprintti - X,
ja jos sprintti < 0 niin sitten vauhti laskee taas kävely-tasolle..
ja jos Sprintti < 1000 niin Sprintti + X
aika sekava, eikä varmaan paras esimerkki, mutta toivottavasti jotain apua..
E: Jonez kerkisikin ensin, ja parempikin vielä
ja jos sprintti < 0 niin sitten vauhti laskee taas kävely-tasolle..
ja jos Sprintti < 1000 niin Sprintti + X
aika sekava, eikä varmaan paras esimerkki, mutta toivottavasti jotain apua..
E: Jonez kerkisikin ensin, ja parempikin vielä
Re: Tyhmät kysymykset (II/2009)
Juuri tälläistä hain, kiitoksia paljon. Mondayn esimerkin tapaista olin siis jo yrittänyt ilman kovin hehkeää tulosta.Jonez wrote:Tässä yhdenlainen juoksutyyli. Luulen, ettei tämä ole täsmälleen kuten halusit, mutta sille ei voi mitään. Ukko juoksee kun shiftiä painaa ja kesto riittää. Kun kesto = 0, on palautumisaika (joka on tässä kaksinkertainen juoksuaikaan). Kesto ei palaudu ellei olla väsähtäneitä.
Code: Select all
Esimerkki
Re: Tyhmät kysymykset (II/2009)
Tota karttojen teko hommaa en oikeen ymmär oon luken kyl kaikki ne ohjeet ja muut leikkiny sen kans ja muuta mut en jaks enää kun en itse keksi ratkaisuu. Ni voisko joku kertoo millai se homma sit niinku menee et saan sen kartan ladattua siihen koodaukseen?
-
- Tech Developer
- Posts: 650
- Joined: Mon Aug 27, 2007 9:51 pm
- Location: Helsinki, Finland
- Contact:
Re: Tyhmät kysymykset (II/2009)
Kartan tekoon tarvitset tilekarttaeditorin. CB:n mukana tulee Tilester, jolla pääset alkuun. Vaihtoehtoja ovat TileGen ja A Stigmator, löytyy foorumin hakutoiminnolla.... wrote:Tota karttojen teko hommaa en oikeen ymmär oon luken kyl kaikki ne ohjeet ja muut leikkiny sen kans ja muuta mut en jaks enää kun en itse keksi ratkaisuu. Ni voisko joku kertoo millai se homma sit niinku menee et saan sen kartan ladattua siihen koodaukseen?
Itse kartta koostuu kahdesta osasta: tiilemapista ja tilesetistä. Tilemap on taulukko lukuja, jota et itse edes näe, vaan se on piilotettu karttaeditorin ja CoolBasicin karttasysteemin sisään. Tilemap tallennetaan .til-tiedostoon, joka sitten ladataan CB:hen. Tileset puolestaan on kuva, joka sisältää karttaan käytettävät palaset, tilet, tai suomeksi tiilet, ruudut, jne.
Tilekarttaeditorilla voit rakentaa tilemapin tilesetin avulla, niin että näet samalla, miltä kartta pelissä tulee näyttämään. Lisäohjeita kartan rakentamiseen saat itse editorin ohjeista.
CB:n manuaalista löytyy yksityiskohtainen esittely tilekarttamoottorin toiminnasta ja käytöstä. Kun painat editorissa F8, aukeaa Oppitunnit-paneeli, josta löytyy kaksi karttoihin keskittyvää oppituntia, 10 ja 11. Niihin tutustumalla homma selviää.
CoolBasic henkilökuntaa
Tech-kehittäjä
CoolBasic Classic, Cool VES
CoolPhysicsEngine | MissileSystem | Jana-ympyrä -törmäys | cbSimpleTexture | CoolCPLX
Tech-kehittäjä
CoolBasic Classic, Cool VES
CoolPhysicsEngine | MissileSystem | Jana-ympyrä -törmäys | cbSimpleTexture | CoolCPLX
Re: Tyhmät kysymykset (II/2009)
Back kerros on alin kerros. Kävelet sen päällä.... wrote:Tota karttojen teko hommaa en oikeen ymmär oon luken kyl kaikki ne ohjeet ja muut leikkiny sen kans ja muuta mut en jaks enää kun en itse keksi ratkaisuu. Ni voisko joku kertoo millai se homma sit niinku menee et saan sen kartan ladattua siihen koodaukseen?
Over kerros on ylin kerros. Menet sen ali ja se on Back kerroksen päällä.
Hit kerrokseen piirtämäsi asiat eivä näy.(Muistaakseni) Mihin kohtaan piirrät Hit kerroksen, pelin aikana SetupCollision komennolla voit estää sen pääsemisen siihen. Eli se estää siihen kohtaan pääsemisen. Lyhyesti Block kerros. (Huom. Tilesterissä Hit kerroksen käyttö on sekoa!, Stigmatorissa se on paljon selkeämpi.)
Kannattaa käyttää Stigimatoria. Kuvassa on Stigimatori.
EDIT:
Pinkit boxit ovat ketovat mihin kohtaan olen laittanut Hit kerroksen(Blockin), tie ja nurmikko on Back kerroksessa, auto on Over kerroksessa, jotta se olisi tien päällä.
- Attachments
-
- Paljon parempi =)
- Stigimator.JPG (73.42 KiB) Viewed 9406 times
Black city peleistä parhain
Re: Tyhmät kysymykset (II/2009)
Tekstisi on sekoa, ja TileGen on parempi kuin Stigmator siksi, että Stigmator on tehty CoolBasicilla ja mavittaa välillä. Anteeksi offtopic.11v wrote:Tilesterissä Hit kerroksen käyttö on sekoa!, Stigmatorissa se on paljon selkeämpi.)
Kannattaa käyttää Stigimatoria.
Re: Tyhmät kysymykset (II/2009)
Kuten taas kerran tuli todistettua mul kävi vahinko en huomannu yht juttu ja senkos takia en ymmärtäny noita mitä äsken selititte. En ees viiti kertoo ku sen verta nolo homma:D Mut nyt tuntuu et vois alkaa tajutakki jotain. Ku oikeen miettii ni ton käyttö on aika yksinkertas jos vaan osaa lukee ohjeen ja tajuu ne toisin ku eräät Mut kiitos kaikil ketä autto alkuun.
Re: Tyhmät kysymykset (II/2009)
Onko CB:llä mitenkään mahdollista piilottaa ohjelman otsikkopalkkia?
Re: Tyhmät kysymykset (II/2009)
Eipä löydy, selasin juuri manuaalin läpi.
Re: Tyhmät kysymykset (II/2009)
SetWinowAlphaMAVellius wrote:Eipä löydy, selasin juuri manuaalin läpi.
Re: Tyhmät kysymykset (II/2009)
Hmm... Nyt kun cbFun:sta puhutaan niin, mikäs on kun yksikään funktio ei toimi... Tai no kokeilin muutamia, en kaikkia, mutta luulisin että jos muutama ei toimi mikään ei toimi... Olisin mieluusti kokiellut vähän noita, enkä siksi osaa sanoa mitä esim. tuo SetWindowAlpha tekee, luulisin että tekee ikkunasta läpinäkyvän tjs.
Re: Tyhmät kysymykset (II/2009)
cbFunin dll:n pitää olla cbFunin kansion vieressä projekti/coolbasic kansion sisässä, ja cbFunin kansiossahan on sen funktiokirjasto. Tällä järjestelyllä pitäisi esimerkkien tiedostopolut cbFuniin toimia.phons wrote:Hmm... Nyt kun cbFun:sta puhutaan niin, mikäs on kun yksikään funktio ei toimi... Tai no kokeilin muutamia, en kaikkia, mutta luulisin että jos muutama ei toimi mikään ei toimi... Olisin mieluusti kokiellut vähän noita, enkä siksi osaa sanoa mitä esim. tuo SetWindowAlpha tekee, luulisin että tekee ikkunasta läpinäkyvän tjs.
Re: Tyhmät kysymykset (II/2009)
Ei liity cb:hen, ja jos joku osaa ehdottaa parempaa aluetta, ehdottakoon. Mitä tarkoittaa "koostefunktiot"?
Asus P8P67 LE/Intel Core i5 2500K/ GTX560/ 8GT RAM/750GT HDDt + 120GT SSD + 13" Macbook Pro
Blogi - Peräpohjola - MERPG
Blogi - Peräpohjola - MERPG