[GELÖST] Drawimage Fehler?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

CO2

ehemals "SirMO"

Betreff: [GELÖST] Drawimage Fehler?

BeitragDi, Feb 14, 2012 17:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
Hab schon wieder ein Problem Embarassed :
Also ich möchte 3 bilder auf den Bildschirm malen, jedes 32 x 32 px groß. Die Entsprechenden Koordinaten werden aus einem Definitions-File ausgelesen. Dieser enthält je x und y koordinate. Diese werden in einem Type gespeichert. Und dann in eine Liste gepackt. Nun lasse ich die bilder wie folgt malen:
BlitzMax: [AUSKLAPPEN]
Function update()
Local zaehler:Int = 0
For Local x:TBlock = EachIn(BlockList)
x.Draw()
Next
End Function
"TBlock" ist der Type der das Bild speichern soll,
"BlockList" ist die liste in der alle types gespeichert wurden
"zaehler" ist eine kontrollvariable (um zu sehen, ob auch alle 3 blöcke in die liste eingetragen wurden)
"Draw()" ist eine Methode des Typs "TBlock", dessen Code wie folgt aussieht:
BlitzMax: [AUSKLAPPEN]
Type TBlock
Field PosX:Int
Field PosY:Int
Method Draw()
DrawImage(block, Self.PosX, Self.PosY)
End Method
End Type
Global BlockList:TList = CreateList()


Die Kontrollvariable ("zaehler") gibt die richtige zahl zurück: 3, d.h.: Die Definitionsdatei wurde richtig gelesen. woran kann es liegen, das trotzdem nur 1 Bild gemalt wird, obwohl ja offensichtlich alle 3 listeneinträge durchgegangen werden?

Hier mal der Code, der in der Hauptschleife steht:
BlitzMax: [AUSKLAPPEN]
	Flip 0
DrawImage(hp, 0, 0)
DrawImage(shield, 100, 0)
DrawImage(score, (screenwidth - 196), 0)
DrawImage(bg, 0, 0)
steuerung()
update()


Ich hoffe ihr könnt mir helfen.

EDIT: Und noch schnell ne Frage hinterher Wink : Wie kann ich Bilder drehen? Bei dem Befehl "SetRotation" weiß ich nicht, wie ich nur 1 Bild ansprechen kann Embarassed
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 Di, Feb 14, 2012 21:44, insgesamt einmal bearbeitet

ChaosCoder

BeitragDi, Feb 14, 2012 17:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Denk an die Zeichenreihenfolge!

BlitzMax: [AUSKLAPPEN]
DrawImage(hp, 0, 0)
DrawImage(shield, 100, 0)
DrawImage(score, (screenwidth - 196), 0)
DrawImage(bg, 0, 0)
bedeutet, dass du erst die Lebenspunktanzeige, dann das Schild, dann die Punkte und zuletzt das Hintergrundbild zeichnest. Und da das Hintergrundbild wahrscheinlich so groß ist, das es alle anderen vorher gezeichneten Bilder überdeckt, siehst du die anderen Bilder nicht mehr.

Drehe also einfach mal deine Zeichenreihenfolge um.


Nun zum Drehen von Bildern. SetRotation ist ganz richtig.
Wenn ein Bild mit DrawImage gezeichnet wird, dann berechnet es die aktuell gesetzt Rotation mit ein. Willst du also ein Bild gedreht zeichnen, rufst du vorher SetRotation mit dem gewünschten Winkel auf, zeichnest das Bild mit DrawImage und setzt die Rotation wieder auf 0 mit SetRotation(0).

Das gleiche gilt für SetColor, SetAlpha, etc.
Projekte: Geolaria | aNemy
Webseite: chaosspace.de
 

CO2

ehemals "SirMO"

BeitragDi, Feb 14, 2012 18:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Trotz der geänderten zeichnen - Reihenfolge werden immernoch 2 von 3 Bildern nicht gemalt (aber zumindest die anzeigen für hp, score und shield sind wieder da Wink )
Es wird immernur der letzte block gezeichnet... Woran könnte das liegen.

