LoadAnimImage & Zeichnen bestimmter Frames
Übersicht

InfectedBetreff: LoadAnimImage & Zeichnen bestimmter Frames |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 So wird daraus ein bestimmtes hevorgehoben: BlitzBasic: [AUSKLAPPEN] Local CurrentTile% = GUI_TILESET_SCROLL_Y*8 + GUI_TILESET_SCROLL_X 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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 ![]() Danke dir ![]() |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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) 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 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Nein, fast ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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]
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 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group