Pong Clock
Übersicht

![]() |
IguanBetreff: Pong Clock |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo
Ich habe spasseshalber eine Pong Uhr programmiert. Bei jedem Minutenwechsel verliert ein Spieler, sodass die aktuelle Punktzahl immer die Uhrzeit darstellt. (Später werde ich einen alten Laptop ausschlachten und das Display für die Uhr an einer Wand aufhängen ^^ etwa so: http://www.youtube.com/watch?v=3uQHWsUby04) Eigentlich funktioniert alles so weit so gut, nur passiert es manchmal, dass ein Spieler den Ball verfehlt, owohl noch kein Minutenwechsel stattgefunden hat. Leider hab ich trotz stundenlangem beobachten nicht herausgefunden wieso und wann das passiert. Deshalb, dachte ich, ich wende mich mal an euch profis.. habt ihr tipps, Ratschläge o.ä? mfg Iguan Hier noch der code: Code: [AUSKLAPPEN] Graphics 640,480,0,1 Dim Ziffer1$(10) Dim Ziffer2$(10) Dim Ziffer3$(10) Dim Ziffer4$(10) Dim Ziffer5$(10) ZeichenGroesse = 10 PaddleLinksY# = 160 PaddleLinksLaenge = 50 PaddleRechtsY# = 160 PaddleRechtsLaenge = 50 PaddleGeschwLinks# = 11 PaddleGeschwRechts# = 11 BallX# = 310 BallY# = 235 Winkel# = 20 Geschw# = 10 SpeedX# = Cos(Winkel#) * Geschw# SpeedY# = Sin(Winkel#) * Geschw# MaxGeschw# = 12 MaxGeschwBall# = 13 ; Aussehen der Ziffern definieren Ziffer1$(0) = "XXX" Ziffer2$(0) = "X X" Ziffer3$(0) = "X X" Ziffer4$(0) = "X X" Ziffer5$(0) = "XXX" Ziffer1$(1) = "XX " Ziffer2$(1) = " X " Ziffer3$(1) = " X " Ziffer4$(1) = " X " Ziffer5$(1) = "XXX" Ziffer1$(2) = "XXX" Ziffer2$(2) = " X" Ziffer3$(2) = "XXX" Ziffer4$(2) = "X " Ziffer5$(2) = "XXX" Ziffer1$(3) = "XXX" Ziffer2$(3) = " X" Ziffer3$(3) = "XXX" Ziffer4$(3) = " X" Ziffer5$(3) = "XXX" Ziffer1$(4) = "X X" Ziffer2$(4) = "X X" Ziffer3$(4) = "XXX" Ziffer4$(4) = " X" Ziffer5$(4) = " X" Ziffer1$(5) = "XXX" Ziffer2$(5) = "X " Ziffer3$(5) = "XXX" Ziffer4$(5) = " X" Ziffer5$(5) = "XXX" Ziffer1$(6) = "XXX" Ziffer2$(6) = "X " Ziffer3$(6) = "XXX" Ziffer4$(6) = "X X" Ziffer5$(6) = "XXX" Ziffer1$(7) = "XXX" Ziffer2$(7) = " X" Ziffer3$(7) = " X" Ziffer4$(7) = " X" Ziffer5$(7) = " X" Ziffer1$(8) = "XXX" Ziffer2$(8) = "X X" Ziffer3$(8) = "XXX" Ziffer4$(8) = "X X" Ziffer5$(8) = "XXX" Ziffer1$(9) = "XXX" Ziffer2$(9) = "X X" Ziffer3$(9) = "XXX" Ziffer4$(9) = " X" Ziffer5$(9) = "XXX" Time$ = CurrentTime() StundenPunkte = Int(Mid$(Time$,1,2)) MinutenPunkte = Int(Mid$(Time$,4,2)) SetBuffer BackBuffer() Repeat Cls ;Spielfeld zeichnen Color 255,255,255 For i = 0 To 640 Step 10 Rect i,15,10,5 Rect i,460,10,5 Next For i = 15 To 460 Step 20 Rect 312,i,7,10 Next Ziffer = 5 StundenPunkteTemp = Int(Mid$(CurrentTime(),1,2)) MinutenPunkteTemp = Int(Mid$(CurrentTime(),4,2)) ; Bestimmen, welcher Spieler verlieren muss, da Punktzahl von der aktuellen Zeit abweicht PlayerXMussVerlieren = 0 If MinutenPunkteTemp <> MinutenPunkte Then PlayerXMussVerlieren = 1 If StundenPunkteTemp <> StundenPunkte Then PlayerXMussVerlieren = 2 Stunden$ = RSet$(Str$(StundenPunkte),2);Mid$(Time$,1,2) Minuten$ = RSet$(Str$(MinutenPunkte),2);Mid$(Time$,4,2) ZifferX = 250 ZifferY = 20 ;Punktzahl (Zeit) anzeigen For ii = 1 To 2 For iy = 1 To 5 For ix = 1 To 3 ;Stunden Anzeige NullNichtAnzeigen = 0 If ii = 1 Then ZifferX = 210 Ziffer = Int(Mid$(Stunden$,1,1)) If Ziffer = 0 Then NullNichtAnzeigen = 1 Else ZifferX = 250 Ziffer = Int(Mid$(Stunden$,2,1)) EndIf If NullNichtAnzeigen = 0 Then If iy = 1 And Mid$(Ziffer1$(Ziffer),ix,1) = "X" Then Rect ZifferX+ ix * ZeichenGroesse, ZifferY + iy * ZeichenGroesse, ZeichenGroesse, ZeichenGroesse If iy = 2 And Mid$(Ziffer2$(Ziffer),ix,1) = "X" Then Rect ZifferX+ ix * ZeichenGroesse, ZifferY + iy * ZeichenGroesse, ZeichenGroesse, ZeichenGroesse If iy = 3 And Mid$(Ziffer3$(Ziffer),ix,1) = "X" Then Rect ZifferX+ ix * ZeichenGroesse, ZifferY + iy * ZeichenGroesse, ZeichenGroesse, ZeichenGroesse If iy = 4 And Mid$(Ziffer4$(Ziffer),ix,1) = "X" Then Rect ZifferX+ ix * ZeichenGroesse, ZifferY + iy * ZeichenGroesse, ZeichenGroesse, ZeichenGroesse If iy = 5 And Mid$(Ziffer5$(Ziffer),ix,1) = "X" Then Rect ZifferX+ ix * ZeichenGroesse, ZifferY + iy * ZeichenGroesse, ZeichenGroesse, ZeichenGroesse EndIf ;Minuten Anzeige NullNichtAnzeigen = 0 If ii = 1 Then ZifferX = 330 Ziffer = Int(Mid$(Minuten$,1,1)) If Ziffer = 0 Then NullNichtAnzeigen = 1 Else ZifferX = 370 Ziffer = Int(Mid$(Minuten$,2,1)) EndIf If NullNichtAnzeigen = 0 Then If iy = 1 And Mid$(Ziffer1$(Ziffer),ix,1) = "X" Then Rect ZifferX+ ix * ZeichenGroesse, ZifferY + iy * ZeichenGroesse, ZeichenGroesse, ZeichenGroesse If iy = 2 And Mid$(Ziffer2$(Ziffer),ix,1) = "X" Then Rect ZifferX+ ix * ZeichenGroesse, ZifferY + iy * ZeichenGroesse, ZeichenGroesse, ZeichenGroesse If iy = 3 And Mid$(Ziffer3$(Ziffer),ix,1) = "X" Then Rect ZifferX+ ix * ZeichenGroesse, ZifferY + iy * ZeichenGroesse, ZeichenGroesse, ZeichenGroesse If iy = 4 And Mid$(Ziffer4$(Ziffer),ix,1) = "X" Then Rect ZifferX+ ix * ZeichenGroesse, ZifferY + iy * ZeichenGroesse, ZeichenGroesse, ZeichenGroesse If iy = 5 And Mid$(Ziffer5$(Ziffer),ix,1) = "X" Then Rect ZifferX+ ix * ZeichenGroesse, ZifferY + iy * ZeichenGroesse, ZeichenGroesse, ZeichenGroesse EndIf Next Next Next Rect 13, PaddleLinksY,7,PaddleLinksLaenge Rect 610, PaddleRechtsY,7,PaddleRechtsLaenge BallXalt# = BallX# BallYalt# = BallY# ;Ball bewegen If NeuesSpiel = 0 Then BallX# = BallX# + SpeedX# BallY# = BallY# + SpeedY# EndIf Rect BallX#,BallY#, 7,7 If BallY# > 450 Or BallY# < 20 Then SpeedY# = SpeedY# * -1 : BallX# = BallXalt#: BallY# = BallYalt# ;Abprall des Balls von einem Paddle If RectsOverlap(5,PaddleLinksY,15,PaddleLinksLaenge,BallX#,BallY#,7,7) Or RectsOverlap(610,PaddleRechtsY,15,PaddleRechtsLaenge,BallX#,BallY#,7,7) And Verzoegerung > 30 Then SeedRnd(MilliSecs()) ;If SpeedX# < 0 Then SchnittpunktLinksY# = 220 Else SchnittpunktRechtsY# = 220 ;If SpeedX# < 0 Then SpeedX# = SpeedX# * -1 SpeedX# = SpeedX# + Rnd(-10,10)/5 SpeedY# = SpeedY# + Rnd(-10,10)/5 If SpeedX# > MaxGeschwBall# Then SpeedX# = MaxGeschwBall# If SpeedX# < -MaxGeschwBall# Then SpeedX# = -MaxGeschwBall# If SpeedY# > MaxGeschwBall# Then SpeedY# = MaxGeschwBall# If SpeedY# < -MaxGeschwBall# Then SpeedY# = -MaxGeschwBall# If SpeedX# < 4 And SpeedX# > 0 Then SpeedX# = SpeedX# + Rnd(8,MaxGeschwBall#) EndIf If SpeedX# > -4 And SpeedX# < 0 Then SpeedX# = SpeedX# - Rnd(8,MaxGeschwBall#) EndIf BallX# = BallXalt# BallY# = BallYalt# Verzoegerung = 0 Else Verzoegerung = Verzoegerung + 1 EndIf ; Spieler links hat einen Punkt gemacht If BallX# > 650 Then ;StundenPunkte = StundenPunkte + 1 Time$ = CurrentTime() StundenPunkteAlt = StundenPunkte MinutenPunkteAlt = MinutenPunkte StundenPunkte = Int(Mid$(Time$,1,2)) MinutenPunkte = Int(Mid$(Time$,4,2)) If StundenPunkte = StundenPunkteAlt And MinutenPunkte = MinutenPunkteAlt Then Fehler = Fehler + 1 BallX# = 310 BallY# = 235 SeedRnd(MilliSecs()) Winkel# = Rnd(135,225) Geschw# = Rnd(9,13) SpeedX# = Cos(Winkel#) * Geschw# SpeedY# = Sin(Winkel#) * Geschw# PaddleLinksY# = 240 - PaddleLinksLaenge / 2 PaddleRechtsY# = 240 - PaddleRechtsLaenge / 2 Delay 1000 NeuesSpiel = 1 EndIf ; Spieler rechts hat einen Punkt gemacht If BallX# < -20 Then ;MinutenPunkte = MinutenPunkte + 1 Time$ = CurrentTime() StundenPunkteAlt = StundenPunkte MinutenPunkteAlt = MinutenPunkte StundenPunkte = Int(Mid$(Time$,1,2)) MinutenPunkte = Int(Mid$(Time$,4,2)) If StundenPunkte = StundenPunkteAlt And MinutenPunkte = MinutenPunkteAlt Then Fehler = Fehler + 1 BallX# = 310 BallY# = 235 SeedRnd(MilliSecs()) Winkel# = Rnd(-45,45) Geschw# = Rnd(9,13) SpeedX# = Cos(Winkel#) * Geschw# SpeedY# = Sin(Winkel#) * Geschw# PaddleLinksY# = 240 - PaddleLinksLaenge / 2 PaddleRechtsY# = 240 - PaddleRechtsLaenge / 2 Delay 1000 NeuesSpiel = 1 EndIf Color 255,0,0 ;Aktuelle Variablen an Berechnung übergeben Bsx# = SpeedX# Bsy# = SpeedY# Bx# = BallX# By# = BallY# ;Text 100,100, a# ;Text 100,120, Bx# ;Text 100,140, By# ;Text 100,160, Bsx# Text 5,20, CurrentTime() Text 5,5, "Fehler: " + Fehler ;Berechnen wo Paddle hin muss i = 0 Repeat i = i + 1 Color 255,0,0 ; a# = Steigung ; b# = Y-Achsenabschnitt a#= Bsy# / Bsx# b# = By#-(a#*(Bx#)) ;Oval 0,b#,2,2 SchnittpunktXalt# = SchnittpunktX# SchnittpunktYalt# = By# If Bsy# < 0 Then SchnittpunktX# = (20-b#)/ a# ;Oval SchnittpunktX# -4,16,8,8 Bx# = SchnittpunktX# By# = 20 Bsy# = Bsy# *-1 Else SchnittpunktX# = (450-b#)/ a# ;Oval SchnittpunktX# -4,446,8,8 Bx# = SchnittpunktX# By# = 450 Bsy# = Bsy# *-1 EndIf Color 0,255,0 If SchnittpunktX# <= 25 Then SchnittpunktLinksY# = a# * 30 + b# a#= Bsy# / Bsx# b# = By#-(a#*(Bx#)) ;Oval 26,SchnittpunktLinksY# -4,8,8 By# = SchnittpunktLinksY# Bx# = 30 Bsx# = Bsx# *-1 ;Text 100,160, SchnittpunktLinksY# ;Line SchnittpunktXalt#, SchnittpunktYalt#,By#,By# EndIf Color 0,255,0 If SchnittpunktX# >= 605 Then SchnittpunktRechtsY# = a# * 610 + b# a#= Bsy# / Bsx# b# = By#-(a#*(Bx#)) By# = SchnittpunktRechtsY# ;SchnittpunktRechtsY# = SchnittpunktRechtsY# + Rnd(-(PaddleRechtsLaenge/2) + 5,(PaddleRechtsLaenge/2)-5) ;Oval 606,SchnittpunktRechtsY# -4,8,8 Bx# = 610 Bsx# = Bsx# *-1 ;Text 100,160, SchnittpunktRechtsY# EndIf ;EndIf ;Line SchnittpunktXalt#, SchnittpunktYalt#,SchnittpunktX#,By# ;Sx# = (460-BallY#+5)/ a# ;Oval Sx#-4,460,8,8 Until KeyDown(1) Or SchnittpunktX# < 20 Or SchnittpunktX# > 610 Or i > 30 ;Zufällige bewegungen, damit alles etwas interessanter aussieht If SpeedX# > 0 And d > 35 Then SchnittpunktLinksY# = PaddleLinksY# + Rnd(-230,230): d = 0 d = d + 1 If SpeedX# < 0 And e > 35 Then SchnittpunktRechtsY# = PaddleRechtsY# + Rnd(-230,230): e = 0 e = e + 1 Color 255,255,255 VerlierenVersatzLinks = 0 VerlierenVersatzRechts = 0 ; Spieler links weicht dem Ball aus, damit Spieler rechts den Punkt macht und somit die Uhrzeit wieder stimmt If PlayerXMussVerlieren = 1 And SpeedX# < 0 Then If SchnittpunktLinksY# < 240 Then VerlierenVersatzLinks = PaddleLinksLaenge * 1.5 Else VerlierenVersatzLinks = -PaddleLinksLaenge * 1.5 EndIf EndIf ; Spieler rechts weicht dem Ball aus, damit Spieler links den Punkt macht und somit die Uhrzeit wieder stimmt If PlayerXMussVerlieren = 2 And SpeedX# > 0 Then If SchnittpunktRechtsY# <= 240 Then VerlierenVersatzRechts = PaddleRechtsLaenge * 1.5 Else VerlierenVersatzRechts = -PaddleRechtsLaenge * 1.5 EndIf EndIf ; Weiche Bewegungen der Paddles DeltayLinks# = PaddleLinksY# + (PaddleLinksLaenge/2) - SchnittpunktLinksY# + VerlierenVersatzLinks DeltayRechts# = PaddleRechtsY# + (PaddleRechtsLaenge/2) - SchnittpunktRechtsY# + VerlierenVersatzRechts If SpeedX# < 0 Then PaddleGeschwLinks# = Abs(DeltayLinks# / 10) Else PaddleGeschwLinks# = Abs(DeltayLinks# / 10) / 2 If SpeedX# > 0 Then PaddleGeschwRechts# = Abs(DeltayRechts# / 10) Else PaddleGeschwRechts# = Abs(DeltayRechts# / 10) / 2 If PaddleGeschwLinks# > MaxGeschw# Then PaddleGeschwLinks# = MaxGeschw# If PaddleGeschwRechts# > MaxGeschw# Then PaddleGeschwRechts# = MaxGeschw# If SchnittpunktLinksY# + VerlierenVersatzLinks < PaddleLinksY# + (PaddleLinksLaenge/2) And (SchnittpunktLinksY# + VerlierenVersatzLinks > 20 And SchnittpunktLinksY# + VerlierenVersatzLinks < 450) Then PaddleLinksY# = PaddleLinksY# - PaddleGeschwLinks# If SchnittpunktLinksY# + VerlierenVersatzLinks > PaddleLinksY# + (PaddleLinksLaenge/2) And (SchnittpunktLinksY# + VerlierenVersatzLinks > 20 And SchnittpunktLinksY# + VerlierenVersatzLinks < 450) Then PaddleLinksY# = PaddleLinksY# + PaddleGeschwLinks# If SchnittpunktRechtsY# + VerlierenVersatzRechts < PaddleRechtsY# + (PaddleRechtsLaenge/2) And (SchnittpunktRechtsY# + VerlierenVersatzRechts > 20 And SchnittpunktRechtsY# + VerlierenVersatzRechts < 450) Then PaddleRechtsY# = PaddleRechtsY# - PaddleGeschwRechts# If SchnittpunktRechtsY# + VerlierenVersatzRechts > PaddleRechtsY# + (PaddleRechtsLaenge/2) And (SchnittpunktRechtsY# + VerlierenVersatzRechts > 20 And SchnittpunktRechtsY# + VerlierenVersatzRechts < 450) Then PaddleRechtsY# = PaddleRechtsY# + PaddleGeschwRechts# If PaddleLinksY# + PaddleLinksLaenge > 460 Then PaddleLinksY# = 460 - PaddleLinksLaenge If PaddleLinksY# < 20 Then PaddleLinksY# = 20 If PaddleRechtsY# + PaddleRechtsLaenge > 460 Then PaddleRechtsY# = 460 - PaddleRechtsLaenge If PaddleRechtsY# < 20 Then PaddleRechtsY# = 20 Flip If NeuesSpiel > 0 Then NeuesSpiel = NeuesSpiel + 1 If NeuesSpiel >= 3 Then NeuesSpiel = 0: Delay 1000 Until KeyDown(1) |
||
![]() |
hazumu-kun |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nice!
Einfach nur Nice! Zu deinem Problem kann ich leider nihcts beitragen, aber das ist doch mal was cooles. |
||
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann -> nicht omnipotent |
![]() |
Goodjee |
![]() Antworten mit Zitat ![]() |
---|---|---|
sobald du merkst das der ball unerwüünscht nebn das paddel geht kannst du doch das paddel ohne "weiche bewegung" zur richtigen position beamen? | ||
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/ |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Vielleicht findest du was passendes beim BCC 29, (bzw. bei der Abstimmung). | ||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Iguan |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke für eure Antworten! Leider stehe ich wohl immer noch vor dem selben problem.. ![]() |
||
![]() |
Goodjee |
![]() Antworten mit Zitat ![]() |
---|---|---|
dann musst du wohl den exakten einfallspunkt berechnen mit reflektionen usw und dann das paddle halt schneller bewegen wenn es mit der normalen geschwindigkeit nicht reichen wird | ||
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/ |
![]() |
Iguan |
![]() Antworten mit Zitat ![]() |
---|---|---|
An der Geschwindigkeit des Paddles liegts sicher nicht, da während das Paddle den Ball verfehlt, bleibt es nähmlich an Ort und Stelle stehen ;-(
(und den exakten Einfallspunkt wird ja bereits berechnet...) |
||
![]() |
PlasmaBetreff: hmm |
![]() Antworten mit Zitat ![]() |
---|---|---|
idee gefällt mir ![]() |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wie wärs wenn du den Ball einfach abprallen lässt, ganz unabhängig der Padstellung, so lange der Ball noch nicht durchgelassen werden soll?
Und es sieht sehr offensichtlich aus, wenn sich die Zeit ändert und das Pad dann im letzten Moment abzieht. Frag lieber nach Sekunden>57 ab und lass den Pad einfach stehen oder in eine andere Richtung laufen um so den Ball durch zu lassen. |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
ComNik |
![]() Antworten mit Zitat ![]() |
---|---|---|
Haha ![]() Geniale Idee. Richtig Klasse. lg ComNik |
||
WIP: Vorx.Engine |
Meik |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Beweg das Paddle zurück in die Mitte des Feldes wenn der Ball abgeprallt ist. So muss das Paddle nur die Hälfte des maximalen weges zurück legen und ist wahrscheinlicher schneller als der Ball am richtigen Platz.
Ich liebe meine komplizierten Erklärungen xD Hoffe sie wurde verstanden ^^ MFG Meik |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group