Array2D kaksiulotteisia "taulukoita"!

Oletko tehnyt jotain, mistä muut voisivat hyötyä. Postita vinkit tänne.
Post Reply
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Array2D kaksiulotteisia "taulukoita"!

Post by MaGetzUb »

Joo, eli tein tämmöisen 2D taulukko kirjaston. Voit luoda taulukon CreateArray2D(width, height) komennolla, siihen voi kirjoitella Integer ja Float tyyppistä dataa komennoilla: PokeArrayI(arr, x, y, dat%) ja PokeArrayF(arr, x, y, dat#)
Datan lukeminen onnistuu PeekArrayI(arr, x, y) ja PeekArrayF(arr, x, y):lä. Taulukon koot saa: ArrayWidth() ja ArrayHeight() komennoilla, taulukkoa voi venytellä uudelleen ResizeArray(arr, width, height) komennolla. DeleteArray(arr) poistaa Array2D tyyppijäsenen, ja sen sisältämän muistipalan.

Funktiot + halpa esimerkki:

Code: Select all

Type Array2D
    Field Array As Integer
    Field Width As Integer
    Field Height As Integer
End Type

Function CreateArray(width, height)
    width = width + 1
    height = height + 1
    arr.Array2D = New (Array2D)
    arr\Width = width
    arr\Height = height
    arr\Array = MakeMEMBlock(4*width*height)
    Return ConvertToInteger(arr)
End Function

Function PokeArrayI(array, x, y, dat%)
    arr.Array2D = ConvertToType(array)
    If x < arr\Width And y < arr\Height Then
        PokeInt arr\Array, 4*((y*arr\Width)+x), dat
    Else
        MakeError "You are attempting To Write over the array!"
    EndIf
EndFunction

Function PokeArrayF(array, x, y, dat#)
    arr.Array2D = ConvertToType(array)
    If x < arr\Width And y < arr\Height Then     
        PokeFloat arr\Array, 4*((y*arr\Width)+x), dat#
    Else
        MakeError "You are attempting To Write over the array!"
    EndIf
EndFunction

Function PeekArrayI%(array, x, y)
    arr.Array2D = ConvertToType(array)
    If x < arr\Width And y < arr\Height Then
        Return PeekInt(arr\Array, 4*((y*arr\Width)+x))
    Else
        MakeError "Peeking failed! You're attempting to read over the array!"
    EndIf
EndFunction

Function PeekArrayF#(array, x, y)
    arr.Array2D = ConvertToType(array)
    If x < arr\Width And y < arr\Height Then
        Return PeekFloat(arr\Array, 4*((y*arr\Width)+x))
    Else
       MakeError "Peeking failed! You're attempting to read over the array!"
    EndIf         
EndFunction

Function ResizeArray(array, width, height)
    width = width + 1
    height = height + 1
    arr.Array2D = ConvertToType(array)
    newArr = MakeMEMBlock(4*width*height+4)

    For y = 0 To (Min(arr\Height, height)-1)
        MemCopy arr\Array, y*arr\Width*4, newArr, y*width*4, Int(Min(arr\Width, width))*4
    Next y 

    DeleteMEMBlock arr\Array
    arr\Array = newArr
    arr\Width = width
    arr\Height = height
EndFunction

Function ArrayWidth(array)
    arr.Array2D = ConvertToType(array)
    Return arr\Width-1
EndFunction

Function ArrayHeight(array)
    arr.Array2D = ConvertToType(array)
    Return arr\Height-1
EndFunction

Function DeleteArray(array)
    arr.Array2D = ConvertToType(array)
    DeleteMEMBlock arr\Array
    Delete arr
EndFunction 

SCREEN 640, 640

tileMap = CreateArray(10, 10)
tilesetti = LoadAnimImage("Media\Tileset.BMP", 32, 32, 0, 256)


For i = 0 To 10
    For j = 0 To 10
        PokeArrayI(tileMap, i, j, Rand(255))
    Next j
Next i

Repeat 

    For i = 0 To 10
        For j = 0 To 10
            frame = PeekArrayI(tileMap, i, j) 
            DrawImage tilesetti, i*32, j*32, frame
        Next j
    Next i

DrawScreen
Forever 
Pelkkä tyyppi ja funktiot:

Code: Select all

Type Array2D
    Field Array As Integer
    Field Width As Integer 
    Field Height As Integer
End Type 

Function CreateArray(width, height)
    width = width + 1
    height = height + 1
    arr.Array2D = New (Array2D)
    arr\Width = width
    arr\Height = height
    arr\Array = MakeMEMBlock(4*width*height)
    Return ConvertToInteger(arr)
End Function 

Function PokeArrayI(array, x, y, dat%)
    arr.Array2D = ConvertToType(array)
    If x < arr\Width And y < arr\Height Then 
        PokeInt arr\Array, 4*((y*arr\Width)+x), dat
    Else 
        MakeError "You are attempting To Write over the array!"
    EndIf 
EndFunction 

Function PokeArrayF(array, x, y, dat#)
    arr.Array2D = ConvertToType(array)
    If x < arr\Width And y < arr\Height Then     
        PokeFloat arr\Array, 4*((y*arr\Width)+x), dat#
    Else 
        MakeError "You are attempting To Write over the array!"
    EndIf 
EndFunction 

Function PeekArrayI%(array, x, y)
    arr.Array2D = ConvertToType(array)
    If x < arr\Width And y < arr\Height Then 
        Return PeekInt(arr\Array, 4*((y*arr\Width)+x))
    Else 
        MakeError "Peeking failed! You're attempting to read over the array!"
    EndIf 
EndFunction

Function PeekArrayF#(array, x, y)
    arr.Array2D = ConvertToType(array)
    If x < arr\Width And y < arr\Height Then 
        Return PeekFloat(arr\Array, 4*((y*arr\Width)+x))
    Else 
       MakeError "Peeking failed! You're attempting to read over the array!"
    EndIf         
EndFunction 

Function ResizeArray(array, width, height)
    width = width + 1
    height = height + 1
    arr.Array2D = ConvertToType(array)
    newArr = MakeMEMBlock(4*width*height+4)

    For y = 0 To (Min(arr\Height, height)-1)
        MemCopy arr\Array, y*arr\Width*4, newArr, y*width*4, Int(Min(arr\Width, width))*4
    Next y  

    DeleteMEMBlock arr\Array
    arr\Array = newArr
    arr\Width = width
    arr\Height = height
EndFunction 

Function ArrayWidth(array)
    arr.Array2D = ConvertToType(array)
    Return arr\Width-1
EndFunction 

Function ArrayHeight(array)
    arr.Array2D = ConvertToType(array)
    Return arr\Height-1
EndFunction

Function DeleteArray(array)
    arr.Array2D = ConvertToType(array)
    DeleteMEMBlock arr\Array
    Delete arr
EndFunction  
Koodin hyöty tulee ilmi esimerkiksi jos tekee vaikka erityyppistä tilemappijärjestelmää kuin cb:n nykyinen tai jos vain muuten vain oikeat taulukot ärsyttävät. Toivottavasti tästä on hyötyä teille muillekkin, itse hyödyn tästä pathfinder koodia varten. :P

off: ASD 1 666. viesti..
EDIT:

Esimerkkiä tehty paremmaksi ja funktio koodista otettu ylimääräinen taulukon luonti koodi pois.

Last edited by MaGetzUb on Mon Jul 02, 2012 3:12 pm, edited 5 times in total.
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
User avatar
MetalRain
Active Member
Posts: 188
Joined: Sun Mar 21, 2010 11:17 am
Location: Espoo

Re: Array2D kaksiulotteisia "taulukoita"!

Post by MetalRain »

Aika jännä toteutus, lähinnä muistipaloihin nähden voittaa siinä ettei tarvitse muistaa kumminpäin koordinaatit nyt menikään ja mistä koko löytyy. Mietin että mihin tuota tyyppikokoelmaa tuossa tarvitsee? Yhtä hyvin voisi käyttää muistipalaa jossa vaikka indekseissä 0 ja 4 leveys ja korkeus ja 8:sta indeksistä alkaen data. Oliko tarkoitus mahdollistaa helppo haku kaikista taulukoista?

Esimerkki ei näemmä toimi ainakaan cbE:llä oikein, vaikka taulun ylikirjoittavan 5:en ottaa pois riviltä 21.
User avatar
Combatti
Active Member
Posts: 101
Joined: Fri Jun 29, 2012 6:23 pm
Location: Kuhmo

Re: Array2D kaksiulotteisia "taulukoita"!

Post by Combatti »

Tässä tein pienen esimerkin, jossa palloa liikutellaan näillä 2D-taulukoilla:

Code: Select all

Type Array2D
        Field Array As Integer
        Field Width As Integer
        Field Height As Integer
    End Type

    arr = CreateArray(3, 3)

    Function CreateArray(width, height)
        width = width + 1
        height = height + 1
        arr.Array2D = New (Array2D)
        arr\Width = width
        arr\Height = height
        arr\Array = MakeMEMBlock(4*width*height)
        Return ConvertToInteger(arr)
    End Function

    Function PokeArrayI(array, x, y, dat%)
        arr.Array2D = ConvertToType(array)
        If x < arr\Width And y < arr\Height Then
            PokeInt arr\Array, 4*((y*arr\Width)+x), dat
        Else
            MakeError "You are attempting To Write over the array!"
        EndIf
    EndFunction

    Function PokeArrayF(array, x, y, dat#)
        arr.Array2D = ConvertToType(array)
        If x < arr\Width And y < arr\Height Then     
            PokeFloat arr\Array, 4*((y*arr\Width)+x), dat#
        Else
            MakeError "You are attempting To Write over the array!"
        EndIf
    EndFunction

    Function PeekArrayI%(array, x, y)
        arr.Array2D = ConvertToType(array)
        If x < arr\Width And y < arr\Height Then
            Return PeekInt(arr\Array, 4*((y*arr\Width)+x))
        Else
            MakeError "Peeking failed! You're attempting to read over the array!"
        EndIf
    EndFunction

    Function PeekArrayF#(array, x, y)
        arr.Array2D = ConvertToType(array)
        If x < arr\Width And y < arr\Height Then
            Return PeekFloat(arr\Array, 4*((y*arr\Width)+x))
        Else
           MakeError "Peeking failed! You're attempting to read over the array!"
        EndIf         
    EndFunction

    Function ResizeArray(array, width, height)
        width = width + 1
        height = height + 1
        arr.Array2D = ConvertToType(array)
        newArr = MakeMEMBlock(4*width*height+4)

        For y = 0 To (Min(arr\Height, height)-1)
            MemCopy arr\Array, y*arr\Width*4, newArr, y*width*4, Int(Min(arr\Width, width))*4
        Next y 

        DeleteMEMBlock arr\Array
        arr\Array = newArr
        arr\Width = width
        arr\Height = height
    EndFunction

    Function ArrayWidth(array)
        arr.Array2D = ConvertToType(array)
        Return arr\Width-1
    EndFunction

    Function ArrayHeight(array)
        arr.Array2D = ConvertToType(array)
        Return arr\Height-1
    EndFunction
    
//Luodaan 2D-taulukko, johon mahtuu tarvittava määrä dataa. Sen leveys on siis 3 pikseliä ja korkeus 1 pikselin.
koordinaatit = CreateArray(3,1)

AX% = 40
AY% = 20
AR% = 32

Repeat
    
    //Silmukassa kirjoitetaan koordinaatit kokoajan taulukkoon. Taulukko on nyt täynnä, koita lisätä vielä yksi PokeArrayI tai PeekArrayI%
    PokeArrayI(koordinaatit,1,1,AX)
    PokeArrayI(koordinaatit,2,1,AY)
    PokeArrayI(koordinaatit,3,1,AR)

    //Päivitetään koordinaatit
    x = PeekArrayI%(koordinaatit,1,1)
    y = PeekArrayI%(koordinaatit,2,1)
    r = PeekArrayI%(koordinaatit,3,1)
    
    //x,y,r ovat kaikki PeekArrayI% komentoja, jotka esitellään edellisellä rivilä.
    Circle x,y,r
    
    //Nämä IF-lausekkeet vaikuttavat AX-,AY- ja AR-muuttujiin, jotka taas vaikuttavaat PokeArrayI-komentoon, joka taas vaikuttaa PeekArrayI%-komentoon joka taas
    //vaikuttaa koordinaatteihin :)
    If RightKey() Then AX = AX + 1
    If LeftKey() Then AX = AX - 1
    
    If UpKey() Then AY = AY - 1
    If DownKey() Then AY = AY + 1
    
    If MouseDown(1) Then AR = AR - 1
    If MouseDown(2) Then AR = AR + 1
    
    DrawScreen
    
Until EscapeKey()
Tämähän sopii aloittelijoille hyvin. Itse ainakaan en yhtään hallitse normaaleja taulukoita :lol: Mutta tämän systeemin käsitin heti kättelyssä. Hieno systeemi. Aloittelijoille varsinkin.
~Yhteiskuntaan kyllästynyt koodari.
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: Array2D kaksiulotteisia "taulukoita"!

Post by MaGetzUb »

MetalRain wrote:Aika jännä toteutus, lähinnä muistipaloihin nähden voittaa siinä ettei tarvitse muistaa kumminpäin koordinaatit nyt menikään ja mistä koko löytyy. Mietin että mihin tuota tyyppikokoelmaa tuossa tarvitsee? Yhtä hyvin voisi käyttää muistipalaa jossa vaikka indekseissä 0 ja 4 leveys ja korkeus ja 8:sta indeksistä alkaen data. Oliko tarkoitus mahdollistaa helppo haku kaikista taulukoista?
Juuri tämä oli tarkoituksena, Tyyppi on sitä varten, ettäkun taulukon kokoa mennään muuttelemaan, niin kokoa ei tarvitse kirjoittaa muistipalaan. Harkitsin alunperin jättää tuon tyypin pois, mutta jätinpä sen silti. :P Korjaan tuon esimerkin, se ylikirjoitusvirhe jäi sinne vahingossa, koska halusin testata toimiiko nuo virheilmoitukset varmasti cbe:lä ja väsyksissä aamuyöllä sitten unohdin sen sinne. :D
EDIT:

Tämähän sopii aloittelijoille hyvin. Itse ainakaan en yhtään hallitse normaaleja taulukoita Mutta tämän systeemin käsitin heti kättelyssä. Hieno systeemi. Aloittelijoille varsinkin. :lol:
No ainakin ohjeet taisivat olla minulla selevemmät kuin esimerkiksi cb:n taulukko tutoriaalissa. :D Mutta tämän käyttö on ihan tarkoitettu aloittelijasta guruun. :D[/edit]
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
MrMonday
Advanced Member
Posts: 378
Joined: Fri Oct 10, 2008 2:35 pm

Re: Array2D kaksiulotteisia "taulukoita"!

Post by MrMonday »

Dodiin, tämä saattaa kyllä helpottaa huomattavasti Tilekartta-editorini työstämistä, kun olen pitkästä aikaa lähtenyt sitä taas sulattelemaan :D
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: Array2D kaksiulotteisia "taulukoita"!

Post by MaGetzUb »

Lisäsin DeleteArray(arr) komennon, sillä voi poistaa muistissa olevia taulukoita. :)
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
Post Reply