Wieder einmal Dim Probleme

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Ziggy

Betreff: Wieder einmal Dim Probleme

BeitragSo, Dez 09, 2007 8:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe den Editor für 2d-Tilemaps recoded, um ihn für mein jump 'n' run zu nutzen.

Alles funktioniert gut, bis auf folgendes:

Im Beispielcode wird ein Dim-Feld der Größe (10,10) angelegt. Ich möchte aber für X mehr als 10 Felder, weil Jump 'n' Run brauch halt mehr. Ich habe dann die Größe auf (10,20) geändert und bekam die Fehlermeldung "Array Index out of bound". Dann hab ich rumprobiert und festgestellt dass ich die Größe maximal auf (10,11) ändern kann bis der Fehler kommt.
Ich versteh das einfach nicht.

Mein Code:

Code: [AUSKLAPPEN]

Dim tiles(6)
For x=0 To 5
   tiles(x) = LoadImage("tile"+Str$(x)+".png")
Next

Dim level(10,12)

For x=0 To 9
   For y=0 To 11
      level(x,y)=0
   Next
Next

While ende = 0
Cls

If KeyHit(1) Then
   file = WriteFile(Str$(levelname$)+".dat")
   For y=0 To 9
      For x=0 To 11
         WriteLine file,level(x,y)
      Next
   Next
CloseFile file
ende = 1
EndIf

If KeyHit(2) Then tile = 1
If KeyHit(3) Then tile = 2
If KeyHit(4) Then tile = 3
If KeyHit(5) Then tile = 4
If KeyHit(6) Then tile = 5

If MouseDown(2) Then
   tile = tile + 1
   If tile = 6 Then tile = 1
EndIf

If MouseX()<12*30 Then mx=MouseX()/30
If MouseY()<10*30 Then my=MouseY()/30

If MouseDown(1) Then
   level(mx,my) = tile
EndIf


For y=0 To 9
   For x=0 To 11
      DrawImage tiles(level(x,y)),x*30,y*30
      Color 189,189,189
      Rect x*30,y*30,30,30,0
   Next
Next

DrawBlock tiles(tile),mx*30,my*30

Color 255,0,0
Rect mx*30,my*30,30,30,0

DrawImage btn_new,0,gfxHeight-ImageHeight(btn_new)
DrawImage btn_open,0+ImageWidth(btn_new),gfxHeight-ImageHeight(btn_open)
DrawImage btn_save,0+ImageWidth(btn_new)+ImageWidth(btn_save),gfxHeight-ImageHeight(btn_new)


Flip
Wend
End


Hier tritt der Fehler auf:

Code: [AUSKLAPPEN]

DrawImage tiles(level(x,y)),x*30,y*30


Ich hab mir schon überlegt ob vielleicht die Bildschirmbreite von 800 px nicht ausreicht, aber meiner rechnung nach sind 12*30 = 360, muss also funktionieren, tut es aber nicht.

Danke schon mal für eure Unterstützung.

Gruß.

Edit: Code-Tags scheinen nicht zu funktionieren??
  • Zuletzt bearbeitet von Ziggy am So, Dez 09, 2007 12:52, insgesamt einmal bearbeitet
 

TeDy14

Gast

BeitragSo, Dez 09, 2007 9:51
Antworten mit Zitat
Hallo

So wie ich das jetzt gesehen hab sieht es so aus als ob du y vergrößern willst und nicht x...
DU hast doch im Dimfeld die erste Var x angegeben und der zweiten y ... dann würde ich auch mal x größer machen und nicht y Wink
 

Ziggy

BeitragSo, Dez 09, 2007 10:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist nicht das Problem... Egal welche Variable ich ändere, es geht nur bis max. 11, alles drüber kommt halt die Fehlermeldung.

Edit:
Weitere Ungewöhnichkeit festgestellt: wenn die x-Koordinate meines Dim-Feldes um 2 größer ist als die y-Koordinate kommt die Fehlermeldung "Array Index out of bounds". Beispiel: Dim(7,8) funktioniert, Dim(7,9) nicht.
"Es gibt 10 Arten von Menschen: Diejenigen die Binär verstehen, und jene die es nicht verstehen."

"Irren ist menschlich, gut dass ich ein Gott bin... xD"

letzte Informatik-Note : 1 ... 96% richtig, Thema: C++ switch/case

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Dez 09, 2007 12:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Deine Codetags funktionieren nicht, weil dein erster Codeabschnitt kein richtig geschlossenes Tag hat. Da fehlt die ] -Klammer am Ende.

Zu deinem Problem:

- Du verwechselst x mit y, was das Problem verursacht. Dim level(10,12) und dann einmal For x=0 To 9, For y=0 To 11 und später nochmal For y=0 To 9, For x=0 To 11...

- Ich würde auch die Zeile If tile = 6 Then tile = 1 eher lieber so If tile >= 6 Then tile = 1 machen.

- Ausserdem hast du bereits von 0 an Bilder gespeichert, du setzt aber hier auf 1, wenn überschritten wird If tile = 6 Then tile = 1.

- Ich würde auch auf solche Kombination verzichten If MouseX()<12*30 Then mx=MouseX()/30.... Dann doch lieber gleich vorsetzen und dann filtern. Ähnlich wie:

Code: [AUSKLAPPEN]
mx=mousex()/30
my=mousey()/30
If mx>12 Then mx=12
If my>10 Then my=10
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

Ziggy

BeitragSo, Dez 09, 2007 12:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich danke dir, hectic.

Mein gröbster Fehler war das vertauschen der x,y-Koordinate beim zeichnen der Bilder:

Code: [AUSKLAPPEN]


DrawImage tiles(level(y,x)),x*32,y*32



Das konnte natürlich nicht funktionieren, und ich habs einfach übersehen.


Gruß.
"Es gibt 10 Arten von Menschen: Diejenigen die Binär verstehen, und jene die es nicht verstehen."

"Irren ist menschlich, gut dass ich ein Gott bin... xD"

letzte Informatik-Note : 1 ... 96% richtig, Thema: C++ switch/case

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group