Taulukko ja type

Voit pyytää apua ohjelmointiongelmiin täältä.
Post Reply
User avatar
Sly_Jack0
Devoted Member
Posts: 612
Joined: Mon Dec 10, 2007 9:25 am

Taulukko ja type

Post by Sly_Jack0 » Thu Mar 26, 2009 8:42 am

Haluaisin tietää että onko mitään mahdollisuuksia laittaa taulukko TYPEn Fieldiksi?

Luulen olevani aika varma, että ei, mutta kysynpä nyt kumminkin...

User avatar
Jare
Devoted Member
Posts: 862
Joined: Mon Aug 27, 2007 10:18 pm
Location: Helsinki

Re: Taulukko ja type

Post by Jare » Thu Mar 26, 2009 1:18 pm

Ei suoraan, mutta kikkailulla voi tehdä suunnilleen vastaavan asian.

Luo taulukko normaalisti, mutta laita siihen yksi ylimääräinen ulottuvuus. Aseta ulottuvuudelle kooksi typen jäsenien maksimimäärä. Eli jos oletat, että tyyppiisi tulee korkeintaan 50 jäsentä, niin sitten ulottuvuuden kooksi laitat 50. Jos olet täysin epävarma, miten paljon tyyppiin tulee jäseniä, muuta taulukon kokoa tarvittaessa myöhemmin ReDimillä.

Seuraavaksi tarvitset tyyppiin kentän, jossa on jokaiselle jäsenelle yksilöllinen indeksi (juokseva luku 1,2,3... jne). Tällä indeksillä kukin jäsen voi hakea taulukosta omia tietojaan ilman sotkeutumista muiden jäsenten tietoihin.

Vaikeutena tässä on taulukon indeksien riitävyys. Kun tyypin jäsen poistetaan, sillä oleva indeksi pitäisi samalla vapauttaa seuraavaksi luotavien jäsenten käyttöön. Käytännössä saatat tarvita jonkinlaisen listan vapaana olevista indekseistä.

User avatar
Sly_Jack0
Devoted Member
Posts: 612
Joined: Mon Dec 10, 2007 9:25 am

Re: Taulukko ja type

Post by Sly_Jack0 » Thu Mar 26, 2009 7:15 pm

Okei, kiitos.

Tuo ei kyllä helpota juuri yhtään sitä mihin olisin tuota tarvinnut, mutta kiitos kuitenkin.

User avatar
Sami The Great
Advanced Member
Posts: 485
Joined: Tue Aug 28, 2007 4:15 pm
Contact:

Re: Taulukko ja type

Post by Sami The Great » Thu Mar 26, 2009 9:41 pm

Sly_Jack0 wrote:Haluaisin tietää että onko mitään mahdollisuuksia laittaa taulukko TYPEn Fieldiksi?

Luulen olevani aika varma, että ei, mutta kysynpä nyt kumminkin...
Itselläni tuli sama ongelma vastaan, kun tein scripti moottoria strategia peliimme. Minun täytyi saada yksi Field sisältämään monta eri tietokenttää ja taulukko olisi ollut tähän ratkaisu. No tein oman taulukointi systeemin merkkijonoilla ;) eli typen field kohtaan laitetaan vain tavallinen merkkijono, joka sisältää eri tunnisteita, mistä saadaan tieto, että mistä taulukon solu alkaa ja loppuu jne. Kannattaa myös tehdä jonkinlaiset funktiot helpottamaan asiaa.
http://www.rockodilegames.com
CoolBasickin käyttäjä vuodesta 2004.

Jonhu
Active Member
Posts: 186
Joined: Mon Aug 04, 2008 5:45 pm

Re: Taulukko ja type

Post by Jonhu » Thu Mar 26, 2009 10:23 pm

Sami The Great wrote:
Sly_Jack0 wrote:Haluaisin tietää että onko mitään mahdollisuuksia laittaa taulukko TYPEn Fieldiksi?

Luulen olevani aika varma, että ei, mutta kysynpä nyt kumminkin...
Itselläni tuli sama ongelma vastaan, kun tein scripti moottoria strategia peliimme. Minun täytyi saada yksi Field sisältämään monta eri tietokenttää ja taulukko olisi ollut tähän ratkaisu. No tein oman taulukointi systeemin merkkijonoilla ;) eli typen field kohtaan laitetaan vain tavallinen merkkijono, joka sisältää eri tunnisteita, mistä saadaan tieto, että mistä taulukon solu alkaa ja loppuu jne. Kannattaa myös tehdä jonkinlaiset funktiot helpottamaan asiaa.
Merkkijonojen käyttö on hidasta, jos joudut parsimaan niitä jatkuvasti ohjelmassa, joten suosittelen muistipalojen käyttöä.