Wegen dem SetRotation(): Erstmal danke, es funktioniert, kann man irgendwie den Drehpunkt ändern? Also es wird ja immer oben rechts gedreht, kann man das auch ändern, das es in der mitte gedreht wird?
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

ZEVS

BeitragDi, Feb 14, 2012 18:39
Antworten mit Zitat
Benutzer-Profile anzeigen
MidHandleImage/SetImageHandle.
Zitat:
BlitzMax: [AUSKLAPPEN]
Type TBlock
Field PosX:Int
Field PosY:Int
Method Draw()
DrawImage(block, Self.PosX, Self.PosY)
End Method
End Type

Woher gibt es die Variable "block"?
Zitat:
BlitzMax: [AUSKLAPPEN]
Function update()
Local zaehler:Int = 0
For Local x:TBlock = EachIn(BlockList)
x.Draw()
Next
End Function

Der Zähler wird nicht erhöht.
Hast du wirklich deinen Code gepostet oder nur einen Teil, der keinen Fehler enthält. Im Zweifelsfall ist DebugLog dein Freund.

ZEVS
 

CO2

ehemals "SirMO"

BeitragDi, Feb 14, 2012 18:45
Antworten mit Zitat
Benutzer-Profile anzeigen
"block" ist das Bild vom Block Wink

Zum dem sich nicht erhöhenden Zähler: Embarassed hab ich wohl ein wenig vom Code abgeschnitten...
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

BeitragDi, Feb 14, 2012 19:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Für Bilder benutze ich immer AutoMidHandle(True), du kannst aber auch SetImageHandle für einzelne Bilder und SetHandle für alles, was kein Bild ist, verwenden.

Was das Zeichnen betrifft: Wurden die Werte richtig gelesen? Sind die Werte innerhalb des Bildschirms? Da gibt es ewig viele Möglichkeiten.

Und die Liste & Funktion würde ich direkt in den Type verlagern, falls das nicht durch Kürzungen anders aussieht...
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

BeitragDi, Feb 14, 2012 20:41
Antworten mit Zitat
Benutzer-Profile anzeigen
ich kann immer nur raten, viel mehr mit Debugloging zu arbeiten. Bei BlitzMax genügt hier ein simpler...
BlitzMax: [AUSKLAPPEN]
Print Self.PosX + " " + Self.PosY

... der gleich beim ersten Schreiben des Codes mit aufgenommen wird und in meinen Programmen oft solange bleibt, bis das Projekt fertiggestellt ist.

Also bei mir sähe der Coce dann so aus:
BlitzMax: [AUSKLAPPEN]

Global BlockList:TList = CreateList()

Repeat
DrawImage(hp, 0, 0)
DrawImage(shield, 100, 0)
DrawImage(score, (screenwidth - 196), 0)
DrawImage(bg, 0, 0)
steuerung()
update()
Flip 0
WaitKey()
Until....


...
Function update()
Print "UPDATE"
Local zaehler:Int = 0
For Local x:TBlock = EachIn(BlockList)
Print " Objekt Nr=" + Zaehler
x.Draw()
Next
End Function


Type TBlock
Field PosX:Int
Field PosY:Int
Method Draw()
DrawImage(block, Self.PosX, Self.PosY)
Print " DRAW=" + Self.PosX + " " + Self.PosY
End Method
End Type


Oft ist nämlich der Fehler ganz wo anders zu suchen. Möglicherweise sind die Koordinaten schon beim Einlesen nicht korrekt gelesen worden... Möglicherweise liegen zwei Objekte übereinander. Der PRINT-Befehl zeigt aber eindeutig, ob und wann etwas gezeichnet wurde.

Mit solchen PRINT-Befehlen kann man Fehler viel schneller entdecken.
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
 

CO2

ehemals "SirMO"

BeitragDi, Feb 14, 2012 21:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Alles klar, Habe mir mal mit Print alles ausgeben lassen und so wie es aussieht wird alles korrekt eingelesen, allerdings beim einfügen in den Type irgenwie kreuz und quer vermischt... Hier mal die Laderoutine:

