Erledigt : Offsetberechnung in Banks
Übersicht BlitzBasic Allgemein
bruZardBetreff: Erledigt : Offsetberechnung in Banks |
Mi, Jan 19, 2005 18:58 Antworten mit Zitat |
|
---|---|---|
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! |
||
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 |
Mi, Jan 19, 2005 19:07 Antworten mit Zitat |
|
---|---|---|
Wie wärs mit (s + z * Breite) * 4? | ||
bruZard |
Mi, Jan 19, 2005 19:15 Antworten mit Zitat |
|
---|---|---|
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 |
Mi, Jan 19, 2005 19:15 Antworten mit Zitat |
|
---|---|---|
http://mitglied.lycos.de/thevertex/media/Banks.doc
das ganze in einem tutorial |
||
vertex.dreamfall.at | GitHub |
bruZard |
Mi, Jan 19, 2005 19:24 Antworten mit Zitat |
|
---|---|---|
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 |
Mi, Jan 19, 2005 19:32 Antworten mit Zitat |
|
---|---|---|
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 |
Mi, Jan 19, 2005 19:40 Antworten mit Zitat |
|
---|---|---|
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 |
Mi, Jan 19, 2005 19:47 Antworten mit Zitat |
|
---|---|---|
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 |
TheShadowModerator |
Mi, Jan 19, 2005 20:30 Antworten mit Zitat |
|
---|---|---|
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 |
Mi, Jan 19, 2005 21:41 Antworten mit Zitat |
|
---|---|---|
Jeder kann man was übersehen | ||
Coding: silizium-net.de | Portfolio: Triton.ch.vu |
OJay |
Mi, Jan 19, 2005 22:23 Antworten mit Zitat |
|
---|---|---|
falls das irgendjemand mal liest, und es evtl auch für 3 dimensionen braucht: https://www.blitzforum.de/viewtopic.php?t=1282 :) | ||
lettorTrepuS |
Mi, Jan 19, 2005 23:40 Antworten mit Zitat |
|
---|---|---|
-aus Sicherheitsgründen gelöscht- Diese Information ist mit Ihrer Sicherheitsfreigabe leider nicht erhältlich, Bürger. | ||
bruZard |
Do, Jan 20, 2005 10:36 Antworten mit Zitat |
|
---|---|---|
@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 |
Do, Jan 20, 2005 12:55 Antworten mit Zitat |
|
---|---|---|
-aus Sicherheitsgründen gelöscht- Diese Information ist mit Ihrer Sicherheitsfreigabe leider nicht erhältlich, Bürger. | ||
Übersicht BlitzBasic Allgemein
Powered by phpBB © 2001 - 2006, phpBB Group