Arry out of bounds ! Warum ?

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Dottakopf

Betreff: Arry out of bounds ! Warum ?

BeitragMi, Aug 01, 2007 18:01
Antworten mit Zitat
Benutzer-Profile anzeigen
HI Blitzer!

nach ner längeren Progger pause hab ich mich mal wieder dazu aufgerafft an meinen npc weiter zu tüfteln. Bin jetzt au scho soweit, dass ich von schilder auf wirkliche frei umherlaufende npc herangearbeitet hab.
Jetzt hab ich aber ein Problem indem ich einfach nicht den wurm find.

Des mit dem Ansprechen und die laufrouten hab ich hinbekommen jedoch zicken die collisionen. Also ich möchte mit hilfe meines map arry checken ob das jeweilige tile vor ihm begehbar oder nicht begehbar ist. Alle tiles im Tileset mit dem Frame <27 sind begehbar der rest nicht.
Das wird in dieser Zeile gemacht : (schild = bot/npc)

Code: [AUSKLAPPEN]

 If info\schild_richtung  = 1 And map(info\schild_x +1,info\schild_y) < 27 Then
                        info\schild_x = info\schild_x - 32


Ich hab n bisschen rumgetüftelt ab wann bb die fehler meldung "arry out of bonds " ausspukt und wie sich herrausstellte : Sobald einer meiner Npc s sich mehr als 3 tiles von der linken oberen ecke 0/0 entfernt gibts es den fehler. Das müsste doch dann heißen, das hier der arry aufhört ? das kann aber nicht sein da die map da ja auch weiter schön brav die tiles richtig positionniert. demnach da auch noch der arry wirksam ist.

Kann es sein dass sich arrys und types nicht verrtragen ?


Da ich weiß, dass man aus einem code fetzten nicht viel in erfahrung bringen kann , setze ich hier den code rein: (hoffe der ist nicht zu lang)
Code: [AUSKLAPPEN]

Graphics 800,600,16,2
SetBuffer BackBuffer()

SeedRnd MilliSecs()



Global Tileset = LoadAnimImage("wood1.bmp",32,32,0,90)



;globals
Global hx,hy,npc_nr
Global schild_x,schild_y
Global start_index = 1,max_index = 2,schild_text$
Global menu,schild_zeilen
Global zeilen_marke1 = 1,zeilen_marke2 = 4




 Global x,y
 Global draw_x,draw_y
 Global map_offset_x,map_offset_y
 Global map_size_x
 Global map_size_y
 Global a_index,b_index
 Global tele_start_index,tele_max_index




;type
Type schild
 Field schild_x
 Field schild_y
 Field schild_nr
 Field schild_richtung
 Field schild_run_counter
 Field schild_run_interval
 Field run_counter
End Type




;arry
Dim npc_zeilen$(1)
Dim map(0,0)


;map laden
    stream$ = ReadFile( "map\map" + 2 + ".map" )
                 a_index        = ReadLine( stream$ )
                 b_index        = ReadLine( stream$ )
                 tele_start_index = ReadLine( stream )
                  tele_max_index   = ReadLine( stream )
                  map_size_x       = ReadLine( stream$ )
                    map_size_y       = ReadLine( stream$ )
   
;für dieses progi uninterresannt
            b      = nr
            b   = ReadLine( stream$ )
            b   = ReadLine( stream$ )
            b    = ReadLine( stream$ )
            b    = ReadLine( stream$ )

          Dim map( map_size_x, map_size_y )                      ;map arry load
   
             For x = 0 To map_size_x
                   For y = 0 To map_size_y
                 map( x, y ) = ReadLine( stream$ )
              Next
             Next   
      
     CloseFile( stream$ )

 
;schild infos lesen

       For npc_nr = start_index To max_index     

                   
            daten = ReadFile("npc" + npc_nr +".txt")
           
                info.schild = New schild
                  info\schild_x = ReadLine(daten)
                  info\schild_y = ReadLine(daten)
                  info\schild_nr = npc_nr
                  info\schild_richtung = Rnd(1,2)
                  info\schild_run_interval= Rnd(40,100)
                  info\run_counter = Rnd(2,4)
            CloseFile(daten)
 
        Next
      
               
       
       
;main-----------------------------------------------------------
Repeat
Cls

 ;----------------------
 If menu = 0 Then       
       
        map_draw()               
        update_player()
        update_schilder()
       

                       
 ElseIf menu = 3 Then 
        map_draw()
        text_ausgeben()
       
                       
 End If                 
 ;----------------------

  Rect hx,hy,32,32,1


