[GELÖST] Irritation bei LoadAnimImage/DrawImage

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

CO2

ehemals "SirMO"

Betreff: [GELÖST] Irritation bei LoadAnimImage/DrawImage

BeitragSa, März 02, 2013 23:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
für ein momentanes Projekt habe ich einen Type THelicopter geschrieben BlitzMax: [AUSKLAPPEN]
Type THelicopter
'### KLASSENVARIABLEN ###
Field Model:TImage
Field PosX:Int
Field PosY:Int
Field Rotation:Int
Field NachwirkungHorizontal:Float
Field NachwirkungVertikal:Float
Field MomFrame:Int
Field ControlLeft:Int
Field ControlRight:Int
Field ControlDown:Int
Field ControlUp:Int
'### KONSTRUKTOR ###
Function Create:THelicopter(Model:String, ModelFrameWidth:Int, ModelFrameHeight:Int, MomFrame:Int = 0, PosX:Int = 0, PosY:Int = 0, ControlUp:Int = KEY_UP, ControlDown:Int = KEY_DOWN, ControlLeft:Int = KEY_LEFT, ControlRight:Int = KEY_RIGHT)
Local TempHeli:THelicopter = New THelicopter
TempHeli.Model = LoadAnimImage(Model, ModelFrameWidth, ModelFrameHeight, 0, 4)
TempHeli.PosX = PosX
TempHeli.PosY = PosY
TempHeli.MomFrame = MomFrame
TempHeli.ControlLeft = ControlLeft
TempHeli.ControlRight = ControlRight
TempHeli.ControlUp = ControlUp
TempHeli.ControlDown = ControlDown
SetImageHandle(TempHeli.Model, 35, 15)
Return TempHeli
End Function
'### METHODEN ###
Method ChangeFrame(NewFrame:Int)
Self.MomFrame = NewFrame
DebugLog("ChangeFrame: MomFrame = " + Self.MomFrame + ", NewFrame = " + NewFrame + "")
End Method
Method StateString:String(AddInfo:String = "")
Return "[" + AddInfo + "] PosX: " + Self.PosX + ", PosY: " + Self.PosY + ", Rot: " + Self.Rotation + ", MomFrame: " + Self.MomFrame + ", NWH: " + Self.NachwirkungHorizontal + ", NWV: " + Self.NachwirkungVertikal + ""
End Method
Method Controls()
Local Operation:Int = 0
'### KEYS ÜBERPRÜFEN ###
If(KeyDown(Self.ControlUp))
If(Self.PosY >= 5)
Self.PosY = Self.PosY - 5
Else
Self.PosY = 0
End If
Self.NachwirkungVertikal = -5
End If
If(KeyDown(Self.ControlDown))
If(Self.PosY <= (GraphicsHeight() - 15))
Self.PosY = Self.PosY + 5
Else
Self.PosY = GraphicsHeight() - 15
End If
Self.NachwirkungVertikal = 5
End If
If(KeyDown(Self.ControlLeft))
If(Self.Rotation < -15)
If(Self.PosX > 35)
Self.PosX = Self.PosX - 5
Else
Self.PosX = 35
End If
End If
If(Self.Rotation > -30)
Self.Rotation = Self.Rotation - 5
Else
Self.Rotation = -30
End If
Self.NachwirkungHorizontal = -10
Operation = 1
End If
If(KeyDown(Self.ControlRight))
If(Self.Rotation > 15)
If(Self.PosX < (GraphicsWidth() - 35))
Self.PosX = Self.PosX + 5
Else
Self.PosX = GraphicsWidth() - 35
End If
End If
If(Self.Rotation < 30)
Self.Rotation = Self.Rotation + 5
Else
Self.Rotation = 30
EndIf
Self.NachwirkungHorizontal = 10
Operation = 2
End If
'### OPERATION (FRAMEWECHSEL RECHTS/LINKS) ###
If(Operation <> 0)
If(Operation = 1)
Self.ChangeFrame(0)
ElseIf(Operation = 2)
Self.ChangeFrame(2)
End If
EndIf


' wird dieser teil auskommentiert, gibt es einen index-out-of-bounds error in der methode draw
' wird dieser teil nicht auskommentiert, wird changeframe immer mit dem parameter 2 ausgeführt
'### FRAMEWECHSEL LINKS (ROTOR) ###
If(Self.MomFrame = 0)
Self.ChangeFrame(1)
ElseIf(Self.MomFrame = 1)
Self.ChangeFrame(0)
ElseIf(Self.MomFrame = 2)
Self.ChangeFrame(3)
Else
Self.ChangeFrame(2)
End If


