Memory Access Viotlation wegen Rechnung?

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

M0rgenstern

Betreff: Memory Access Viotlation wegen Rechnung?

BeitragMi, Apr 08, 2009 21:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leute.
Ich habe gerade ein Problem das ich mir nicht erklären kann.
Ich versuche meinen Panzer möglichst realistisch fahren zu lassen und will ihn deshalb in den Kurven bremsen.
Aber ich bekomme nach einiger Zeit einen MAV Error.

Hier der Code wo er drauf zeigt:

Code: [AUSKLAPPEN]

If KeyDown(200) And KeyDown(203) Then
      player\Geschw# = player\Geschw#-Reibung#/10.5
      player\winkel#=player\winkel#-player\DrehB#
      
   EndIf
   
   If KeyDown(200) And KeyDown(205) Then
      player\Geschw# = player\Geschw#-Reibung#/10.5
      player\winkel#=player\winkel#+player\DrehB#
      
   EndIf
If KeyDown(200) Then
      player\Geschw# = player\Geschw#+player\BeschV#
      If Not ChannelPlaying (playerMID) Then
         playerMID = PlaySound (playerM)
      EndIf
         
   Else
      player\Geschw# = player\Geschw#-Reibung#
   EndIf


Achja. Reibung ist 0.5 groß, die Beschleunigung 0.05 und die Höchstgeschwindigkeit 6. Achso die Drehbarkeit liegt bei 1.5.

Xeres

Moderator

BeitragMi, Apr 08, 2009 21:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Welche Zeile markiert der Debugger? Gibt er keine genauere Auskunft?
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

BeitragMi, Apr 08, 2009 21:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Er markiert in diesem Abschnitt :

Code: [AUSKLAPPEN]
   If KeyDown(200) And KeyDown(205) Then
   player\Geschw# = player\Geschw#-Reibung#/10.5
      player\winkel#=player\winkel#+player\DrehB#
     
   EndIf

Diese Zeile:
player\Geschw# = player\Geschw#-Reibung#/10.5

Achso, da fällt mir grade was auf, meine Bremse funktiniert gar nicht:
Code: [AUSKLAPPEN]

   If KeyDown(208) And player\Geschw# > 0 Then
      player\Geschw# = player\Geschw# - player\Brems#
      
   EndIf

Da kann ich auch keinen Fehler erkennen.

Lg, M0rgenstern

Silver_Knee

BeitragMi, Apr 08, 2009 22:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Abgesehen Davon, dass ich mir allerhöchstens vorstellen könnte, dass player=null ist, Reibung realisiert man so:

Geschwindigkeit=Geschwindigkeit+s
Geschwindigkeit=geschwindigkeit*r;r<1

Die beiden zahlen lassen sich anpassen:
G+s=G*r
s=(1+r)G

Geschwindigkeit=s/(1+r) ist dabei die Endgeschwindigkeit. Bei Größerem a beschleunigst du stärker und bei kleinerem r wird die Reibung größer.

M0rgenstern

BeitragMi, Apr 08, 2009 22:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Also. Im Grunde habe ich die Reibung so realisiert.
Ich habe sie wegen der Kurve nur nochmal arg geteilt damit sie den Spieler nicht komplett bremst.
Zur Erinnerung: Reibung=0.5 Beschleunigung=0.05.

Korrigier mich falls ich dich falsch verstehe.
Aber ich sehe nicht wo ich die Reibung falsch angewendet hätte.
Sie ist im ersten Code sogar mit drin:

Else
player\Geschw# = player\Geschw#-Reibung#
EndIf


Edit: Wenn ichs nicht mit Ideal sondern mit Blitz3D laufen lasse passiert folgendes:
Er zeigt auf diese Zeile:

