LoadAnimImage & Zeichnen bestimmter Frames

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

Infected

Betreff: LoadAnimImage & Zeichnen bestimmter Frames

BeitragFr, Feb 21, 2014 6:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo! Ich steh momentan etwas auf dem Schlauch!
Ich versuche grade ein Bild welches 32x32 große Tiles enthält so zu laden, dass davon nur ein Feld von 8x8 Tiles(also 8x8 32x32 Felder) angezeigt werden.
Punkt 0,0 bis 7,7 sollen jetzt gemalt werden, das ist erstmal nicht das Problem
Jetzt soll man hin und her schieben können, welche Tiles des Bildes angezeigt werden - leider weiß nich nicht wie ich das ganze umsetzen soll. Zuerst dachte ich per Pixmap, aber das wäre denk ich zuviel für so eine Aufgabe.

Mein TileSet Type:
Code: [AUSKLAPPEN]
   Type TTileSet
      Field i:TImage
      Field w:Int
      Field h:Int
      Field id:Int
   EndType
   



Geladen werden die Sets so:

Code: [AUSKLAPPEN]
   
TEMP_IMAGE_STRING = RequestFile$("TileSet auswaehlen"))
    tSet:TTileSet = New TTileSet
    TEMP_IMAGE = LoadImage(TEMP_IMAGE_STRING)
   tSet.w = ImageWidth(TEMP_IMAGE)/32
   tSet.h = ImageHeight(TEMP_IMAGE)/32
   tSet.id = 1
   tSet.i = LoadAnimImage(TEMP_IMAGE_STRING,32,32,0,(tSet.w*tSet.h))
   ListAddLast(SYS_TILESET_LIST,tSet)



Jetzt steh ich allerdings auf dem Schlauch.
Was ich machen will:
-Nur ein durchscrollbares raster von 8x8 tiles zeichnen, welches sich dann einfach verschieben lässt.

Ich habs einmal probiert, aber da kommt nur Müll dabei raus :/
Vielleicht weiß jemand wie ichs am besten anstelle?

Hier mein noch mein Müll:
Code: [AUSKLAPPEN]
   For tSet:TTileSet = EachIn SYS_TILESET_LIST
   
      If tSet.id = CURRENT_SET
         Local my:Int = 0
local mx:int = 0
         Local GUI_TILECOUNT:Int = 0
         GUI_TILECOUNT = (GUI_TILESET_SCROLL_Y*GUI_TILESET_SCROLL_X)
            For my = 0 To 7
               For mx = 0 To 7
                  Print GUI_TILECOUNT
                  If GUI_TILECOUNT > (GUI_TILESET_SCROLL_X*GUI_TILESET_SCROLL_Y)-1
                     If GUI_TILECOUNT < ((GUI_TILESET_SCROLL_X+7)*(GUI_TILESET_SCROLL_Y+7))-1

                        DrawImage tSet.i,1600+(mx*32),100+(my*32),GUI_Tilecount
                  
                     EndIf
                  EndIf
                  GUI_Tilecount = GUI_Tilecount + 1
               Next
            Next
      
EndIf
   Next
+


Edit: Mir fällt auf, mein Ansatz is nich so schlecht, er fängt ja beim richtigen Tile an zu zeichnen, in der zweiten Zeile passt es dann schon nicht mehr..

Midimaster

BeitragFr, Feb 21, 2014 9:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hast hier einen Denkfehler:
BlitzMax: [AUSKLAPPEN]
GUI_TILECOUNT = (GUI_TILESET_SCROLL_Y*GUI_TILESET_SCROLL_X)


Die Tile-Nr wird nicht errechnet, indem man x und y miteinander multipliziert. Du nimmst y mal 8, den jede Zeile weiter sind ja immer 8 Tiles mehr:
BlitzMax: [AUSKLAPPEN]
GUI_TILECOUNT = GUI_TILESET_SCROLL_Y*8 + GUI_TILESET_SCROLL_X



So werden alle 8x8 angezeigt:
BlitzBasic: [AUSKLAPPEN]
For Local my%=0 To 7
For Local mx%=0 To 7
Local Frame%= my*8+mx
DrawImage tSet.i, 1600+(mx*tSet.w), 100+(my*tSet.h), Frame
Next
Next


So wird daraus ein bestimmtes hevorgehoben:
BlitzBasic: [AUSKLAPPEN]
Local CurrentTile% = GUI_TILESET_SCROLL_Y*8 + GUI_TILESET_SCROLL_X
For Local my%=0 To 7
For Local mx%=0 To 7
Local Frame%= my*8+mx
SetColor 55,55,55
If Frame=CurrentTile
SetColor 255,255,255
EndIf
DrawImage tSet.i, 1600+(mx*tSet.w), 100+(my*tSet.h), Frame
Next
Next
SetColor 255,255,255



Noch eine kleine Anmerkung zur Groß-/Kleinschreibung von Code:

Großschreibung verwendet man eigentlich nur um CONST zu verdeutlichen

Schreibe besser GuiTileset_ScrollY als GUI_TILESET_SCROLL_Y
GUI_TILESET_SCROLL_Y
 

Infected

BeitragFr, Feb 21, 2014 22:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Das mit dem großschreiben hab ich mir irgendwie angewöhnt für Variablen die im ganzen Programm gebraucht werden, vielleicht nicht die beste angewohnheit, aber ich komm klar Smile

Das mit den +8 Tiles versteh ich nur nicht ganz, wäre in diesem Fall 8 die maximale Anzahl der Tiles in die Breite? also quasi das geladene image 8x32 breit? oder wie meinst du?
Ich hab wie gesagt, ein großes Tileset, mit jeweils 32x32 großen Tiles. Ich möchte dass man hin under her scrollen kann zwischen den tiles in dem tileset, ohne dass das Bild dadurch verschoben wird. Die größere des TileSets(des Bildes mit den Tiles) variiert, deshalb im type das type.w, welches gleich durch 32 geteilt wurde, so bedeutet type.w = tileset breite in 32x32 tiles. Woher kommt die 8? Das raff ich nich ganz Smile

Danke dir Smile

Xeres

Moderator

BeitragFr, Feb 21, 2014 22:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Jedes Einzelbild mag 32x32 px groß sein, aber das spielt nur beim Laden mit LoadAnimImage eine Rolle.
Die 8x8 = 64 Tiles kann man einzeln ansprechen. 0 ist der erste Frame, 1 der Zweite usw.
Wenn du Zeilen- (y) und Spalten- (x) Position hast, kannst du mit der Zeilenlänge (hier 8) den Frame ausrechnen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

PhillipK

BeitragSa, Feb 22, 2014 0:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Meinst du mit dem "+8" etwa diese zeile?

Code: [AUSKLAPPEN]
Local Frame%= my*8+mx


Hier hast du die vars my (zeile) und mx (spalte). Stell dir das geladene image wie eine tabelle oder liste vor.
Das erste frame ist oben links, das 2te direkt FRAMEBREITE daneben.

Code: [AUSKLAPPEN]
 0  1  2  3  4  5  6  7
 8  9 10 11 12 13 14 15
16 17 18 19 20...


Undsoweiter ^^

9 Liegt also auf der position "1,1" (0,0 ist oben links) -> 1*8 + 1 = 9 - ergo, frame 9.

Midimaster

BeitragSa, Feb 22, 2014 10:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Nirgendwo steht "+8" !!!

Es ist "my*8" !!! Mit dem geladenen Image hat das wenig zu tun. Eher mit der Anzahl der Tiles, die Du gerne nebeneinander darstellen möchtest. Unabhängig von deiner Anordnung in der Bilddatei! Nach dem Laden liegen LoadAnimImage Bilder alle "wie nacheinander" in einer Liste.



Wieviele Bilder sind in einer Datei?

Ist es so, dass Deine Bild-Datei immer 32x32 Tiles also fast 1000 Tiles enthält?
hier sieht das so aus:
BlitzMax: [AUSKLAPPEN]
    TEMP_IMAGE = LoadImage(TEMP_IMAGE_STRING)
tSet.w = ImageWidth(TEMP_IMAGE)/32
tSet.h = ImageHeight(TEMP_IMAGE)/32



Die 8 hat nix mit der Datei, sondern was mit dem Bildschirm zu tun

