[Hilfe]Pingpongclon mit Menü problem

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Skyline

Betreff: [Hilfe]Pingpongclon mit Menü problem

BeitragDi, Nov 30, 2010 17:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, ich habe versucht, einen Pingpong clon mit einem Menü zu erstellen (das spiel ist nochnicht vorhanden aber selbst das Menü mackt)

hier mal der Code Code: [AUSKLAPPEN]
AppTitle"PingPong v0.8a"
Graphics 800,600,16,2
SetBuffer BackBuffer()

;Menübild laden.
menuebutton = LoadAnimImage("gfx\Menuebutton.png",200,40,0,6)

menue=1

;Schleife...
While Not KeyHit(1)
Cls

;Hier beginnt Select.
Select menue

 Case 1
   DrawImage menuebutton,300,100,0
  DrawImage menuebutton,300,160,3
  DrawImage menuebutton,300,220,5


 Case 2
  DrawImage menuebutton,300,100,1
  DrawImage menuebutton,300,160,2
  DrawImage menuebutton,300,220,5

If variablename And menue=2 Then
Print("Hallo bei meiner 0.0.1a Version meines Ping Pong")
Print("Spieles! Mit den Pfeiltasten Steuerst du deinen Pong Schläger!")
Print("Sobald die Kugel hinter deinem Gegner ist bekommst du einen Punkt!")
Print("Drücke nun ESC zum beenden oder Return um ins hauptmenü zu gelangen!")
Print(" Made By Skyline!")
WaitKey(1)
WaitKey(51)
Print("Klappt!")   
End
 
Case 3
  DrawImage menuebutton,300,100,1
  DrawImage menuebutton,300,160,3
  DrawImage menuebutton,300,220,4
   
variabelname=KeyHit(28)

If variabelname And menue=3 Then End
EndIf

End Select

If KeyHit(200) And menue>1
  menue=menue-1
EndIf

If KeyHit(208) And menue<3
  menue=menue+1
EndIf

Text 10,10,menue

Flip ;Buffer flippen <->
Wend
End


so und es kommt der error "Case" without "Select" und ich weiss nich woran es liegt :l und ausserdem, weiss jemand wie ich mit retunr (51) wieder auf die select start komme? danke im vorraus!

TimBo

BeitragDi, Nov 30, 2010 18:16
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]
If variabelname And menue=3 Then End
EndIf


hier kannste das Endif weglassen

oder du schreibst
BlitzBasic: [AUSKLAPPEN]
If bla=3 Then
End
EndIf
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.

Xeres

Moderator

BeitragDi, Nov 30, 2010 18:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Du solltest:
a) Deine Variablen deklarieren mit Local oder Global - schafft Übersicht und rechnet sich bei größeren Projekten.
b) Benutze aussagekräftige Variablennamen "variabelname" sagt einem nichts über Sinn oder Zweck. Da siehst du nicht durch, und wir hier werden es auch schwer haben, dir zu helfen.
c) Für das Menü kannst du Konstanten const verwenden. Insgesamt sähe das dann so aus:

BlitzBasic: [AUSKLAPPEN]
Graphics 800,600,16,2
SetBuffer BackBuffer()

Local FrameTimer = CreateTimer(60)

Const Menu_Start=1, Menu_Highscore=2, Menu_wasauchimmer=3
Global MenuState=Menu_Start


While Not KeyHit(1)
Cls

Select MenuState

Case Menu_Start

Case Menu_Highscore
If KeyHit(...) Then MenuState = Menu_wasauchimmer

Case Menu_wasauchimmer

End Select

Flip(0)
WaitTimer(FrameTimer)
Wend
End


Zum Timer siehe auch Hurra, 100 % Auslastung

d) Waitkey kannst du keinen Scancode übergeben - das wird BB zum meckern veranlassen.
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Johannes´

BeitragDi, Nov 30, 2010 18:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem ist ganz einfach, dass du das Case in einer If-Anweisung stehen hast, also zwischen if und endif.
Code: [AUSKLAPPEN]
Select menue
   Case 2
      If variablename And menue=2 Then
;...
      Case 3
;...
      EndIf
End Select


Hier musst du die If-Anweisung vor dem "Case 3" abschließen. (Oder soll das da ein "Else" oder so sein?)
 

Skyline

BeitragDi, Nov 30, 2010 18:23
Antworten mit Zitat
Benutzer-Profile anzeigen
ah ok ich versuch es mal Wink
aber ich denk nich das ichs schaffen werde Very Happy
 

