Kleine Pause einfügen, aber wie?

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Desantes

Betreff: Kleine Pause einfügen, aber wie?

BeitragMo, Feb 16, 2004 11:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Also , ich habe mit hilfe von Ralliman nun endlich mein simples Pong Spiel inkl. Highscore liste ( Danke nochmal "Ralliman") fertiggestellt.
Nun habe ich aber bemerkt das es doch noch etwas gibt was ich gerne abändern möchte und zwar wird jedesmal wenn der ball ins aus geht sofort ein neuer ball losgeschleudert, ich hätte es gerne so das wenn der ball ins aus geht das prog ca.2-3 sec wartet und einen Text ausgibt wie z.B. " Neuer Ball etc." und dann erst der neue Ball losgeschickt wird.
Letzteres ist noch ,das ich wenn der Spieler mehr als 20 Punkte hat die Geschwindigkeit des Balls erhöht wird.
Kann man das irgendwie realisieren?
Ich hatte es schon mit dem Waittimer befehl probiert ,was aber leider nur fehler produzierte.

Wäre echt Spitze wenn mit jemand helfen könnte.

Quelletxt:
Code: [AUSKLAPPEN]

Graphics 640,480,16,2
SetBuffer BackBuffer()
SeedRnd MilliSecs()

Dim Punkte(11)
Dim Namen$(11)

Global fntArialI=LoadFont("Arial",20,False,True,False)   
Global Spielerpunkte
Global Computerpunkte
Global spielername$
;Global S%=Spielerpunkte

Global Hintergrund = LoadImage("Startbild.bmp") ;Zuweisen des Hintergrundbildes
Global Name=LoadImage ("Nameneingabe.bmp")
Global BAll = LoadImage("Ball.bmp") ; zuweisen der Bilder
Global Computer=LoadImage ("Schläger.bmp")
Global Spieler=LoadImage("Schläger.bmp")

Liste_laden() ; highscore einlesen
; highscore einlesen muss existieren sonst fehler
;wenn diese nicht existiert dann eimal laufen lassen ohne dieser Function als ein ; davor machen
Menü() ;Spiel starten

Function Spiel()
FlushKeys
Spielerpunkte = 0
Computerpunkte=0
AppTitle "Pong" ;Titel
; start positionen festlegen
Spieler_x=30 ;Variable und Position des Spielers
Spieler_y=400

Computer_x=600 ;Variable und position des Computers
Computer_y=420

SpeedX = Rand(4,8) ; Anfangsgeschwindigkeit
SpeedY = Rand(4,8)

BAll_x = Rand(10,600) ; Ball Position
BAll_y = Rand(10,400)

;Haupt Spielschleife
 
While Not KeyHit(1) ;Ende des Spieles durch drücken von ESC

If KeyDown (200) ;Schläger bewegung des Spielers
Spieler_y=Spieler_y-4
If Spieler_y<0 Then Spieler_y=0
EndIf

If KeyDown (208)
Spieler_y=Spieler_y+4
If Spieler_y>400 Then Spieler_y=400
EndIf

; Collison zwischen Schläger und Ball
If ImagesCollide(Spieler,Spieler_x,Spieler_y,0,BAll,Ball_x,Ball_y,0) Then SpeedX= SpeedX-(2*SpeedX)
If ImagesCollide(BAll,Ball_x,Ball_y,0,Computer,Computer_x,Computer_y,0) Then SpeedX= SpeedX-(2*SpeedX)

If BAll_x>600 Then Spielerpunkte=Spielerpunkte+10; Punktezähler des Players
If Ball_x<1 Then Computerpunkte=Computerpunkte+10 ; Punktezähler des Computer


If Computer_y>400 Then Computer_y=400 ; Bewegungsende des Computer
If Computer_y<0 Then Computer_y=0 ; Nicht über den Rand hinaus gehen


If Ball_y>Computer_y Then ;
If random = 1 Then Computer_y=Computer_y
Else Computer_y=Computer_y-Rand(2,10)
EndIf

