Finde meinen Fehler nicht

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Smokie

Betreff: Finde meinen Fehler nicht

BeitragMo, Aug 28, 2006 13:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

ich habe einen doofen Fehler in meinem Code und sehe in nicht. Der Syntax is richtig nur im Context da is ein Fehler und ich seh in einfach net.

Ich habe 2 Bank, inder ich die x und y Positon eines Knotens speichere. (Knoten zum Pathfinden). Ich speicher in einer Variable (Numn) an welcher Stelle die Koordinaten aufhören. Also ich brauche nur 10 byte der 2000 byte großen Bank dann ist numn 5 (später dann 5 * 2). Damit ich net unnötig speicher verschwende überschreibe ich die Knoden für einen Pfad mit den dahinterliegenden. Bei dem Vorgang geht irgendwas schief und die Figur läuft zur falschen Stelle.

Ich hoffe ihr findet meinen Fehler, da wie so oft ich meinen eigenen Fehler net finde.

hier der Code. Mit dem Type für mein Objekt
Code: [AUSKLAPPEN]

Type einheit

   Field id   
   Field typ   
   Field x,y   
   Field leben   
   Field besitzer
   Field xaim,yaim
   Field move   
   Field chosen    

   Field node_start  ; hier wird gespeichert an welcher Stelle er mit dem lesen der Bank beginnen soll
   Field node_pos  ; Aktuelle Leseposition
   Field node_end  ; Leseende
   
End Type


Der Teil an dem die X-Y Koordinate in die Bank geschrieben wird.
Code: [AUSKLAPPEN]

   einheit\node_pos = numn * 2
   DebugLog "Numn " + numn * 2
   einheit\node_start = numn * 2
   
  While tempnode\parent<>Null

   
   PokeShort x_bank,numn * 2,tempnode\x
   PokeShort y_bank,numn * 2,tempnode\y

   tempnode=tempnode\parent

   
   Numn = Numn + 1

  Wend

   PokeShort x_bank,numn * 2,tempnode\x
   PokeShort y_bank,numn * 2,tempnode\y
   
   einheit\node_end = numn * 2
 
     Numn = Numn + 1


Numn ist global.

Hier der Code zum bewegen des Objektes.
Code: [AUSKLAPPEN]

   If RectsOverlap(e\x-1,e\y-1,5,5,e\xaim,e\yaim,1,1) Then
      

      If e\node_pos + 2 < e\node_end Then
         
         e\node_pos = e\node_pos + 2
         
         e\xaim = PeekShort (x_bank, e\node_pos) * 16
         e\yaim = PeekShort (y_bank, e\node_pos) * 16   
         
         rect_x = e\xaim
         rect_y = e\yaim      
         
         
      Else
      
         e\move = 0
                  
      EndIf
            
      
   EndIf


Und jetzt die Funktion die den Speicher verwalten soll, sie wird jedes mal aufgerufen, wenn ein neuer Pfad berechnet wird.
Code: [AUSKLAPPEN]

Function bankverwalten(start,ende) ;start = e\node_start ende e\node_end

   div = (ende - start)

   For i = 0 To 2000 Step 2
   
      If i => start And (2000 - div + i)  < 2001 Then
      
         PokeShort x_bank,i,PeekShort(x_bank,i + div)
         PokeShort y_bank,i,PeekShort(y_bank,i + div)
         
      EndIf
         
   Next
   
   div = (ende - start)
   
   For e.einheit = Each einheit
   
      If e\node_start <> 0 And e\node_start => start / 2 Then      
         
         DebugLog "pos: " + e\node_pos
         DebugLog "Div: " + div
               
         e\node_start = e\node_start - div
         e\node_pos = e\node_pos - div
         e\node_end = e\node_end - div
         
         DebugLog "pos: " + e\node_pos
         DebugLog "Xaim: " + e\xaim
         
         e\xaim = PeekShort (x_bank, e\node_pos) * 16
         
         DebugLog "Xaim: " + e\xaim
         DebugLog "Xaim-after: " + PeekShort (x_bank, e\node_pos + 2) * 16

         
         e\yaim = PeekShort (y_bank, e\node_pos) * 16   
         
      EndIf
   
   Next
   
   numn = numn - div  / 2

End Function


Ich schätze ma das der Fehler in der Funktion ist. Danke schonma im Vorraus.

Grüße
Smokie
M-Soft Studios Mit selbst gemachtem Forum!!!
Unbequem lebt's sich schwer.
Musik macht erst Spaß, wenn man sie mit 2,8 facher Geschwindigkeit hört
Zuletzt bearbeitet von Smokie am Fr Jan 01, 1888 51:58 PM, insgesamt 1000-mal bearbeitet
 

Dreamora

BeitragMo, Aug 28, 2006 14:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei beiden Seiten besteht der gleiche Fehler:

Du schreibst und liest die X und Y Position an die gleiche Position in der Bank, was natürlich nur falsche Resultate liefern kann, ausser sein Zielpunkt war an einer Position wo X und Y identisch waren.

Damit es funktioniert musst du erst X schreiben und dann Y 2 Bytes weiter hinten in der bank.

Konsequenz ist, dass du die Berechnung für die die Position in der Bank andern musst (aktuell ist die ebenfalls falsch), da du 2 Shorts schreibst ist natürlich jede Positionsangabe in der Bank auch 4 Byte lang, nicht 2.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Smokie

BeitragMo, Aug 28, 2006 14:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Achso!! Ich wusste net, dass bei banken sozusagen an der selben Stelle im Speicher sind. Hab gedach du wurden aneinandergehängt oda so. Merkwürdigerweiße hat es aber funktioniert. Naja ich schau ma, dass ich es abändere.

Grüße
SMokie
M-Soft Studios Mit selbst gemachtem Forum!!!
Unbequem lebt's sich schwer.
Musik macht erst Spaß, wenn man sie mit 2,8 facher Geschwindigkeit hört
Zuletzt bearbeitet von Smokie am Fr Jan 01, 1888 51:58 PM, insgesamt 1000-mal bearbeitet

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group