Editorproblematik bei CheckQuad3D in Schleife [Gelöst]

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

n-Halbleiter

Betreff: Editorproblematik bei CheckQuad3D in Schleife [Gelöst]

BeitragMi, Apr 15, 2009 20:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey Leute!

Ich hab' hier offenbar irgendwo einen Fehler eingebaut. Ich suche ihn jetzt seit grob geschätzten 4 Stunden, komme allerdings nicht dahinter, wo das Problem liegen soll. Ich hoffe hier kann mir jemand helfen.

Code: [AUSKLAPPEN]
For CY=0 To LVLHEIGHT+1
   For CX=0 To LVLWIDTH+1
      AX=-(LVLWIDTH+1)/2*TILESIZE+TILESIZE/2+CX*TILESIZE
      AY=+(LVLWIDTH+1)/2*TILESIZE-TILESIZE/2-CY*TILESIZE
      CheckQuad3D(AX-TILESIZE/2,AY+TILESIZE/2,AX+TILESIZE/2,AY+TILESIZE/2,AX+TILESIZE/2,AY-TILESIZE/2,AX-TILESIZE/2,AY-TILESIZE/2,GLOW)
      If MouseHit3D
         Select C2
            Case 8;Shooter
               If CX=0 Or CY=0 Or CX=LVLWIDTH+1 Or CY=LVLHEIGHT+1
                  If Int(Mid(arg,1,1))=1
                     OBJECTS(Int(Mid(arg,2,1)),Int(Mid(arg,3,1)),1)=CX*$10000+CY
                     arg=""
                  EndIf
                  OBJECTS(CX,CY,0)=8
               EndIf
         End Select
         MouseHit3D=0
      EndIf
   Next
Next


Im Array OBJECTS(X,Y,D) werden die Elementdaten gespeichert, die Globalen "LVLWIDTH", "LVLHEIGHT" und "TILESIZE" sind die Grobdaten des Levels. "CX" und "CY" sind meine Zählvariablen und "AX" bzw. "AY" die Variablen, die die aktuelle Position des Tiles auf dem Feld darstellen (für CheckQuad3D).

Diese Schleife (ich habe die scheinbar funktionierenden Teile herausgekürzt) stellt die Routine für das Positionieren von Elementen in meinem Editor für mein Spiel. Die Schleife geht "über den normalen Bereich" hinaus (d.h. sie macht eben zwei Reihen und Spalten mehr, in denen die "Shooter" platziert werden). In diesem Bereich außerhalb des normalen Levels gibt es nun folgende Problematik: Wenn ich am rechten Rand einen "Shooter" platzieren will, setzt er am linken Rand auch einen, allerdings eine Reihe nach unten versetzt. Und umgekehrt. Zusätzlich kann ich im zweiten Feld von oben links und im zweiten Feld von unten rechts keine Elemente platzieren. Innerhalb des Feldes und am oberen und unteren Rand funktioniert alles so, wie es soll. Confused

EDIT: Da ich zur Zeit auf einer mehrtägigen LAN bin, habe ich noch ein paar der anderen Teilnehmer dazu überredet, dass ich das mal bei ihnen ausprobieren kann; mit dem selben Ergebnis (s.o., an bestimmten Stellen setzt er zwei anstelle von einem "Shooter", an zwei Stellen kann ich überhaupt keine setzen, obwohl es in der Theorie her funktionieren müsste, denke ich. Ich schließe daraus, dass es ein Fehler ist, der irgendwo in einem der Codeteile liegt. Nur wo ist die Frage... Hat wer 'ne Idee?

EDIT 2: Scheinbar ist mein Text von oben so geschrieben, dass er zu Missverständnissen führen kann; ich habe ihn ein wenig umformuliert, um dem entgegenzuwirken. Wink
  • Zuletzt bearbeitet von n-Halbleiter am Do, Apr 16, 2009 22:21, insgesamt 2-mal bearbeitet
 

TerrorMachine

BeitragDo, Apr 16, 2009 9:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Meiner Ansicht nach musst du bei den beiden Schleifen LVLHEIGHT(bzw. DEPTH) - 1 und nicht + 1 rechnen.
Da du ja schon bei 0 anfängst und nicht bei 1. In dieser Konstellation müsstest du bei 2 anfangen (Was aber mir dem Array dann nix bringen würde).
 

n-Halbleiter

BeitragDo, Apr 16, 2009 10:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich fange bewusst bei 0 an bzw. arbeite mich bis zu lvlwidth+1 und lvlheight+1 vor. Ich habe nämlich das Feld, in dem alle anderen Elemente gespeichert werden. An den Rändern, also die Werte mit CX oder CY gleich 0 bzw. gleich lvlwidth+1 und lvlheight+1, werden die "Shooter" gespeichert. Wenn ich jetzt versuche, einen am rechten Rand zu platzieren, dann setzt er mir links auch nochmal einen (s.o.).
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit
Ploing!
Blog

"Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935)

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Apr 16, 2009 11:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie groß hast du denn OBJECTS dimensioniert? Das ist erstmal das wichtigste für uns zu wissen. Das würde vor allem das ''rechts setzen, links erschienen'' erkären.

Generell würde ich auch die Nutzung in dieser Form von CheckQuad3D abraten. Macht die Abfrage am besten über den Weg, wo du deine Map auch einzeichnest. Denn dann kannst du dir sicher sein, dass nicht durcheinander gerät.

Und was sagt denn der Debugger zu deinen Fehler?
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

n-Halbleiter

BeitragDo, Apr 16, 2009 11:15
Antworten mit Zitat
Benutzer-Profile anzeigen
OBJECTS ist auf LVLWIDTH+2,LVLHEIGHT+2,2 (<- die dritte Dmension aufgrund von anderen Daten) dimensioniert, also so, dass es mit der Schleife passt. Ich hatte diese Methode eigentlich bewusst gewählt, da ich meine Funktion DrawLevel, also die, mit der das Level gezeichnet wird, nicht mit "Editor-spezifischem" Code füllen wollte. Was sagt mein Debugger? Gute Frage, nächste Frage... Ich hab' mal nachgeschaut, er sagt an sich nichts ungewöhnliches, nur das, was ich auch sehe: wenn ich rechts was hinsetze, klatscht er's mir links auch nochmal hin. Warum war mir ein Rätsel.

Hat sich allerdings auch eben erledigt. Ich bin durch Zufall eben beim Duschen auf die Lösung gekommen Wink
Danke für die Hilfe!
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit
Ploing!
Blog

"Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935)
 

TerrorMachine

BeitragDo, Apr 16, 2009 21:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich kenn ja deinen vorherigen Code nicht, aber wenn du das so wie oben schreibst, dann kommt doch sowas bei raus:
Eingestellte Levelgröße: 3 (Beispiel)
Schleifendurchlaufzähler: 0 1 2 3 4 (da größe + 1)
Das sind dann 5 und nicht 3 Durchläufe.

Ist mein Gedankengang so falsch?
 

n-Halbleiter

BeitragDo, Apr 16, 2009 22:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Terrormachine, genau das ist doch geplant. LVLWIDTH und LVLHEIGHT sind ja die Größe des 'effektiv nutzbaren Bereiches', also des Bereiches, in dem der eine Teil der Elemente gespeichert wird. Im Randbereich wird der andere Teil gespeichert. Außerdem habe ich das Problem ja schon gelöst. ^^
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit
Ploing!
Blog

"Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935)

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group