[VB 6] Problem mit For

P31

Member
ID: 346248
L
24 März 2009
13
0
Ich habe schon in 2 anderen Foren gefragt, aber noch keine Antwort auf meine Frage erhalten. Hier ist der Originale Thread meines Problems:


Hallo Leute,
Ich hab gestern angefangen eine kleine Engine zu Programmieren, die mit hilfe der BitBlt API-Funktion Texturen in eine PictureBox zeichnet.

Mein Problem ist jetzt folgendes:
Ich habe eine TexturenMap die so aussieht:

123
456
789

Jede Zahl steht für eine Textur, die dann vom Programm geladen wird.
Das Koordinaten System ist so aufgebaut:

Bei Zahl 1:
X=0
Y=0
Bei Zahl 2:
X=1
Y=0

Und so weiter.....

Ich habe zum "Rendern" der Map eine kleine Funktion programmiert, in der For-Schleifen durchlaufen. Ich scheine aber irgendwo einen Fehler gemacht zu haben.

Hier der Code der Funktion:
Code:
Dim mapdata As String
Dim Mapchunk() As String
mapdata = txt_ReadAll(Path)
Mapchunk = Split(mapdata, vbNewLine)
Dim x As Long
x = Len(Mapchunk(0))
Dim y As Long
y = UBound(Mapchunk) + 1
frmRender.Max_X = x
frmRender.Max_Y = y
Dim a As Long
Dim b As Long
a = 0
b = 1
For a = 0 To y '+ 5
For b = 0 To x 'y - 1
frmRender.Label1.Caption = "X:" & x & " Y:" & y
Dim chunk As String
chunk = Mid(Mapchunk(b), a + 1, 1)
Call Print_Texture(chunk, b * 20, a * 20, 20, 20, 1)
Next b
Next a
Print_BG

Und für die, die es interressiert hab ich auch die komplette Source mit den Texturen, usw. Hochgeladen:
https://pprojects.de/filez/2D_Engine.rar

Ich hoffe auf schnelle Hilfe ;)
 
Huch, sorry ^^

