function error

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Lord AdZ

Betreff: function error

BeitragSa, März 24, 2007 17:17
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, März 24, 2007 17:44
Antworten mit Zitat
Benutzer-Profile anzeigen
du hast ein repeat zufiel oder ein forever/until zuwenig Wink
deshalb steht die funktion in einer schleife

und dieses unbeendete repeat, liegt bei:
BlitzBasic: [AUSKLAPPEN]

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 ; <---<---<---<---<--- Hier
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
Programmers dont die. They gosub without return...

Lord AdZ

BeitragSa, März 24, 2007 19:28
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, März 25, 2007 10:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du deinen Code Formatiert hättest, hättest du den Fehler auch ganz einfach selber finden können Rolling Eyes
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

BeitragSo, März 25, 2007 13:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie meinst du das mit formatieren?

Thorsten

BeitragSo, März 25, 2007 13:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Code einrücken (Tab stops) oder sinnvolle Leerzeilen machen zum Beispiel

mfG

Thorsten

Lord AdZ

BeitragSo, März 25, 2007 17:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, danke für den Tipp!

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group