Außerdem hab ich versucht es möglichst strukturiert zu bauen, man kann zum Beispiel beliebig viele Spieler einstellen da das in einem Array gehandhabt wird, das is auch eine Sache was man denke ich so früh wie möglich lernen/nutzen sollte:

Code: Alles auswählen
;
; Round Pong
;
; by KeyKon
; v1.0 - 16.06.2009
; PB v4.31 | Tested on x86/DX9
EnableExplicit
;- Proz
Procedure.d ATan2(y.d,x.d)
If x < 0
ProcedureReturn ATan(y/x)+#PI
ElseIf x > 0 And y >= 0
ProcedureReturn ATan(y/x)
ElseIf x > 0 And y < 0
ProcedureReturn ATan(y/x)+2*#PI
ElseIf x = 0 And y > 0
ProcedureReturn #PI/2
ElseIf x = 0 And y < 0
ProcedureReturn 3*#PI/2
Else ; x = 0 and y = 0
ProcedureReturn 0
EndIf
EndProcedure
Procedure.d Rad(x.d,y.d)
ProcedureReturn Sqr(Pow(x,2)+Pow(y,2))
EndProcedure
Procedure.d KartX(ang.d,rad.d)
ProcedureReturn Cos(ang)*rad
EndProcedure
Procedure.d KartY(ang.d,rad.d)
ProcedureReturn Sin(ang)*rad
EndProcedure
;- Inits
If Not InitSprite() Or Not InitSprite3D() Or Not InitKeyboard()
Debug "InitError"
End
EndIf
If Not OpenWindow(0,0,0,700,700,"Round Pong",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
Debug "WindowError"
End
EndIf
If Not OpenWindowedScreen(WindowID(0),0,0,700,700,0,0,0)
Debug "ScreenError"
End
EndIf
Sprite3DQuality(#PB_Sprite3D_BilinearFiltering)
;- Var
Define event
Define ballx.d = 350
Define bally.d = 350
Define balla.d = 0
Define ballv.d = 1.5
Define balloldrad.d = 0
Define turn.b = 0
Define change.b = 0
Define looser.b = -1
Define i
Define playerv.d = 1
Structure pd
pos.d
x.l
y.l
a.f
ball.i
bar.i
color.l
EndStructure
#Player = 1 ;Man muss bei mehr Spielern noch Farben und Tasten per Hand hinzufügen....
Dim player.pd(#Player)
player(0)\color = RGB(255,0,0)
player(1)\color = RGB(0,255,0)
;player(2)\color = RGB(0,0,255)
For i = 0 To #Player
player(i)\pos = 360/(#Player+1)*i
Next
;- CreateSprite
TransparentSpriteColor(-1,0)
For i = 0 To #Player
player(i)\ball = CreateSprite(#PB_Any,32,32)
If StartDrawing(SpriteOutput(player(i)\ball))
Circle(16,16,16,player(i)\color)
StopDrawing()
EndIf
player(i)\bar = CreateSprite(#PB_Any,128,128,#PB_Sprite_Texture)
If StartDrawing(SpriteOutput(player(i)\bar))
Box(20,44,86,40,player(i)\color)
Circle(21,64,20,player(i)\color)
Circle(107,64,20,player(i)\color)
StopDrawing()
EndIf
player(i)\bar = CreateSprite3D(#PB_Any,player(i)\bar)
Next
;- Loadfont
LoadFont(0,"Comic Sans MS",20)
LoadFont(1,"Comic Sans MS",60)
;- Schleife
Repeat
Delay(1)
Repeat
event = WindowEvent()
If event = #PB_Event_CloseWindow
End
EndIf
Until Not event
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Escape)
End
EndIf
If KeyboardPushed(#PB_Key_Right)
player(0)\pos+playerv
EndIf
If KeyboardPushed(#PB_Key_Left)
player(0)\pos-playerv
EndIf
If KeyboardPushed(#PB_Key_2)
player(1)\pos+playerv
EndIf
If KeyboardPushed(#PB_Key_1)
player(1)\pos-playerv
EndIf
; If KeyboardPushed(#PB_Key_B)
; player(2)\pos+playerv
; EndIf
; If KeyboardPushed(#PB_Key_V)
; player(2)\pos-playerv
; EndIf
ClearScreen(0)
ballx + Cos(balla*#PI/180)*ballv
bally + Sin(balla*#PI/180)*ballv
If change And Rad(350-ballx,350-bally) > balloldrad
looser = turn
ElseIf change
change = 0
turn+1
If turn > #Player
turn = 0
ballv+0.5
EndIf
EndIf
balloldrad = Rad(350-ballx,350-bally)
If balloldrad > 350
looser = turn
EndIf
For i = 0 To #Player
player(i)\x = 350+Cos(player(i)\pos*#PI/180)*300
player(i)\y = 350+Sin(player(i)\pos*#PI/180)*300
player(i)\a = ATan2(bally-player(i)\y,ballx-player(i)\x)*180/#PI+90
If turn = i And Rad(ballx-player(i)\x,bally-player(i)\y) < 40
balla=player(i)\a-90
change = 1
EndIf
If player(i)\pos > 360
player(i)\pos - 360
ElseIf player(i)\pos < 0
player(i)\pos + 360
EndIf
Next
If balla > 360
balla-360
EndIf
DisplayTransparentSprite(player(turn)\ball,ballx -16,bally -16)
If Start3D()
For i = 0 To #Player
RotateSprite3D(player(i)\bar,player(i)\a,0)
If looser < 0 And turn = i
DisplaySprite3D(player(i)\bar,player(i)\x -64,player(i)\y -64)
Else
DisplaySprite3D(player(i)\bar,player(i)\x -64,player(i)\y -64,64)
EndIf
Next
Stop3D()
EndIf
If StartDrawing(ScreenOutput())
DrawingMode(#PB_2DDrawing_Transparent)
DrawingFont(FontID(0))
DrawText(10,0,"Level "+Str((ballv-1)*2),#White)
If looser >= 0
DrawingFont(FontID(1))
DrawText(50,100,"Player "+Str(looser)+" verliert!",player(looser)\color)
EndIf
StopDrawing()
EndIf
FlipBuffers()
ForEver

Fragen/Anregungen/Verbesserungsvorschläge und Lob sind natürlich gern gesehen
