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

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

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

Beitrag 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:
Zuletzt geändert von KeyKon am 18.06.2009 18:15, insgesamt 1-mal geändert.
(\/) (°,,,°) (\/)
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

Beitrag von Vermilion »

Bild

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

Immer die neueste PureBasic Version. Auf allem Betriebssystemen. Ich bin ein OS-Nomad!
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Beitrag 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 ^^)
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

wurde bestimmt mit der radial Engine gemacht :mrgreen:
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag 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...
(\/) (°,,,°) (\/)
Benutzeravatar
rolaf
Beiträge: 3843
Registriert: 10.03.2005 14:01

Beitrag 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.
:::: WIN 10 :: PB 5.73 :: (x64) ::::
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

Beitrag 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.
Bild

Immer die neueste PureBasic Version. Auf allem Betriebssystemen. Ich bin ein OS-Nomad!
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag 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...
(\/) (°,,,°) (\/)
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

Beitrag 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...
Bild

Immer die neueste PureBasic Version. Auf allem Betriebssystemen. Ich bin ein OS-Nomad!
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag 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:
(\/) (°,,,°) (\/)
Antworten