GrabImage verhält sich merkwürdig ...

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

GrabImage verhält sich merkwürdig ...

Beitrag von diceman »

Hallo liebe Leute,
Ich versuche gerade einen Handgriff zu realisieren, den ich in Blitzbasic zuhauf verwendet habe: und zwar geht es darum, eine Bilddatei, welche mehrere Tiles nebeneinander hält, mit GrabImage auf verschiedene Image-Handles aufzusplitten.
Vielleicht habe ich ja einen Denkfehler?

• Gegeben sei eine tiles.bmp mit der Größe von 50*25 Pixeln, welche zwei 25*25-große Tile-Grafiken hat.

Code: Alles auswählen

#tileSize = 25
temp_PIC = LoadImage(#PB_Any,"tiles.bmp")
GrabImage(temp_PIC,tile1_PIC,0,0,#tileSize,#tileSize)
Soweit so gut. Funktioniert super, ich habe jetzt ein 25*25 großes Image mit dem Handle tile1_PIC.
Aber jetzt wird's merkwürdig:
Wenn ich jetzt direkt mit

Code: Alles auswählen

GrabImage(temp_PIC,tile2_PIC,#tileSize,0,#tileSize,#tileSize)
versuche, das zweite Bild "auszuschneiden", habe ich anschließend 2 Images, welche beide so aussehen wie das zweite Bild.
:? :?
Und es wird NOCH merkwürdiger:
Wenn ich bei folgendem Beispiel den ersten GrabImage-Befehl auskommentiere (also gar kein tile1_PIC erstelle), wird an der Stelle im Programm, wo tile1_PIC eigentlich angezeigt werden sollte, stattdessen tile2_PIC gezeichnet (tile1_PIC und tile2_PIC wurden jeweils als globale Variablen initialisiert).
Eine Fehlermeldung bekomme ich nicht (EnableExplicit() aktiviert). Beide GrabImage-Befehle geben eine Nummer zurück, habe es mit Debug überprüft.
Nur wenn ich beide GrabImage-Zeilen auskommentiere, meckert der Compiler.

Code: Alles auswählen

temp_PIC = LoadImage(#PB_Any,"tiles.bmp")
;GrabImage(temp_PIC,tile1_PIC,0,0,#tileSize,#tileSize)
GrabImage(temp_PIC,tile2_PIC,0,#tileSize,#tileSize,#tileSize)
Hat jemand eine Erklärung dafür?
Danke!
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: GrabImage verhält sich merkwürdig ...

Beitrag von Bisonte »

Code: Alles auswählen

#TileSize = 25

Temp_Pic = LoadImage(#PB_Any, "tiles.bmp")

Tile1_Pic = GrabImage(Temp_Pic, #PB_Any, 0, 0, #TileSize, #TileSize)
Ist eigentlich schnell erklärt.
Dein Tile1_Pic ist, wenn nicht anders angegeben mit dem Wert 0 bestückt. Also will PB ein Image mit der Nummer 0 laden.
Da du das aber variable halten willst solltest du #PB_Any nutzen (für den 2.Parameter).

Und die Zuweisung, damit am Ende in Tile1_Pic auch die richtige Nummer ist (die wird von GrabImage zurückgegeben).

Edit:

Mal so kurz erdacht :

Code: Alles auswählen

Procedure.i GrabTileImage(Image, TileSetImage, PosX, PosY, TileSizeX, TileSizeY)
  
  Protected ID = #False
  
  If IsImage(TileSetImage)
    
    ID = GrabImage(TileSetImage, Image, PosX, PosY, TileSizeX, TileSizeY)
    If Image = #PB_Any : ID = Image : EndIf
    
  EndIf
  
  ProcedureReturn ID
  
EndProcedure

; Aufruf : Entweder

temp_PIC = LoadImage(#PB_Any,"tiles.bmp")
tile1_PIC = GrabTileImage(#PB_Any, temp_pic, 0, 0, #TileSize, #TileSize)

; Oder

#TileSet = 1
#TileImage = 2

LoadImage(#Temp, "tiles.bmp")

If Not GrabTileImage(#TileImage, #TileSet, 0, 0, #TileSize, #TileSize)
  Debug "Oh nein, das ist wohl in die Hose gegangen"
EndIf
Weil man braucht es ja öfter ;)
Das IsImage() kann man auch aus der Prozedure entfernen. Man muss halt nur selber sicherstellen, das das TileSetImage tatsächlich ein gültiges Image ist.
Dann kann man sich das noch mehr vereinfachen, wenn z.b. die TileSets wirklich immer die gleichgrosse TileBilder beinhalten, das man nur eine Nummer (sozusagen den Index) der Prozdeur übergibt und diese rechnet selbst aus wo das Bild ausgeschnitten werden muss....
Als Beispiel: Alle Bilder im Set sind 25x25 ohne Ränder. Dann will ich Bild 4 haben, also sage ich einer Prozedur : HolMir(Bild4, Tileset, Tilesetsize) sozusagen....
Zuletzt geändert von Bisonte am 14.02.2018 22:17, insgesamt 1-mal geändert.
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: GrabImage verhält sich merkwürdig ...

Beitrag von diceman »

Oh Mann, du hast Recht, soweit habe ich gar nicht gedacht! :oops: :bluescreen:
Ich raufe mir hier schon seit gut einer Stunde die Haare und schreibe Test-Codes noch und nöcher - aber auf die Idee bin ich natürlich nicht gekommen.
Ich nutze jetzt die Variante mit

Code: Alles auswählen

temp_PIC = LoadImage(#PB_Any,"tiles.png")
tile1_PIC = GrabImage(temp_PIC,#PB_Any,0,0,#tileSize,#tileSize)
tile2_PIC = GrabImage(temp_PIC,#PB_Any,#tileSize,0,#tileSize,#tileSize)
das klappt prima und ist für mich am intuitivsten.
... das sind die kleinen Fallstricke beim Erlernen einer neuen Sprache, wenn man Jahrelang mit Scheuklappen durch die Gegend gelaufen ist; aber das soll mich nicht einschüchtern!
Also Cheers, und vielen lieben Dank! :coderselixir: :coderselixir:
Ich hoffe mal, daß ich irgendwann soweit bin, daß ich mein Gelerntes ebenfalls weitergeben, und so anderen helfen kann. <)
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: GrabImage verhält sich merkwürdig ...

Beitrag von diceman »

Ich muß nochmal was fragen, verwandtes Thema:
Und zwar habe ich jetzt versucht mit der oben beschriebenen Methode meine Sprites zu laden und an handle-Variablen zu verteilen:

Code: Alles auswählen

temp_SPR = LoadSprite(#PB_Any,"sprites.png")
flag_SPR = GrabSprite(temp_SPR,#PB_Any,0,0,#tileSize,#tileSize)
Ich erhalte für die zweite Zeile im Code folgende Fehlermeldung:
#Sprite object number is very high (over 1000000), are You sure of that?
Was mache ich falsch?
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: GrabImage verhält sich merkwürdig ...

Beitrag von Bisonte »

GrabSprite funktioniert so nicht.....
Ergebnis = GrabSprite(#Sprite, x, y, Breite, Höhe [, Modus])

Fotografiert ("grab") den Bildschirminhalt im Bereich von (x, y, Breite, Höhe) und erstellt daraus ein neues #Sprite
Das ist etwas anders als beim GrabImage !

Da wird der Screen als Quelle genommen, nicht ein Image oder ein Sprite!!!
Das würde nur etwas bringen wenn dein temp_sprite auf dem Screen zu sehen wäre.

Also ein

Code: Alles auswählen

temp_image = LoadImage(#PB_Any, "deinBild.png")
temp_sprite = CreateSprite(#PB_Any, ImageWidth(temp_image), ImageHeight(temp_image)) ; Evt noch "Modus" beachten
If StartDrawing(SpriteOutput(temp_sprite))
  DrawAlphaImage(ImageID(temp_image), 0, 0, 255)
  StopDrawing()
EndIf
würde bei dir das richtige ergebnis bringen
Zuletzt geändert von Bisonte am 15.02.2018 23:24, insgesamt 1-mal geändert.
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
#NULL
Beiträge: 2235
Registriert: 20.04.2006 09:50

Re: GrabImage verhält sich merkwürdig ...

Beitrag von #NULL »

Die Parameter sind bei GrabSprite anders als bei GrabImage. Kein Source-Sprite, es wird immer vom Screen gegrabscht.
Kannst jetzt entweder via Images grabben und aus den einzelnen Images Sprites erstellen, oder das Tileset als Sprite (oder auch als Image) auf den Screen bringen und dann von dort grabben. Was auch noch geht ist das Tileset versetzt auf einzelne Sprites zu zeichnen, die durch ihre Größe den Rest automatisch clippen.
Dann gibt's auch noch ClipOutput. Oder du läßt das Tileset in einem Sprite und verwendest ClipSprite für jedes entsprechende Tile.
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: GrabImage verhält sich merkwürdig ...

Beitrag von diceman »

Habe ich verstanden, vielen Dank! :allright:
Soviel zu meiner anderen Frage bezüglich Unterschiede Images und Sprites ... ;) so langsam kommt Licht ins Dunkle.
Das versetzte Zeichnen vom Tileset auf einzelne Sprites klingt sexy, das probiere ich gleich mal.
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Antworten