Die 8 kommt daher, weil Du 8 Tile in jeder Zeile nebeneinander darstellen möchtest. Du hattest dies selbst vorgeschlagen:
BlitzBasic: [AUSKLAPPEN]
For my = 0 To 7
For mx = 0 To 7



Phillip hat es schön dargestellt.

Dabei gehe ich immer davon aus, das Deine Variablen mx bzw. my bereits nur eine Zahl zwischen 0 und 7 liefern.


Wolltest Du nur 5 Tiles pro Zeile anzeigen wäre die Formel my*5+mx

1 2 3 4
5 6 7 8
9 ...




Vermutung:

Ich wage mal eine Vermutung...

Deine Bild-Datei enthält 32x32 Images, also 1000... Du möchstest gerne immer einen Ausschnitt von 8x8 daraus anzeigen? Dieser Ausschnitt soll sich verschieben lassen, so dass zunächst Bild 0-7, und nach einem Ruck nach rechts Bild 1-9 und nach vielen Rucks 25-32 angezeigt wird? Ein Ruck nach unten und es soll Bild 32-39 und nach einem weiteren Ruck Bild 64-71 angezeigt werden?
 

Infected

BeitragSa, Feb 22, 2014 19:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, fast Smile
Ums zu verdeutlichen mit den Framenummern
bild = animimage mit 32x32 großen tiles, angefangen mit 0, maximal anzahl = (bild.x/32)*(bild.y/32)
so hab ich schonmal die maximale anzahl an tiles in dem Bild
die Tiles sind im Image so angeordnet:

X X X X X X X X X X X
X X X X X X X X X X X
X X X X o o o o o X X
X X X X o o o o o X X
X X X X o o o o o X X
X X X X X X X X X X X

o steht für die Tiles die ich gezeichnet werden will(die 8 lassen wir mal aussen vor, wieviele tiles angezeigt wird, wird variabel)

Jetzt müsste ich per tastedruck einfach, dass sich das feld aus " o " 's verschiebt

also quasi z.B. ich drück [<-] -> ergebnis

X X X X X X X X X X X
X X X X X X X X X X X
X X X o o o o o X X X
X X X o o o o o X X X
X X X o o o o o X X X
X X X X X X X X X X X
Es sollen also quasi nur die o'en gezeichnet werden

Alle aufeinmal in der richtigen Reihenfolge zu zeichnen wäre kein Problem, sobald ich aber versuch die angezeigten Tiles zu malen, ist alles verschoeben.
Hier mal screens+ original tileset:


Vielleicht verdeutlicht das mein Problem. Es ist mit sicherheit irgendwo ein Denkfehler.. aber wo? =/
(und ja ich hab mit deinen codebeispielen rumgespielt etc, aber es war dennoch alles verschoben)

Midimaster

BeitragSa, Feb 22, 2014 21:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah, siehste... genauso hatte ich mir das schon gedacht!
Code: [AUSKLAPPEN]
 0  1  2  3  4 ...
32 33 34 35 36 ...
64 65 66 67 68 ...
96 97 98 99 100 ...
....


Der Beispielcode bleibt dann der gleiche, nur die 8 wird durch die 32 ersetzt:

BlitzMax: [AUSKLAPPEN]

offX=GUI_TILESET_SCROLL_X
offY=GUI_TILESET_SCROLL_Y

For Local my%=0 To 7
For Local mx%=0 To 7
Local Frame%= (my+offY)*32+(mx+offX)
DrawImage tSet.i, 1600+(mx*tSet.w), 100+(my*tSet.h), Frame
Next
Next



Der Startpunkt links oben ist wie ein Offset zum Nullpunkt. z.B das erste links oben darzustellende Tile wäre die x=3,y=2

Dann müssten gemalt werden:

Code: [AUSKLAPPEN]
67  68  69  70 ...
99 100 101 102...
...


genau das leistet die Formel:

Frame%= (my+offY)*32+(mx+offX)

Ecke links oben:
Frame%= (0+2)*32+(0+3)
Frame%= 67

Das Tile rechts daneben:
Frame%= (0+2)*32+(1+3)
Frame%= 68

Das erste Tile der zweiten Zeile:
Frame%= (1+2)*32+(0+3)
Frame%= 99

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group