Memory Access Violation?

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

s_m_w

Betreff: Memory Access Violation?

BeitragDi, Feb 14, 2006 15:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

Ich bin noch relativ neu in sachen bb etc. und hab mich mal an was relativ primitiven versucht:

Code: [AUSKLAPPEN]

Global Grafik, Grafikani, frame, keyhits, x, y
Graphics 640, 480, 16, 1
frame = 0
x = 300
y = 300
timer = CreateTimer(20)
Grafik = LoadImage ("Test.bmp")
Grafikani = LoadAnimImage ("Test.bmp", 20, 20, 0, 4)
While KeyHit(1)=0
  Cls
  Tasten()
  DrawImage Grafikani, x, y, frame
  Flip
Wend

Function Tasten()
  If KeyDown(205)=1 Then
    WaitTimer(timer)
    If frame < 3 Then
    frame = frame +1
    Else
    frame = 0
    End If
    x = x + 5
    Return
  End If
  If KeyDown(203)=1 Then
    WaitTimer(timer)
    If frame > 0 Then
    frame = frame -1
    Else
    frame = 3
    End If
    x = x -5
    Return
  End If
  If KeyDown(200)=1 Then
    WaitTimer(timer)
    If frame < 3 Then
    frame = frame +1
    Else
    frame = 0
    End If
    y = y - 5
    Return
  End If
  If KeyDown(208)=1 Then
    WaitTimer(timer)
    If frame > 0 Then
    frame = frame -1
    Else
    frame = 3
    End If
    y = y + 5
    Return
  End If
End Function


Das soll bewirken das ein männchen auf dem bildschirm angezeigt wird (was ich vorher alles getestet habe etc.) und gesteuert werden kann, dabei sollte man nicht mehrere pfeiltasten gleichzeitig drücken dürfen, dafür eben return, nur wenn ich das ausführe gibt das den error
Code: [AUSKLAPPEN]
Memory Access Violation

Weiß jemand was das bedeutet?
P.S. Wenn ich die iffs aus der funktion in die hauptschleife packe, geht alles.

[edit] bb syntax highlighting geht scheinbar nicht?

Firstdeathmaker

BeitragDi, Feb 14, 2006 15:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Hast du mal den Debugger von BB angeschaltet? Dann wird dir eine genauere Fehlermeldung angezeigt.

Und wenn du hier Code pasten möchtest musst du den normalen "Code" Tag nehmen, der andere ist irgentwie kaputt Wink
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

s_m_w

BeitragDi, Feb 14, 2006 15:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Das passiert bei dem "Waittimer" in einem der iffs sobald man eine taste drückt, hilft mir nicht sehrviel weiter Sad

Firstdeathmaker

BeitragDi, Feb 14, 2006 15:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Ahh, mir aber Wink

Der Timer der von dir erstellt wird, ist nicht als Globale definiert. Deshalb wird er in der Funktion nicht erkannt und es gibt einen MAV.
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

s_m_w

BeitragDi, Feb 14, 2006 15:14
Antworten mit Zitat
Benutzer-Profile anzeigen
also die variable timer als globale? mal gucken ob es geht
[edit] k geht alles und man kann nicht mehr schräg laufen Very Happy Nur jetzt wird das Bild nicht durchgehend gezeichnet, also flackert es stark beim laufen, wie könntre man das hinbekommen, aber trotzdem den timer dalassen damit die frames nicht zuschnell gezeichnet werden?

Firstdeathmaker

BeitragDi, Feb 14, 2006 15:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du etwas, das du im Hauptprogram definierst in einer Funktion benutzen möchtest ohne diese als Funktionsparameter zu übergeben, musst du sie schon als Globale definieren. Benutze aber am besten nur so wenig Globale wie möglich. Auch den Befehl Timer benutze ich z.B. eher garnicht, weil dadurch ja immer das ganze Program angehalten wird.


