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.
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.
Ich hab das Ganze nun umgeschrieben, aber stehe vor einem Problem, was ich echt nicht verstehe.
Dieser Teil...
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...
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
Ohne auf den Code geschaut zu haben: Debugger an? Vielleicht ein Out of Bounds?
sobald ich die space taste drücke kommt im debugger dieses, und k.P. wie man das nun liest...
Injection started
bounds: [ 9][ 9]
access: [ 0][ 9]
fakt ist aber wenn ich die innere If ... ENDIF schleife rausnehme kommt kein fehler...
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.
Habe jetzt dieses geändert
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
IF feld[x][y].farbe <> 0 AND feld[x][y+1].farbe = 0
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