Skyline

BeitragDi, Nov 30, 2010 18:43
Antworten mit Zitat
Benutzer-Profile anzeigen
so error kommen keine mehr aber auch keine Funktion, wenn ich die buttons betätige hier der veränderte code:
Code: [AUSKLAPPEN]
AppTitle"PingPong v0.8a"
Graphics 800,600,16,2
SetBuffer BackBuffer()

;Menübild laden.
menuebutton = LoadAnimImage("gfx\Menuebutton.png",200,40,0,6)

menue=1

;Schleife...
While Not KeyHit(1)
Cls

;Hier beginnt Select.
Select menue

 Case 1
   DrawImage menuebutton,300,100,0
  DrawImage menuebutton,300,160,3
  DrawImage menuebutton,300,220,5


 Case 2
  DrawImage menuebutton,300,100,1
  DrawImage menuebutton,300,160,2
  DrawImage menuebutton,300,220,5

Case 3
  DrawImage menuebutton,300,100,1
  DrawImage menuebutton,300,160,3
  DrawImage menuebutton,300,220,4
 
Enter=KeyHit(28)

If Enter And menue=3 Then End

If Enter And menue=2 Then
Cls
Print ("Spiel von : Skyline")
Print ("Steuerung : Linke und Rechte Pfeiltaste")
Print ("Homepage : Keine vorhanden!")
Print ("Drücke nun ESC zum beenden oder Backspace um ins Menü")
Print ("zurück zu kehren!")
If KeyHit(1) Then End
If KeyHit(51) Then Print ("Klappt")
End If
If Enter And menue=1 Then
Print ("Game nicht eingebaut! Drücke nun ESC!")
If KeyHit(1) Then End
End If
End Select


If KeyHit(200) And menue>1
  menue=menue-1
EndIf

If KeyHit(208) And menue<3
  menue=menue+1
EndIf

Text 10,10,menue

Flip ;Buffer flippen <->
Wend
End

Eingeproggt

BeitragDi, Nov 30, 2010 18:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Du prüfst das hier:
Code: [AUSKLAPPEN]
Enter=KeyHit(28)

Innerhalb des letzten Select-Case (Case 3) ab. Du musst das "End Select" davor schreiben, damit Enter immer abgefragt wird.

Außerdem ist mir aufgefallen dass deine
Code: [AUSKLAPPEN]
If KeyHit(1) Then End


nichts bringen werden, da sie erstens nur sofort nach Enter abgefragt werden und zweitens die Schleife ohnehin bei Druck von ESC verlassen wird (While Not KeyHit(1) )

mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9
 

Skyline

BeitragDi, Nov 30, 2010 18:57
Antworten mit Zitat
Benutzer-Profile anzeigen
ok danke klappt nunr 1A Very Happy nur noch das letzte problem vorerst, wie mach ich, das das Menü dann verschwindet und der text bzw später das spiel wiedergegeben wird?^^

Edit:
achja und wie mach ich es, das ich mit backspace (51) wieder das menü anzeigen lasse Very Happy

Code: [AUSKLAPPEN]
AppTitle"PingPong v0.8a"
Graphics 800,600,16,2
SetBuffer BackBuffer()

;Menübild laden.
menuebutton = LoadAnimImage("gfx\Menuebutton.png",200,40,0,6)

menue=1

;Schleife...
While Not KeyHit(1)
Cls

;Hier beginnt Select.
Select menue

 Case 1 ; das spiel
  DrawImage menuebutton,300,100,0
  DrawImage menuebutton,300,160,3
  DrawImage menuebutton,300,220,5


 Case 2 ; Extras wie Credits und co
  DrawImage menuebutton,300,100,1
  DrawImage menuebutton,300,160,2
  DrawImage menuebutton,300,220,5

Case 3 ; beenden!
  DrawImage menuebutton,300,100,1
  DrawImage menuebutton,300,160,3
  DrawImage menuebutton,300,220,4
 
End Select

Enter=KeyHit(28)

If Enter And menue=3 Then End

If Enter And menue=2 Then
Cls
Print ("Spiel von : Skyline")
Print ("Steuerung : Linke und Rechte Pfeiltaste")
Print ("Homepage : Keine vorhanden!")
Print ("Drücke nun ESC zum beenden oder Backspace um ins Menü")
Print ("zurück zu kehren!")
If KeyHit(51) Then Print ("Klappt")
End If
If Enter And menue=1 Then
Print ("Game nicht eingebaut! Drücke nun ESC!")
If KeyHit(1) Then End
End If



