Pong - Ball
Re: Pong - Ball
Guten Abend
Ich brauche noch einmal eure Hilfe. Folgendes will ich realisieren:
Wenn die Leertaste gedrückt wird, soll sozusagen ein Menü erscheinen, wo man bspw. die
Geschwindigkeit erhöhen oder auch das Spiel beenden kann.
Ich hatte mir dazu gedacht, dass man erst die gesamten Daten (Position der Schläger und des Balls, etc.)
in Zwischenvariablen abspeichert. Dann werden die Ursprungsvariablen der Geschwindigkeiten = 0 gesetzt,
damit sich nichts mehr bewegt (die Position muss ja bleiben). Dann würde folglich das Menü erscheinen und dort
die Abfragen geschehen. Wenn das Spiel nun weitergehen soll, werden die Ursprungsvariablen wieder mit den
Daten der Zwischenvariablen gefüttert und das Spiel geht weiter.
Aber irgendwie glaube ich, dass zum einen die Methode nicht so effizient ist und zum anderen fällt es mir schwer,
das umzusetzen, weil ich kein 'goto' verwenden will um bei der Leertaste aus der Repeat-Schleife zu kommen, außerdem
fängt dann ja wieder eine neue an wegem dem Menü.
Vielen Dank schon einmal im Voraus für eure Hilfe!
Ich brauche noch einmal eure Hilfe. Folgendes will ich realisieren:
Wenn die Leertaste gedrückt wird, soll sozusagen ein Menü erscheinen, wo man bspw. die
Geschwindigkeit erhöhen oder auch das Spiel beenden kann.
Ich hatte mir dazu gedacht, dass man erst die gesamten Daten (Position der Schläger und des Balls, etc.)
in Zwischenvariablen abspeichert. Dann werden die Ursprungsvariablen der Geschwindigkeiten = 0 gesetzt,
damit sich nichts mehr bewegt (die Position muss ja bleiben). Dann würde folglich das Menü erscheinen und dort
die Abfragen geschehen. Wenn das Spiel nun weitergehen soll, werden die Ursprungsvariablen wieder mit den
Daten der Zwischenvariablen gefüttert und das Spiel geht weiter.
Aber irgendwie glaube ich, dass zum einen die Methode nicht so effizient ist und zum anderen fällt es mir schwer,
das umzusetzen, weil ich kein 'goto' verwenden will um bei der Leertaste aus der Repeat-Schleife zu kommen, außerdem
fängt dann ja wieder eine neue an wegem dem Menü.
Vielen Dank schon einmal im Voraus für eure Hilfe!
Vielen Dank für eure Hilfe!
Mit freundlichen Grüßen,
Shiv0r
Mit freundlichen Grüßen,
Shiv0r

