Sprite H/V-Flip on the fly
Sprite H/V-Flip on the fly
Hallo.
Gibt es eine Möglichkeit Images/Sprites zur Laufzeit zu spiegeln?
Bei einem Spiel werden nämlich Wurfgeschosse je nachdem, wer an der Reihe ist, von links nach rechts oder von rechts nach links bewegt. Und es wäre gut, wenn ich nicht jedes Teil 2 mal malen müsste.
Gibt es eine Möglichkeit Images/Sprites zur Laufzeit zu spiegeln?
Bei einem Spiel werden nämlich Wurfgeschosse je nachdem, wer an der Reihe ist, von links nach rechts oder von rechts nach links bewegt. Und es wäre gut, wenn ich nicht jedes Teil 2 mal malen müsste.
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
nur mit sprite3D...
aber 2x malen müßtest dus ja garnicht.
ob du deine bildchen nun nochmal flipst und ein zweites mal speicherst,
ist doch eigentlich unerheblich, oder?
...wenn es sich um viele viele bildchen handelt:
irfanview hat eine funktion zur batch-konvertierung.
da kannst du ein ganzes verzeichnis voll bildchen in einem rutsch flippen.
aber 2x malen müßtest dus ja garnicht.
ob du deine bildchen nun nochmal flipst und ein zweites mal speicherst,
ist doch eigentlich unerheblich, oder?
...wenn es sich um viele viele bildchen handelt:
irfanview hat eine funktion zur batch-konvertierung.
da kannst du ein ganzes verzeichnis voll bildchen in einem rutsch flippen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
nuja...
im endeffekt wirst du sowieso alles doppelt im speicher haben,
oder willst, du vor jeden einzelnen display richtigflippen?
was ist, wenn du in einem frame zwei geschosse darstellen willst,
die unterschiedliche ausrichtung haben?
dann müßtest du in jedem frame 2x flippen, das wär doch wahnsinn.
also wirst du sowieso ein einziges mal zubeginn alles flippen,
und dann im speicher belassen, das ist die einzig sinnvolle anwendung.
also kannst du das auch vorab machen.
was in der GraKa platz hat, hat auch platz auf der Platte.
im endeffekt wirst du sowieso alles doppelt im speicher haben,
oder willst, du vor jeden einzelnen display richtigflippen?
was ist, wenn du in einem frame zwei geschosse darstellen willst,
die unterschiedliche ausrichtung haben?
dann müßtest du in jedem frame 2x flippen, das wär doch wahnsinn.
also wirst du sowieso ein einziges mal zubeginn alles flippen,
und dann im speicher belassen, das ist die einzig sinnvolle anwendung.
also kannst du das auch vorab machen.
was in der GraKa platz hat, hat auch platz auf der Platte.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
- PureLust
- Beiträge: 1145
- Registriert: 21.07.2005 00:02
- Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
- Wohnort: am schönen Niederrhein
Hi Tom, ...
ich hab Dir hier mal eine kleine FlipSprite-Routine samt kleinem DemoCode gebastelt, mit der Du dann Sprites "on the fly" flippen kannst:
Um es plattformübergreifend zu halten, werden ausschließlich reine PureBasic-Befehle verwendet, so dass die Routine auch problemlos unter Linux und Mac laufen sollte.
Horizontal bzw. vertikal flippen kannst Du bei der Demo mit "h" und "v".
Gruß, PureLust.
ich hab Dir hier mal eine kleine FlipSprite-Routine samt kleinem DemoCode gebastelt, mit der Du dann Sprites "on the fly" flippen kannst:
Code: Alles auswählen
EnableExplicit
Define n, StartTime, StopTime, Key$, Event
Procedure FlipSprite(SpriteNr, Direction=0) ; Direction = 0 -> Flip horizontal, Direction <> 0 -> Flip vertical
Protected Point1.l, Point2.l
Protected x,y
If IsSprite(SpriteNr) And StartDrawing(SpriteOutput(SpriteNr))
Protected Width = SpriteWidth(SpriteNr)-1
Protected Height = SpriteHeight(SpriteNr)-1
If Direction ; vertical Flip
For x = 0 To Width
For y = 0 To Int((Height-1)/2)
Point1 = Point(x,y)
Point2 = Point(x,Height-y)
If Point1 <> Point2
Plot(x,y,Point2)
Plot(x,Height-y,Point1)
EndIf
Next y
Next x
Else ; horizontal Flip
For y = 0 To Height
For x = 0 To Int((Width-1)/2)
Point1 = Point(x,y)
Point2 = Point(Width-x,y)
If Point1 <> Point2
Plot(x,y,Point2)
Plot(Width-x,y,Point1)
EndIf
Next x
Next y
EndIf
StopDrawing()
EndIf
EndProcedure
If InitSprite() And InitKeyboard() And OpenWindow(0,0,0,640,480,"FlipSprite()",#PB_Window_ScreenCentered | #PB_Window_SystemMenu)
If OpenWindowedScreen(WindowID(0),0,0,640,480,0,0,0)
CreateSprite(1,100,100)
If StartDrawing(SpriteOutput(1))
For n = 1 To 50 : Circle(Random(100), Random(100), Random(20), Random($ffffff)) : Next n
Debug "OK"
StopDrawing()
EndIf
Key$ = "h"
Repeat
Event = WaitWindowEvent(10)
If Key$ = "h" Or Key$ = "v"
StartTime = ElapsedMilliseconds()
If Key$ = "h"
FlipSprite(1)
Else
FlipSprite(1,1)
EndIf
StopTime = ElapsedMilliseconds()
ClearScreen(0)
DisplaySprite(1,270,170)
If StartDrawing(ScreenOutput())
DrawText(235,190+SpriteHeight(1),"Sprite flipped within "+Str(StopTime - StartTime)+"ms",$ffffff,0)
StopDrawing()
EndIf
FlipBuffers()
EndIf
ExamineKeyboard()
Key$ = KeyboardInkey()
Until Key$ = #ESC$ Or Event = #PB_Event_CloseWindow
EndIf
EndIf
Horizontal bzw. vertikal flippen kannst Du bei der Demo mit "h" und "v".
Gruß, PureLust.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
in diesem fall wohl eher "on the snail"...PureLust hat geschrieben:... mit der Du dann Sprites "on the fly" flippen kannst

ich glaube kaum, dass TomS ein problem gehabt hätte,
zwei verschachtelte schleifen zu schreiben,
wo mittels Point/Plot die punkte vertauscht werden.
bei der zu erwartenden performance halte ich diese vorgehensweise jedoch für eher sinnfrei....

Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
- PureLust
- Beiträge: 1145
- Registriert: 21.07.2005 00:02
- Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
- Wohnort: am schönen Niederrhein
@Kaeru:
Da diese Anfrage im Anfängerforum geschrieben wurde, gehe ich nicht davon aus, das TomS das unbedingt selber so einfach hinbekommen hätte.
Aber da das ohnehin nur TomS selber beurteilen kann ob die Routine für ihn brauchbar und schnell genug ist,
war das mal wieder ein für Dich absolut typisches Posting: Zitat : ... eher sinnfrei.
Da diese Anfrage im Anfängerforum geschrieben wurde, gehe ich nicht davon aus, das TomS das unbedingt selber so einfach hinbekommen hätte.
Aber da das ohnehin nur TomS selber beurteilen kann ob die Routine für ihn brauchbar und schnell genug ist,
war das mal wieder ein für Dich absolut typisches Posting: Zitat : ... eher sinnfrei.

[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
eine flip-routine mit point/plot hätte ich ihm gestern schon posten können,
aber aufgrund ihrer langsamkeit halte ich das nicht für praktikabel.
im gegensatz zu dir mache ich mir gedanken über die bedürfnisse der fragenden.
deshalb poste ich keine schneckenroutine, sondern führe ihn zu einer praktikablen lösung.
genausowenig wie ich einem anfänger, für den andere kollegen Arrays
für verfrüht halten, keinen thread um die ohren haue.
aber aufgrund ihrer langsamkeit halte ich das nicht für praktikabel.
im gegensatz zu dir mache ich mir gedanken über die bedürfnisse der fragenden.
deshalb poste ich keine schneckenroutine, sondern führe ihn zu einer praktikablen lösung.
genausowenig wie ich einem anfänger, für den andere kollegen Arrays
für verfrüht halten, keinen thread um die ohren haue.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
Ich wollte mich gerade an das Erstellen einer FlpH() und FlipV() Prozedur machen, aber ich setze mich erst dran, wenn ich selber was brauche.
Kann mir einer sagen, wie ich mit DrawingBuffer() arbeite? Einfach da raus peeken?
@ Topic:
Ich finde es besser, man erstellt eine Kopie des Sprites und flippt es einmal. Dann kann man die geflippte Version immer wie ein normales Sprite anzeigen. Bevor das Sprite noch ausflippt...
Idee: Vielleicht kann man ja, wenn man DrawingBuffer() benutzt, mit Pointern arbeiten. Und dann 2 Pointer-Pixel immer mit Swap vertauschen. Wäre das nicht schnell (genug)?
Kann mir einer sagen, wie ich mit DrawingBuffer() arbeite? Einfach da raus peeken?
@ Topic:
Ich finde es besser, man erstellt eine Kopie des Sprites und flippt es einmal. Dann kann man die geflippte Version immer wie ein normales Sprite anzeigen. Bevor das Sprite noch ausflippt...

Idee: Vielleicht kann man ja, wenn man DrawingBuffer() benutzt, mit Pointern arbeiten. Und dann 2 Pointer-Pixel immer mit Swap vertauschen. Wäre das nicht schnell (genug)?
PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End