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()