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
- 
				Drago
 - 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  
EndIfFalls 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
						
