[GELÖST:] MAV und Debugger zickt...

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

M0rgenstern

Betreff: [GELÖST:] MAV und Debugger zickt...

BeitragSo, Sep 27, 2009 15:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leute.

Ich brauch mal ein wenig Hilfe.

Also, erstmal der eigentliche Fehler:

Ich hab ne Routine geschrieben, um Waffen von der FUnktion her realistisch ins Spiel zu integrieren.
Also diese Routine überprüft zuerst, welche Waffe gewählt wurde (momentan sind 6 geplant, eingefügt ist bisher aber nur die Pistole).
Je nachdem welche Waffe gewählt wurde wird halt die Schussfrequenz, übertragen, die Geschwindigkeit der Kugeln etc.
Jetzt gerade habe ich dann noch eine Abfrage für die Munition und Magazine + Anzeige dafür geschrieben.
Funktioniert am Anfang auch sehr gut.
Bis zu dem Zeitpunkt, an dem das Magazin, das momentan im Lauf ist, leer ist.
Dann sollte es aufgefüllt werden und von der Gesamtzahl der Magazine sollte eines abgezogen werden (wie halt in nem ganz normalen Shooter, ich hoffe ihr wisst wie ichs meine).
Aber irgendwie bekomme ich in diesem Moment (also wenn die Momentane Munition 0 ist und man dann klickt (dann sollte er eigentlich nachladen)) einen MAV.

Woran das liegt weiß ich wirklich nicht. Läuft mit Types (Die Schüsse/gegner und der SPieler) und Dim Feldern (Waffeneigenschaften (also auch Munition)).
Richtig geschrieben müsste alles sein (Ich hab dreimal drüber geguckt).

Jetzt wollte ich den Debugger mal anschalten, um zu sehen, was der sagt, jetzt startet das Programm nicht mal mehr.
Er zeigt mir folgenden Fehler an: "Startup Error: graphics_create failed"


Also, hier wäre der Code wegen der Waffenabfrage:

Code: [AUSKLAPPEN]
      
            Select Spieler\PGewWaffe
   
            Case 1
               If Pistole(0) <= 0 Then ;Überprüfen ob überhaupt noch eine Kugel im Lauf ist
                  Pistole(0) = 0 ;Damit auf jeden Fall von 0 an gerechnet wird
                  
                  If Pistole(1) > 0 Then
                     Pistole(0) = Pistole(0) + Pistole(2) ;Waffe nachladen, wenn das Magazin leer war
                     Pistole(1) = Pistole(1) - 1 ;Ein Magazin weniger
                  EndIf
               
               ElseIf Pistole(0) > 0 Then
                  Schuss.TPlayerSchuss = New TPlayerSchuss ;Ansonsten schießen
               
                  Schuss\PSImage = PistSchuss
                  Schuss\PSGeschw = Pistole(5)
                  Pistole(0) = Pistole(0) - 1
                  If Pistole(0) < 0 Then Pistole(0) = 0 ;Nochmal extra überprüfen dass nichts unter 0 geht
               EndIf
               
            Case 2

nach Case 2 gehts natürlich weiter, aber für die nächste Waffe ist die Abfrage noch nicht drin.


Und hier mal der ganze Code:

Code: [AUSKLAPPEN]
AppTitle "Draw3D V.3.2 - LoadFont3D"
Graphics3D 1024,768,0,1
SetBuffer BackBuffer()
SeedRnd MilliSecs()

Local Timer=CreateTimer(60)
Local Camera=CreateCamera()
CameraClsColor Camera,5,5,5

Include "Includes\Draw3D.bb"
DrawInit3D(Camera)
Origin3D(1024,768)


;_______________________________________________
Global PlayerImage=LoadImage3D("gfx\spaceship3.png", 4, 2)
Global MouseImage = loadimage3d("gfx\target.png", 2, 2)
Global GegnerTestI = loadimage3d("gfx\block3.bmp", 1, 2)
Global PistSchuss = loadimage3d("gfx\PistolenSchuss.png", 2, 2)

;++++++++++++++

Global GegnerTimer = MilliSecs()

;++++++++++++++

Global Schriftart = loadfont3d("Fonts\Cosmic1.png", 2, 2, 0)


;++++++++++++++

Dim Pistole(5) ;0Munition die man hat (schon in der Waffe), 1Magazine die man hat, 2Munition pro Magazin, 3Kadenz, 4Stärke, 5Geschw
Dim MP(5)
Dim Schrot(5)
Dim MG(5)
Dim Laser(5)
Dim Magnum(5)

Pistole(0) = 10
Pistole(1) = 99999
Pistole(2) = 10
Pistole(3) = 400
Pistole(4) = 20
Pistole(5) = 15

MP(0) = 25
MP(1) = 10
MP(2) = 25
MP(3) = 200
MP(4) = 17
MP(5) = 19

Schrot(0) = 8
Schrot(1) = 10
Schrot(2) = 8
Schrot(3) = 700
Schrot(4) = 30
Schrot(5) = 12

MG(0) = 50
MG(1) = 10
MG(2) = 50
MG(3) = 100
MG(4) = 21
MG(5) = 24

