|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
mkfezzo
Anmeldungsdatum: 16.08.2007 Beiträge: 25
|
Verfasst am: 15.01.2013, 14:40 Titel: Tileset in Array einlesen... |
|
|
Hallo zusammen,
mich quält grad ein kleines Problem:
Ich möchte Grafiktiles aus Datazeilen in meinem Programm einfügen, auslesen und in einem Feld speichern. Ich möchte diese dann mit get für das einzelne tile speichern - aber als Feld:
z.B.
Dim shared tileset(4+(16*16*4),100) as integer (Tile 16*16, 32 bit, 100 Tiles)
einlesen (nachdem Datazeilen als Grafik auf den Bild ge-psettet wurden):
get(0,0)-(15,15),tileset(1,1) für tile 1
(nächstes Tile anzeigen)
get(0,0)-(15,15),tileset(1,2) für tile 2
(und nächstes Tile anzeigen...and so on...)
...get(0,0)-(15,15),tileset(1,100) für tile 100
das ganze funktioniert natürlich (leider) nicht... was wäre ein anderer/funktionierender weg? Also ich möchte (erstmal) trotz aller anderslautenden Ratschläge mit dim shared deklarieren und unbedingt get/put (das verstehe ich wenigstens etwas!) nutzen? |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2507 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 15.01.2013, 20:05 Titel: |
|
|
Am besten einen Blick in
http://www.dreael.ch/Deutsch/Download/WindowsBitmapBibliothek.html
werfen, speziell Thematik "Für Trickfilm-Sprites: Der Startindex".
Ansonsten ist es problemlos möglich, ein zweidimensionales Array zu verwenden, man muss jedoch wissen, welcher der beiden Indexe als Bildindex verwendet werden kann, so dass der andere für die Bilddaten dient.
Ich müsste es sonst auch wieder kurz testen (aktuell gerade kein QB zur Hand). _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
mkfezzo
Anmeldungsdatum: 16.08.2007 Beiträge: 25
|
Verfasst am: 16.01.2013, 09:58 Titel: |
|
|
Ich werde mir den Link mal zuhause ansehen
Was mir grade aufgefallen ist, ich programiere das in FB und habe versehentlich im QB-Forum gepostet.
Mir ist bis jetzt aufgefallen, dass z.B. bei o.a. Dimensionierung der Index nicht mit (0,...) anfangen darf - es wird nichts ausgegeben. Wenn ich die Grafik manuell, also einfach als Tile1, Tile2... dimensioniere funktioniert alles - aber wer will das schon?
Auch wird bei z.B. tile(1,1) die erste Grafik angezeigt, bei tile(1,2) hingegen ist schon schluss... die Grafik wird nicht angezeigt. hmmm. |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 16.01.2013, 14:39 Titel: |
|
|
Hallo!
mkfezzo hat Folgendes geschrieben: | Was mir grade aufgefallen ist, ich programiere das in FB und habe versehentlich im QB-Forum gepostet. |
=> Thread ins FreeBASIC-Forum verschoben.
mkfezzo hat Folgendes geschrieben: | Ich werde mir den Link mal zuhause ansehen |
Die Artikel aus dreaels Sammlung sind alle auf QBasic oder gar GWBASIC bezogen. Von daher sind sie für Programmiervorhaben in FreeBASIC i.d.R. nicht eins zu eins übertragbar. Davon kann man meistens zwar trotzdem viel lernen, weil sie echt gut geschrieben sind und auch sprachunabhängiges Grundlagen-/Hintergrundwissen liefern, aber die Code-Beispiele sind eben meistens doch anders.
Beispielsweise lädt man Bitmaps in FreeBASIC ganz anders (viel einfacher) als damals in QBasic.
mkfezzo hat Folgendes geschrieben: | Dimensionierung der Index nicht mit (0,...) anfangen darf |
nemored hat dir vor einiger Zeit doch mal einige Tipps gegeben, wie man Grafiken aus BMP-Dateien laden kann:
http://forum.qbasic.at/viewtopic.php?p=92228#92228
Ganz wichtig dabei: Der Speicher, wo die Grafik "reinkommt", wird heute nicht mehr als manuell dimensioniertes Array vorbereitet. Das war in den allerersten Versionen von FreeBASIC das Vorgehen (-> Ähnlichkeit zu Grafikpuffern in QB), aber schon seit vielen Versionen (seit FB 0.14) benutzt man dafür Pointer und IMAGECREATE:
Code: | 'Aus der FreeBASIC-Befehlsreferenz zu BLOAD:
SCREENRES 640, 480, 32
Dim As Any Ptr bild
bild = ImageCreate(48, 48) 'Bildpuffer der Groesse 48x48 anlegen
BLoad "picture.bmp", bild 'Bilddatei in den Puffer laden
PUT (10, 10), bild 'Bildpuffer auf den Bildschirm zeichnen
ImageDestroy (bild) 'Bildpuffer wieder loeschen
Sleep 'Auf Tastendruck warten
End |
Siehe dazu: http://www.freebasic-portal.de/befehlsreferenz/bload-59.html
(Noch einfacher geht es mit einer vorbereiteten Routine:
Code-Beispiel: BMP-Bilder komfortabel in FreeBASIC laden und anzeigen)
Wenn du mehrere Grafiken hast, erzeugst du einfach ein Array mit Bild-Pointern.
Code: | DIM Tileset(1 To 10) As ANY PTR |
Damit sowas hier klappt,
Code: | Dim shared tileset(4+(16*16*4),100) as integer (Tile 16*16, 32 bit, 100 Tiles) |
müsste FB zuerst die 2. Dimension des Arrays auswerten. Also zuerst alle N von 1 bis 100 verarbeiten und in dabei wiederum die 4+(16*16*4) Integer linear am Stück hintereinanderschreiben. Also 100 Blöcke zu je 4+(16*16*4) Elementen.
Es könnte aber auch sein, dass FreeBASIC zu jedem der 4+(16*16*4) Elemente der 1. Dimension nacheinander 100 Integer schreibt, d.h. 1.028 Blöcke zu je 100 Integern. Das wäre dann ja nicht deine Bildpuffer-Wunschgröße. (Hab ich jetzt aber nicht ausprobiert.)
Wenn du solche Array-Speicher-Tricks machst, musst du dich genau damit auseinandersetzen, wie sowas im Speicher abgelegt wird und musst außerdem darauf hoffen, dass es sich nicht in späteren Versionen mal ändert.
Von daher würde ich schon empfehlen, die sinnvollen Abstraktionen zu benutzen, die dir die Sprache für den Zweck anbietet. Das heißt: Nicht den Bildpuffer selber zusammenbauen, sondern die vorgefertigte Funktion (ImageCreate) benutzen, die es dir genau richtig automatisch erledigt.
Viele Grüße!
Sebastian _________________
Der Markt regelt das! | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|