Mein Problem ist es, dass die Maps meißt ned ganz gerendert werden.
Also manchmal fehlen in der Y Achse die hälfte der Felder :(

Btw hab ich mir was neues erarbeitet:
Code:
Dim mapdata As String
Dim Mapchunk() As String
Dim tempx As Long
Dim tempy As Long
Dim a As Long
Dim b As Long
Dim tmp As String
Dim chunk As String
mapdata = txt_ReadAll(Path)
Mapchunk = Split(mapdata, vbNewLine)
tempx = Len(Mapchunk(0))
tempy = UBound(Mapchunk)
frmRender.Max_X = tempy
frmRender.Max_Y = tempx
For a = 0 To UBound(Mapchunk)
    tmp = Mapchunk(a)
    For b = 1 To Len(tmp)
        chunk = Mid(tmp, b, 1)
        Call Print_Texture(chunk, a * 20, y * 20, 22, 28, 1)
    Next b
Next a
Print_BG

Die Funktion Print_Texture:
Code:
Public Function Print_Texture(id As String, x As Long, y As Long, w As Long, h As Long, cset As Integer)
On Error Resume Next
frmRender.tmp.Picture = frmRender.clear.Picture
frmRender.tmp_Mask.Picture = frmRender.clear.Picture
frmRender.tmp.Picture = LoadPicture(App.Path & "/Data/Textures/" & cset & "/" & id & ".bmp")
frmRender.tmp_Mask.Picture = LoadPicture(App.Path & "/Data/Textures/" & cset & "/" & id & "_M.bmp")
Call BitBlt(frmRender.bg.hDC, x, y, w, h, frmRender.tmp_Mask.hDC, 0, 0, BIT_AND)
Call BitBlt(frmRender.bg.hDC, x, y, w, h, frmRender.tmp.hDC, 0, 0, BIT_COPY)
End Function

Ich hoffe, ihr könnt mir helfen ._.
 
Bau in die innerste for-Schleife eine Debug-Ausgabe der Koordinaten ein, dann siehst du schnell, was schief läuft. Vom Code-angucken oder In-Foren-fragen kriegst du den Fehler nicht gefunden.

Analysiere die Ausgabe, steppe durch das Programm und beobachte die Variablen. Erstell dir einen Plan (auf Papier), wie der Ablauf und die Werte zu jedem Zeitpunkt sein soll und vergleiche ihn.
 
Das hab ich ja alles schon gemacht ^^
Habe auch schon andere die ich so kenne gefragt. Wissen alle nichts.
Die Variablen werden Korrekt ausgegeben und gespeichert. Jedoch weigert sich das Programm die Karte Ordnungsgemäß darzustellen :(
 
Wird die Karte denn korrekt ausgegeben, wenn du statt zeichnen, einfach nur Text-Symbole nimmst? Falls ja, ist der Fehler in Print_Texture() zu suchen.
 
Print_Texture Funktioniert.
Ich habe es schonmal versucht, eine Karte ohne For-Schleife zu zeichnen. Die Karte wurde dann mit vielen Print_Texture() Aufrufen geneieriert. Ohne Fehler.
Ich Persönlich vermute aber immernoch, dass die For-Schleife den Fehler Beeinhaltet
 
Ich habe es schonmal versucht, eine Karte ohne For-Schleife zu zeichnen. Die Karte wurde dann mit vielen Print_Texture() Aufrufen geneieriert. Ohne Fehler.
Gut. Dann kannst du sicher folgern, dass der Fehler in der for-Schleife steckt.

Also geh weg von Print_Texture(), kommentier die aus, damit sie nicht nervt und gib die Map mittels der Schleifen textuell auf der Debug-Konsole aus.
 
Okay werde ich machen.
Ich fahre jetzt gleich nach hause (Praktikum als Programmierer, bin noch im Büro). Werde dann morgen oder so mal posten obs geklappt hat (Zu hause kein Internet, weil ich ab Donnerstag ne 16k Leitung hab).
Nochma vielen Dank ^^
 
So ich hab gestern wieder einmal 2 Stunden an der Source gesitzt.
Ich hab mir die map im ASCII Format wiedergeben lassen, und mir ist aufgefallen, dass die Map genau wie im Original (Also richtig) dargestellt wird.
Ich habe jetzt mal den SourceCode Download den man in meinem ersten Post sieht updated. Wenn jemand Lust hat kann er sich es mal anschauen und mit vielleicht helfen :(
 
In dem Code in dem Archiv steht ja auch in open_Map() drin, dass
Code:
chunk = "2"
. Logisch zeigt der damit immer dieselbe Grafik :ugly:
Ändert man das, funktioniert auch alles (außer, dass der Baum viel zu groß is).

Tipp: Wenn du nicht ordentlich deinen Code einrückst und übersichtlich machst, fällt es dir freilich schwerer, einen Fehler zu finden und - wichtiger - wenn den Code jemand anders lesen muss, wird der dran verzweifeln 8O
 
Ich habe chunk="2" nur geschrieben, da sonst immer out of Range Fehler kommen -.-
Und nach dem chunk="2" ist ein Kommentar.
Lösche "2" und lösch das '.
Und das die Funktion was darstellt ist mir bewusst, jedoch zu wenig. Schau dir mal die Datei 1.map an.
Dann siehste wie groß die Felder sein müssen :S

Btw, der Baum ist mit Absicht so groß, da ich den so von nem anderen Chipset gerippt hab. Ich werde den bald noch in 20x20 Grafiken aufteilein
 
So, das Problem hat sich gelöst.
Bitte Topic Löschen oder Closen. Weiß ja nich wie das bei euch gehandhabt wird ^^
 
Bitte Topic Löschen oder Closen. Weiß ja nich wie das bei euch gehandhabt wird ^^
Keines von beiden. Der Threadersteller postet die Lösung - fehlt noch - und somit können auch andere Leute davon profitieren, die den Thread verfolgt haben oder ihn nachträglich noch lesen möchten.
 
Ah, gut. Also hier die Lösung:

Das männchen war 28x20 groß. Die Texturen jedoch nur 20x20.
Einfach die Texturen bisschen vergrößern und schon hat man das Problem gelöst ;)