Laser(0) = 500
Laser(1) = 0
Laser(2) = 500
Laser(3) = 1
Laser(4) = 26
Laser(5) = 8

Magnum(0) = 7
Magnum(1) = 10
Magnum(2) = 7
Magnum(3) = 590
Magnum(4) = 28
Magnum(5) = 10

;++++++++++++++

Type TGegnerTest
 Field GTx#, GTy#, GTWinkel, GTGeschw#, GTImage, GTRotatGe#, Dead, GTRotatRich
End Type

Type TPlayerSchuss
 Field PSx#, PSy#, PSWinkel, PSGeschw#, PSImage, PSDead
End Type

Type TPlayer
 Field Px#, Py#, PWinkel, PEnergie, PAltx#, PAlty#, PGeschw#, Image, Dead
 Field PGewWaffe, PSchuTimer, PWafKadenz
End Type

Global Spieler.TPlayer = New TPlayer
 Spieler\Px# = (20)
 Spieler\Py# = (20)
 Spieler\PWinkel = 0
 Spieler\Image = PlayerImage
 Spieler\PEnergie = 100
 Spieler\PGeschw# = 5
 Spieler\Dead = 0
 Spieler\PGewWaffe = 1
 Spieler\PSchuTimer = MilliSecs()
;_________________________________________________



Repeat

   SpielerSteuerung()
   SpielerSchuss()
   SSchussBewegen()
   GegnerErstellenTest()
   GegnerBewegenTest()
   AllesMalen()

   

   ;Zeichen()
   
   WaitTimer(Timer)
   RenderWorld
   Clear3D()
   Flip 0
Until KeyHit(1)
End



;___________________________________________________
Function SpielerSteuerung()

 Spieler\PAltx# = Spieler\Px#
 Spieler\PAlty# = Spieler\Py#

 Spieler\PWinkel#=ATan2(Spieler\Px#-MouseX3D,Spieler\Py#-MouseY3D) ;Blickrichtung



 ;Geradeaus
   If KeyDown(17) Then
      Spieler\Px#=Spieler\Px#-Sin(Spieler\PWinkel)*Spieler\PGeschw#
      Spieler\Py#=Spieler\Py#-Cos(Spieler\PWinkel)*Spieler\PGeschw#
   EndIf
   
   ;Links
   If KeyDown(30) Then
      Spieler\Px#=Spieler\Px#-Sin(Spieler\PWinkel+90)*Spieler\PGeschw#
      Spieler\Py#=Spieler\Py#-Cos(Spieler\PWinkel+90)*Spieler\PGeschw#
   EndIf
   
   ;Rechts
   If KeyDown(32) Then
      Spieler\Px#=Spieler\Px#+Sin(Spieler\PWinkel+90)*Spieler\PGeschw#
      Spieler\Py#=Spieler\Py#+Cos(Spieler\PWinkel+90)*Spieler\PGeschw#
   EndIf
   
   ;Nach hinten
   If KeyDown(31) Then
      Spieler\Px#=Spieler\Px#+Sin(Spieler\PWinkel)*Spieler\PGeschw#
      Spieler\Py#=Spieler\Py#+Cos(Spieler\PWinkel)*Spieler\PGeschw#
   EndIf

   If Spieler\Px# >= 490 Then Spieler\Px# = Spieler\PAltx#
   If Spieler\Px# <= -490 Then Spieler\Px# = Spieler\PAltx#
   If SPieler\Py# >= 350 Then Spieler\Py# = Spieler\PAlty#
   If Spieler\Py# <= -350 Then Spieler\Py# = Spieler\PAlty#

End Function

;++++++++++++++

Function GegnerErstellenTest()

   If (GegnerTimer + Rand(1000,2000)) < MilliSecs() Then
      
      For i = 1 To 3
         Gegner.TGegnerTest = New TGegnerTest
         Gegner\GTx# = Rand(-490, 490)
         Gegner\GTy# = 355
         Gegner\GTGeschw# = Rand(1,8)
         Gegner\GTWinkel = Rand(0,360)
         Gegner\GtRotatGe = Rand(0,20)
         Gegner\GTImage = GegnerTestI
         Gegner\GTRotatRich = Rand(1,2)
         Gegner\Dead = 0
      Next
      
      GegnerTimer = MilliSecs()
   EndIf

End Function

;++++++++++++++

Function GegnerBewegenTest()

   For Gegner.TGegnerTest = Each TGegnerTest
   
      Gegner\GTy# = Gegner\GTy# - Gegner\GTGeschw#
      
      If Gegner\GTRotatRich = 1 Then ;Im Uhrzeigersinn
         Gegner\GTWinkel = Gegner\GTWinkel + Gegner\GTRotatGe
      ElseIf Gegner\GTRotatRich = 2 Then
         Gegner\GTWinkel = Gegner\GTWinkel - Gegner\GTRotatGe
      EndIf
      
      If Gegner\GTy# > 384 Then Gegner\Dead = 1
      If Gegner\Dead = 1 Then Delete Gegner.TGegnerTest
      
   Next

End Function

;++++++++++++++