Code: [AUSKLAPPEN]
DrawImage PlayerD(player\winkel#), player\x# , player\y#


Die in diesem Abschnitt steht:
Code: [AUSKLAPPEN]
Repeat
   
   WaitTimer (frametimer)
   Cls
   
   BodenM()
   Steuerung()
   
   
   ;Spieler malen
   DrawImage PlayerD(player\winkel#), player\x# , player\y#
   Text 300,500, "Geschwindigkeit: " + player\Geschw#,1,1
   
   
   
   Flip(0)
Until KeyDown(1)

Die Function Steuerung hab ich ja zum Großteil schon gepostet.

Er beschwert sich bei Blitz3D dann mti der Meldung "Image does not exist"

Tankbuster

BeitragMi, Apr 08, 2009 23:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielleicht solltest du
Zitat:
For player.player=each player
DrawImage PlayerD(player\winkel#), player\x# , player\y#
Next

schreiben.
Ist doch kein Wunder, warum das nicht klappt
Twitter
Download Jewel Snake!
Windows|Android

Xeres

Moderator

BeitragMi, Apr 08, 2009 23:12
Antworten mit Zitat
Benutzer-Profile anzeigen
...nicht wenn es nur eine Instanz vom Player gibt...
Beim "PlayerD(player\winkel#)" sicher das das gesamte Array auch mit Bildern gefüllt ist?
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

BeitragMi, Apr 08, 2009 23:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann erklär mir mal bitte warum das so klar ist?
Es ging ja alles bis ich die Sache mit der Kurve drin hatte... Vorher ist der brav Kurven gefahren nur eben ohne langsamer zu werden... Und ich bekomme diese Fehlermeldung erst nach ein paar Kurven.

Also ich seh wirklich keinen Grund ein "For .. each" einzubauen, da ich nur EINEN Spieler habe der gezeichnet wird. Wenn irgendwann Gegner dazukommen dann muss ich das benutzen aber jetzt nicht.
Ich wüsste wirklich mal gerne warum das bitte so klar ist... Hab ich da etwa übersehen weshalb ich For each benutzen müsste?

Lg, M0rgenstern

Ah Xeper war schneller.

Also das array sieht so aus: Dim PlayerD(360)
Und die Funktion mit dem es gefüllt ist ist: For winkela = 0 to 359

Wenn einige Teile des arrays nicht voll sind ist das doch egal, oder? es ist doch schlimmer wenn es zu viele sind, oder seh ich das falsch?

Edit2:
Fehler gefunden, das muss so aussehen:

Code: [AUSKLAPPEN]
;Drehen:
   If KeyDown(203) Then player\winkel#=player\winkel#-player\DrehB#;links
   If KeyDown(205) Then player\winkel#=player\winkel#+player\DrehB#;rechts
   
   ;Winkel außerhalb?:
   If player\winkel#>=360 Then player\winkel#=player\winkel# Mod 360
   If player\winkel#<0 Then player\winkel#=360+player\winkel#
   
   If KeyDown(200) And KeyDown(203) Then
      player\Geschw# = player\Geschw#-Reibung#/2
      player\winkel#=player\winkel#-player\DrehB#
      
    EndIf
   
   If player\winkel#>=360 Then player\winkel#=player\winkel# Mod 360
   If player\winkel#<0 Then player\winkel#=360+player\winkel#
   
   If KeyDown(200) And KeyDown(205) Then
      player\Geschw# = player\Geschw#-Reibung#/10.2
      player\winkel#=player\winkel#+player\DrehB#
      
   EndIf
   
   If player\winkel#>=360 Then player\winkel#=player\winkel# Mod 360
   If player\winkel#<0 Then player\winkel#=360+player\winkel#


Der Modulus muss immer gerechnet werden wenn irgendws gedreht wird...
.

The_Nici

BeitragDo, Apr 09, 2009 9:36
Antworten mit Zitat
Benutzer-Profile anzeigen
36 Bilder reichen btw völlig aus, also Dim Auto(35), weil niemand die paar Pixel drehung bemerken wird, frisst nur verdammt viel Speicher.

M0rgenstern

BeitragDo, Apr 09, 2009 10:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja das ist mir bewusst.
Ich mach das jetzt nur bis es fertig ist damit ich allgemein mehr Freiraum habe. Die Optimierung kommt später.

Aber Danke.
Lg; M0rgenstern

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group