Seite 1 von 1
ZoomSprite und SpriteWidth
Verfasst: 21.11.2020 18:17
von 4Planes
Hallo!
Ich lerne gerade mit PureBasic zu programmieren und bin auf mein erstes Hindernis gestoßen.
Ich lade ein einfaches 2D-Sprite, dann passe ich mit ZoomSprite dessen Größe an.
Wenn ich zu späterer Zeit die Größe des Sprites wissen will, geben mir SpriteWidth und SpriteHeight nur die ursprüngliche Größe des Sprites an, nicht aber die gezoomte Größe.
Gibt es einen Befehl, um die aktuelle Größe zu erhalten?
Eine Lösung ist natürlich, einfach zu speichern, was man bei ZoomSprite für Maße verwendet hat, aber das kommt mir nicht sehr elegant vor.
Für Tippps und HInweise bin ich sehr dankbar

Re: ZoomSprite und SpriteWidth
Verfasst: 21.11.2020 19:26
von ccode_new
Hallo 4Planes,
deine Aussage:
4Planes hat geschrieben:Wenn ich zu späterer Zeit die Größe des Sprites wissen will, geben mir SpriteWidth und SpriteHeight nur die ursprüngliche Größe des Sprites an, nicht aber die gezoomte Größe.
ist falsch.
SpriteWidth und SpriteHeight geben nach einem ZoomSprite - Aufruf auch die neue Spritegröße aus.
Das funktioniert unter Windows x86/x64 mit DirectX 11 oder OpenGL und unter Linux mit OpenGL, sowie unter MacOS mit OpenGL als Renderer.
Es wird überall gezoomt. Und der Befehl ist dabei so nett auch die neuen Texturdimensionen für eine spätere Verwendung (z.B. mit SpriteWidth oder SpriteHeight) zu speichern und nicht nur als reine Darstellungsfunktion zu dienen.
Vielleicht machst du einen Fehler beim Abfragen der Werte?
Beispielcode?
Re: ZoomSprite und SpriteWidth
Verfasst: 21.11.2020 21:59
von 4Planes
Du hast Recht! Ich hätte das vorher prüfen sollen, bevor ich behaupte, wie SpriteWidth funktioniert. Ich war mir sicher, dass der Fehler hier liegt. Stattdessen verstehe ich den Fehler jetzt nicht. Wenn ich versuche auf ein gezoomtes Sprite zu schreiben, kommt eine Fehlermeldung, sobald ich den Bereich der Originalgröße verlasse.
Dieser Code funktioniert:
Code: Alles auswählen
StartDrawing(SpriteOutput(varInt_SpriteID))
For varInt_PositionY = 0 To SpriteHeight(varInt_SpriteID)-1
For varInt_PositionX = 0 To SpriteWidth(varInt_SpriteID)-1
Plot(varInt_PositionX, varInt_PositionY, $00FF00)
Next
Next
StopDrawing()
Dieser hier funktioniert nicht. Da heißt es »Plot() ist außerhalb des Zeichenbereichs«.
Code: Alles auswählen
ZoomSprite(varInt_SpriteID, SpriteWidth(varInt_SpriteID) * 2, SpriteHeight(varInt_SpriteID) * 2)
StartDrawing(SpriteOutput(varInt_SpriteID))
For varInt_PositionY = 0 To SpriteHeight(varInt_SpriteID)-1
For varInt_PositionX = 0 To SpriteWidth(varInt_SpriteID)-1
Plot(varInt_PositionX, varInt_PositionY, $00FF00)
Next
Next
StopDrawing()
Heißt das, wenn man gezoomte Sprites bearbeiten will, dann geht das nur in ihrer Originalgröße?
Re: ZoomSprite und SpriteWidth
Verfasst: 21.11.2020 22:26
von Mijikai
4Planes hat geschrieben:...
Heißt das, wenn man gezoomte Sprites bearbeiten will, dann geht das nur in ihrer Originalgröße?
Ja, da sonst außerhalb des Sprite-Speichers geschrieben wird.
Re: ZoomSprite und SpriteWidth
Verfasst: 22.11.2020 09:00
von 4Planes
Vielen Dank für die Aufklärung! Das erklärt, warum mein Code manchmal nicht funktioniert.
Damit stellt sich sich mir jetzt aber die genau umgekehrte Frage vom Anfang: Gibt es eine elegante Möglichkeit, die ursprüngliche Größe eines gezoomten Sprites zu ermitteln, ohne den Wert irgendwo in einer Variable gespeichert zu haben?
Ich weiß, dass man ZoomSprite mit #PB_Default aufrufen kann, aber ich will ja eigentlich die Größe des Sprites beibehalten.
Re: ZoomSprite und SpriteWidth
Verfasst: 22.11.2020 12:02
von ccode_new
Ja diese Möglichkeit gibt es.
Benutze: OutputWidth() und OutputHeight()
Beispiel:
Code: Alles auswählen
StartDrawing(SpriteOutput(varInt_SpriteID))
For varInt_PositionY = 0 To OutputHeight()-1
For varInt_PositionX = 0 To OutputWidth()-1
Plot(varInt_PositionX, varInt_PositionY, $00FF00)
Next
Next
Re: ZoomSprite und SpriteWidth
Verfasst: 22.11.2020 16:01
von 4Planes
Vielen Dank für die Hilfe! Funktioniert jetzt tadellos!