Function SpielerSchuss()
   
   Select Spieler\PGewWaffe
   
      Case 1
         Spieler\PWafKadenz = Pistole(3)
      Case 2
         Spieler\PWafKadenz = MP(3)
      Case 3
         Spieler\PWafKadenz = Schrot(3)
      Case 4
         Spieler\PWafKadenz = MG(3)
      Case 5
         Spieler\PWafKadenz = Laser(3)
      Case 6
         Spieler\PWafKadenz = Magnum(3)
   End Select
   
   If ((Spieler\PSchuTimer + Spieler\PWafKadenz) < MilliSecs()) And Spieler\Dead <> 1 Then
      If MouseDown(1) Then
         
            
      
            Select Spieler\PGewWaffe
   
            Case 1
               If Pistole(0) <= 0 Then ;Überprüfen ob überhaupt noch eine Kugel im Lauf ist
                  Pistole(0) = 0 ;Damit auf jeden Fall von 0 an gerechnet wird
                  
                  If Pistole(1) > 0 Then
                     Pistole(0) = Pistole(0) + Pistole(2) ;Waffe nachladen, wenn das Magazin leer war
                     Pistole(1) = Pistole(1) - 1 ;Ein Magazin weniger
                  EndIf
               
               ElseIf Pistole(0) > 0 Then
                  Schuss.TPlayerSchuss = New TPlayerSchuss ;Ansonsten schießen
               
                  Schuss\PSImage = PistSchuss
                  Schuss\PSGeschw = Pistole(5)
                  Pistole(0) = Pistole(0) - 1
                  If Pistole(0) < 0 Then Pistole(0) = 0 ;Nochmal extra überprüfen dass nichts unter 0 geht
               EndIf
               
            Case 2
               Schuss.TPlayerSchuss = New TPlayerSchuss
               
               Schuss\PSImage = PistSchuss
               Schuss\PSGeschw = MP(5)
               
            Case 3
               Schuss.TPlayerSchuss = New TPlayerSchuss
            
               Schuss\PSImage = PistSchuss
               Schuss\PSGeschw = Schrot(5)
               
            Case 4
               Schuss.TPlayerSchuss = New TPlayerSchuss
            
               Schuss\PSImage = PistSchuss
               Schuss\PSGeschw = MG(5)
               
            Case 5
               Schuss.TPlayerSchuss = New TPlayerSchuss
            
               Schuss\PSImage = PistSchuss
               Schuss\PSGeschw = Laser(5)
               
            Case 6
               Schuss.TPlayerSchuss = New TPlayerSchuss
                  
               Schuss\PSImage = PistSchuss
               Schuss\PSGeschw = Magnum(5)
               
         End Select
         

         Schuss\PSy# = Spieler\Py#-Cos(Spieler\PWinkel)*Schuss\PSGeschw
         Schuss\PSx# = Spieler\Px#-Sin(Spieler\PWinkel)*Schuss\PSGeschw
         Schuss\PSWinkel = Spieler\PWinkel
         
      
         
         
         Schuss\PSDead = 0
         
         Spieler\PSchuTimer = MilliSecs()
      EndIf
   EndIf
         

End Function

;++++++++++++++

Function SSchussBewegen()

   For Schuss.TPlayerSchuss = Each TPlayerSchuss
   
      Schuss\PSx#=Schuss\PSx#-Sin(Schuss\PSWinkel)*Schuss\PSGeschw#
     Schuss\PSy#=Schuss\PSy#-Cos(Schuss\PSWinkel)*Schuss\PSGeschw#
      
            
      If SChuss\Psx# >= 512 Then Schuss\PSDead = 1
      If Schuss\Psx# <= -512 Then Schuss\PSDead = 1
      If Schuss\Psy# >= 384 Then Schuss\PSDead = 1
      If Schuss\Psy# <= -384 Then Schuss\PSDead = 1
      
      If Schuss\PSDead = 1 Then Delete Schuss.TPlayerSchuss
      
   Next

End Function

;++++++++++++++

