Seite 2 von 2

Re: Pong - Ball

Verfasst: 14.02.2012 22:10
von Shiv0r
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!

Re: Pong - Ball

Verfasst: 14.02.2012 23:57
von Drago
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.

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

Verfasst: 15.02.2012 19:35
von Shiv0r
Guten Abend

Vielen Dank, Drago. Das Beispiel ist sehr anschaulich und hat mirsehr weitergeholfen! :)

Re: Pong - Ball

Verfasst: 18.02.2012 14:58
von Shiv0r
Hallo

Mein kleiner Pong-Klon ist jetzt fast fertig, aber ich brauche noch einmal eure Hilfe. :oops:

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

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)
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.

Code: Alles auswählen

Until KeyboardPushed(#PB_Key_Escape)
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.

Re: Pong - Ball

Verfasst: 18.02.2012 16:05
von The_Dark_Zim-.-
Hey,

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
Immerhin ist es ohne Schleifen kürzer :P

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
Gruß Zim

Re: Pong - Ball

Verfasst: 18.02.2012 17:55
von Shiv0r
Hallo

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 ?

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
Immerhin ist es ohne Schleifen kürzer :P
Ja stimmt, ich habe es mal geändert.
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
Gruß Zim
Ich habe diese Prozedur mal eingebaut, die Wartezeit funktioniert, aber irgendwie zeichnet er den Text nicht:

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
  
Liegt es vielleicht daran, dass man nicht die if-Schleife verwenden darf?

Re: Pong - Ball

Verfasst: 18.02.2012 18:41
von Kiffi
Shiv0r hat geschrieben:Liegt es vielleicht daran, dass man nicht die if-Schleife verwenden darf?
http://www.if-schleife.de/

Re: Pong - Ball

Verfasst: 18.02.2012 20:53
von rolaf
Kiffi hat geschrieben:http://www.if-schleife.de/
Wow, das nenne ich mal Sendungsbewußtsein.
Extra ne Domain zu mieten um darüber aufzuklären. :lol:

Re: Pong - Ball

Verfasst: 18.02.2012 21:03
von RSBasic
rolaf hat geschrieben:
Kiffi hat geschrieben:http://www.if-schleife.de/
Wow, das nenne ich mal Sendungsbewußtsein.
Extra ne Domain zu mieten um darüber aufzuklären. :lol:
Solche Seiten sind zwar wirklich sinnfrei, aber scheinbar machen viele User solche Fehler.
Genauso wie mit der deutschen Rechtschreibung:
http://www.das-dass.de
http://www.seit-seid.de
[...]

Re: Pong - Ball

Verfasst: 18.02.2012 21:59
von The_Dark_Zim-.-

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)
Mit ElapsedMilliseconds() wirds genauer :P

Gruß Zim