If Ball_y<Computer_y Then
If random = 1 Then Computer_y = Computer_y
Else Computer_y=Computer_y+Rand(2,10)
EndIf

Cls
; Laden des Designs für den Ball
DrawImage Ball,Ball_x,Ball_y

;Collsion mit den Rändern oder dem BAll
If Ball_x<1 Or Ball_x>GraphicsWidth()-40 Then Ball_x=Rand(50,300) Ball_y=Rand(60,400) VelX=Rand(5,8) VelY=Rand(5,8)
If Ball_y<1 Or Ball_y>GraphicsHeight()-40 Then SpeedY =- SpeedY

;Modernisieren der Ball position
Ball_x = BAll_x + SpeedX
Ball_y = Ball_y + SpeedY

DrawImage Spieler,Spieler_x,Spieler_y ; Design des Spielers

DrawImage Computer,Computer_x,Computer_y ; Design des Computer

; Tabellen Position
Text 300,0,Spielerpunkte,1
Text 340,0,Computerpunkte,1

; Tabellen Text
Locate 220,1
Print "Player"

Locate 370,1
Print"Hall 3000"



If Computerpunkte=30 Then
Name()
Exit
End If
; Buffer

 
Flip

Wend ; Wiederholung der While Schleife()

End Function




Function Name() ; Function der Namenseingabe
Cls
FlushKeys()
DrawImage Name, Name_x, Name_y
Locate 200,350 ;Namenseingabe
spielername$ = Input(" ") ;Variablenname des Spielers
; nach eingabe die Highscore aufrufen
Highscore () ; Spielende - daten neu sortieren
;Spiel in Menue weiter
End Function


Function Menü() ; Function des Hauptmenüs
While Not KeyHit(1)
Cls
DrawImage Hintergrund,Hintergrund_y,Hintergrund_x
If KeyDown(2) Then Spiel
If KeyDown (1) Then Menü
If KeyDown (5) Then End
If KeyDown (3) Then Highscore
Flip
Wend
End Function

Function Highscore() ;Highscoreliste Alte anzeigen und dann neue anzeigen
Cls
AppTitle "Highscore"
punkte(11) = spielerpunkte
Namen$(11) = spielername$
For i = 1 To 11 ; unsortiert dann mit dem neuen wert anzeigen sonst sieht man nichts!!
;punkte(i) = spielerpunkte :; hier wird ja jeder neu zugewiesen der Fehler den du angesprochen hast
;Namen$(i) = spielername$ + i ; mit (+i) werden die Namen immer länger, das soll bestimmt nicht sein
;Print i + "." +" " + Namen$(i) + " " + "hat" + " " + punkte(i) + " " + "Punkte"
Next

;Print "Taste für weiter"
;WaitKey
FlushKeys
Liste_sortieren (); --- Liste sortieren
Liste_speichern(); --- Liste speichern
Liste_anzeigen (); --- Liste laden + anzeigen

WaitKey
Cls
End Function


Function Liste_laden(); --- Liste laden + anzeigen
Datei = ReadFile("Highscore.dat")
For i = 1 To 10
Namen$(i) = ReadLine(Datei)
punkte(i) = ReadLine(Datei)
;Print i + "." + spielername$ + " " + "hat" + " " + spielerpunkte
Next
CloseFile Datei
;Print "Datei eingelesen --Tatse für weiter---"

End Function


; --- Liste laden + anzeigen
Function Liste_anzeigen()
SetFont fntArialI
Text 260,10, "Highscoreliste"
For i = 1 To 10
For i = 1 To 10
If i < 10 Then Text 200,(i*16)+100, i + ".)" ; Rang anzeigen
If i = 10 Then Text 200,(i*16)+100, i + ".)" ; Rang anzeigen
Text 300,(i*16)+100, Namen$(i) ; Namen anzeigen
Text 450,(i*16)+100, punkte(i) ; Punkte anzeigen
Next
Locate 80,400
Print  " --  Drücken Sie eine Taste um ins Menü zurück zu kommen ---"
 ; Dies ist die Stelle an der er zwar zurück ins Menü geht aber dennoch das Menü nicht angezeigt wird obwohl alle Tasten funktionieren.
