Erledigt : Offsetberechnung in Banks

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

bruZard

Betreff: Erledigt : Offsetberechnung in Banks

BeitragMi, Jan 19, 2005 18:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Jetzt muss ich auch mal eine Frage fragen...

Um meine Frage zu verdeutlichen muss ich ein klein wenig ausholen:

eine zweidimensionale Map könnte man in einem Array sichern -> Dim myArray(100,100). Füllt man dieses mit Werten kann man auf jedes beliebige Feld zugreifen: irgendeinwert = Array(s,z) ... hierbei ist s die Spalte und z die Zeile. Soweit so gut, das versteht jeder und es funktionierte schon immer.
Das Problem: Was mache ich wenn ich kein Array sondern eine Bank verwenden will? Die Felder die ich im Array hatte sollen in der Bank durch Integer repräsentiert werden. Also berechne ich die Bytesize der Bank durch (breite*höhe)*4 da ein Integer = 4 Bytes.
Soweit gehts ja auch noch, die Bank hat die richtige Grösse, kniffelig wirds dann aber beim berechnen des Offsets um an die einzelnen Elemente des gedachten zweidimensionalen Arrays zu kommen.
Ich habe schon diverse Berechnungsmethoden ausprobiert, aber die Werte stimmen vorn und hinten nicht.
Hatte jemand das Problem schon, hat es gelöst und könnte mir hilfreich unter die Arme greifen? Danke! Smile
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32

User posted image
  • Zuletzt bearbeitet von bruZard am Mi, Jan 19, 2005 19:48, insgesamt einmal bearbeitet
 

Edlothiol

BeitragMi, Jan 19, 2005 19:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie wärs mit (s + z * Breite) * 4?

bruZard

BeitragMi, Jan 19, 2005 19:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Nö, geht nicht ... ((s+width)*z)*4 habe ich auch schon durch ...
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32

User posted image

Vertex

BeitragMi, Jan 19, 2005 19:15
Antworten mit Zitat
Benutzer-Profile anzeigen
http://mitglied.lycos.de/thevertex/media/Banks.doc
das ganze in einem tutorial
vertex.dreamfall.at | GitHub

bruZard

BeitragMi, Jan 19, 2005 19:24
Antworten mit Zitat
Benutzer-Profile anzeigen
So hatte ich es auch schonmal Vertex, haut auch nicht hin ... scheinbar liegt der Fehler woanders ... evtl. kann sich ja mal jemand durch den folgenden bmx Code wühlen. Ist nur ein Ausschnitt.

Code: [AUSKLAPPEN]

Type TMap
   Global map:TList
   Global layer:Int
   Field as:Int
   Field az:Int
   Field width:Int
   Field height:Int
   Field mapdata:TBank
   
   Method Create(w:Int,h:Int)
      Local bytesize:Int = (w*h)*4
      mapdata:TBank = CreateBank(bytesize)
      For Local i:Int=0 To bytesize-1
         PokeByte(mapdata,i,0)
      Next
   End Method
   
   Method Draw(sw,sh,ctw,cth)
      Local s:Int      = 0
      Local z:Int      = 0
      Local x:Int      = 0
      Local y:Int      = 0
      Local off:Int   = 0
      Local t:Int
      
      Repeat
         off = (s*(width+1)+z)*4
         t = PeekInt(mapdata,off)
         DrawImage tileset,x,y,t
         
         x:+ctw; s:+1
         If s=sw/ctw
            s=0; x=0
            z:+1; y:+cth
         EndIf
      Until z=sh/cth
   End Method
   
   Method Edit(mx:Int,my:Int,sw:Int,sh:Int,ctw:Int,cth:Int,ct:Int)
      Local s:Int      = 0
      Local z:Int      = 0
      Local x:Int      = 0
      Local y:Int      = 0
      Local off:Int   = 0
      
      Repeat      
         If mx>x And my>y And mx<x+ctw And my<y+cth
            SetBlend LIGHTBLEND;
            DrawImage tileset,x,y,ct
            SetBlend ALPHABLEND;
            
            If MouseDown(1)
               off=(s*(width+1)+z)*4
               PokeInt(mapdata,off,ct)
            EndIf
         EndIf
         
         x:+ctw; s:+1
         If s=sw/ctw
            s=0; x=0
            z:+1; y:+cth
         EndIf
      Until z=sh/cth
   End Method
   
   Method New()
      If map=Null Then map=New TList
      map.AddLast(Self)
      layer:+1
   End Method
   Method Delete()
      map.Remove(Self)
   End Method