;status
Text 600,300,"zeilen " + schild_zeilen
Text 600,320,"hx " +hx + " hy " + hy
Text 600,340," (1) " +zeilen_marke1 + " (2) " + zeilen_marke2
Text 600,360,"sx " + info\schild_x
Flip
Until KeyHit(1)
;----------------------------------------------------------------



Function update_player()

             If KeyHit(203) Then hx = hx - 32
             If KeyHit(205) Then hx = hx + 32
             If KeyHit(200) Then hy = hy - 32
             If KeyHit(208) Then hy = hy + 32

End Function


Function update_schilder()


            For info.schild = Each schild
            
               info\schild_run_counter = info\schild_run_counter +1
             
               If  info\schild_run_counter  >= info\schild_run_interval  Then
                    info\schild_run_counter = 0
                     info\run_counter = info\run_counter +1
                        
                     If info\schild_richtung  = 1 And map(info\schild_x+1,info\schild_y) < 27 Then
                        info\schild_x = info\schild_x - 32
                         
            
                    ElseIf info\schild_richtung  = 3 Then
                        info\schild_x = info\schild_x + 32
                   
            
                    ElseIf info\schild_richtung  = 4 Then
                        info\schild_y = info\schild_y - 32
                   
            
                     ElseIf info\schild_richtung  = 2 Then
                        info\schild_y = info\schild_y + 32
                   
                      End If
                       
               
                           
               End If
         
                   ;laufen lassen
                     If info\run_counter >= Rnd(2,4) Then
                            info\run_counter = 0
                             info\schild_richtung = info\schild_richtung +1
                             If info\schild_richtung >4 Then info\schild_richtung = 1
                    End If


                    ;collisions check
                    If info\schild_x = (hx +32) And info\schild_y = hy And info\schild_richtung = 1 Then info\schild_richtung = 3
                    If info\schild_x = (hx -32) And info\schild_y = hy And info\schild_richtung = 3 Then info\schild_richtung = 1
                    If info\schild_x =  hx And info\schild_y  = (hy +32) And info\schild_richtung = 4 Then info\schild_richtung = 2
                    If info\schild_x =  hx And info\schild_y  = (hy -32) And info\schild_richtung = 2 Then info\schild_richtung = 4

                   Rect info\schild_x,info\schild_y,32,32,0
             Next



 If KeyHit(57)

                ;Ist hier ein npc feld ?
                For npc_nr = start_index To max_index

                  daten = ReadFile("npc" + npc_nr + ".txt")
                     schild_x = ReadLine(daten)
                     schild_y = ReadLine(daten)
                     schild_zeilen = ReadLine(daten)
         
                  For info.schild = Each schild
               
                    ;links / rechts / oben / unten
                    If hx  = info\schild_x -32 And hy = info\schild_y And info\schild_nr = npc_nr Then  schild_x = info\schild_x -32   schild_y = info\schild_y    Exit
                    If hx  = info\schild_x +32 And hy = info\schild_y And info\schild_nr = npc_nr Then  schild_x = info\schild_x +32   schild_y = info\schild_y    Exit
               If hx  = info\schild_x  And hy = info\schild_y -32 And info\schild_nr = npc_nr Then  schild_x = info\schild_x    schild_y = info\schild_y -32    Exit
                    If hx  = info\schild_x  And hy = info\schild_y +32 And info\schild_nr = npc_nr Then  schild_x = info\schild_x    schild_y = info\schild_y +32   Exit

                  Next
 
                    If hx  = schild_x  And hy = schild_y Then Exit
               
                                                     
                Next

 
               If hx  <> schild_x Or hy <> schild_y Then CloseFile(daten) ;datei schließen wenn kein bot da
               If hx  = schild_x And hy = schild_y Then
           

              ;arry neu dimensionieren /zeilen einlesen
              Dim npc_zeilen$(schild_zeilen)

                For x = 1 To schild_zeilen
                   schild_text$ = ReadLine(daten)
                   npc_zeilen$(x) = schild_text$
                Next
 
                 menu = 3
             
                 CloseFile(daten)

                 
         End If

     

  End If

End Function


Function text_ausgeben()
       
        y = 400
        x2 = 0
      For x = zeilen_marke1 To zeilen_marke2
          Text x2,y,"" +npc_zeilen$(x)
            y = y +20
          
      Next

        If KeyHit(57) Then zeilen_marke1 = zeilen_marke1 +4 zeilen_marke2 = zeilen_marke2 +4
        If zeilen_marke2 > schild_zeilen Then menu = 0 zeilen_marke1 = 1 zeilen_marke2 = 4


End Function

Function map_draw()

      For x = 0 To map_size_x
         For y = 0 To map_size_y
          DrawBlock tileset, x*32 - offset_x, y*32 - offset_y,map(x,y)
        Next
      Next

End Function




Ich hoffe der code verrschreckt euch ned so ^^ wer einen genaueren blick drauf werfen möchte bekommt hier die möglichkeit sich das ding im archiev genauer anzuschauen (map_arry,npc.txt)

https://www.blitzforum.de/upload/uploads.php

~Edit~ ka warum aber ich hab des sauber und ordentlich formatiert eingefügt ... was hier auch wenns editiert wird aufgehoben wird .... sry
mfg Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!

Rone

BeitragMi, Aug 01, 2007 18:41
Antworten mit Zitat
Benutzer-Profile anzeigen
spontan würd ich sagen dass es daran liegt:
Code: [AUSKLAPPEN]
Dim map(0,0)


Edit:
und natürlich "for i=0 to mapX-1"
Code: [AUSKLAPPEN]
For x = 0 To map_size_x-1
                   For y = 0 To map_size_y-1
                 map( x, y ) = ReadLine( stream$ )
              Next
             Next


wenn du...
Code: [AUSKLAPPEN]
Dim map( map_size_x, map_size_y )
...machst.
Der Debugger zeigt dir übrigens die Zeile an!

Dottakopf

Betreff: .

BeitragDo, Aug 02, 2007 11:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Erstmal danke, dass du dich dieser sache angenommen hast !

Jedoch verstehe ich den sinn von -1 ned wirklich, bis dahin gibts ja mit dem arry keine probleme.

der deggbuger bleibt bei dieser zeile stehen:
Code: [AUSKLAPPEN]

If info\schild_richtung  = 1 And map(info\schild_x +1,info\schild_y) < 27 Then
                        info\schild_x = info\schild_x - 32


so änlich überprüfe ich auch mit meinem "hero" die collison auf der tilemap.
Ist da ein fehler drinne ?

mfg Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!
 

ChristianK

BeitragDo, Aug 02, 2007 12:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
map(info\schild_x +1, info\schild_y)

Wenn info\schild_x am rechten Ende der Map / des Arrays ist und du dann noch eins dazuaddierst, geht das natürlich über die Arraygrenze.
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT

Dottakopf

Betreff: .

BeitragDo, Aug 02, 2007 16:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist mir natürlich bewusst... daher gibt mapbegrenzungen (bäume,zäune) das problem ist das diese meldung aber schon kommt, sobald sich mein npc von der linken oberen ecke (also 0/0) mehr als 3 tiles (3*32 pixel) entfernt.. wei man im archiev auch sehen kann. (das ausgefüllte weise ist der "hero" die leeren kästchen sind die npc s beides startet auf 0/0 daher ned am anfang wundern

mfg Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!

Silver_Knee

BeitragDo, Aug 02, 2007 16:27
Antworten mit Zitat
Benutzer-Profile anzeigen
kuk doch im debugger mal nach der vaiable info\schild_x

Dottakopf

BeitragDo, Aug 02, 2007 23:50
Antworten mit Zitat
Benutzer-Profile anzeigen
x und y sind 0 ! Was aber rein logisch nicht sen kann, da sie sich gerade 3 tiles bewegt haben. Von 0/0 weg und demnach können diese unmöglich 0 sein ! jetzt bin ich richtig verrwirt Crying or Very sad

Und da ja nur nach rechts hin geprüft wird können sie sich auch nicht außerhalb des arrys befinden sonlange die npc noch sichbar sind

~Edit~ Oo ich glaub ich hab grad was gemerkt... da stimmt was nicht zwischen reallen pixel koords und den tile koords mal checken ...

Tatsächlich ^^ ich hab versucht die pixel koords im arry unterzubringen der aber die tiles regelt ^^ ---> arry(60,60) versucht npc(128,128) zu finden, einfach doof

aber trotzdem ein großes Danke schön an eure hilfe !!!

~Edit~ eins möchte ich noch hinzufügen : "es ist schon erstaunlich, wie stolz man auf eine solch doofe Ki sein kann"

mfg Dottakpof
Rechtschreibfehler gelten der allgemeinen Belustigung!

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group