Das mit den Frames kann man auch anders lösen, definiere eine Zeit/Frame und arbeite mit Millisecs() und eigenen Berechnungen. (Z.b. die Zeit/Schleifendurchlauf ausrechnen [global] und dann für dein Bild eine Variable haben in der du z.B.
DeineVariable = (DeineVariable+VergangeneZeit) Mod ZeitfürAnimation
schreibst, und dann mit
DeineVariable/ZeitfürAnimation*FramesInDerAnimation berechnest welches Frame gerade dran ist.
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image
  • Zuletzt bearbeitet von Firstdeathmaker am Di, Feb 14, 2006 15:21, insgesamt einmal bearbeitet

s_m_w

BeitragDi, Feb 14, 2006 15:19
Antworten mit Zitat
Benutzer-Profile anzeigen
und wie bekomme ich dann die animation nicht so ganz schnell? Also so eher wie eine laufanimation wie man sie kennt und nicht so ein rumgefuchtel.

Firstdeathmaker

BeitragDi, Feb 14, 2006 15:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Kleines Beispiel (Ich weis jetzt nicht ob es funktioniert, bin gerade in der Schule und kann es nicht testen):

Code: [AUSKLAPPEN]

graphics 800,600
setbuffer backbuffer()

global Time
global TimeDiff

type Player
field Frametimer;Zeit
field Image;Das Anim-Bild
field Frames;Anzahl Frames im Bild
field TimeForLoop;Zeit um alle Frames zu durchlaufen
end type

P.Player = new Player
P\Image = Loadimage("Playerimage.png")
P\Frames = KeineAhnung wie viele du da hast...
P\TimeForLoop = 500 ;500 Millisecs pro durchlauf.

;Hauptschleife
repeat
TimeDiff = Millisecs()-Time
Time = Millisecs()

for P.Player = each Player
 P\Frametimer = (P\Frametimer + TimeDiff) mod P\TimeForLoop
 local frame = P\Frametimer*P\Frames/P\TimeForLoop
 drawanimimage P\Image,50,50,frame
next

until keyhit(1)
end

www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

s_m_w

BeitragDi, Feb 14, 2006 16:03
Antworten mit Zitat
Benutzer-Profile anzeigen
hm mir wird nicht so ganz klar was das machen soll, da es nicht funktioniert... Schade, sieht professionell aus

5k41

BeitragDi, Feb 14, 2006 16:14
Antworten mit Zitat
Benutzer-Profile anzeigen
ich würde einfach eine Variable in jedem schleifendurchlauf inkrementieren und wenn die variable z.B. 20 ist dann wird das animationsbild gewechselt und die variable wieder auf 0 gesetzt.
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

s_m_w

BeitragDi, Feb 14, 2006 16:30
Antworten mit Zitat
Benutzer-Profile anzeigen
ja aber die animation soll ja nur beim laufen stattfinden und nicht so schnell wie die schleife sondern in soundsovielen sekunden

5k41

BeitragDi, Feb 14, 2006 18:21
Antworten mit Zitat
Benutzer-Profile anzeigen
ja dann machs per ql:millisecs() einfach
Code: [AUSKLAPPEN]

while sonstewas
 
 if millisecs()-milli=>zeit in millisekunden zwischen den bildern then
  frame=frame+1
  nächsterschritt=1
 endif
 if nächsterschritt=1 then
  milli=millisecs()
  nächsterschritt=0
 endif

wend
[/code]
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

Firstdeathmaker

BeitragDi, Feb 14, 2006 18:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab den Code nochmal jetzt zuhause überprüft und verbessert:

Code: [AUSKLAPPEN]
Graphics 800,600
SetBuffer BackBuffer()

Global Time
Global TimeDiff

Type Player
Field Frametimer;Zeit
Field Image;Das Anim-Bild
Field Frames;Anzahl Frames im Bild
Field TimeForLoop;Zeit um alle Frames zu durchlaufen
End Type

P.Player = New Player
P\Image = LoadAnimImage ("Player.PNG", 40, 40, 0, 3)

P\Frames = 3
P\TimeForLoop = 500 ;500 Millisecs pro durchlauf.

;Hauptschleife
Repeat
Cls
TimeDiff = MilliSecs()-Time
Time = MilliSecs()

For P.Player = Each Player
   
 P\Frametimer = (P\Frametimer + TimeDiff) Mod P\TimeForLoop
 Local frame = Floor(Float(P\Frametimer*P\Frames)/P\TimeForLoop)
 Text 10,10,frame
 DrawImage P\Image,50,50,frame
Next
Flip

Until KeyHit(1)
End



Benötigtes Bild (Rechtsklick->speichern unter...)
user posted image
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

s_m_w

BeitragDi, Feb 14, 2006 20:16
Antworten mit Zitat
Benutzer-Profile anzeigen
schick, das hilft mir schon weiter, ein kleineres spiel (ohne sinn aber egal Wink) habe ich dann schon.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group