End Type

Variablen:

mx = MouseX()
my = MouseY()
ctw = current_tile_width
cth = current_tile_height
ct = current_tile
sw = screen_width
sh = screen_height

Die Methode "Draw()" holt die Werte aus der Bank, die Methode "Edit()" soll sie reinschreiben ... tut sie zwar, aber nicht dort wo ich es gern hätte.
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32

User posted image
 

Apocalyptic

BeitragMi, Jan 19, 2005 19:32
Antworten mit Zitat
Benutzer-Profile anzeigen
OnlineHilfe hat Folgendes geschrieben:
Ein Speicherfeld hat viele Vorteile. Es ist aber nur eindimensional. Für 2D-Kartenfelder kann es aber dennoch problemlos verwendet werden. Dazu muss man die Größe der Karte wissen (Breite, Höhe). Dann benötigt man noch die Bytegröße pro Eintrag (Byte=1, Short=2, Integer=4). Nach dieser Formel lässt sich der benötigte Speicher berechnen:

Speicher=Breite*Hoehe*Bytegroesse

Wenn nun die Position (X,Y) bekannt ist, dann lässt die die Speicherposition so berechnen:

Position=(X+Y*Breite)*Bytegroesse

X und Y fangen beide ab 0 an. Sollte man eine Kartengröße von 100x200 haben, dann kann X nur 0-99 sein und Y nur 0-199. Seltener benötigt man die Umkehrfunktionen. Wenn die Speicherposition bekannt ist, dann lässt sich X und Y so berechnen:

X=(Position/Bytegroesse) MOD Breite
Y=(Position/Bytegroesse) / Breite

Das sollte doch funktionieren...
Suum cuique

[ www.ffs-net.de.vu ] [ Raycaster ]

bruZard

BeitragMi, Jan 19, 2005 19:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Tut es aber leider nicht ... wenn ich nicht schon alle Berechnungsmöglichkeiten ausprobiert hätte würde ich auch nicht posten. Ich vermute einfach mal dass der Fehler woanders liegt ...
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32

User posted image

bruZard

BeitragMi, Jan 19, 2005 19:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh Mann ... ich bin so dämlich ... sorry für die Belästigung Folks, aber wenn ich width und height benutzen will sollte ich diesen Variablen auch Werte geben.

Es ist unglaublich... tritt mich Santa Claus
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32

User posted image

TheShadow

Moderator

BeitragMi, Jan 19, 2005 20:30
Antworten mit Zitat
Benutzer-Profile anzeigen
bruzard du hast mich gerade sehr enttäuscht... das ist wirklich "basic"

Darauf basiert die gesamte grafikausgabe der computerwelt... ein vram-block wäre vergleichbar mit so einer bank - RGBA (=4 byte) entspräche in dem Fall dem Integer in BB...
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2

Triton

BeitragMi, Jan 19, 2005 21:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Jeder kann man was übersehen Wink
Coding: silizium-net.de | Portfolio: Triton.ch.vu
 

OJay

BeitragMi, Jan 19, 2005 22:23
Antworten mit Zitat
Benutzer-Profile anzeigen
falls das irgendjemand mal liest, und es evtl auch für 3 dimensionen braucht: https://www.blitzforum.de/viewtopic.php?t=1282 :)
 

lettorTrepuS

BeitragMi, Jan 19, 2005 23:40
Antworten mit Zitat
Benutzer-Profile anzeigen
-aus Sicherheitsgründen gelöscht- Diese Information ist mit Ihrer Sicherheitsfreigabe leider nicht erhältlich, Bürger.

bruZard

BeitragDo, Jan 20, 2005 10:36
Antworten mit Zitat
Benutzer-Profile anzeigen
@TheShadow: Das ich vergessen habe zwei Variablen zu initialisieren und dadurch verwirrt war dass bisher immer lauffähiger Code nicht mehr funktionierte, ist wohl kaum mit Unswissenheit gleichzusetzen.

@Schildkröte: Was soll ich zu Deinen dämlichen Kommentaren blos noch posten....
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32

User posted image
 

lettorTrepuS

BeitragDo, Jan 20, 2005 12:55
Antworten mit Zitat
Benutzer-Profile anzeigen
-aus Sicherheitsgründen gelöscht- Diese Information ist mit Ihrer Sicherheitsfreigabe leider nicht erhältlich, Bürger.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group