Seite 1 von 2

Round Pong (Wem Quadratisch zu langweilig/einfach is^^)

Verfasst: 16.06.2009 22:07
von KeyKon
Angeregt aus einem anderen Thread hab ich mal was kleines geproggt was vll manchen Anfängern das Verständnis für Winkelrechnen näherbringt...
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:

Bild

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
Für Kommentare haben meine Nerven bisher leider nich gereicht :roll:

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

Verfasst: 16.06.2009 23:13
von Vermilion
Bild

Sieht nicht so gesund aus... :| An sich... tolle Sache. <)

Verfasst: 16.06.2009 23:19
von X360 Andy
Ab Level 80 ist das Spiel ja leider beendet ):
Sonst sehr geil :allright: vieleicht noch für den Anfang eine beliebige Richtig für den Ball auswählen (damit man nicht so wie ich einfach nichts machen muss ^^)

Verfasst: 16.06.2009 23:46
von ZeHa
wurde bestimmt mit der radial Engine gemacht :mrgreen:

Verfasst: 17.06.2009 00:10
von KeyKon
Vermilion hat geschrieben:Sieht nicht so gesund aus... :| An sich... tolle Sache. <)
Was fürne Graka hast du denn und mit welchem DX hast du kompiliert?
EDIT: Das Drawing auf Sprites im Texture Mode hat bei mir glaubich auch schonmal Fehler verursacht, probiers mal damit statt dem Code von z.114 - z.120:

Code: Alles auswählen

CreateSprite(0,128,128)
  If StartDrawing(SpriteOutput(0))
    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 = CopySprite(0,#PB_Any,#PB_Sprite_Texture)

X360 Andy hat geschrieben:Ab Level 80 ist das Spiel ja leider beendet ): >
Ja, hatte ich auch schon getestet^^
Anfangs hatte ichs so gemacht das der Winkel des Balls zufällig is, aber das erschien mir irgendwie Unfair für den ersten da der Ball wenn dann manchmal garnich erreichbar is, und wenn man nicht mit sich selbst spielt wird solch eine Situation (zwei parallele Schläger) auch eher selten auftreten, schließlich will man ja gewinnen und kann den anderen dann ziemlich leicht ausspielen...

ZeHa hat geschrieben:wurde bestimmt mit der radial Engine gemacht
:?: Hilf mir auf die Sprünge was du meinst...

Verfasst: 17.06.2009 07:50
von rolaf
X360 Andy hat geschrieben:Ab Level 80 ist das Spiel ja leider beendet ):
Sonst sehr geil :allright: vieleicht noch für den Anfang eine beliebige Richtig für den Ball auswählen (damit man nicht so wie ich einfach nichts machen muss ^^)
Jo, ab Level 50 gehts ab wie Schmidts Katze. :lol:
Nur warum verliert denn Player 1? Müsste eigendlich Unentschieden sein.

Verfasst: 17.06.2009 09:49
von Vermilion
@KeyKon: Ich habe eine Radeon HD4850 (mit der habe ich die letzten Tage aber ab und zu mal wieder Probleme, weil die GPU des öfteren zurückgesetzt werden muss, ist mal eine Zeit lang, dann wieder nicht, usw.). Kompiliert habe ich das mit dem Standard DirectX von PureBasic 4.31 auf 32-Bit Windows XP Professional Service Pack 3... Müsste doch 9 sein, oder? Nein, ich sehe gerade... Scheint ja wohl immer noch 7 zu sein, ich dachte das hat sich geändert. Egal, mit DirectX9 Subsystem funktioniert es einwandfrei.

Verfasst: 17.06.2009 21:46
von KeyKon
Vermilion hat geschrieben:... mit DirectX9 Subsystem funktioniert es einwandfrei.
Ja, sieht auch besser aus das Filtering, und wenn man will kann man AlphaKanal verwenden, ich finde DX9 sollte mal Standart werden (wird ja vll in 4.4)

Dann wirds Zeit für DX 11 Support^^, vorallem das GPU-Rechnen einfach integriert fände ich mal geil...

Verfasst: 17.06.2009 22:07
von Vermilion
GPU Rechnen integriert? Was ist damit gemeint? :?

Ich raste aus... Scheiß Grafikkarte... Jetzt habe ich mal zum Spaß mein Spiel mit DirectX9 Subsystem kompiliert, und dann kommt nach schon fast nach einer Sekunde VPU Recover, weil die GPU sich aufhängt. -_- Das tut sie in den letzten Wochen mehrmals täglich... Aber jetzt sogar "auf Befehl"... Bald habe ich raus, was es bestimmtes ist...

Verfasst: 17.06.2009 22:32
von KeyKon
Naja, in DX11 sind ist die GPU-Calc (Mir fällt der genaue name grad einfach nich ein^^) ja schon dabei, damit man nich mehr auf was Speziefisches wie CUDA oder Firedings (Wie auch immer das bei ATI heißt) zugreifen muss, außerdem will Microsoft wahrscheinlich auch OpenCL konkurrenz bieten...

Ich hoffe du weist jetz was ich mein, eben Massiv parallele Berechnungen auf GPU...

Zu deinen Problemen mit einer ATI-Karte sag ich jetz mal lieber nix :roll: