Animationswirrwarr bei Bejeweled Clone

Previous topic - Next topic

Heiko

So langsam nähere ich mich der Lösung meines Problems, jedoch scheine ich irgendwo noch einen Denkfehler drin zu haben.

Fakt ist.
Ich habe das Testweise auf ein 1D Feld reduziert.
Beim Löschen eines Spielfeldes sollen die Steine darüber weich runterfallen.

Beim Löschen wird feld[y].ani auf 1 gesetzt und entsprechendes Feld bleibt solange leer.
Bis eben der darüberliegende Spielstein, welchen ich temporär als Wert in feld[y].tmp_farbe speichere auf dem feld angekommen ist.
Anschliessend wird feld[y].ani wieder auf 0 gesetzt, damit wieder der Spielstein statisch gezeichnet wird.


Das Statische Feld bzw. die Spielsteine werden nur gezeichnet, wenn feld[y].ani = 0 ist.
Hier mal der code der Fallroutine.

Code (glbasic) Select
FUNCTION Animation:

FOR y = 1 TO 9
              IF feld[y].ani = 1 
              DRAWSPRITE feld[y].tmp_farbe, feld[y].pos_x, (feld[y].pos_y + feld[y].count)
              feld[y].count = feld[y].count + 0.1
              ENDIF
              IF feld[y].count = 50
              feld[y].count = 0
              feld[y].ani = 0
              ENDIF
NEXT

ENDFUNCTION


Ab und an fällt auch ein Stein, aber von oben kommt nix nach.

Als Anhang mal das komplette 1D Projekt.
Hoffe jemand kann mal drüber schauen.

Heiko

Ich hab das Ganze nun umgeschrieben, aber stehe vor einem Problem, was ich echt nicht verstehe.
Dieser Teil...
Code (glbasic) Select
      IF KEY(57) = 1 AND animation = 0 //Leertaste
         FOR x = 0 TO felder_x
         FOR y = felder_y - 1 TO 1 STEP -1
            IF feld[x][y].farbe <> 0 AND feld[x][y+1].farbe = 0
               animation = -TileSize         //Animation starten
               feld[x][y+1].ani = animation   //Animation starten
               feld[x][y+1].farbe = feld[x][y].farbe
               feld[x][y].farbe = 0
               
            ENDIF
         NEXT
         NEXT
      ENDIF


in einer while true schleife schliesst das fenster beim drücken der space taste

ich hab schon alles andere rausgenommen an code....

insgesamt sieht der code somit so aus...

Code (glbasic) Select
SETSCREEN 500, 500, 0
//variablen
GLOBAL TileSize = 30
GLOBAL felder_x = 10
GLOBAL felder_y = 10
GLOBAL mx, my, b1, b2, flag, animation, px, py

 
// Type Felder
TYPE Tfeld
             farbe
             ani
ENDTYPE

GLOBAL  feld[] AS Tfeld

DIM feld[felder_x -1][felder_y -1]

   feld[3][3].farbe = 1 //rotes Feld
   feld[5][6].farbe = 2 //Grünes Feld
   feld[8][8].farbe = 3 //Blaues Feld
   feld[3][5].farbe = 2
   

   

   //Hauptschleife
WHILE TRUE

     //Felder fallen lassen

      IF KEY(57) = 1 AND animation = 0 //Leertaste
         FOR x = 0 TO felder_x
         FOR y = felder_y - 1 TO 1 STEP -1
            IF feld[x][y].farbe <> 0 AND feld[x][y+1].farbe = 0
               animation = -TileSize         //Animation starten
               feld[x][y+1].ani = animation   //Animation starten
               feld[x][y+1].farbe = feld[x][y].farbe
               feld[x][y].farbe = 0
               
            ENDIF
         NEXT
         NEXT
      ENDIF
     
//      IF animation < 0  //Animation
//         animation = animation + 1
//         FOR x = 0 TO felder_x - 1
//         FOR y = 0 TO felder_y - 1
//            IF feld[x][y].ani < 0                       
//               feld[x][y].ani = animation
//            ENDIF
//         NEXT
//         NEXT         
//      ENDIF
   
   
   //   Feld anzeigen
     
//      FOR x = 0 TO felder_x - 1
//      FOR y = 0 TO felder_y - 1
//         
//         px = x * TileSize
//         py = y * TileSize + feld[x][y].ani
//         
//         
//         IF feld[x][y].farbe = 1 THEN DRAWRECT px, py, TileSize, TileSize, RGB(255, 0, 0)
//           
//         IF feld[x][y].farbe = 2 THEN DRAWRECT px, py, TileSize, TileSize, RGB(0, 255, 0)
//           
//         IF feld[x][y].farbe = 3 THEN DRAWRECT px, py, TileSize, TileSize, RGB(0, 0, 255)
//       
//      NEXT
//      NEXT


SHOWSCREEN
WEND



versteh nicht warum das passiert...
wenn man das ganze auskommentierte wieder reinnimmt passiert das gleiche...

vielleicht fällt ja jemandem der fehler auf...
mir fällt grad nix ein

kanonet

Ohne auf den Code geschaut zu haben: Debugger an? Vielleicht ein Out of Bounds?
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

Heiko

sobald ich die space taste drücke kommt im debugger dieses, und k.P. wie man das nun liest...
Code (glbasic) Select
Injection started

bounds: [   9][   9]
access: [   0][   9]


fakt ist aber wenn ich die innere If ... ENDIF schleife rausnehme kommt kein fehler...

kanonet

Ja, ist ein out of bounds error. Der Cursor sollte in die betreffende Zeile springen und dir verraten, wo der Fehler liegt, außerdem verrät dir die Ausgabe, dass du ein Array hast, dass [0...8][0...8] Einträge groß ist (9x9 Array), du versuchst jedoch das Feld
  • [9] zu nutzen - dieses existiert jedoch nicht, deshalb crashed dein Programm. Vergrößere dein Array oder greife auf andere Einträge zu.
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

Heiko

#5
Habe jetzt dieses geändert
Code (glbasic) Select
         FOR x = 0 TO felder_x - 1
         FOR y = felder_y  - 2 TO 1 STEP - 1
             IF feld[x][y].farbe <> 0 AND feld[x][y+1].farbe = 0


felder_y - 2 statt -1

damit ergibt sich eine Zeile drunter der y+1 wert 9
sollte also im wertebereich liegen

dennoch kommt nun diese fehlermeldung durch zeile
Code (glbasic) Select
IF feld[x][y].farbe <> 0 AND feld[x][y+1].farbe = 0

Code (glbasic) Select
bounds: [   9][   9]
access: [   8][   9]
error : Ausserhalb des DIM Bereichs


warum immer noch ausserhalb des dim bereichs.... confused grad


edit: Heiko: <---- trottelig myself....habs hinbekommen