If KeyHit(200) And menue>1
  menue=menue-1
EndIf

If KeyHit(208) And menue<3
  menue=menue+1
EndIf

Text 10,10,menue

Flip ;Buffer flippen <->
Wend


~EDITIERT~

Ich war mal so frei, die Code-Box zu flicken.
mfG, Holzchopf

Holzchopf

Meisterpacker

BeitragMi, Dez 01, 2010 12:05
Antworten mit Zitat
Benutzer-Profile anzeigen
In den Blitz3D-Bereich bitte nur Zeugs, dass wirklich spezifisch Blitz3D ist. Dein Code enthält nicht einmal ein Graphics3D Wink daher:

~VERSCHOBEN~
Dieser Thread passte nicht in das Forum, in dem er ursprünglich gepostet wurde.

mfG
Holzchopf
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

Skyline

BeitragMi, Dez 01, 2010 12:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh Very Happy ich danke dir,

soweit so gut, hab mein code übersichtlicher und so gemacht, mit globals locals usw. lass auch die (mittlerweile) nurnoch 2 buttons anzeigen und ja, irgentwie bekomm ich es jetzt nicht hin ziwschen button 1 und 2 zu tauschen hier der code:

Code: [AUSKLAPPEN]
Graphics 1024,768,32,2
SetBuffer BackBuffer()
Local timer=CreateTimer(60)
 
menuebutton = LoadAnimImage("gfx\Menuebutton.png",200,40,0,6)
pause = LoadAnimImage("gfx\pause.png",200,40,0,6)
 
Const Spiel=0
Const Credits=1
Const Menü=2
Local programmstatus=Menü
 
Repeat
 
 Select programmstatus
   
  Case Spiel
   If KeyHit(Pause) Then programmstatus=Credits
   ;hier kommt der Code für das Spiel rein
   
  Case Credits
   If KeyHit(51) Then programmstatus=Spiel
   ;hier kommt der Credits-Code hin
   
  Case Menü

; das spiel
   DrawImage menuebutton,300,100,0
   DrawImage menuebutton,300,160,3
   
; Extras wie Credits und co
   DrawImage menuebutton,300,100,1
   DrawImage menuebutton,300,160,2
   


 If KeyHit(200) And menue>1
  menue=menue-1
 EndIf
 
 If KeyHit(208) And menue<2
  menue=menue+1
 EndIf
   
 End Select
 
 
 WaitTimer(timer)
 Flip(0):Cls
Until KeyHit(1)

skey-z

BeitragMi, Dez 01, 2010 14:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Also vorweg, du schreibst Menü, aber Blitz kann bei Variablennamen nicht mit Umlauten umgehen, entweder Menue oder Menu.

Such mal nach dem Tutorial von Suco-X, über den Programmaufbau mit Verschiedenen Statusvariablen
[EDIT] Ach hier ist es: https://www.blitzforum.de/foru...highlight=
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter
 

Skyline

BeitragMi, Dez 01, 2010 15:35
Antworten mit Zitat
Benutzer-Profile anzeigen
oh, ich bedanke mich klappt alles 1a Very Happy danke ^^
 

Skyline

BeitragMi, Dez 01, 2010 17:01
Antworten mit Zitat
Benutzer-Profile anzeigen
sooo und ich stehe erneut vor einem problem hab das spiel nun in das menü eingearbeitet, ist auch alles super duper toll , nur die bild dateien setz der ganz oben in die ecke und nicht so wie der s soll z.B das bild wall.png soll an die beiden ausenwände die ping pong spieler,kann man sich ja denken, genau wie der ball hier ERNEUT der code.
Code: [AUSKLAPPEN]
Graphics 1024,768,16,2
SetBuffer BackBuffer()

SetFont(LoadFont("Comic Sans MS",30,1))

Const game_pause = 1
Const game_menue = 2
Const game_haupt = 3
Const game_over  = 4

Global game_zustand = game_menue

Global frametimer = CreateTimer(60)
SeedRnd MilliSecs()

Global kugel=LoadImage("gfx\kugel.png");damit wird die Kugel in eine Variable geladen
MidHandle kugel ;

Global spieler1=LoadImage("gfx\sp1.png");damit ist der Untere gemeint
MidHandle spieler1;auch dieser bekommt seine Ursprung in die Mitte (s.Kugel)
MaskImage spieler1,255,255,255;hier müssen wir die Tranzparenzfarbe angeben, weil sie vom Standard abweicht

