Hallo Manuel, habe dir mal ein kleines Demo gemacht......
Code: Alles auswählen
EnableExplicit
;***************************************************************************
;* 
;* 
;* 
;*     Coded By: Klaus Wilke
;*     PB 5.31/ September 2015
;***************************************************************************
#ScreenW = 1024
#ScreenH = 768
#FPS     = 1000/60
  If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 Or InitSound() = 0
    MessageRequester("Error", "Can't open screen & sprite environment!", 0)
    End
  EndIf
  
  If  OpenWindow( 0, 0, 0, #ScreenW, #ScreenH, "A screen in a window...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered ) = 0
    MessageRequester( "Error", "Can`t open Window !", 0 )
  EndIf
     
  If  OpenWindowedScreen( WindowID(0), 0, 0, #ScreenW, #ScreenH ) = 0
       MessageRequester( "Error", "Can`t open WindowScreen !", 0 )
  EndIf
  
  Global GameTimer.i, Event.i, SpriteWeapon.i, WeaponRotate.i, Weapon_X.i = 512, Weapon_Y.i = 384
  Global Exit.b = #False
  ; Hier malen wir unsere Kanone
  
  ClearScreen( 0 )
  
  StartDrawing( ScreenOutput() )
  
  Box( 10, 63 - 10, 117, 20, $FFFFFF )
  DrawingMode( #PB_2DDrawing_Outlined )
  Box( 0, 63 - 10, 10, 20, $FFFFFF)
  StopDrawing()
  
  SpriteWeapon = GrabSprite( #PB_Any, 0, 0, 128, 128, #PB_Sprite_AlphaBlending )
  
  Structure attrib
    
    sprite.i
    x.f
    y.f
    angle.f
    speed.f
    
  EndStructure
  
  Global NewList Shot.attrib()
  
  ; mit dieser Procedure kannst du den Drehpunkt verlagern, dafür zuständig ist CenterX und CenterY.
  ; Sind beide 0 liegt der Drehpunkt in der Mitte des Sprites.
  
  Procedure DisplayTransformSprite(Sprite.i, X.f, Y.f, Width.f, Height.f, angle.f, CenterX.f=0, CenterY.f=0, Transparency=255)
  
  Protected Sin.f = Sin(Radian(angle)), Cos.f = Cos(Radian(angle))
  TransformSprite(Sprite, X + Cos*(-Width*0.5-CenterX) - Sin*(-Height*0.5-CenterY), Y + Sin*(-Width*0.5-CenterX) + Cos*(-Height*0.5-CenterY), X + Cos*( Width*0.5-CenterX) - Sin*(-Height*0.5-CenterY), Y + Sin*( Width*0.5-CenterX) + Cos*(-Height*0.5-CenterY), X + Cos*( Width*0.5-CenterX) - Sin*( Height*0.5-CenterY), Y + Sin*( Width*0.5-CenterX) + Cos*( Height*0.5-CenterY), X + Cos*(-Width*0.5-CenterX) - Sin*( Height*0.5-CenterY), Y + Sin*(-Width*0.5-CenterX) + Cos*( Height*0.5-CenterY))
  DisplayTransparentSprite(Sprite, 0, 0, Transparency)
  
EndProcedure
Procedure UpdateMove()
  
  Protected Factor.f
  Static OldTime.i
  
  If OldTime = 0 : OldTime = ElapsedMilliseconds(): EndIf
  
  Factor = ( ElapsedMilliseconds() - OldTime ) * 0.001  
  
  ForEach Shot()
    
    With Shot()
      
      \x + Cos( Radian( \angle ) ) * \speed * Factor
      \y + Sin( Radian( \angle ) ) * \speed * Factor
      
      If \x > 1023 + 5 Or \x < - 5 Or \y > 767 + 5 Or \y < - 5; prüfen ob die Kugel aus dem Bild ist
        
        DeleteElement( Shot() )
        
      EndIf
      
    EndWith
    
  Next
  
  OldTime = ElapsedMilliseconds()
  
EndProcedure
Procedure CreateShot()
  
  AddElement( Shot() )
  
  With Shot()
    
    \x = Weapon_X + Cos( Radian( WeaponRotate ) ) * 128; Schuss an die Spitze der
    \y = Weapon_Y + Sin( Radian( WeaponRotate ) ) * 128; Kanone setzen
    \angle = WeaponRotate; Winkel der Kanone speichern, da das die Richtung ist in der die Kugel fliegen soll    
    \speed = 300
    
  EndWith
  
EndProcedure
  Procedure UpdateScreen()
    
    ClearScreen(RGB(0, 0, 0))
   
    StartDrawing( ScreenOutput() )
    
    DrawingMode( #PB_2DDrawing_Outlined )
    
    Circle( Weapon_X, Weapon_Y, 50, $00FF00 )
    Circle( Weapon_X, Weapon_Y, 2, $0000FF )
    
    ForEach Shot()
       
       With Shot()
         
         Circle( \x, \y, 5, $FFFFFF )
         
       EndWith
       
     Next
    
    StopDrawing()
    
    DisplayTransformSprite( SpriteWeapon, Weapon_X, Weapon_Y, 128, 128, WeaponRotate, -64, 0, 255 )
     FlipBuffers() 
    
  EndProcedure
  
  Procedure UpdateKeyboard()
   
    ExamineKeyboard()
    
    If KeyboardPushed( #PB_Key_Right )
      
      WeaponRotate + 1
      If WeaponRotate > 359: WeaponRotate = 0:EndIf
      
    EndIf
    
    If KeyboardPushed( #PB_Key_Left )
      
      WeaponRotate - 1
      If WeaponRotate < 0: WeaponRotate = 359:EndIf
      
    EndIf
    
    If KeyboardReleased( #PB_Key_Space )
      
      CreateShot()
      
    EndIf
    
    If KeyboardPushed( #PB_Key_Escape )
      
      Exit = #True
      
    EndIf
    
  EndProcedure
  
  Repeat
   
    Repeat
      
      Event = WindowEvent()
      
      Select Event 
          
        Case #PB_Event_CloseWindow
          
          End 
          
      EndSelect
      
    Until Event = 0
  
    If ElapsedMilliseconds() >= GameTimer
      
      UpdateScreen()
      UpdateKeyboard()
      UpdateMove()
      
      GameTimer = ElapsedMilliseconds() + #FPS 
      
    EndIf
    
    Delay(0)   
    
  Until Exit = #True
  
  End
  
  CloseScreen()