Next 
End Function





Function Liste_sortieren (); --- Liste sortieren
For I = 1 To 11
For J = I To 11
If punkte(I) < punkte(J) Then ; "<" = größter zuerst / ">" = kleinster zuerst
X = punkte(I) : punkte(I) = punkte(J) : punkte(J) = X
xx$ = Namen$(i) : Namen$(i) = Namen$(j): Namen(j) = xx$
EndIf
Next
Next
End Function


Function Liste_speichern(); --- Liste_speichern
Datei = WriteFile("Highscore.dat")
For i = 1 To 10
WriteLine Datei, Namen$(i)
WriteLine Datei, punkte(i)
Next
CloseFile Datei


Mfg

Desantes

Markus2

BeitragMo, Feb 16, 2004 13:29
Antworten mit Zitat
Benutzer-Profile anzeigen
If BallImAus=1 and NeuerBall=0 then NeuerBall=100

If NeuerBall=0 then
... Spiel
Else
NeuerBall=NeuerBall-1
Text "Neuer Ball"
Endif
 

Desantes

BeitragMo, Feb 16, 2004 13:50
Antworten mit Zitat
Benutzer-Profile anzeigen
KAnnst du das noch etwas erleutern ich verstehe die Syntax nicht ganz!
bzw. Könntest du die Syntax meinem Code anpassen?

Mfg

Desantes

Markus2

BeitragMo, Feb 16, 2004 14:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn die Variable gesetzt ist dann wird das Spiel unterbrochen und
dafür der Text angezeigt .
Dabei wird diese Variable runter gezählt und bei 0 geht das Spiel weiter .
Also setzt du den Spielablauf wo man Eingaben machen kann etc.
in If Then
Genau so kannste auch eine Pause einbauen in dem du bei
Tastendruck diese auf 1 oder wieder auf 0 stellst .
 

Desantes

BeitragMo, Feb 16, 2004 14:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Das kann so wie du es beschrieben hast glaube ich nicht funktioniere, da wie man im Quelltext sehen kann das Spiel die Hauptschleife solange durchläuft bis der Computer 30 punkte erreicht hat. Das Spielende wird also nicht durch die Anzahl der Bälle definiert sondern über die Gesamtpunktzahl des Computers was bei 30 Punkten auch gleichzeitig 3 Bälle im Aus bedeutet.

Man müßte also irgendwas zusammen stricken mit den Koordinaten die das Ball Image beim verlassen des Spielfeldes hat.
Z.b. if ball_X>600 then ?????
if ball_X<1 then ????

ich glaube das wäre der richtige ansatz oder??
Vielleicht fällt dir dazu ja was ein?

Mfg

Desantes
 

Desantes

BeitragMo, Feb 16, 2004 16:08
Antworten mit Zitat
Benutzer-Profile anzeigen
KAnn mir denn garkeiner helfen?

Mfg

Desantes

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragMo, Feb 16, 2004 16:19
Antworten mit Zitat
Benutzer-Profile anzeigen
die einfachste Möglichkeit, aber auch die schlechteste wäre

Code: [AUSKLAPPEN]
Text 300,300,"Achtung neuer Ball",1,1
flip
delay 1000 ; hier stopt das ganze Proggy 1 sekunde
[BB2D | BB3D | BB+]
 

Desantes

BeitragMo, Feb 16, 2004 17:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank erstmal. Ist aber wie du schon sagtest wirklich nur ne notlösung,da halt das ganze Proggie an der Stelle einfriert.
Ich glaube ich werde mir mal ne function überlegen die an dieser Stelle eingreift. Was meinst du dazu?

Könnte man das mit ner seperaten function lösen ?

Desantes
 

BIG BUG