Global spieler2=LoadImage("gfx\sp2.png");damit ist der Obere gemeint
MidHandle spieler2;auch dieser bekommt seine Ursprung in die Mitte (s.Kugel)
MaskImage spieler2,255,255,255;hier müssen wir die Tranzparenzfarbe angeben, weil sie vom Standard abweicht

Global begrenzung=LoadImage("gfx\wall.png");damit wird die Seitenwand geladen
MaskImage begrenzung,255,255,255;hier müssen wir die Tranzparenzfarbe angeben, weil sie vom Standard abweicht

Global xsp1=xmax/2;also in der Mitte
Global xsp2=xmax/2
Global sp1st
Global sp2st
Global xkugel#
Global ykugel#
Global winkel
Global geschwindigkeit=5 ;wird mit Wert zugewiesen, weil man sie (noch) nicht ändern kann
Global fehlersp1
Global fehlersp2
Global beweglichkeit



;Wichtig. Hauptschleife. Hier wird das ganze Spiel verwaltet.

Repeat
   
   
   Select game_zustand
      Case game_menue
         GameMenue()
      Case game_haupt
         GameHaupt()
      Case game_pause
         GamePause()
   End Select
   
   
Until game_zustand = game_over
End





Function GameMenue()
   
   Local temp_zustand = game_zustand
   
   FlushMouse()
   FlushKeys()
   
   Repeat
      ClsColor 0,0,0
      Cls
      Color 0,0,255
      Text GraphicsWidth()/2,100,"Menu",1,1
      
      
      Color 255,255,255
      Text GraphicsWidth()/2,400,"Start"
      
      Color 255,255,255
      Text GraphicsWidth()/2,500,"Ende"
      
      
      If MouseHit(1)
         If RectsOverlap(MouseX(),MouseY(),1,1,GraphicsWidth()/2,400,StringWidth("Start"),StringHeight("Start"))
            game_zustand = game_haupt
         ElseIf RectsOverlap(MouseX(),MouseY(),1,1,GraphicsWidth()/2,500,StringWidth("Ende"),StringHeight("Ende"))
            game_zustand = game_over
         EndIf
      EndIf
      
      
      If KeyHit(1)
         End
      EndIf
      
      Flip
   Until game_zustand<>temp_zustand
   
End Function

Function resetkugel()
   xkugel=xmax/2:ykugel=ymax/2
   If Rand(0,1)=1 Then winkel=Rand(105,45) Else winkel=Rand(315,225);der Winkel wird durch Zufall ermittelt
End Function




Function GameHaupt()
   
   Local temp_zustand = game_zustand
   Local x = GraphicsWidth()/2
   Local y = GraphicsHeight()/2
   Local h = 0
   
   resetkugel;damit sie an der richtigen Position ist
   
   Repeat
      WaitTimer (frametimer)
      
      beweglichkeit=geschwindigkeit
      
      For z2=0 To 1
         If  z2=1 Then x=xmax-50 Else x=0
         For z=0 To ymax/50
            DrawImage begrenzung,x,z*50
         Next
      Next
      
      If KeyHit(14) Then resetkugel;wenn die Löschen Taste gedrückt wurde wird die Kugel zurück gesetzt
      
;die Spielersteuerung
      If KeyHit(2) Then sp1st=sp1st+1;die Zahlentaste 1
      If KeyHit(3) Then sp2st=sp2st+1;die Zahlentaste 2
      
      If sp1st>2 Then sp1st=0
      If sp2st>2 Then sp2st=0
      
;die automatische Steuerung, wenn die Steuerungsvariable 0 ist:
      If xsp1>xkugel And sp1st=0 Then xsp1=xsp1-beweglichkeit
      If xsp1<xkugel And sp1st=0 Then xsp1=xsp1+beweglichkeit
      
      If xsp2>xkugel And sp2st=0 Then xsp2=xsp2-beweglichkeit
      If xsp2<xkugel And sp2st=0 Then xsp2=xsp2+beweglichkeit
      
;die Tastatursteuerung, wenn die Steuerungsvariable 1 ist:
      If KeyDown(203) And sp1st=1 Then xsp1=xsp1-beweglichkeit;linke Pfeiltaste
      If KeyDown(205) And sp1st=1 Then xsp1=xsp1+beweglichkeit;rechte Pfeiltaste
      
      If KeyDown(44) And sp2st=1 Then xsp2=xsp2-beweglichkeit;Y Taste
      If KeyDown(45) And sp2st=1 Then xsp2=xsp2+beweglichkeit;X Taste
      