BlitzMax: [AUSKLAPPEN]
Function ReadLVLData(File:String)
Local RFile:TStream = ReadFile(File)
Local Line:String
Local TempBlock:TBlock = New TBlock
Local TempElephant:TElephant = New TElephant
Repeat
Line = Trim(ReadLine(RFile))
If(Left(Line, 5) = "BLOCK")
Local Params:String[100]
ReadParams(Line, 2, Params)
TempBlock.PosX = Int(Params[0])
TempBlock.PosY = Int(Params[1])
ListAddLast(BlockList, TempBlock)
ElseIf(Left(Line, 6) = "SPAWNER")
Local Params2:String[100]
ReadParams(Line, 2, Params2)
TempBlock.PosX = Int(Params2[0])
TempBlock.PosY = Int(Params2[1])
ListAddLast(BlockList, TempBlock)
ElseIf(Left(Line, 8) = "ELEPHANT")
Local Params3:String[100]
ReadParams(Line, 3, Params3)
TempElephant.PosX = Int(Params3[0])
TempElephant.PosY = Int(Params3[1])
TempElephant.Typ = Int(Params3[2])
ListAddLast(ElephantList, TempElephant)
EndIf
Until Eof(RFile)
End Function

(Die Funktion ReadParams habe ich selber geschrieben, sie ließt die Parameter aus einer Zeile;
BlockList enthält alle Blöcke)
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

Midimaster

BeitragDi, Feb 14, 2012 21:28
Antworten mit Zitat
Benutzer-Profile anzeigen
jetzt ist alles klar: du liest die "Block"-Abschnitte der Datei in immer wieder das selbe typ-objekt TempBlock.

Du musst das NEW in die Schleife holen:

BlitzBasic: [AUSKLAPPEN]
...	Repeat
Line = Trim(ReadLine(RFile))
If(Left(Line, 5) = "BLOCK")
Local TempBlock:TBlock = New TBlock
Local Params:String[100]


mit DEBUGGING Wink würde ich die Funktion übrigens so schreiben:

BlitzBasic: [AUSKLAPPEN]
Function ReadLVLData(File:String)
Print "READ"
Local RFile:TStream = ReadFile(File)
Local Line:String
Local TempBlock:TBlock = New TBlock
Local TempElephant:TElephant = New TElephant
Repeat
Line = Trim(ReadLine(RFile))
Print " Line= " + Line
If(Left(Line, 5) = "BLOCK")
Local Params:String[100]
ReadParams(Line, 2, Params)
Print " Block Values = " + Int(Params[0] + " " +Int(Params[1]
TempBlock.PosX = Int(Params[0])
TempBlock.PosY = Int(Params[1])
ListAddLast(BlockList, TempBlock)
ElseIf(Left(Line, 6) = "SPAWNER")
Local Params2:String[100]
ReadParams(Line, 2, Params2)
Print " Spawner Values = " + Int(Params[0] + " " +Int(Params[1]
TempBlock.PosX = Int(Params2[0])
TempBlock.PosY = Int(Params2[1])
ListAddLast(BlockList, TempBlock)
ElseIf(Left(Line, 8) = "ELEPHANT")
Local Params3:String[100]
ReadParams(Line, 3, Params3)
Print " Elefant Values = " + Int(Params[0] + " " +Int(Params[1]
TempElephant.PosX = Int(Params3[0])
TempElephant.PosY = Int(Params3[1])
TempElephant.Typ = Int(Params3[2])
ListAddLast(ElephantList, TempElephant)
EndIf
Until Eof(RFile)

For Local x:TBlock = EachIn(BlockList)
Print " NACH READ =" + Self.PosX + " " + Self.PosY
Next

End Function

Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Xeres

Moderator

BeitragDi, Feb 14, 2012 21:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst keine 100 Strings im Array reservieren, wenn du nur 2-3 benutzt. Lasse dir ein Array der richtigen Größe zurückgeben.
ListAdd könnte man auch in die New Methode verlagern und es macht sich praktisch immer gut, eine Create-Funktion zu benutzen, um neue Objekte zu erzeugen und Werte zu zu weisen.
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)
 

CO2

ehemals "SirMO"

BeitragDi, Feb 14, 2012 21:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Alles klar, so funktionierts, danke an alle die halfen Wink
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

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group