-
- Beiträge: 148
- Registriert: 02.02.2010 18:22
- Computerausstattung: Win XP SP3, AMD Sempron (MMX) 1.2 GHz, 512 MB, Nvidia GeForce FX 5200, 128 MB, DirectX 9.0c
- Wohnort: Westerwald
Re: Pong - Ball
Ich habe dir mal ein Beispiel gemacht, hoffe du kommst klar damit.
Wenn das Programm gestartet ist, einfach Space drücken um ins Menue
zu kommen.
Wenn das Programm gestartet ist, einfach Space drücken um ins Menue
zu kommen.
Code: Alles auswählen
EnableExplicit
;**************************************************************************************************************************
; Konstanten declarieren
;**************************************************************************************************************************
#ScreenWidth = 1024
#ScreenHeigth = 768
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitSprite3D() = 0 Or InitSound() = 0 Or InitMouse() = 0
MessageRequester( "Error", "Can't open DirectX 7 or later", 0 )
End
EndIf
If OpenScreen( #ScreenWidth, #ScreenHeigth, 32, "Test3D", 0, 60 ) = 0
MessageRequester( "Error", "Can't open Screen", 0 )
End
EndIf
SetFrameRate( 60 )
Define Ball.l = 1
Define BallX.f = 512
Define BallY.f = 384
Define BallSpeed.l = 1
Define Picture.l
Ball = CreateSprite( #PB_Any, 32, 32 )
; Einen Ball zum Spielen erstellen
StartDrawing( SpriteOutput( Ball ) )
Circle( 16, 16, 5 , RGB( 0,255,0 ) )
StopDrawing()
Procedure Menu()
Shared Picture, BallSpeed
Repeat
ClearScreen( 0 )
DisplaySprite( Picture, 0, 0 )
StartDrawing( ScreenOutput() )
DrawingMode( #PB_2DDrawing_Outlined )
Box( 400, 450, 230, 120, RGB( Random( 255 ), 0, 255 ) )
FrontColor( RGB( 255, 255, 255 ) )
DrawText( 460, 470, " BallSpeed : " + Str(BallSpeed ) )
DrawText( 410, 500, " erhöhen / erniedrigen = + oder - " )
DrawText( 440, 520, " Esc = zurück zum Spiel" )
StopDrawing()
FlipBuffers()
Delay( 1 )
ExamineKeyboard()
If KeyboardReleased( #PB_Key_Add )
BallSpeed + 1
EndIf
If KeyboardReleased( #PB_Key_Subtract )
BallSpeed - 1
EndIf
Until KeyboardReleased( #PB_Key_Escape )
EndProcedure
Repeat
ClearScreen( 0 )
DisplaySprite( Ball, BallX, BallY )
BallX + BallSpeed
If BallX > 1024
BallX = - 32
EndIf
FlipBuffers()
Delay( 1 )
ExamineKeyboard()
If KeyboardPushed( #PB_Key_Space )
; Picture ist sozusagen ein Foto vom aktuellen
; Bildschirm
Picture = GrabSprite( #PB_Any, 0, 0, 1024, 768 )
Menu()
EndIf
Until KeyboardPushed( #PB_Key_Escape )
End
Re: Pong - Ball
Guten Abend
Vielen Dank, Drago. Das Beispiel ist sehr anschaulich und hat mirsehr weitergeholfen!
Vielen Dank, Drago. Das Beispiel ist sehr anschaulich und hat mirsehr weitergeholfen!

Vielen Dank für eure Hilfe!
Mit freundlichen Grüßen,
Shiv0r
Mit freundlichen Grüßen,
Shiv0r

Re: Pong - Ball
Hallo
Mein kleiner Pong-Klon ist jetzt fast fertig, aber ich brauche noch einmal eure Hilfe.
Ich will eine Highscore-Liste erstellen, bisher sieht es so aus am Anfang aus:
Damit will ich bezwecken, dass erst einmal geschaut wird, ob die Highscore-Liste existiert.
Falls nicht, soll sie erstellt werden und die ersten Zeilen eingeschrieben werden. Dann schließen und speichern.
Das funktioniert auch.
Darauf wird der Screen geöffnet und die Main-Loop beginnt.
Bei Escape wird das Programm beendet, also soll die Highscore-Liste geöffnet werden, zum Ende springen und die Punkte eintrage,
dann wieder schließen und speichern.
Aber dieser Teil funktioniert irgendwie nicht. Ich habe auch schon probiert, ob es vielleicht an dem Escape liegt, wg.
und es mal für die Taste S gemacht, aber das hat nichts geändert.
Achso, gibt es eine andere Möglichkeit das Programm z.B. für 3 Sekunden anzuhalten statt mit Delay() ? Ich würde gerne, falls
ein Punkt gemacht wurde, einen Counter für 3 Sekunden einbauen und den dann mit einem Text runterzählen lassen, aber ich
habe es leider nicht hinbekommen.
PS: Sorry für Doppelpost.
Mein kleiner Pong-Klon ist jetzt fast fertig, aber ich brauche noch einmal eure Hilfe.

Ich will eine Highscore-Liste erstellen, bisher sieht es so aus am Anfang aus:
Code: Alles auswählen
If ReadFile(#Highscore_List, "Highscore.txt") = 0
If CreateFile(#Highscore_List, "Highscore.txt")
For a=1 To 2
WriteStringN(#Highscore_List, "********************************************************************")
Next
WriteStringN(#Highscore_List, "***************************HIGHSCORE-LISTE**************************")
For a=1 To 2
WriteStringN(#Highscore_List, "********************************************************************")
Next
CloseFile(#Highscore_List)
Else
MessageRequester("Fehler","Highscore-Liste konnte nicht erstellt werden")
EndIf
EndIf
Falls nicht, soll sie erstellt werden und die ersten Zeilen eingeschrieben werden. Dann schließen und speichern.
Das funktioniert auch.
Darauf wird der Screen geöffnet und die Main-Loop beginnt.
Code: Alles auswählen
Repeat
[...]
FlipBuffers()
Delay(1)
ClearScreen(RGB(100, 20, 0))
If KeyboardPushed(#PB_Key_Escape)
If OpenFile(#Highscore_List, "Highscore.txt") = 1
FileSeek(#Highscore_List, Lof(#Highscore_List))
WriteStringN(#Highscore_List, "SPIELER:" +Str(PunkteSpieler))
WriteStringN(#Highscore_List, "GEGNER:" +Str(PunkteGegner))
CloseFile(#Highscore_List)
EndIf
EndIf
Until KeyboardPushed(#PB_Key_Escape)
dann wieder schließen und speichern.
Aber dieser Teil funktioniert irgendwie nicht. Ich habe auch schon probiert, ob es vielleicht an dem Escape liegt, wg.
Code: Alles auswählen
Until KeyboardPushed(#PB_Key_Escape)
Achso, gibt es eine andere Möglichkeit das Programm z.B. für 3 Sekunden anzuhalten statt mit Delay() ? Ich würde gerne, falls
ein Punkt gemacht wurde, einen Counter für 3 Sekunden einbauen und den dann mit einem Text runterzählen lassen, aber ich
habe es leider nicht hinbekommen.
PS: Sorry für Doppelpost.
Vielen Dank für eure Hilfe!
Mit freundlichen Grüßen,
Shiv0r
Mit freundlichen Grüßen,
Shiv0r

- The_Dark_Zim-.-
- Beiträge: 372
- Registriert: 18.03.2008 16:53
Re: Pong - Ball
Hey,
jetzt nicht wirklich was für dein Problem, aber ist es nicht klüger die Schleifen in deiner Highscoreerstellung weg zu lassen ?
Immerhin ist es ohne Schleifen kürzer :P
Ich glaub das hier ist nicht sooo schlecht zum warten "ohne" Delay()
Gruß Zim
jetzt nicht wirklich was für dein Problem, aber ist es nicht klüger die Schleifen in deiner Highscoreerstellung weg zu lassen ?
Code: Alles auswählen
If ReadFile(#Highscore_List, "Highscore.txt") = 0
If CreateFile(#Highscore_List, "Highscore.txt")
WriteStringN(#Highscore_List, "********************************************************************")
WriteStringN(#Highscore_List, "********************************************************************")
WriteStringN(#Highscore_List, "***************************HIGHSCORE-LISTE**************************")
WriteStringN(#Highscore_List, "********************************************************************")
WriteStringN(#Highscore_List, "********************************************************************")
CloseFile(#Highscore_List)
Else
MessageRequester("Fehler","Highscore-Liste konnte nicht erstellt werden")
EndIf
EndIf
Ich glaub das hier ist nicht sooo schlecht zum warten "ohne" Delay()
Code: Alles auswählen
Procedure Wait(Waittime.l)
While Time < Waittime +1
If FormatDate("%ss", Date()) <> LastTime$
Time+1
LastTime$ = FormatDate("%ss", Date())
EndIf
Wend
Delay(1)
EndProcedure
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Re: Pong - Ball
Hallo
Liegt es vielleicht daran, dass man nicht die if-Schleife verwenden darf?
Ja stimmt, ich habe es mal geändert.The_Dark_Zim-.- hat geschrieben:Hey,
jetzt nicht wirklich was für dein Problem, aber ist es nicht klüger die Schleifen in deiner Highscoreerstellung weg zu lassen ?
Immerhin ist es ohne Schleifen kürzer :PCode: Alles auswählen
If ReadFile(#Highscore_List, "Highscore.txt") = 0 If CreateFile(#Highscore_List, "Highscore.txt") WriteStringN(#Highscore_List, "********************************************************************") WriteStringN(#Highscore_List, "********************************************************************") WriteStringN(#Highscore_List, "***************************HIGHSCORE-LISTE**************************") WriteStringN(#Highscore_List, "********************************************************************") WriteStringN(#Highscore_List, "********************************************************************") CloseFile(#Highscore_List) Else MessageRequester("Fehler","Highscore-Liste konnte nicht erstellt werden") EndIf EndIf
Ich habe diese Prozedur mal eingebaut, die Wartezeit funktioniert, aber irgendwie zeichnet er den Text nicht:Ich glaub das hier ist nicht sooo schlecht zum warten "ohne" Delay()
Gruß ZimCode: Alles auswählen
Procedure Wait(Waittime.l) While Time < Waittime +1 If FormatDate("%ss", Date()) <> LastTime$ Time+1 LastTime$ = FormatDate("%ss", Date()) EndIf Wend Delay(1) EndProcedure
Code: Alles auswählen
; Kollision mit linken Rand (Punkt für Gegner)
If ball.Player\PlayerX <= 0
PlaySound(#Sound_Explosion)
PunkteGegner = PunkteGegner + 1
ball.Player\playerX = 0
If Wait(1)
StartDrawing(ScreenOutput())
DrawText(#ScreenWidth / 2 - 100, 400, "3", #Red, RGB(255,255,255))
StopDrawing()
EndIf
If Wait(1)
StartDrawing(ScreenOutput())
DrawText(#ScreenWidth / 2 - 100, 400, "2", #Red, RGB(255,255,255))
StopDrawing()
EndIf
If Wait(1)
StartDrawing(ScreenOutput())
DrawText(#ScreenWidth / 2 - 100, 400, "1", #Red, RGB(255,255,255))
StopDrawing()
EndIf
; Ball resetten
ball.Player\playerX = #Screenwidth / 2
ball.Player\playerY = Random(#ScreenHeight - 150)
EndIf
Vielen Dank für eure Hilfe!
Mit freundlichen Grüßen,
Shiv0r
Mit freundlichen Grüßen,
Shiv0r

Re: Pong - Ball
http://www.if-schleife.de/Shiv0r hat geschrieben:Liegt es vielleicht daran, dass man nicht die if-Schleife verwenden darf?
a²+b²=mc²
Re: Pong - Ball
Wow, das nenne ich mal Sendungsbewußtsein.Kiffi hat geschrieben:http://www.if-schleife.de/
Extra ne Domain zu mieten um darüber aufzuklären.

:::: WIN 10 :: PB 5.73 :: (x64) ::::
Re: Pong - Ball
Solche Seiten sind zwar wirklich sinnfrei, aber scheinbar machen viele User solche Fehler.rolaf hat geschrieben:Wow, das nenne ich mal Sendungsbewußtsein.Kiffi hat geschrieben:http://www.if-schleife.de/
Extra ne Domain zu mieten um darüber aufzuklären.
Genauso wie mit der deutschen Rechtschreibung:
http://www.das-dass.de
http://www.seit-seid.de
[...]
- The_Dark_Zim-.-
- Beiträge: 372
- Registriert: 18.03.2008 16:53
Re: Pong - Ball
Code: Alles auswählen
InitSprite()
InitKeyboard()
ExamineDesktops()
Global Width = DesktopWidth(0)
Global Height = DesktopHeight(0)
OpenScreen(Width,Height,DesktopDepth(0),"Pong")
SetFrameRate(50)
Global PlayerY = (Height/2)-30
Global PlayerX = 40
Global BallSpeedX = Random(4)+5
Global BallSpeedY = Random(4)+5
Global BallX = (width/2)-5
Global BallY = 25 + Random(Height-45)
Global Collision$ = "False"
Global Lives = 3
If Random(1) = 0
BallSpeedX * -1
EndIf
If Random(1) = 0
BallSpeedY * -1
EndIf
Procedure Restart()
BallSpeedX = Random(4)+1
BallSpeedY = Random(4)+1
BallX = (width/2)-5
BallY = 25 + Random(Height-45)
EndProcedure
Procedure PlayerLives()
Lives -1
If Lives = 0
Repeat
ClearScreen(RGB(0,0,0))
StartDrawing(ScreenOutput())
DrawText((Width/2),(Height/2)-5,"GAME OVER",RGB(0,255,0))
StopDrawing()
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Escape)
End
ElseIf KeyboardPushed(#PB_Key_R)
Ende$ = "True"
Lives = 3
PlayerY = (Height/2)-30
Restart()
EndIf
FlipBuffers()
Until Ende$ = "True"
Else
Waittime = 3
LastTime = 1
StartZeit = ElapsedMilliseconds()
While (ElapsedMilliseconds()-StartZeit)/1000 < Waittime
If Time <> LastTime
CreateImage(2,10,15)
StartDrawing(ImageOutput(2))
DrawText(0,0,Str(Int(WaitTime) - Int(Time)),RGB(0,255,0))
StopDrawing()
StartDrawing(ScreenOutput())
DrawImage(ImageID(2), (Width/2)-((10*20)/2),(Height/2)-((15*20)/2), 10*20, 15*20)
StopDrawing()
FlipBuffers()
LastTime = Time
EndIf
Time = (ElapsedMilliseconds()-StartZeit)/1000
Delay(1)
Wend
Time = 0
EndIf
EndProcedure
Procedure BallCollision()
BallX+BallSpeedX
BallY+BallSpeedY
If BallY-8 <= 21 Or BallY+8 => Height - 21
BallSpeedY *-1
EndIf
If BallX+8 => Width - 21
BallSpeedX *-1
EndIf
If BallX < 21
PlayerLives()
Restart()
EndIf
If BallX-8 > PlayerX And BallX-8 < PlayerX+20 And BallY-8 > PlayerY And BallY-8 < PlayerY+60
If Collision$ = "False"
BallSpeedX *-1
Collision$ = "True"
EndIf
Else
Collision$ = "False"
EndIf
EndProcedure
Procedure BackGroundImage()
StartDrawing(ImageOutput(0))
Box(0, 0, Width, 20, RGB(255,255,255))
Box(0, 0, 20, Height, RGB(255,255,255))
Box(0, Height-20, Width, 20, RGB(255,255,255))
Box(Width-20, 0, 20, Height, RGB(255,255,255))
For i = 0 To 10
Box((width/2)-10, 20+((Height/10)*i), 20, 40, RGB(255,255,255))
Next
StopDrawing()
EndProcedure
CreateImage(0,Width,Height)
BackGroundImage()
Repeat
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Down)
If PlayerY < Height-80
PlayerY + 5
EndIf
ElseIf KeyboardPushed(#PB_Key_Up)
If PlayerY > 20
PlayerY -5
EndIf
EndIf
If KeyboardPushed(#PB_Key_R)
Lives = 3
PlayerY = (Height/2)-30
Restart()
EndIf
BallCollision()
StartDrawing(ScreenOutput())
;####### Background
DrawImage(ImageID(0),0,0)
;#######
;####### Player
Box(PlayerX,PlayerY,20,60,RGB(255,0,0))
;#######
;####### Ball
Circle(BallX,BallY,10,RGB(0,0,255))
;#######
;####### Text
DrawText(20,0,"Player Lives: " + Str(Lives) + " | Press 'R' for Restart",RGB(0,0,0),RGB(255,255,255))
;#######
StopDrawing()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
Gruß Zim
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64