Schuss Test (Fehler)?

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Raiden93

Betreff: Schuss Test (Fehler)?

BeitragSa, Dez 04, 2010 11:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey ich habe mir gedacht, ich gehe nochmal mein Type wissen durch und habe ein kleines Schuss Spiel Programmiert was ganz ohne Grafiken auskommt.

Leider habe ich ein Bug, den ich leider nicht finden kann. :/ ich bin das Ganze ein paar mal durch gegangen aber finde den Fehler nicht finden.

Der Fehler ist folgendes schießt man mehrere Schüsse ab. und der 2 Schuss trift das Ziel gibt es ein Error.

Code: [AUSKLAPPEN]
Type Schusstyp
   Field X#,Y#,Speed#
End Type

Type Gegnertyp
   Field X#,Y#
End Type
Global Schuss.Schusstyp
Global Gegner.Gegnertyp

AppTitle "Headshot"
Graphics 800,600,32,1
SetBuffer BackBuffer()
Global FPS_Timer = CreateTimer(60)


;Variablen Cache
Global Gegner_ToT_Abfrage = True
Global Level_Change = True

;Variablen
Global Treffer_Zahl = 0
Global Gegner_Zahl = 0
Global Level = 1

Repeat
   Cls
   Level_Function()
   Maus_Zeichen()
   Schuss_Erstellen()
   Schuss_Zeichnen()
   Schuss_Bewegen()
   Gegner_Zeichen()
   Kollision()
   Anzeige()
   Ende()
   Level_Next()
   
   
   Flip 0
   WaitTimer (FPS_Timer)
Until KeyHit(1)

Function Maus_Zeichen()
   Color 255,0,0
   Oval 10,MouseY(),5,5
End Function

Function Schuss_Erstellen()
   If MouseHit(1)
      Schuss.Schusstyp = New Schusstyp
      Schuss\X = 10
      Schuss\Y = MouseY()
      Schuss\Speed = 7
   End If
End Function

Function Schuss_Zeichnen()
   For Schuss.Schusstyp = Each Schusstyp
      Color 0,0,255
      Oval Schuss\X,Schuss\Y,5,5
   Next
End Function

Function Schuss_Bewegen()
   For Schuss.Schusstyp = Each Schusstyp
      Schuss\X = Schuss\X +Schuss\Speed
   Next
End Function

Function Gegner_Zeichen()
   For Gegner.Gegnertyp = Each Gegnertyp
      Color 0,255,0
      Rect Gegner\X,Gegner\Y,25,25
    Next
End Function

Function Kollision()
   For Gegner.Gegnertyp = Each Gegnertyp
      For Schuss.Schusstyp = Each Schusstyp
         If Schuss\X > Gegner\X And Schuss\X < Gegner\X +25
            If Schuss\Y > Gegner\Y And Schuss\Y < Gegner\Y +25
               Delete Schuss
               Delete Gegner
               Gegner_Zahl = Gegner_Zahl -1
            End If
         End If
      Next
   Next
End Function

Function Ende()
   For Schuss.Schusstyp = Each Schusstyp
      If Schuss\X > 800
         Delete Schuss
         Treffer_Zahl = Treffer_Zahl -1
      End If
   Next
End Function

Function Anzeige()
   Color 0,255,0
   Text 10,10,"Treffer: " +Treffer_Zahl
   Text 10,35,"Gegner: " +Gegner_Zahl
   Text 10,55,"Level: " +Level
End Function

Function Level_Function()
   Select Level
      Case 1
         If Gegner_ToT_Abfrage = True
            Gegner_ToT_Abfrage = False
            Gegner.Gegnertyp = New Gegnertyp
            Gegner\X = 700 Gegner\Y = Rnd(5,600)
            Gegner_Zahl = Gegner_Zahl +1
         End If
      Case 2
         Local i
         If Gegner_ToT_Abfrage = True
            For i=1 To 3
            Gegner_ToT_Abfrage = False
            Gegner.Gegnertyp = New Gegnertyp
            Gegner\X = 700 Gegner\Y = Rnd(5,600)
            Gegner_Zahl = Gegner_Zahl +1
         Next
         End If
   End Select
End Function

Function Level_Next()
   If Gegner_Zahl =< 0 And Level_Change = True
      Level_Change = False
      Level = Level +1
      Gegner_ToT_Abfrage = True
   End If
End Function

Hubsi

BeitragSa, Dez 04, 2010 12:06
Antworten mit Zitat
Benutzer-Profile anzeigen
In Kollision() löscht Du den Gegner in den verschachtelten Schleifen. Der nächste Schuss versucht aber dann auf eben diesen Eintrag zuzugreifen, der nun aber schon Null ist -> Peng. Wenn Du den Debugger anwerfen würdest wärst Du in 0,garnix drüber gestolpert Wink
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Raiden93

BeitragSa, Dez 04, 2010 12:12
Antworten mit Zitat
Benutzer-Profile anzeigen
wie soll ich dann die Kollision verwirklichen^^?

Ana

BeitragSa, Dez 04, 2010 12:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Raiden,

der Fehler ist glaube ich gar nicht so komplex

bei deiner Funktion Kollision hast du ja diese verschachtelten For schleifen

Nun bei einem Treffer wird der aktuelle Gegner gelöscht, was ja okay ist, allerdings werden alle noch fliegenden Schüsse nun überprüft, ob sie mit diesem Gegner eine Kollision haben und hier ist der Fehler, den Gegner gibs ja nun nicht mehr.

Du könntest einfach ein Exit einbauen oder deinen gegnern noch einen Wert geben der anzeigt ob du sie getroffen hast und dann nach der Schusskollision überprüfung den gegner löscht falls der getroffenen Wert true ist oder so.
Don't only practice your art,
but force your way into its secrets,
for it and knowledge
can raise human to divine

Hubsi

BeitragSa, Dez 04, 2010 12:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein Exit das die Schusschleife verläßt ist die einfachste und schnellste Lösung. Danach läuft die Gegnerschleife weiter und der nächste Gegner wird auf sein Ableben geprüft.

Edit: Btw., das zeichnen, bewegen und "Ende-Prüfen" der Schüsse in drei seperaten Schleifen zu machen ist Performanceseitig übelster Humbug. Ist zwar nur "Probiercode" wie Du sagtest, aber da stellt es mir einfach sämtliche Haare auf Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Ana

BeitragSa, Dez 04, 2010 12:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Da hat Hubsi recht,

for schleifen und gerade wenn sie verschachtelt sind, sind leistungsfresser. Natürlich sind sie dann und wann sinnvoll, aber so selten wie möglich verwenden ist clever. Du kannst deinen Funktionen auch selfmade types übergeben mit
Code: [AUSKLAPPEN]
Function My_Function(T.My_Type)


nur so zur für den fall das du das noch nicht wusstest
Don't only practice your art,
but force your way into its secrets,
for it and knowledge
can raise human to divine

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group