Tässä 10 minutissa tehty esimerkki..

Code: Select all


Type TEST
    Field tiedot
EndType

AddTieto("dodo",200,10)
AddTieto("test",0,0)
AddTieto("asdasd",2230,13)
AddTieto("Mo",21324,234)

Repeat

    y=0
    Text 20,10,"Player      Scores      Level"
    For aa.TEST = Each TEST
        Text 20,30 + y * 15, GetName(aa\tiedot)
        Text 120,30 + y * 15, GetScores(aa\tiedot)
        Text 220,30 + y * 15, GetLevel(aa\tiedot)
        y+1
    Next aa
    
    DrawScreen
Forever


Function Addtieto(name$,scores,lvl)
    aa.TEST = New( TEST )
    aa\tiedot = MakeMEMBlock( Len(name$) + 10 ) 
    
    // kirjotetaan tulevan merkkijonon pituus
    PokeByte aa\tiedot, 0, Len(name$)
    
    // merkataan jokainen kirjain asii merkeillä muistiin
    For a=1 To Len(name$)
        PokeByte aa\tiedot, a, Asc( Mid( name$,a,1 ) )
    Next a

    // merkataan lvl ja scores merkkijonon jälkeen
    PokeInt aa\tiedot, Len(name$) + 1, scores
    PokeInt aa\tiedot, Len(name$) + 5, lvl
    
EndFunction

Function GetScores( mem )
    Return PeekInt( mem, PeekByte(mem,0) + 1 )
EndFunction 

Function GetLevel( mem )
    Return PeekInt( mem, PeekByte(mem,0) + 5 )
EndFunction 

Function GetName( mem )
    For a=1 To PeekByte(mem, 0)
        txt$ = txt$ + Chr( PeekByte( mem, a ) )
    Next a
    Return txt$
EndFunction
EDIT:
Tässä vielä muistipalahommeleille toteutettu paikka väreille.. Tästä kun voi olla monellekkin hyötyä.
Tein itse nopeusvertailun nyt merkkijonojen ja muistipalojen siirto nopeudesta, niin muistipalat olivat ~75% nopeampia.

Code: Select all

Type TEST
    Field vari
EndType

AddColor(cbred)
AddColor(cbmagenta)
AddColor(cbgreen)
AddColor(cbblue)
AddColor(cblightblue)
AddColor(cbdarkblue)
AddColor(100,200,100)

Repeat

    
    Color cbwhite
    Text 20,10,"Red         Green        BLUE"
    
    y=0
    For aa.TEST = Each TEST
        Color GetRed(aa\vari), GetGreen(aa\vari),GetBlue(aa\vari)
        Text 20, 30 + y * 15, GetRed(aa\vari)
        Text 120,30 + y * 15, GetGreen(aa\vari)
        Text 220,30 + y * 15, GetBlue(aa\vari)
        y+1
    Next aa
    
    If KeyHit(28) Then
        For bb.TEST = Each TEST
            SwitchColor(bb\vari,Rand(255),Rand(255),Rand(255))
        Next bb
    EndIf
    
    DrawScreen
Forever

Function AddColor(r,g,b)
    aa.TEST = New( TEST )
    aa\vari = MakeMEMBlock( 3 ) // 3 * 1  

    // merkataan varit muistiin
    PokeByte aa\vari, 0, r
    PokeByte aa\vari, 1, g
    PokeByte aa\vari, 2, b
    
EndFunction

Function SwitchColor(mem,r,g,b)
    If mem = 0 Then MakeError "Muistipalaa ei ole olemassa" 
    PokeByte mem, 0, r
    PokeByte mem, 1, g
    PokeByte mem, 2, b
EndFunction

Function GetRed( mem )
    Return PeekByte( mem, 0)
EndFunction 

Function GetGreen( mem )
    Return PeekByte( mem, 1)
EndFunction 

Function GetBlue( mem )
    Return PeekByte( mem, 2)
EndFunction 
Tekeillä pikkupelejä ja ohjelmia :)

Post Reply