Hat mich etwas mehr Knobelarbeit gekostet als ich dachte, dafür liefere ich euch (m)eine Prozedur, die 2D Sprites um 90°, 180° und 270° drehten kann!
Pures PureBasic, es läuft also auf Windows und Linux (DrawingBuffer() wird auf Mac nicht unterstützt).
- Parameter
- 90, 180, 270 dreht jeweils X Grad nach rechts
- -90, -180, -270 dreht jeweils X Grad nach links
einfacher zu merken: - 3 dreht das Bild auf "3 Uhr" = 90°
- 6 dreht das Bild auf "6 Uhr" = 180°
- 9 dreht das Bild auf "9 Uhr" = 270°
- Verbesserung:
Man kann jetzt auch um x*90 Grad drehen, also zum Beispiel um 450° (=90°) oder -1260° (= -180°) - Bei 0°, 360° und "12 Uhr" pasiert nichts
- Bei allen anderen Winkelangaben passiert auch nichts
- Rückgabewert
- Konnte das Sprite erfolgreich gedreht werden, ist der Rückgabewert <> 0
- Der Rückgabewert ist die Adresse des DrawingBuffers
Code: Alles auswählen
Procedure RotateSprite(SpriteID, Rotate=90) ; AND51, Feb/2008
Protected *buffer, x, y, border=SpriteWidth(SpriteID)-1, bytesPerPixel=1, *px1.Long, *px2.Long
*buffer=DrawingBuffer()
If *buffer
Select DrawingBufferPixelFormat()
Case #PB_PixelFormat_32Bits_BGR, #PB_PixelFormat_32Bits_RGB
bytesPerPixel=4
Case #PB_PixelFormat_15Bits, #PB_PixelFormat_16Bits
bytesPerPixel=2
Case #PB_PixelFormat_24Bits_BGR, #PB_PixelFormat_24Bits_RGB
bytesPerPixel=3
EndSelect
Select rotate%360
Case 90, 3, -270 ; turn right
For y=0 To border/2
For x=0 To border/2
*px1=*buffer+x*bytesPerPixel+y*DrawingBufferPitch()
*px2=*buffer+(border-y)*bytesPerPixel+x*DrawingBufferPitch()
Swap *px1\l, *px2\l
*px2=*buffer+(border-x)*bytesPerPixel+(border-y)*DrawingBufferPitch()
Swap *px1\l, *px2\l
*px2=*buffer+y*bytesPerPixel+(border-x)*DrawingBufferPitch()
Swap *px1\l, *px2\l
Next
Next
Case 180, 6, -180 ; turn around
For y=0 To border/2
For x=0 To border
*px1=*buffer+x*bytesPerPixel+y*DrawingBufferPitch()
*px2=*buffer+(border-y)*DrawingBufferPitch()+(border-x)*bytesPerPixel
Swap *px1\l, *px2\l
Next
Next
Case 270, 9, -90 ; turn left
For y=0 To border/2
For x=0 To border/2
*px1=*buffer+x*bytesPerPixel+y*DrawingBufferPitch()
*px2=*buffer+y*bytesPerPixel+(border-x)*DrawingBufferPitch()
Swap *px1\l, *px2\l
*px2=*buffer+(border-x)*bytesPerPixel+(border-y)*DrawingBufferPitch()
Swap *px1\l, *px2\l
*px2=*buffer+(border-y)*bytesPerPixel+x*DrawingBufferPitch()
Swap *px1\l, *px2\l
Next
Next
EndSelect
EndIf
ProcedureReturn *buffer
EndProcedure