;die Maussteuerung, wenn die Steuerungsvariable 2 ist:
      If sp1st=2 Then xsp1=xsp1+MouseXSpeed()
      If sp2st=2 Then xsp2=xsp2+MouseXSpeed()
      
;die Überprüfung:
      If xsp1<70 Then xsp1=70
      If xsp1>xmax-70 Then xsp1=xmax-70
      If xsp2<70 Then xsp2=70
      If xsp2>xmax-70 Then xsp2=xmax-70
      
;die Kollisionsabfrage der Spieler
      If ImagesCollide(spieler1,xsp1,ymax-10,0,kugel,xkugel,ykugel,0) Then;wenn eine Kollision ist
         winkel=360-winkel ;prallt die Kugel ab
         abweichung=2*(xsp1-xkugel) ;damit kannst du die Richtung der Kugel steuern
         winkel=winkel+abweichung
      EndIf
      
      If ImagesCollide(spieler2,xsp2,10,0,kugel,xkugel,ykugel,0) Then
         winkel=360-winkel
         abweichung=2*(xsp2-xkugel)
         winkel=winkel-abweichung
      EndIf
      
;damit der Winkel nicht über den Bereich von 0-360 geht:
      If winkel>360 Then winkel=winkel-360
      If winkel<0 Then winkel=winkel+360
      
      
;Kollisionsabfrage Seitenwände
      If xkugel<60 Then
         winkel=180-winkel ;damit prallt die Kugel ab
      EndIf
      
      If xkugel>xmax-60 Then
         winkel=180-winkel
      EndIf
      
;wenn die Kugel durchgelassen wurde
      If ykugel<-10 Then ;oben
         fehlersp2=fehlersp2+1 ;der Obere bekommt einen Fehlerpunkt dazu
         resetkugel ;ein Funktionsaufruf
      EndIf
      
      If ykugel>ymax+10 Then ;unten
         fehlersp1=fehlersp1+1 ;der Untere bekommt einen Fehlerpunkt dazu
         resetkugel ;ein Funktionsaufruf
      EndIf
      
      
      
;das Berechnen der Kugelkoordinaten
      xkugel=xkugel+Cos(winkel)*geschwindigkeit
      ykugel=ykugel-Sin(winkel)*geschwindigkeit
      
;einige Informationen werden auf den Bildschirm gemalt
      Text 200,300,"Geschwindigkeit:" + geschwindigkeit
      Text 500,300,"Spielstand:  "+fehlersp2 + "       :       " + fehlersp1
;damit du die Steuerungsart sehen kannst
      Text 55,ymax-25,"Spieler1"
      If sp1st>0 Then
         If sp1st=2 Then Text 120,ymax-25,"Maussteuerung" Else Text 120,ymax-25,"Tastatursteuerung"
         Else Text 120,ymax-25,"Computer"
      EndIf
;If spieler1man>0 Then Text 250,ymax-25,scorep1
      
      Text 55,5,"Spieler2"
      If sp2st>0 Then
         If sp2st=2 Then
            Text 120,5,"Maussteuerung"
         Else
            Text 120,5,"Tastatursteuerung"
         EndIf
      Else
         Text 120,5,"Computer"
      EndIf
      
      
      DrawImage kugel,xkugel,ykugel;nur damit man sieht, das sie existiert
      DrawImage spieler1,xsp1,ymax-10
      DrawImage spieler2,xsp2,10
      
      Flip ;da wir den Hintergrundpuffer aktiviert haben, wechseln wir jetzt die Seiten, damit wir was sehen
      Cls ;der nichtsichtbare Bereich wird gelöscht
   Until KeyHit(1)
   End
   
   
   FlushKeys()
   FlushMouse()
   
   
   
End Function






Function GamePause()
   
   Local temp_zustand = game_zustand
   
   FlushKeys()
   FlushMouse()
   
   Repeat
      ClsColor 0,0,0
      Cls
      
      Color 255,255,255
      Text GraphicsWidth()/2,GraphicsHeight()/2,"Pause",1,1
      
      If KeyHit(57)
         game_zustand = game_haupt
      EndIf
      
      Flip
   Until game_zustand<>temp_zustand
   
End Function

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group