Function AllesMalen()

   
   For Gegner.TGegnerTest = Each TGegnerTest
      Drawimage3D(Gegner\GTImage, Gegner\GTx#, Gegner\Gty#,0, Gegner\GTWinkel, 1)
   Next
   
   For SChuss.TPlayerSchuss = Each TPlayerSchuss
      Drawimage3D(Schuss\PSImage, Schuss\PSx#, SChuss\PSy#,0, SChuss\PSWinkel, 1.5)
   Next
   
   DrawImage3D(PlayerImage,Spieler\Px#,Spieler\Py#,0,Spieler\PWinkel#,1)
   Drawimage3d(MouseImage, MouseX3D, MouseY3D, 0, 0, 1)
   
   ColorT3D(255, 10, 10, 1)
   
   Select Spieler\PGewWaffe
   
      Case 1
         Text3D(Schriftart, (-400), 300, "Munition: " + Pistole(0) + "/" + Pistole(1), 0, 0, 0)
         
      Case 2
         Text3D(Schriftart, (-400), 300, "Munition: " + MP(0) + "/" + MP(1), 0, 0, 0)
         
      Case 3
         Text3D(Schriftart, (-400), 300, "Munition: " + Schrot(0) + "/" + Schrot(1), 0, 0, 0)
         
      Case 4
         Text3D(Schriftart, (-400), 300, "Munition: " + MG(0) + "/" + MG(1), 0, 0, 0)
         
      Case 5
         Text3D(Schriftart, (-400), 300, "Munition: " + Laser(0) + "/" + Laser(1), 0, 0, 0)
         
      Case 6
         Text3D(Schriftart, (-400), 300, "Munition: " + Magnum(0) + "/" + Magnum(1), 0, 0, 0)
      
   End Select

   
   

End Function
;--------------------------------



Wenn ich den irgendwie auseinanderbasteln soll, also, um euch einige Funktionen schneller anzugucken, dann sagt bitte ienfach bescheid, werd ich dann sofort tun.


Hoffe ihr könnt mir helfen.

Danke schonmal,

Lg, M0rgenstern
  • Zuletzt bearbeitet von M0rgenstern am Mo, Sep 28, 2009 22:08, insgesamt einmal bearbeitet

ZaP

BeitragSo, Sep 27, 2009 16:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Kannst Du mal die Zeile zeigen (Kommentar), über die sich der Debugger zuletzt beschwert hat?
Starfare: Worklog, Website (download)

Xeres

Moderator

BeitragSo, Sep 27, 2009 16:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Diese riesigen Abfrageblöcke...
Code: [AUSKLAPPEN]
Select Spieler\PGewWaffe
   
      Case 1
         Spieler\PWafKadenz = Pistole(3)
      Case 2
         Spieler\PWafKadenz = MP(3)
... für jede Waffe sind ziemlich grauenhaft. Jedenfalls könntest du es dir wesentlich einfacher und übersichtlicher machen, wenn du auf Arrays verzichtest, und dafür ebenfalls Types nimmst.
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)

M0rgenstern

BeitragSo, Sep 27, 2009 17:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Öhm, wie wäre das dann umzusetzen?

Ich muss ja im Endeffekt trotzdem überprüfen, welche Waffe gewählt ist und diese dementsrpechend in dem TypBlock ansprechen.


Wenn er mir ne Zeile anzeigen würde, hätte ichs schon geschrieben. Da liegt ja eben noch zusätzlich das Problem: Er zeigt keine Zeile an... Er beschwert sich nur.

Lg, M0rgenstern

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Sep 27, 2009 18:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab mir jetzt nicht alles durchgelesen, aber man kann Type-IDs refferenzieren womit dann Querverweise möglich sind.

Type tut! Von dummies für dummies
Types Schnellkurs
Verwendung von Typen
Verwendung von Typen II ( Datenstruktur )

Vielleicht findet sich da was. Ist auf jeden Fall sehr Hilfreich.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Xeres

Moderator

BeitragSo, Sep 27, 2009 18:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Type TPlayer
   Field Name$
   Field Waffe.TWaffe
End Type

Type TWaffe
   Field Name$
   Field Magazine%, Magazine_Max%
   Field Shots_per_Mag%
   Field Kadenz%
   Field DMG%
End Type

Local W_SMG.TWaffe = Create_Waffe("SMG", 12, 2000, 4, 30)


Local Player.TPlayer = New TPlayer
Player\Name = "Bob"
Player\Waffe = W_SMG

Print(Player\Name+ " trägt ein "+Player\Waffe\Name)
Print("("+Player\Waffe\Magazine+"/"+Player\Waffe\Magazine_Max+", löst "+Player\Waffe\Kadenz+" Probleme die Minute)" )
WaitKey()

End

Function Create_Waffe.TWaffe(name$, DMG, Kadenz, Magazine, Shots_per_Mag)
   Local W.TWaffe = New TWaffe
   W\Name = name$
   W\DMG = DMG
   W\Kadenz = Kadenz
   W\Magazine_Max = Magazine
   W\Magazine = Magazine
   W\Shots_per_Mag = Shots_per_Mag
   
   Return W
End Function


Klar muss man ggf. Abfragen welche Waffe man benutzt, vieles lässt sich aber mit allgemeinem Code erreichen oder als weiterem unter-Type (Waffengattungen) sortieren. Und man sieht, was man rechnet ohne jedes mal nach zu schlagen, welcher Index was bedeutet.
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)

M0rgenstern

BeitragSo, Sep 27, 2009 18:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh man.

Danke Xeres. Ich hab mal wieder viel zu kompliziert gedacht, was das angeht.

Mein Gedankengang war: "Schön, ich hab Befehle für auf JEDEN TypEintrag oder den ersten bzw letzten zuzugreifen. Wie komm in an die mittleren?"
Deine Lösung ist mir gar nicht in den Sinn gekommen.

Werd ich gleich noch umsetzen. Dann wird mein Code ein wenig sauberer^^ Dankeschön....

Aber bei meinem Debugg Problem hat das leider noch nichts geholfen... (Das andere Problem löst sich bestimmt damit)

Lg, M0rgenstern


EDIT:

Also, Ich habe jetzt Xeres Lösung eingebaut.

Ich muss sagen: Es sieht deutlich besser aus und lässt sich viel einfacher steuern und bearbeiten. SO kann ich wirklich schnell neue Waffen hinzufügen. Werde das wohl auch für die Waffen der Gegner übernehmen.

Aber der Fehler (oder besser: BEIDE Fehler) sind immernoch da.

So sieht der COde jetzt aus:

Code: [AUSKLAPPEN]
AppTitle "Draw3D V.3.2 - LoadFont3D"
Graphics3D 1024,768,0,1
SetBuffer BackBuffer()
SeedRnd MilliSecs()

Local Timer=CreateTimer(60)
Local Camera=CreateCamera()
CameraClsColor Camera,5,5,5

Include "Includes\Draw3D.bb"
DrawInit3D(Camera)
Origin3D(1024,768)


;_______________________________________________
Global PlayerImage=LoadImage3D("gfx\spaceship3.png", 4, 2)
Global MouseImage = loadimage3d("gfx\target.png", 2, 2)
Global GegnerTestI = loadimage3d("gfx\block3.bmp", 1, 2)
Global PistSchuss = loadimage3d("gfx\PistolenSchuss.png", 2, 2)

;++++++++++++++

Global GegnerTimer = MilliSecs()

;++++++++++++++

Global Schriftart = loadfont3d("Fonts\Cosmic1.png", 2, 2, 0)


;++++++++++++++

Type TWaffe
 Field WName$
 Field WMunition%, WMagazine%
 Field WSchussProMagazin%, WKadenz%, WDamage%, WSpeed%
End Type

Global PW_Pistole.TWaffe = WaffeErstellen("Pistole", 10, 9999, 10, 400, 20, 15) 

Type TGegnerTest
 Field GTx#, GTy#, GTWinkel, GTGeschw#, GTImage, GTRotatGe#, Dead, GTRotatRich
End Type

Type TPlayerSchuss
 Field PSx#, PSy#, PSWinkel, PSGeschw#, PSImage, PSDead
End Type

Type TPlayer
 Field Px#, Py#, PWinkel, PEnergie, PAltx#, PAlty#, PGeschw#, Image, Dead
 Field PGewWaffe.TWaffe, PSchuTimer, PWafKadenz
End Type

Global Spieler.TPlayer = New TPlayer
 Spieler\Px# = (20)
 Spieler\Py# = (20)
 Spieler\PWinkel = 0
 Spieler\Image = PlayerImage
 Spieler\PEnergie = 100
 Spieler\PGeschw# = 5
 Spieler\Dead = 0
 Spieler\PGewWaffe = PW_Pistole
 Spieler\PSchuTimer = MilliSecs()
;_________________________________________________



Repeat

   SpielerSteuerung()
   SpielerSchuss()
   SSchussBewegen()
   GegnerErstellenTest()
   GegnerBewegenTest()
   AllesMalen()

   

   ;Zeichen()
   
   WaitTimer(Timer)
   RenderWorld
   Clear3D()
   Flip 0
Until KeyHit(1)
End



;___________________________________________________
Function SpielerSteuerung()

 Spieler\PAltx# = Spieler\Px#
 Spieler\PAlty# = Spieler\Py#

 Spieler\PWinkel#=ATan2(Spieler\Px#-MouseX3D,Spieler\Py#-MouseY3D) ;Blickrichtung



 ;Geradeaus
   If KeyDown(17) Then
      Spieler\Px#=Spieler\Px#-Sin(Spieler\PWinkel)*Spieler\PGeschw#
      Spieler\Py#=Spieler\Py#-Cos(Spieler\PWinkel)*Spieler\PGeschw#
   EndIf
   
   ;Links
   If KeyDown(30) Then
      Spieler\Px#=Spieler\Px#-Sin(Spieler\PWinkel+90)*Spieler\PGeschw#
      Spieler\Py#=Spieler\Py#-Cos(Spieler\PWinkel+90)*Spieler\PGeschw#
   EndIf
   
   ;Rechts
   If KeyDown(32) Then
      Spieler\Px#=Spieler\Px#+Sin(Spieler\PWinkel+90)*Spieler\PGeschw#
      Spieler\Py#=Spieler\Py#+Cos(Spieler\PWinkel+90)*Spieler\PGeschw#
   EndIf
   
   ;Nach hinten
   If KeyDown(31) Then
      Spieler\Px#=Spieler\Px#+Sin(Spieler\PWinkel)*Spieler\PGeschw#
      Spieler\Py#=Spieler\Py#+Cos(Spieler\PWinkel)*Spieler\PGeschw#
   EndIf

   If Spieler\Px# >= 490 Then Spieler\Px# = Spieler\PAltx#
   If Spieler\Px# <= -490 Then Spieler\Px# = Spieler\PAltx#
   If SPieler\Py# >= 350 Then Spieler\Py# = Spieler\PAlty#
   If Spieler\Py# <= -350 Then Spieler\Py# = Spieler\PAlty#

End Function

;++++++++++++++

Function GegnerErstellenTest()

   If (GegnerTimer + Rand(1000,2000)) < MilliSecs() Then
      
      For i = 1 To 3
         Gegner.TGegnerTest = New TGegnerTest
         Gegner\GTx# = Rand(-490, 490)
         Gegner\GTy# = 355
         Gegner\GTGeschw# = Rand(1,8)
         Gegner\GTWinkel = Rand(0,360)
         Gegner\GtRotatGe = Rand(0,20)
         Gegner\GTImage = GegnerTestI
         Gegner\GTRotatRich = Rand(1,2)
         Gegner\Dead = 0
      Next
      
      GegnerTimer = MilliSecs()
   EndIf

End Function

;++++++++++++++

Function GegnerBewegenTest()

   For Gegner.TGegnerTest = Each TGegnerTest
   
      Gegner\GTy# = Gegner\GTy# - Gegner\GTGeschw#
      
      If Gegner\GTRotatRich = 1 Then ;Im Uhrzeigersinn
         Gegner\GTWinkel = Gegner\GTWinkel + Gegner\GTRotatGe
      ElseIf Gegner\GTRotatRich = 2 Then
         Gegner\GTWinkel = Gegner\GTWinkel - Gegner\GTRotatGe
      EndIf
      
      If Gegner\GTy# > 384 Then Gegner\Dead = 1
      If Gegner\Dead = 1 Then Delete Gegner.TGegnerTest
      
   Next

End Function

;++++++++++++++

Function SpielerSchuss()
   


   
   If ((Spieler\PSchuTimer + Spieler\PGewWaffe\WKadenz) < MilliSecs()) And Spieler\Dead <> 1 Then
      If MouseDown(1) Then
         
            

               If Spieler\PGewWaffe\WMunition <= 0 Then ;Überprüfen ob überhaupt noch eine Kugel im Lauf ist
                  Spieler\PGewWaffe\WMunition = 0 ;Damit auf jeden Fall von 0 an gerechnet wird
                  
                  If Spieler\PGewWaffe\WMagazine > 0 Then
                     Spieler\PGewWaffe\WMunition = Spieler\PGewWaffe\WMunition + Spieler\PGewWaffe\WSchussProMagazin ;Waffe nachladen, wenn das Magazin leer war
                     Spieler\PGewWaffe\WMagazine = Spieler\PGewWaffe\WMagazine - 1 ;Ein Magazin weniger
                  EndIf
               
               ElseIf Spieler\PGewWaffe\WMunition > 0 Then
                  Schuss.TPlayerSchuss = New TPlayerSchuss ;Ansonsten schießen
               
                  Schuss\PSImage = PistSchuss
                  Schuss\PSGeschw = Spieler\PGewWaffe\WSpeed
                  Spieler\PGewWaffe\WMunition = Spieler\PGewWaffe\WMunition - 1
                  If Spieler\PGewWaffe\WMunition < 0 Then Spieler\PGewWaffe\WMunition = 0 ;Nochmal extra überprüfen dass nichts unter 0 geht
               EndIf
               
         

         Schuss\PSy# = Spieler\Py#-Cos(Spieler\PWinkel)*Schuss\PSGeschw
         Schuss\PSx# = Spieler\Px#-Sin(Spieler\PWinkel)*Schuss\PSGeschw
         Schuss\PSWinkel = Spieler\PWinkel
         
      
         
         
         Schuss\PSDead = 0
         
         Spieler\PSchuTimer = MilliSecs()
      EndIf
   EndIf
         

End Function

;++++++++++++++

Function SSchussBewegen()

   For Schuss.TPlayerSchuss = Each TPlayerSchuss
   
      Schuss\PSx#=Schuss\PSx#-Sin(Schuss\PSWinkel)*Schuss\PSGeschw#
     Schuss\PSy#=Schuss\PSy#-Cos(Schuss\PSWinkel)*Schuss\PSGeschw#
      
            
      If SChuss\Psx# >= 512 Then Schuss\PSDead = 1
      If Schuss\Psx# <= -512 Then Schuss\PSDead = 1
      If Schuss\Psy# >= 384 Then Schuss\PSDead = 1
      If Schuss\Psy# <= -384 Then Schuss\PSDead = 1
      
      If Schuss\PSDead = 1 Then Delete Schuss.TPlayerSchuss
      
   Next

End Function

;++++++++++++++

Function AllesMalen()

   
   For Gegner.TGegnerTest = Each TGegnerTest
      Drawimage3D(Gegner\GTImage, Gegner\GTx#, Gegner\Gty#,0, Gegner\GTWinkel, 1)
   Next
   
   For SChuss.TPlayerSchuss = Each TPlayerSchuss
      Drawimage3D(Schuss\PSImage, Schuss\PSx#, SChuss\PSy#,0, SChuss\PSWinkel, 1.5)
   Next
   
   DrawImage3D(PlayerImage,Spieler\Px#,Spieler\Py#,0,Spieler\PWinkel#,1)
   Drawimage3d(MouseImage, MouseX3D, MouseY3D, 0, 0, 1)
   
   ColorT3D(255, 10, 10, 1)
   
   
   

   Text3D(Schriftart, (-400), 300, "Munition: " + Spieler\PGewWaffe\WMunition + "/" + Spieler\PGewWaffe\WMagazine, 0, 0, 0)
         

   
   

End Function
;--------------------------------

Function WaffeErstellen.TWaffe(name$, Munition, Magazine, SchussProMagazin, Kadenz, Damage, Speed)

   Local W.TWaffe = New TWaffe
   W\WName = name$
   W\WMunition = Munition
   W\WMagazine = Magazine
   W\WSchussProMagazin = SchussProMagazin
   W\WKadenz = Kadenz
   W\WDamage = Damage
   W\WSpeed = Speed
   
   Return W

End Function



UNd hier der Code an der vermeintlichen Fehlerstelle (wegen dem MAV):

Code: [AUSKLAPPEN]
If Spieler\PGewWaffe\WMunition <= 0 Then ;Überprüfen ob überhaupt noch eine Kugel im Lauf ist
                  Spieler\PGewWaffe\WMunition = 0 ;Damit auf jeden Fall von 0 an gerechnet wird
                  
                  If Spieler\PGewWaffe\WMagazine > 0 Then
                     Spieler\PGewWaffe\WMunition = Spieler\PGewWaffe\WMunition + Spieler\PGewWaffe\WSchussProMagazin ;Waffe nachladen, wenn das Magazin leer war
                     Spieler\PGewWaffe\WMagazine = Spieler\PGewWaffe\WMagazine - 1 ;Ein Magazin weniger
                  EndIf
               
               ElseIf Spieler\PGewWaffe\WMunition > 0 Then
                  Schuss.TPlayerSchuss = New TPlayerSchuss ;Ansonsten schießen
               
                  Schuss\PSImage = PistSchuss
                  Schuss\PSGeschw = Spieler\PGewWaffe\WSpeed
                  Spieler\PGewWaffe\WMunition = Spieler\PGewWaffe\WMunition - 1
                  If Spieler\PGewWaffe\WMunition < 0 Then Spieler\PGewWaffe\WMunition = 0 ;Nochmal extra überprüfen dass nichts unter 0 geht
               EndIf


Also, ich denke, dass der Fehler irgendwo in dieser verschachtelten IF Abfrage liegt. Aber richtig geschlossen mit Endif ist es ja und es überschneidet sich ja auch nicht blöd von irgendwelchen Variablen her.

(Achso, ich habe Xeres Code übrigens verstanden. Nicht dass ihr glaubt ich würde nur Copy - Paste machen^^)

Lg, M0rgenstern


EDIT 2:

Also, der Debugger spinnt wohl wegen Draw3D.
Spinnt bei allen Projekten, in denen ich Draw3D benutze (Auch in den Draw3D Beispielen).
Das Problem kann somit als hinfällig angesehen werden.

Aber das Problem mit dem MAV besteht immernoch. Aber bei jeder Waffe eben.
Da kann ja wohl nur was in der Abfrage:

Code: [AUSKLAPPEN]
Function SpielerSchuss()
   
   If ((Spieler\PSchuTimer + Spieler\PGewWaffe\WKadenz) < MilliSecs()) And Spieler\Dead <> 1 Then
      If MouseDown(1) Then
            
               

         If Spieler\PGewWaffe\WMunition <= 0 Then ;Überprüfen ob überhaupt noch eine Kugel im Lauf ist
            Spieler\PGewWaffe\WMunition = 0 ;Damit auf jeden Fall von 0 an gerechnet wird
                  
               If Spieler\PGewWaffe\WMagazine > 0 Then
                  Spieler\PGewWaffe\WMunition = Spieler\PGewWaffe\WMunition + Spieler\PGewWaffe\WSchussProMagazin ;Waffe nachladen, wenn das Magazin leer war
                  Spieler\PGewWaffe\WMagazine = Spieler\PGewWaffe\WMagazine - 1 ;Ein Magazin weniger
               EndIf
               
         ElseIf Spieler\PGewWaffe\WMunition > 0 Then
                  
            If Spieler\PGewWaffe = PW_Schrot
                   
               For i = 1 To 5 ;Schrotflinte... Damit es ne schöne Streuung gibt
                        
                  Schuss.TPlayerSchuss = New TPlayerSchuss
                        
                  Schuss\PSy# = Spieler\Py#-Cos(Spieler\PWinkel)*Schuss\PSGeschw
                  Schuss\PSx# = Spieler\Px#-Sin(Spieler\PWinkel)*Schuss\PSGeschw
                  Schuss\PSWinkel = Spieler\PWinkel+Rand(-23,23)
                  Schuss\PSImage = PistSchuss
                  SChuss\PSDead = 0
                  Schuss\PSGeschw = Spieler\PGewWaffe\WSpeed
                        

               Next
                     
               Spieler\PGewWaffe\WMunition = Spieler\PGewWaffe\WMunition - 1
               If Spieler\PGewWaffe\WMunition < 0 Then Spieler\PGewWaffe\WMunition = 0
                  
            Else
                  
               Schuss.TPlayerSchuss = New TPlayerSchuss ;Ansonsten schießen
                  
               Schuss\PSy# = Spieler\Py#-Cos(Spieler\PWinkel)*Schuss\PSGeschw
               Schuss\PSx# = Spieler\Px#-Sin(Spieler\PWinkel)*Schuss\PSGeschw
               Schuss\PSWinkel = Spieler\PWinkel
         
               Schuss\PSImage = PistSchuss
               Schuss\PSDead = 0
               Schuss\PSGeschw = Spieler\PGewWaffe\WSpeed
               Spieler\PGewWaffe\WMunition = Spieler\PGewWaffe\WMunition - 1
               If Spieler\PGewWaffe\WMunition < 0 Then Spieler\PGewWaffe\WMunition = 0 ;Nochmal extra überprüfen dass nichts unter 0 geht
            EndIf
         EndIf
         

      
      
         
         
         Schuss\PSDead = 0
         
         Spieler\PSchuTimer = MilliSecs()
      EndIf
   EndIf
         

End Function


nicht stimmen.

Aber ich finde den Fehler einfach nicht Sad

Wäre wirklich toll, wenn mir jemand helfen könnte.

Lg, M0rgenstern


EDIT 3:

Durch auskommentieren bin ich zu dem Ergebnis gekommen, dass der Fehler in dieser Zeile zu liegen scheint:

Code: [AUSKLAPPEN]
ElseIf Spieler\PGewWaffe\WMunition > 0 Then


Wie gesagt: Er SCHEINT da zu liegen. Ich hab mal die andere Bedingung komplett ausgeklammert und der MAV tritt immernoch auf.
Obs aber wirklich die Zeile ist kann ich nicht mit Sicherheit sagen.
Vielleich hilft das nur mal weiter.


Lg, M0rgenstern


EDIT 4:

FEHLER GEFUNDEN!!!!!!!

Es tut mir leid. Der Fehler war so dumm.
Weiß nicht, warum mir das nicht aufgefallen ist.

Man sehe sich die FUnktion an:

Code: [AUSKLAPPEN]

Function SpielerSchuss()
   
   If ((Spieler\PSchuTimer + Spieler\PGewWaffe\WKadenz) < MilliSecs()) And Spieler\Dead <> 1 Then
      If MouseDown(1) Then
            
               

         If Spieler\PGewWaffe\WMunition <= 0 Then ;Überprüfen ob überhaupt noch eine Kugel im Lauf ist
               Spieler\PGewWaffe\WMunition = 0 ;Damit auf jeden Fall von 0 an gerechnet wird
                  
               If Spieler\PGewWaffe\WMagazine > 0 Then
                  Spieler\PGewWaffe\WMunition = Spieler\PGewWaffe\WMunition + Spieler\PGewWaffe\WSchussProMagazin ;Waffe nachladen, wenn das Magazin leer war
                  Spieler\PGewWaffe\WMagazine = Spieler\PGewWaffe\WMagazine - 1 ;Ein Magazin weniger
               EndIf
               
         ElseIf Spieler\PGewWaffe\WMunition > 0 Then
                  
            If Spieler\PGewWaffe = PW_Schrot
                   
               For i = 1 To 5 ;Schrotflinte... Damit es ne schöne Streuung gibt
                        
                  Schuss.TPlayerSchuss = New TPlayerSchuss
                        
                  Schuss\PSy# = Spieler\Py#-Cos(Spieler\PWinkel)*Schuss\PSGeschw
                  Schuss\PSx# = Spieler\Px#-Sin(Spieler\PWinkel)*Schuss\PSGeschw
                  Schuss\PSWinkel = Spieler\PWinkel+Rand(-23,23)
                  Schuss\PSImage = PistSchuss
                  SChuss\PSDead = 0
                  Schuss\PSGeschw = Spieler\PGewWaffe\WSpeed
                        

               Next
                     
               Spieler\PGewWaffe\WMunition = Spieler\PGewWaffe\WMunition - 1
               If Spieler\PGewWaffe\WMunition < 0 Then Spieler\PGewWaffe\WMunition = 0
               
            Else
                  
               Schuss.TPlayerSchuss = New TPlayerSchuss ;Ansonsten schießen
                  
               Schuss\PSy# = Spieler\Py#-Cos(Spieler\PWinkel)*Schuss\PSGeschw
               Schuss\PSx# = Spieler\Px#-Sin(Spieler\PWinkel)*Schuss\PSGeschw
               Schuss\PSWinkel = Spieler\PWinkel
         
               Schuss\PSImage = PistSchuss
               Schuss\PSDead = 0
               Schuss\PSGeschw = Spieler\PGewWaffe\WSpeed
               Spieler\PGewWaffe\WMunition = Spieler\PGewWaffe\WMunition - 1
               If Spieler\PGewWaffe\WMunition < 0 Then Spieler\PGewWaffe\WMunition = 0 ;Nochmal extra überprüfen dass nichts unter 0 geht
            EndIf
            
            
         EndIf
         

      
      
         
         
         Schuss\PSDead = 0
         
         Spieler\PSchuTimer = MilliSecs()
      EndIf
   EndIf
         

End Function


Und dann schaue man etwas genauer hin:

Code: [AUSKLAPPEN]
               If Spieler\PGewWaffe\WMunition < 0 Then Spieler\PGewWaffe\WMunition = 0 ;Nochmal extra überprüfen dass nichts unter 0 geht
            EndIf
            
            
         EndIf
         

      
      
         
         
         Schuss\PSDead = 0
         
         Spieler\PSchuTimer = MilliSecs()
      EndIf
   EndIf


Und dann sieht man, dass die Variable Zitat:
Schuss\PSDead
auch auf 0 gesetzt wird, wenn gar kein neuer Schuss erstellt wurde, da dieser Befehl außerhalb der IF Anweisungen liegt.

Ist geändert, Fehler gitbs nicht mehr und es funktioniert.

Liebe Grüße, M0rgensten Smile

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group