Arry out of bounds ! Warum ?
Übersicht

![]() |
DottakopfBetreff: Arry out of bounds ! Warum ? |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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! |
||
![]() |
DottakopfBetreff: . |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() |
DottakopfBetreff: . |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
kuk doch im debugger mal nach der vaiable info\schild_x | ||
![]() |
Dottakopf |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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! |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group