RotateSprite() » dreht 2D Sprites um 90°, 180° oder 270°
Verfasst: 02.02.2008 02:22
Hallo!
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).
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