BeitragMo, Feb 16, 2004 18:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Als erstes solltest du mal deinen Code formatieren. Das ist ja augenkrebserregend.

Eine Bedingung die mehr als einen Befehl steuert, gehört nicht in eine Zeile gequetscht:
Code: [AUSKLAPPEN]


If Ball_x<1 Or Ball_x>GraphicsWidth()-40 Then
   Ball_x=Rand(50,300)
   Ball_y=Rand(60,400)
   VelX=Rand(5,8)
   VelY=Rand(5,8)
endif



Markus hat die Lösung ja schon genannt, mit ein bisschen nachdenken solltest du diese ohne größere Probleme in deinen Code einarbeiten können.
Es reicht ja, wenn du einfach die Ballbewegung nach diesem Prinzip verhinderst(so kann man noch reagieren bevor der Ball startet)...
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)
 

Desantes

BeitragMo, Feb 16, 2004 19:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich verstehe schon wie MArkus das meint , nur bin ich glaube ich noch nicht erfahren genug um meine Syntax nach dem Beispiel umzustricken.
Wäre echt nett wenn man mir noch nen Stück weiter helfen könnte.
Was die Syntax angeht hast du völlig recht, ich werde sobald das Proggie vernünftig läuft auch diese vernünftig anpassen.

Mfg
Desantes

Hubsi

BeitragMo, Feb 16, 2004 20:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn der Ball ins Aus geht:
Code: [AUSKLAPPEN]
gamestop=true
stoptime=MilliSecs()


Den Ball bewegst Du nur wenn gamestop=False ist. Und dann fügst Du noch diesen Code ein:
Code: [AUSKLAPPEN]
If gamestop
  Text x,y,"Irgendein Text halt..."
  If MilliSecs>stoptime+2000 Then gamestop=False
EndIf


Die 2000 da oben sind Millisekunden, also 2 Sekunden. Das läßt sich natürlich nach belieben ändern Wink
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...
 

Desantes

BeitragMo, Feb 16, 2004 20:34
Antworten mit Zitat
Benutzer-Profile anzeigen
HAb das jetzt folgender massen abgeändert ,leider ohne erfolg. Der Text blinkt zwar in einem bruchteil einer sekunde auf aber das wars auch schon

Code: [AUSKLAPPEN]
If Ball_x<1 Or Ball_x>GraphicsWidth()-40 Then
gamestop=True
stoptime=MilliSecs()

If gamestop
 Text 10,10,"Irgendein Text halt..."
 If MilliSecs>stoptime+2000 Then gamestop=False
EndIf

Ball_x=Rand(60,300)
Ball_y=Rand(60,400)
SpeedX=Rand(5,8)
SpeedY=Rand(5,8)
EndIf 
 

roaches

BeitragMo, Feb 16, 2004 20:41
Antworten mit Zitat
Benutzer-Profile anzeigen
bei meinem ersten prog, was ja auch ein pongclon ist, hab ich einfach über loadimage ein bild dargestellt, auf dem halt steht "tooor - weiter mit space" und dann den waitkey(57)-befehl.

das spiel geht dann erst weiter wenn man die spacetaste getätigt hat

Code: [AUSKLAPPEN]
.tor1
      punkte1=punkte1 + 1
      xb=320:yb=240
      DrawImage tor1,140,210  ;torbild laden
      x1=10:y1=240                 ;koordinaten neusetzen
      x2=620:y2=240
      yw=335
      
      points1=points1+points
      directory=2
      directoryball=2
      xv=0
      sb=0
      speed=0
      
      Flip
      Locate 190,390
      Print name$+" staubt "+points+" Rundenpunkte ab."
      points=0:round=0
      Repeat
      Until KeyHit(57)=1
      Gosub spiel
 

Desantes

BeitragMo, Feb 16, 2004 20:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab ich da ein böses Gosub entdeckt? Very Happy Klar so funktioniert es auch aber da wird doch das spiel ganz neu gestartet und bei mir soll nur der ball stehen bleiben bzw. neu gestartet werden so das man die schläger noch bewegen kann.

