Schuss Test (Fehler)?
Übersicht

![]() |
Raiden93Betreff: Schuss Test (Fehler)? |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
![]() |
Raiden93 |
![]() Antworten mit Zitat ![]() |
---|---|---|
wie soll ich dann die Kollision verwirklichen^^? | ||
![]() |
Ana |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ein Exit![]() 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 ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
![]() |
Ana |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group