function error
Übersicht

![]() |
Lord AdZBetreff: function error |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich bin grade dabei, ein einfaches Ping-Pong Spiel zu schreiben, aber seit ich an der KI des 2. Spielers arbeite kommt, wenn ich f5 drücke, dieser error: "function can only appear in main program"
Hie ist mein Code: ; Ping-Pong Global xmax=1024,ymax=768 Graphics xmax,ymax,32,1 SetBuffer BackBuffer() Global frametimer = CreateTimer(60) SeedRnd MilliSecs() Global kugel=LoadImage("Bullet2.png") MidHandle kugel ;ursprung mitte Global spieler1=LoadImage("Spieler_1.png");damit ist der Untere gemeint MidHandle spieler1;auch dieser bekommt seine Ursprung in die Mitte (s.Kugel) MaskImage spieler1,255,255,255; Trasparenz Global spieler2=LoadImage("Spieler_2.png"); der Obere MidHandle spieler2; Ursprung mitte MaskImage spieler2,255,255,255;Tranzparenz Global begrenzung=LoadImage("Wand.png");Seitenwand geladen MaskImage begrenzung,255,255,255;Tranzparenz 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 Global ysp1=ymax-10 ;10 Pixel über den unteren Rand Global xsp1=xmax/2;also in der Mitte Global xsp2=xmax/2 Global sp1st Global sp2st Global xkugel# Global ykugel# Global winkel Global geschwindigkeit=15 Global fehlersp1 Global fehlersp2 Global beweglichkeit ; KI des Spielers Type Spieler_2 Field Spieler_2x Field Spieler_2y Field speed End Type Type Bally Field Ballx Field Bally Field SpeedBallx$ Field SpeedBally$ End Type Spieler_1x = 3 Spieler_2y = 300 geschwindigkeit = 15 Spieler_2x = 780 Spieler_2y = 300 Ballx = 400 Bally = 300 SpeedBallx = 2 SpeedBally = 2 Repeat Cls If KeyDown(Rauf) Then Spieler_1y = Spieler_1y - 3 EndIf If KeyDown(Runter) Then Spieler_1y = Spieler_1y + 3 EndIf If Ballx < 400 Then Spieler_2y = Spieler_2y + geschwindigkeit EndIf If ballx > 400 Then If bally - Spieler_2y > 4 Then Spieler_2y = Spieler_2y + geschwindigkeit EndIf If bally - gegnery < -4 Then spieler_2y = Spieler_2y - geschwindigkeit EndIf EndIf Bally = Bally + SpeedBally Ballx = Ballx + SpeedBallx If ImagesCollide(Spieler_2,Spieler_2x,Spieler_2y,0,Ball,Ballx,Bally,0) Then SpeedBallx = -SpeedBallx -0.1 EndIf If ImagesCollide(Spieler_1,Spieler_1x,Spieler_1y,0,Ball,Ballx,Bally,0) Then SpeedBallx = -SpeedBallx -0.1 EndIf DrawImage Spieler_1,Spieler_1x,Spieler_1y DrawImage Spieler_2,Spieler_2x,Spieler_2y DrawImage Ball,Ballx,Bally ClsColor 0,0,200;Hintergrund blau resetkugel;damit sie an der richtigen Position ist Repeat WaitTimer (frametimer) beweglichkeit=geschwindigkeit ; der Spielstand von beiden Spielern ist gleich 0, wenn 0 gedrückt wurde If KeyHit(11) Then fehlersp1=0 fehlersp2=0 EndIf If KeyHit(14) Then resetkugel;wenn entf gedrückt wurde, wird die Kugel zurück gesetzt If KeyHit(1) Then End ;beendet das spiel, wenn escape gedrückt wurde If KeyDown(6) Then geschwindigkeit=geschwindigkeit+1 ; erhöht die spielgeschwindigkeit um 1, wenn man 5 drückt If KeyDown(7) Then geschwindigkeit=geschwindigkeit-1 ; verringert die spielgeschwindigkeit um 1, wenn man 6 drückt ;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(208) And sp1st=1 Then ysp1 = ysp1 + beweglichkeit ; Pfeiltaste oben If KeyDown(200) And sp1st=1 Then ysp1 = ysp1 - beweglichkeit ; Pfeiltaste unten 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 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 DrawImage spieler1,xsp1,ymax-10 DrawImage spieler2,xsp2,10 ; Hintergrundbuffer Flip Cls Until KeyHit(1) End 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 Wo liegt der Fehler und was soll ich machen? |
||
Schnuff |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
du hast ein repeat zufiel oder ein forever/until zuwenig ![]() deshalb steht die funktion in einer schleife und dieses unbeendete repeat, liegt bei: BlitzBasic: [AUSKLAPPEN]
|
||
Programmers dont die. They gosub without return... |
![]() |
Lord AdZ |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke für deinen Tipp, der Debugger meldet sich nicht mehr, außerdem hab ich noch einen anderen Fehler gefunden. Aber jetzt gibts ein neues Problem: Nachdem ich f5 gedrückt hab, erscheint nur noch der blaue Hintergrund, die Spieler, Wand, usw. tauchen nicht mehr auf.
Liegt das vielleicht daran, das durch das Löschen der repeat/until Schleife die Backbuffer unterbrochen wurden? Hier ist die überarbeitete Version des Codes: Zitat: ; Ping-Pong Global xmax=1024,ymax=768 Graphics xmax,ymax,32,1 SetBuffer BackBuffer() Global frametimer = CreateTimer(60) SeedRnd MilliSecs() Global kugel=LoadImage("Bullet2.png") MidHandle kugel ;ursprung mitte Global spieler1=LoadImage("Spieler_1.png");damit ist der Untere gemeint MidHandle spieler1;auch dieser bekommt seine Ursprung in die Mitte (s.Kugel) MaskImage spieler1,255,255,255; Trasparenz Global spieler2=LoadImage("Spieler_2.png"); der Obere MidHandle spieler2; Ursprung mitte MaskImage spieler2,255,255,255;Tranzparenz Global begrenzung=LoadImage("Wand.png");Seitenwand geladen MaskImage begrenzung,255,255,255;Tranzparenz 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 Global ysp1=ymax-10 ;10 Pixel über dem unteren Rand Global xsp1=xmax/2;also in der Mitte Global xsp2=xmax/2 Global sp1st Global sp2st Global xkugel# Global ykugel# Global winkel Global geschwindigkeit=15 Global fehlersp1 Global fehlersp2 Global beweglichkeit Type Spieler_2 Field Spieler_2x Field Spieler_2y Field speed End Type Type Bullet2y Field Bullet2x Field Bullet2y Field SpeedBullet2x$ Field SpeedBullet2y$ End Type Spieler_1x = 3 Spieler_2y = 300 geschwindigkeit = 15 Spieler_2x = 780 Spieler_2y = 300 Bullet2x = 400 Bullet2y = 300 SpeedBullet2x = 2 SpeedBullet2y = 2 Repeat Cls If KeyDown(Rauf) Then Spieler_1y = Spieler_1y - 3 EndIf If KeyDown(Runter) Then Spieler_1y = Spieler_1y + 3 EndIf If Bullet2x < 400 Then Spieler_2y = Spieler_2y + geschwindigkeit EndIf If Bullet2x > 400 Then If Bullet2y - Spieler_2y > 4 Then Spieler_2y = Spieler_2y + geschwindigkeit EndIf If Bullet2y - Spieler_2y < -4 Then Spieler_2y = Spieler_2y - geschwindigkeit EndIf EndIf Bullet2y = Bullet2y + SpeedBullet2y Bullet2x = Bullet2x + SpeedBullet2x ClsColor 0,0,200;Hintergrund blau resetkugel;damit sie an der richtigen Position ist WaitTimer (frametimer) ; Hintergrundbuffer Flip Cls Until KeyHit(1) End 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 beweglichkeit=geschwindigkeit ; der Spielstand von beiden Spielern ist gleich 0, wenn 0 gedrückt wurde If KeyHit(11) Then fehlersp1=0 fehlersp2=0 EndIf If KeyHit(14) Then resetkugel;wenn entf gedrückt wurde, wird die Kugel zurück gesetzt If KeyHit(1) Then End ;beendet das spiel, wenn escape gedrückt wurde If KeyDown(6) Then geschwindigkeit=geschwindigkeit+1 ; erhöht die spielgeschwindigkeit um 1, wenn man 5 drückt If KeyDown(7) Then geschwindigkeit=geschwindigkeit-1 ; verringert die spielgeschwindigkeit um 1, wenn man 6 drückt ;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(208) And sp1st=1 Then ysp1 = ysp1 + beweglichkeit ; Pfeiltaste oben If KeyDown(200) And sp1st=1 Then ysp1 = ysp1 - beweglichkeit ; Pfeiltaste unten 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 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 DrawImage spieler1,xsp1,ymax-10 DrawImage spieler2,xsp2,10 |
||
![]() |
Smily |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn du deinen Code Formatiert hättest, hättest du den Fehler auch ganz einfach selber finden können ![]() |
||
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets "Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!" stummi.org |
![]() |
Lord AdZ |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wie meinst du das mit formatieren? | ||
![]() |
Thorsten |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code einrücken (Tab stops) oder sinnvolle Leerzeilen machen zum Beispiel
mfG Thorsten |
||
![]() |
Lord AdZ |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ok, danke für den Tipp! | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group