Trotzdem vielen Dank.

Mfg Desantes

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragMo, Feb 16, 2004 21:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
If Ball_x<1 Or Ball_x>GraphicsWidth()-40 Then
   gamestop=True
   stoptime=MilliSecs()
   
   If gamestop
    Text 10,10,"Irgendein Text halt..."
    If MilliSecs>stoptime+2000 Then gamestop=False
   EndIf
   If gamestop=False  ; hier nur neuen erstellen wenn wieder freigegeben
      Ball_x=Rand(60,300)
      Ball_y=Rand(60,400)
      SpeedX=Rand(5,8)
      SpeedY=Rand(5,8)
   End If
EndIf

mach es so, da ja erst ein neuer erstellt werden darf wenn die 2 Sekunden abgelaufen sind
[BB2D | BB3D | BB+]
 

Desantes

BeitragMo, Feb 16, 2004 21:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab das mal ausprobiert funzt aber leider nicht. Sobald er ball im aus ist, springt er komplett aus der Spielschleife und geht zum Spielende bzw. Namenseingabe für die Highscore.



Code: [AUSKLAPPEN]

If Ball_x<1 Or Ball_x>GraphicsWidth()-40 Then
gamestop=True
stoptime=MilliSecs()

If gamestop
Text 10,10,"Irgendein Text halt..."
If MilliSecs>stoptime+20000 Then gamestop=False
EndIf
If gamestop=False Then  ; hier nur neuen erstellen wenn wieder freigegeben
Ball_x=Rand(60,300)
Ball_y=Rand(60,400)
SpeedX=Rand(5,8)
SpeedY=Rand(5,8)
End If
EndIf

If Ball_y<1 Or Ball_y>GraphicsHeight()-40 Then SpeedY =- SpeedY

 

BIG BUG

BeitragMo, Feb 16, 2004 22:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]

Global StopBall
.
.
.
If Ball_x<1 Or Ball_x>GraphicsWidth()-40 Then

   Ball_x=Rand(50,300)
   Ball_y=Rand(60,400)
   VelX=Rand(5,8)
   VelY=Rand(5,8)

   StopBall = 200   ;<<< hier ausprobieren...

endif
.
.
.
if StopBall > 0 then
   StopBall = StopBall - 1
else
   ;Modernisieren der Ball position
   Ball_x = BAll_x + SpeedX
   Ball_y = Ball_y + SpeedY
endif


Du solltest vor dem Flip aber noch ein Waittimer verwenden, um bei allen Computern die gleiche Spielgeschwindigkeit zu erreichen.
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)
 

Desantes

BeitragMo, Feb 16, 2004 23:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Funktioniert einwandfrei!! Vielen Dank !!
Danke nochmal an alle anderen die mir versucht haben zu helfen.

Mfg Desantes


P.s. In stiller Hoffnung das ich irgendwann auch mal soviel durchblick habewie die meisten von euch.

Hubsi

BeitragDi, Feb 17, 2004 12:20
Antworten mit Zitat
Benutzer-Profile anzeigen
kleines Mißverständnis:
Code: [AUSKLAPPEN]
If Ball_x<1 Or Ball_x>GraphicsWidth()-40 and gamestop=false ;Hier
gamestop=True
stoptime=MilliSecs()
Endif  ; Und hier geändert

If gamestop
Text 10,10,"Irgendein Text halt..."
If MilliSecs>stoptime+20000 Then gamestop=False
EndIf
If gamestop=False Then  ; hier nur neuen erstellen wenn wieder freigegeben
Ball_x=Rand(60,300)
Ball_y=Rand(60,400)
SpeedX=Rand(5,8)
SpeedY=Rand(5,8)
End If
;EndIf => Das muß natürlich dann weg

If Ball_y<1 Or Ball_y>GraphicsHeight()-40 Then SpeedY =- SpeedY
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group