Code : Tout sélectionner
Procedure RotateSprite(source,target,angle.f,scale) 
  s.f=Sin(6.28318531/3600*angle):c.f=Cos(6.28318531/3600*angle)
  bitmap=CreateCompatibleBitmap_(GetDC_(0),SpriteWidth(source),SpriteHeight(source))
  dc=CreateCompatibleDC_(GetDC_(0))
  obj=SelectObject_(dc,bitmap)
  sid=SpriteOutput(source)
  workdc=StartDrawing(sid)
    BitBlt_(dc,0,0,SpriteWidth(source),SpriteHeight(source),workdc,0,0,13369376)
    transcolor=Point(SpriteWidth(source)-1,0);<-----transparent color upper-right pixel in sourcesprite
  StopDrawing()
  mx=SpriteWidth(source)/2:my=SpriteHeight(source)/2
  radius.f=Sqr(mx*mx + my*my)+1
  If scale=0
    If SpriteWidth(target)=0
      CreateSprite(target,SpriteWidth(source),SpriteHeight(source),0)
      TransparentSpriteColor(2,RGB(transcolor,transcolor,transcolor))
      cl=1
    EndIf
    mx2=mx:my2=my
  Else
    If IsSprite(target)=0
      CreateSprite(target,radius*2,radius*2,0)
      TransparentSpriteColor(2,RGB(transcolor,transcolor,transcolor))
      cl=1
    EndIf
    mx2=radius:my2=radius:diffmx=mx2-mx:diffmy=my2-my
  EndIf
  max=SpriteWidth(target):may=SpriteHeight(target)
  sid=SpriteOutput(target)
  workdc=StartDrawing(sid)
    Box(x, y, max, may,transcolor)
    For y=0 To SpriteHeight(source)-1
      For x=0 To SpriteWidth(source)-1
        RotateX.f = ((x - mx) * c - (y - my) * s) + mx + diffmx
        RotateY.f = ((x - mx) * s + (y - my) * c) + my + diffmy
        If RotateX>=0 And RotateX<max And RotateY>=0 And RotateY<may
          color=GetPixel_(dc,x,y)
          If RotateX>1 And RotateX<SpriteWidth(target)-1 And RotateY>1 And RotateY<SpriteHeight(target)-1
             Plot(RotateX,RotateY,color)
          EndIf
          If angle<>0 And angle<>900 And angle<>1800 And angle<>2700 And angle<>3600
            If RotateX>1 And RotateX<SpriteWidth(target)-1 And RotateY>0 And RotateY<SpriteHeight(target)-1
              Plot(RotateX,RotateY,color);<--This is my very complex
            EndIf
          EndIf
        EndIf
      Next x
    Next y
  StopDrawing()
  DeleteObject_(bitmap):DeleteObject_(obj):DeleteDC_(dc)
EndProcedure
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 Or OpenScreen(1024,768,32,"Rotate")=0
  MessageRequester("Error", "Can't open DirectX 7 Or later", 0):End
EndIf
LoadSprite(1,"PureBasic\Examples\Sources\Data\GeeBee2.bmp",0);<--You should use this first (You can find it in 'PureBasic\Examples\Sources\Data')
TransparentSpriteColor(1,RGB(255,0,255))
Repeat
    ExamineMouse():ExamineKeyboard()
    ClearScreen(RGB(100,50,50))
    DisplayTransparentSprite(1,100,100)
    If count<3650
      If GetTickCount_()-zeit > 10
     
        RotateSprite(1,2,count,1)
        ;RotateSprite(source,target,angle,scale)
        ;source - Number of existing sprite
        ;target - Number of (new)targetsprite
        ;angle  - 0 - 3600 tenth-degree
        ;scale  - 0 = target dimensions are same as source
        ;         1 = target dimension depends on rotation-radius
   
        count+50
        zeit=GetTickCount_()
      EndIf
    EndIf
    DisplayTransparentSprite(2,300+count/20,100+count/20)
    StartDrawing(ScreenOutput())
      DrawText(10, 500,"Angle= "+Str((count-50)/10)+" Degree")
    StopDrawing()
    FlipBuffers()
    Sleep_(1)
Until KeyboardPushed(#PB_Key_Escape)
End