'### ROTATION/NACHWIRKUNGEN AUSFÜHREN (NUR WENN KEINE TASTE GEDRÜCKT WIRD) ###
If(KeyDown(Self.ControlLeft) <> 1 And KeyDown(Self.ControlRight) <> 1 And KeyDown(Self.ControlUp) <> 1 And KeyDown(Self.ControlDown) <> 1)
If(Self.Rotation <> 0)
If(Self.Rotation < 0)
Self.Rotation = Self.Rotation + 1
EndIf
If(Self.Rotation > 0)
Self.Rotation = Self.Rotation - 1
EndIf
End If
If(Self.PosY <= (GraphicsHeight() - 15))
Self.PosY = Self.PosY + 1
Else
Self.PosY = GraphicsHeight() - 15
End If
If(Self.NachwirkungHorizontal <> 0 And Self.Rotation <> 0)
If(Self.NachwirkungHorizontal < 0)
If(Self.PosX > 35)
Self.PosX = Self.PosX + Self.NachwirkungHorizontal
Else
Self.PosX = 35
EndIf
Self.NachwirkungHorizontal = Self.NachwirkungHorizontal + 0.5
EndIf
If(Self.NachwirkungHorizontal > 0)
If(Self.PosX < (GraphicsWidth() - 35))
Self.PosX = Self.PosX + Self.NachwirkungHorizontal
Else
Self.PosX = (GraphicsWidth() - 35)
EndIf
Self.NachwirkungHorizontal = Self.NachwirkungHorizontal - 0.5
EndIf
End If
If(Self.NachwirkungVertikal <> 0)
If(Self.NachwirkungVertikal < 0)
If(Self.PosY > 15)
Self.PosY = Self.PosY + Self.NachwirkungVertikal
Else
Self.PosY = 15
EndIf
Self.NachwirkungVertikal = Self.NachwirkungVertikal + 0.5
EndIf
If(Self.NachwirkungVertikal > 0)
If(Self.PosY < (GraphicsHeight() - 5))
Self.PosY = Self.PosY + Self.NachwirkungVertikal
Else
Self.PosY = GraphicsHeight() - 5
EndIf
Self.NachwirkungVertikal = Self.NachwirkungVertikal - 0.5
EndIf
End If
End If
End Method
Method Draw()
If(GetRotation() <> Self.Rotation)
SetRotation(Self.Rotation)
EndIf
DrawImage(Self.Model, Self.PosX, Self.PosY, Self.MomFrame)
DebugLog("Draw: MomFrame = " + Self.MomFrame)
End Method
Method Update()
Self.Controls()
Self.Draw()
End Method
End Type


Dieser enthält erstmal nur alle wichtigen Sachen, um den Helicopter zu malen, etc.
Methoden:
- ChangeFrame(NewFrame:Int): Ändert den Momentan anzuzeigenden Frame
- Controls(): Diese Methode fängt die Tastendrücke zur Steuerung des Helis ab. Die Methode funktioniert soweit einwandfrei, nur der Teil zwischen Rem und EndRem nicht so ganz, und das ist auch die Frage (s.u.)
- Draw(): Diese Methode Malt einfach den Helikopter
- Update(): Diese Methode führt die Methoden Controls() und Draw() aus.
Eine Debugausgabe In den Methoden ChangeFrame() und Draw() führt zu folgendem Ergebnis (Ausschnitt) Code: [AUSKLAPPEN]
DebugLog:ChangeFrame: MomFrame = 1, NewFrame = 1
DebugLog:ChangeFrame: MomFrame = 2, NewFrame = 2
DebugLog:Draw: MomFrame = 2
DebugLog:ChangeFrame: MomFrame = 0, NewFrame = 0
DebugLog:ChangeFrame: MomFrame = 2, NewFrame = 2
DebugLog:Draw: MomFrame = 2
DebugLog:ChangeFrame: MomFrame = 0, NewFrame = 0
DebugLog:ChangeFrame: MomFrame = 2, NewFrame = 2
DebugLog:Draw: MomFrame = 2
DebugLog:ChangeFrame: MomFrame = 0, NewFrame = 0
DebugLog:ChangeFrame: MomFrame = 2, NewFrame = 2
DebugLog:Draw: MomFrame = 2
DebugLog:ChangeFrame: MomFrame = 0, NewFrame = 0
DebugLog:ChangeFrame: MomFrame = 2, NewFrame = 2
DebugLog:Draw: MomFrame = 2
DebugLog:ChangeFrame: MomFrame = 0, NewFrame = 0
DebugLog:ChangeFrame: MomFrame = 2, NewFrame = 2
DebugLog:Draw: MomFrame = 2
DebugLog:ChangeFrame: MomFrame = 0, NewFrame = 0
DebugLog:ChangeFrame: MomFrame = 2, NewFrame = 2
DebugLog:Draw: MomFrame = 2
DebugLog:ChangeFrame: MomFrame = 0, NewFrame = 0
DebugLog:ChangeFrame: MomFrame = 2, NewFrame = 2
DebugLog:Draw: MomFrame = 2

(Der Helikopter wurde in der Zeit bewegt)

Im Main-Code wird der Helikopter wie folgt erzeugt BlitzMax: [AUSKLAPPEN]
Include ".bmx\fcn\heli.bmx"

Graphics(1600, 900)
HideMouse()
SetMaskColor(255, 0, 255)

Global Helicopters:THelicopter[3]
Helicopters[0] = THelicopter.Create("data\models\independence.bmp", 71, 30, 0, 0, 0)
Helicopters[1] = THelicopter.Create("data\models\millenium.bmp", 85, 35, 200, 0, 0, KEY_T, KEY_G, KEY_F, KEY_H)
Helicopters[2] = THelicopter.Create("data\models\hunter.bmp", 135, 35, 400, 0, 0, KEY_I, KEY_K, KEY_J, KEY_L)

Global FPS:TTimer = CreateTimer(60)

Repeat
WaitTimer(FPS)
Cls
For x = 0 To 2
Helicopters[x].Update()
Next
Flip
Until KeyHit(KEY_ESCAPE)
End


Meine Frage wäre jetzt: Im Debuglog sieht man, dass ChangeFrame() öfter als erwartet ausgeführt wird. Allerdings stehe ich momentan total auf dem Schlauch, ich bin den gesamten Code schon insgesamt 3 Mal durchgegangen, mir fällt aber kein Fehler auf...
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti
  • Zuletzt bearbeitet von CO2 am So, März 03, 2013 21:02, insgesamt 2-mal bearbeitet

Xeres

Moderator

BeitragSa, März 02, 2013 23:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Bitte entferne entweder die endlosen # Reihen oder füge Leerzeichen ein, damit du nicht das ganze Forenlayout zerstörst - danke.
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)

Midimaster

BeitragSo, März 03, 2013 11:50
Antworten mit Zitat
Benutzer-Profile anzeigen
So wie Dein Code momentan aussieht, ist ja der Aufruf der Methode ChangeFrame völlig wegkommentiert. Was soll das?

Was ich so erraten kann aus dem Code: Es handelt sich um 3 Helikopter? Es gibt nur 4 Frames? Die sollen aber nicht der Reihe nach aufgerufen werden? Also 0-1-2-3? Nein? Irgendwie gibt es zwei Abfolgen 0-1-0-1-... und 2-3-2-3-...?

Mögliche Ursache:
BlitzMax: [AUSKLAPPEN]
		### FRAMEWECHSEL LINKS (ROTOR) ###
If(Self.MomFrame = 0)
Self.ChangeFrame(1)
Else
Self.ChangeFrame(0)
End If


### FRAMEWECHSEL RECHTS (ROTOR) ###
If(Self.MomFrame = 2)
Self.ChangeFrame(3)
Else
Self.ChangeFrame(2)
End If

Im auskommentierten Teil rufst Du bei FRAMEWECHSEL ... (ROTOR) in zwei Varianten ChangeFrame nacheinander für die Möglichkeiten 0 und 2 auf. Allerdings kommt es nie zu deinem 2.Codeteil, denn wenn Self.MomFrame=2 ist oder Self.MomFrame=3 ist, wird es bereits im ersten Abschnitt auf 0 gesetzt!!!
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
 

CO2

ehemals "SirMO"

BeitragSo, März 03, 2013 20:51
Antworten mit Zitat
Benutzer-Profile anzeigen
@ Xeres: Ist geändert.

@ Midimaster:
Zitat:
Irgendwie gibt es zwei Abfolgen 0-1-0-1-... und 2-3-2-3-...?

- Das liegt daran, dass ein Helikopter-Modell wie folgt aussieht:
user posted image
Und sich aus den Aufrufen 0-1-0-1-... Eine "Rotor-Animation" nach rechts ergibt, aus den Aufrufen 2-3-2-3-... eine Animation nach links.

Zitat:
... denn wenn Self.MomFrame=2 ist oder Self.MomFrame=3 ist, wird es bereits im ersten Abschnitt auf 0 gesetzt

- Daran hat es gelegen, der geänderte Code sieht wie folgt aus BlitzMax: [AUSKLAPPEN]
'(...)
If(Self.MomFrame = 0)
Self.ChangeFrame(1)
ElseIf(Self.MomFrame = 1)
Self.ChangeFrame(0)
ElseIf(Self.MomFrame = 2)
Self.ChangeFrame(3)
Else
Self.ChangeFrame(2)
End If
'(...)


Vielen Dank für die Hilfe!
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Xeres

Moderator

BeitragSo, März 03, 2013 23:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist es geschickt, aus dem .bmx Verzeichnis zu inkludieren? Ich hätte angst, dem Compiler dazwischen zu funken oder den ganzen Ordner zu verlieren, da nur temporäre Daten darin vermutet werden.
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)

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group