Aktuelle Zeit: 26.05.2018 13:53

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: GrabImage verhält sich merkwürdig ...
BeitragVerfasst: 14.02.2018 21:46 
Offline
Benutzeravatar

Registriert: 06.07.2017 12:24
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:
#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:
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:
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: GrabImage verhält sich merkwürdig ...
BeitragVerfasst: 14.02.2018 22:03 
Offline
Benutzeravatar

Registriert: 01.04.2007 20:18
Code:
#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:
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....

_________________
PureBasic 5.46 LTS / 5.62 (Windows x86/x64) | Windows10 Pro x64 | Z370 Extreme4 | i7 8770k | 32GB RAM | iChill GeForce GTX 980 X4 Ultra | HAF XF Evo​​


Zuletzt geändert von Bisonte am 14.02.2018 22:17, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: GrabImage verhält sich merkwürdig ...
BeitragVerfasst: 14.02.2018 22:15 
Offline
Benutzeravatar

Registriert: 06.07.2017 12:24
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:
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: GrabImage verhält sich merkwürdig ...
BeitragVerfasst: 15.02.2018 23:01 
Offline
Benutzeravatar

Registriert: 06.07.2017 12:24
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:
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:
Zitat:
#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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: GrabImage verhält sich merkwürdig ...
BeitragVerfasst: 15.02.2018 23:21 
Offline
Benutzeravatar

Registriert: 01.04.2007 20:18
GrabSprite funktioniert so nicht.....

Zitat:
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:
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

_________________
PureBasic 5.46 LTS / 5.62 (Windows x86/x64) | Windows10 Pro x64 | Z370 Extreme4 | i7 8770k | 32GB RAM | iChill GeForce GTX 980 X4 Ultra | HAF XF Evo​​


Zuletzt geändert von Bisonte am 15.02.2018 23:24, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: GrabImage verhält sich merkwürdig ...
BeitragVerfasst: 15.02.2018 23:23 
Offline
Benutzeravatar

Registriert: 20.04.2006 09:50
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: GrabImage verhält sich merkwürdig ...
BeitragVerfasst: 15.02.2018 23:31 
Offline
Benutzeravatar

Registriert: 06.07.2017 12:24
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.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye