Ich weiß, ich poste und frage hier zuviel, aber nach all den Mühen werde ich ein Tut zu meinem Spiel schreiben, denn ich hab da auch so einiges bisher gelernt.
Ich habe ein wenig gebastelt, und es wird ein 10x10 felder spielbrett erstellt.
Aber es sollen weder auf x noch auf y drei gleichfarbige steine liegen.
dazu habe ich etwas versucht, aber es klappt nicht so wirklich.
also es werden immer noch teilweise 3 gleiche steine gelegt..............
Findet jemand den Fehler?
Unten der Quellcode und im Anhang das ganze zum ausprobieren als paket.
// --------------------------------- //
// Project: aqua
// Start: Tuesday, April 01, 2008
// IDE Version: 5.204
SETSCREEN 600, 600, 1
LIMITFPS 25
TileSize = 50 //laenge/breite der sprites
tilesX = 10
tilesY = 10
randy = 50 //Randverschiebung
randx = 49
///Typedefinition
TYPE Tinfo
posx
posy
posneuy
box
boxalt
ENDTYPE
LOCAL feld[] AS Tinfo
///Ende Typedefinition
///Dimensionierung
DIM feld[tilesX][tilesY]
///Ende Dimensionierung
///Material laden
LOADSPRITE "pfeil.png",20
LOADSPRITE "box1.bmp",1
LOADSPRITE "box2.bmp",2
LOADSPRITE "box3.bmp",3
LOADSPRITE "box5.bmp",5
LOADSPRITE "box6.bmp",6
LOADSPRITE "box7.bmp",7
LOADSPRITE "boxclear.png",4
LOADBMP "hintergrund.bmp"
///Ende Material laden
FOR x = 0 TO tilesX-1
FOR y = 0 TO tilesY-1
//Falls noch keine 3 werte erstellt worden sind wird nichts überprüft aber die 1. 2 Felder werden gefüllt
IF y < 2
feld[x][y].box = INTEGER(RND(5)+1)
ELSE
startY:
feld[x][y].box = INTEGER(RND(5)+1) //nächstes feld wird gefüllt
LET feld$ = feld[x][y].box // wert des feldes in string feld$ speichern
LET feld1$ = feld[x][y-1].box
LET feld2$ = feld[x][y-2].box
tempstring$ = (feld$) + (feld1$) + (feld2$)
// überprüfen ob 3 gleiche zeichen sind
SELECT tempstring$
CASE 000 OR 111 OR 222 OR 333 OR 444 OR 555 OR 666
GOTO startY
ENDSELECT
ENDIF
//Falls noch keine 3 werte erstellt worden sind wird nichts überprüft aber die 1. 2 Felder werden gefüllt
IF x < 2
feld[x][y].box = INTEGER(RND(5)+1)
ELSE
startX:
feld[x][y].box = INTEGER(RND(5)+1) //nächstes feld wird gefüllt
LET feld$ = feld[x][y].box // wert des feldes in string feld$ speichern
LET feld1$ = feld[x-1][y].box
LET feld2$ = feld[x-2][y].box
tempstring$ = (feld$) + (feld1$) + (feld2$)
////////////////////////////////////////////
////// überprüfen ob 3 gleiche zeichen sind
SELECT tempstring$
CASE 000 OR 111 OR 222 OR 333 OR 444 OR 555 OR 666
GOTO startX
ENDSELECT
ENDIF
NEXT
NEXT
//////
///Hauptschleife
WHILE TRUE
FOR x = 0 TO tilesX-1
FOR y = 0 TO tilesY-1
IF feld[x][y].box = 0 THEN DRAWSPRITE 4, ((x*TileSize)+randx),((y*TileSize)+randy)
IF feld[x][y].box = 1 THEN DRAWSPRITE 1, ((x*TileSize)+randx),((y*TileSize)+randy)
IF feld[x][y].box = 2 THEN DRAWSPRITE 2, ((x*TileSize)+randx),((y*TileSize)+randy)
IF feld[x][y].box = 3 THEN DRAWSPRITE 3, ((x*TileSize)+randx),((y*TileSize)+randy)
IF feld[x][y].box = 4 THEN DRAWSPRITE 5, ((x*TileSize)+randx),((y*TileSize)+randy)
IF feld[x][y].box = 5 THEN DRAWSPRITE 6, ((x*TileSize)+randx),((y*TileSize)+randy)
IF feld[x][y].box = 6 THEN DRAWSPRITE 7, ((x*TileSize)+randx),((y*TileSize)+randy)
NEXT
NEXT
//mausbewegung
MOUSESTATE mx, my, b1, b2
DRAWSPRITE 20, mx, my
//mausbewegung ende
SHOWSCREEN
WEND
///Ende Hauptschleife
game.zip - 0.41MB (http://www.zshare.net/download/10066714970f2e6d/)
Ich verrat' Dir einen Trick:
-Füll das Feld zufällig.
-Ruf Deine Routine auf "finde 3, lösche die, runterfallen, neue einfügen"
-Achte drarauf, dass keine Punkte vergeben werden
-Lass in dieser Zeit nichts animieren
-Wenn keiner mehr runterfällt -> Spielstart
:D
Cheater ^^
grins, werd das so versuchen, das kann ich dann gleich weiterverwenden für die abfrage wenn die steine im spiel entfernt werden sollen.
so hab das mal umgeschrieben, bis auf die fallen und ersetzen routine, die folgt noch.
ist das soweit richtig gernot? was sagst du?
Ich bemerke gerade, dass das so garnicht geht.
Kannst du mir vielleicht helfen damit das funktioniert, und sagen was ich an code explizit zu ändern habe.
Ich seh den Fehler einfach nicht.
zumindest in nullen müsste es die felder wandeln, tut es aber nicht.
wenigstens bei dem füllen des spielfeldes auf diese art und weise würde ich mal hilfe brauchen.
kann vielleicht jemand den code korrigieren, bitte.
den fall der steine und das neusetzen wollte ich heute auch noch machen.....büüüdddeeee (@gernot smile)
// --------------------------------- //
// Project: aqua
// Start: Tuesday, April 01, 2008
// IDE Version: 5.204
SETSCREEN 600, 600, 1
LIMITFPS 25
TileSize = 50 //laenge/breite der sprites
tilesX = 10
tilesY = 10
randy = 50 //Randverschiebung
randx = 49
///Typedefinition
TYPE Tinfo
posx
posy
posneuy
box
boxalt
ENDTYPE
LOCAL feld[] AS Tinfo
///Ende Typedefinition
///Dimensionierung
DIM feld[tilesX][tilesY]
///Ende Dimensionierung
///Material laden
LOADSPRITE "pfeil.png",20
LOADSPRITE "box1.bmp",1
LOADSPRITE "box2.bmp",2
LOADSPRITE "box3.bmp",3
LOADSPRITE "box5.bmp",5
LOADSPRITE "box6.bmp",6
LOADSPRITE "box7.bmp",7
LOADSPRITE "boxclear.png",4
LOADBMP "hintergrund.bmp"
///Ende Material laden
//feld füllen
FOR x = 0 TO tilesX-1
FOR y = 0 TO tilesY-1
feld[x][y].box = INTEGER(RND(5)+1)
NEXT
NEXT
//ende feld füllen
pruefung:
FOR x = 0 TO tilesX-1
FOR y = 0 TO tilesY-1
IF y < 2
y=y+2
ELSE
startY:
LET feld$ = feld[x][y].box // wert des feldes in string feld$ speichern
LET feld1$ = feld[x][y-1].box // wert des feldes in string feld$ speichern
LET feld2$ = feld[x][y-2].box // wert des feldes in string feld$ speichern
tempstring$ = (feld$) + (feld1$) + (feld2$) // überprüfen ob 3 gleiche zeichen sind
SELECT tempstring$
CASE 000 OR 111 OR 222 OR 333 OR 444 OR 555 OR 666
feld[x][y].box = 0
feld[x][y-1].box = 0
feld[x][y-2].box = 0
//goto fallen routine und neues einfügen
GOTO startY
ENDSELECT
ENDIF
IF x < 2
x=x+2
ELSE
startX:
LET feld$ = feld[x][y].box // wert des feldes in string feld$ speichern
LET feld1$ = feld[x-1][y].box // wert des feldes in string feld$ speichern
LET feld2$ = feld[x-2][y].box // wert des feldes in string feld$ speichern
tempstring$ = (feld$) + (feld1$) + (feld2$) // überprüfen ob 3 gleiche zeichen sind
SELECT tempstring$
CASE 000 OR 111 OR 222 OR 333 OR 444 OR 555 OR 666
feld[x][y].box = 0
feld[x-1][y].box = 0
feld[x-1][y].box = 0
//goto fallen routine und neues einfügen
GOTO startX
ENDSELECT
ENDIF
NEXT
NEXT
//////
///Hauptschleife
WHILE TRUE
FOR x = 0 TO tilesX-1
FOR y = 0 TO tilesY-1
IF feld[x][y].box = 0 THEN DRAWSPRITE 4, ((x*TileSize)+randx),((y*TileSize)+randy)
IF feld[x][y].box = 1 THEN DRAWSPRITE 1, ((x*TileSize)+randx),((y*TileSize)+randy)
IF feld[x][y].box = 2 THEN DRAWSPRITE 2, ((x*TileSize)+randx),((y*TileSize)+randy)
IF feld[x][y].box = 3 THEN DRAWSPRITE 3, ((x*TileSize)+randx),((y*TileSize)+randy)
IF feld[x][y].box = 4 THEN DRAWSPRITE 5, ((x*TileSize)+randx),((y*TileSize)+randy)
IF feld[x][y].box = 5 THEN DRAWSPRITE 6, ((x*TileSize)+randx),((y*TileSize)+randy)
IF feld[x][y].box = 6 THEN DRAWSPRITE 7, ((x*TileSize)+randx),((y*TileSize)+randy)
NEXT
NEXT
//mausbewegung
MOUSESTATE mx, my, b1, b2
DRAWSPRITE 20, mx, my
//mausbewegung ende
SHOWSCREEN
WEND
///Ende Hauptschleife
Hab es selber hinbekommen.im anderen thread der code dazu.
Fehle bei:
tempstring$ = (feld$) + (feld1$) + (feld2$) // überprüfen ob 3 gleiche zeichen sind
SELECT tempstring$
CASE 000 OR 111 OR 222 OR 333 OR 444 OR 555 OR 666
Muss sein:
CASE "000" OR "111" ...
Hier mal eine Mini-Bejeweled.
DIM feld[10][10]
NeuesLevel()
END
FUNCTION NeuesLevel:
FOR x=0 TO 9
FOR y=0 TO 9
feld[x][y] = RND(4)
NEXT
NEXT
ShowFeld(); SHOWSCREEN; MOUSEWAIT
WHILE PruefeDreier() > 0
ShowFeld(); SHOWSCREEN; MOUSEWAIT
WHILE Nachfallen()>0
WEND
ShowFeld(); SHOWSCREEN; MOUSEWAIT
WEND
ENDFUNCTION
FUNCTION PruefeDreier:
LOCAL x,y
LOCAL nTreffer, gefunden
// horizontale 3er
FOR x=0 TO 9
FOR y=0 TO 9
// feld ist leer
// nicht auf 3er prüfen
IF feld[x][y] = -1 THEN CONTINUE
// sind die Nachbarn gleich?
FOR xGleiche=x+1 TO 9 // nach rechts durchprüfen
IF feld[xGleiche][y] <> feld[x][y] // farbe passt nicht
BREAK // raus aus der Schleife
ENDIF
NEXT
// so, hier ist 'xGleiche' jetzt die position, an der
// die Farbe nicht mit 'x' übereinstimmt
// also haben wir xGleiche - x gleiche gefunden:
// [0] [1] [2]
// A A B -> x=0; xGleiche=2
gefunden = xGleiche - x
IF gefunden >= 3
FOR xLoeschen = x TO xGleiche-1
feld[xLoeschen][y] = -1
NEXT
INC nTreffer, gefunden // die Treffer zählen
ENDIF
NEXT
NEXT
// vertikale 3er prüfen... wie oben, nur anders :P
RETURN nTreffer // wieviele wurden weggemacht?
ENDFUNCTION
FUNCTION Nachfallen:
LOCAL gefallen
FOR x=0 TO 9
FOR y=9 TO 0 STEP -1
IF feld[x][y] = -1
gefallen = TRUE
// nicht in der ersten Zeile
IF y>0
// oberer Stein runter
feld[x][y] = feld[x][y-1]
feld[x][y-1] = -1 // oben leer machen
ELSE
// oben einen neuen reinmachen
feld[x][y]=RND(4)
ENDIF
ENDIF
NEXT
NEXT
RETURN gefallen
ENDFUNCTION
FUNCTION ShowFeld:
LOCAL x,y
LOCAL col[]
DIMDATA col[], RGB(0xff, 0xff, 0x40), RGB(0x00, 0xff, 0x80), RGB(0x80, 0x80, 0xff), _
RGB(0xff, 0x00, 0x00), RGB(0xff, 0x80, 0xff)
FOR x=0 TO 9
FOR y=0 TO 9
IF feld[x][y]>=0
DRAWRECT x*16, y*16, 14,14, col[feld[x][y]]
PRINT feld[x][y], x*16, y*16
ENDIF
NEXT
NEXT
ENDFUNCTION
so im einfachen stil hatte ich das schon hinbekommen, vielleicht nicht so elegant, aber funktionierte.(optimiert hätte ich später)
aber ich kämpfe im moment mit langsam fallenden steinen beim löschen der steine.
in meinem beispiel hab ich aber nur immer einen stein beim anklicken entfernen lassen.
damit das fallen erstmal realisiert wird.
funktioniert auch nicht ganz, aber ich glaub ich muss erstmal 1-2 tage durchschlafen.
// --------------------------------- //
// Project: aqua
// Start: Tuesday, April 01, 2008
// IDE Version: 5.204
SETSCREEN 600, 600, 0
LIMITFPS 25
GOSUB variablen
GOSUB initdim
GOSUB material
GOSUB initfeld
WHILE TRUE
GOSUB statik
GOSUB movement
SHOWSCREEN
WEND
///Ende Hauptschleife
// ------------------------------------------------------------- //
// --- VARIABLEN ---
// ------------------------------------------------------------- //
SUB variablen:
GLOBAL TileSize = 50
GLOBAL tilesX = 10
GLOBAL tilesY = 10
GLOBAL randy = 50
GLOBAL randx = 49
ENDSUB // VARIABLEN
// ------------------------------------------------------------- //
// --- INITDIM ---
// ------------------------------------------------------------- //
SUB initdim:
TYPE Tinfo
posx
posy
box
boxalt
posyalt
ENDTYPE
GLOBAL feld[] AS Tinfo
DIM feld[tilesX][tilesY]
ENDSUB // INITDIM
// ------------------------------------------------------------- //
// --- MATERIAL ---
// ------------------------------------------------------------- //
SUB material:
LOADSPRITE "pfeil.png",20
LOADSPRITE "box1.png",1
LOADSPRITE "box2.png",2
LOADSPRITE "box3.png",3
LOADSPRITE "box5.png",5
LOADSPRITE "box6.png",6
LOADSPRITE "box7.png",7
LOADSPRITE "boxclear.png",4
LOADBMP "hintergrund.bmp"
ENDSUB // MATERIAL
// ------------------------------------------------------------- //
// --- INITFELD ---
// ------------------------------------------------------------- //
SUB initfeld:
FOR x = 0 TO tilesX-1
FOR y = 0 TO tilesY-1
feld[x][y].box = (RND(5)+1)
WHILE ( y>1 AND feld[x][y-1].box = feld[x][y].box AND feld[x][y-2].box = feld[x][y].box) OR ( x>1 AND feld[x-1][y].box = feld[x][y].box AND feld[x-2][y].box = feld[x][y].box)
feld[x][y].box = (RND(5)+1)
WEND
NEXT
NEXT
FOR x = 0 TO tilesX-1
FOR y = 0 TO tilesY-1
GLOBAL feld[x][y].posx = ((x*TileSize)+randx)
GLOBAL feld[x][y].posy = ((y*TileSize)+randy)
NEXT
NEXT
ENDSUB // INITFELD
// ------------------------------------------------------------- //
// --- STATIC ---
// ------------------------------------------------------------- //
SUB statik:
FOR x = 0 TO tilesX-1
FOR y = 0 TO tilesY-1
MOUSESTATE mx, my, b1, b2
DRAWSPRITE 20, mx, my
feld[x][y].boxalt = feld[x][y].box
IF y > 0
feld[x][y-1].boxalt = feld[x][y-1].box
feld[x][y-1].posyalt = feld[x][y-1].posy
ENDIF
IF b1 = 1
IF mx >= feld[x][y].posx AND mx <= (feld[x][y].posx + 48) AND my >= feld[x][y].posy AND my <= (feld[x][y].posy + 48)
feld[x][y].box = 0
feld[x][y-1].box = 0
ENDIF
ENDIF
IF feld[x][0].box = 0
feld[x][0].box = (RND(5)+1)
ENDIF
IF feld[x][y].box = 0 THEN DRAWSPRITE 4, feld[x][y].posx,feld[x][y].posy
IF feld[x][y].box = 1 THEN DRAWSPRITE 1, feld[x][y].posx,feld[x][y].posy
IF feld[x][y].box = 2 THEN DRAWSPRITE 2, feld[x][y].posx,feld[x][y].posy
IF feld[x][y].box = 3 THEN DRAWSPRITE 3, feld[x][y].posx,feld[x][y].posy
IF feld[x][y].box = 4 THEN DRAWSPRITE 5, feld[x][y].posx,feld[x][y].posy
IF feld[x][y].box = 5 THEN DRAWSPRITE 6, feld[x][y].posx,feld[x][y].posy
IF feld[x][y].box = 6 THEN DRAWSPRITE 7, feld[x][y].posx,feld[x][y].posy
PRINT mx, 10, 20
PRINT my, 10, 30
NEXT
NEXT
ENDSUB // STATIC
// ------------------------------------------------------------- //
// --- MOVEMENT ---
// ------------------------------------------------------------- //
//SUB movement:
FOR x = 0 TO tilesX-1
FOR y = 0 TO tilesY-1
IF y > 0
IF feld[x][y].box = 0 AND feld[x][y-1].box = 0
feld[x][y-1].posyalt = feld[x][y-1].posyalt + 1
DRAWSPRITE feld[x][y].boxalt, feld[x][y-1].posx, feld[x][y-1].posyalt
IF feld[x][y-1].posyalt = feld[x][y].posy
feld[x][y].box = feld[x][y-1].boxalt
ENDIF
ENDIF
ENDIF
NEXT
NEXT
//ENDSUB // MOVEMENT
Aso.
Ich mach das so - und es gibt da mehrere Wege, meine muss nicht der Beste sein - dass ich in der Funktion "Draw" eine Variable einbaue, die Blöcke, wenn darunter leer ist, um nY Pixel verschoben anzeigt.
Die rufe ich dann mehrmals nach dem FallStones() auf, das dann die Werte im Feld geändert hat.
Wichtig dabei, dass man die oberste Zeile quasi versteckt hält.
Hat jemand eine bessere Idee?
ich hatte es mir schon so überlegt: ein schleifenteil in draw, wo die statischen werte in den feldern gezeichnet werden.und darunter der teil, wo alle sprites um ein pixel verschoben werden wo das feld oberhalb x,y leer ist, und sozusagen mit 0 gefüllt.das darüber liegende feld müsste dann noch mit einem extra type wert markiert werden, damit das nächste feld oben drüber auch noch mit nach unten kommt, usw usw. ausser natürlich y> null, da erfolgt oben keine abfrage mehr, sondern nur noch wenn x,0 dann eben zufalls x,y = zufallswert.
aber ich denke mal, ich machs einfach zu umständlich.....
[edit] es geht ausschliesslich um die fallroutine der steine, die ich noch nicht hinbekomme......
Jemand eine bessere Idee?
[edit] momentan versuch ichs damit: ich gehe das spielfeld gleich zu beginn von unten nach oben durchlaufen, setze dabei die statischen steine in den feldern. als nächstes gehe ich die zeilen y eine nach der anderen durch, und zeichne ein sprite von der position eins drüber wenn das drunterliegende feld leer ist. naja alles bisschen kompliziert, hoffe ich bekomme das bald hin, die letzten nächte waren einfach zu lang.
hierzu mal ein code, der natürlich wieder mal nicht funktioniert, wie er soll.......menno (achja die cases unten sollten später zusammengefügt werden, aber ich hats nun schon dastehen.
// --------------------------------- //
// Project: aqua
// Start: Tuesday, April 01, 2008
// IDE Version: 5.204
SETSCREEN 600, 600, 0
LIMITFPS 25
GOSUB variablen
GOSUB initdim
GOSUB material
GOSUB initfeld
WHILE TRUE
GOSUB statik
GOSUB movement
SHOWSCREEN
WEND
///Ende Hauptschleife
// ------------------------------------------------------------- //
// --- VARIABLEN ---
// ------------------------------------------------------------- //
SUB variablen:
GLOBAL TileSize = 50
GLOBAL tilesX = 10
GLOBAL tilesY = 10
GLOBAL randy = 50
GLOBAL randx = 49
ENDSUB // VARIABLEN
// ------------------------------------------------------------- //
// --- INITDIM ---
// ------------------------------------------------------------- //
SUB initdim:
TYPE Tinfo
posx
posy
box
boxalt
posyalt
wandern
ENDTYPE
GLOBAL feld[] AS Tinfo
DIM feld[tilesX][tilesY]
ENDSUB // INITDIM
// ------------------------------------------------------------- //
// --- MATERIAL ---
// ------------------------------------------------------------- //
SUB material:
LOADSPRITE "pfeil.png",20
LOADSPRITE "box1.png",1
LOADSPRITE "box2.png",2
LOADSPRITE "box3.png",3
LOADSPRITE "box5.png",5
LOADSPRITE "box6.png",6
LOADSPRITE "box7.png",7
LOADSPRITE "boxclear.png",4
LOADBMP "hintergrund.bmp"
LOADSPRITE "hintergrund.bmp",50
ENDSUB // MATERIAL
// ------------------------------------------------------------- //
// --- INITFELD ---
// ------------------------------------------------------------- //
SUB initfeld:
FOR x = 0 TO tilesX-1
FOR y = 0 TO tilesY-1
feld[x][y].box = (RND(5)+1)
WHILE ( y>1 AND feld[x][y-1].box = feld[x][y].box AND feld[x][y-2].box = feld[x][y].box) OR ( x>1 AND feld[x-1][y].box = feld[x][y].box AND feld[x-2][y].box = feld[x][y].box)
feld[x][y].box = (RND(5)+1)
WEND
NEXT
NEXT
FOR x = 0 TO tilesX-1
FOR y = 0 TO tilesY-1
GLOBAL feld[x][y].posx = ((x*TileSize)+randx)
GLOBAL feld[x][y].posy = ((y*TileSize)+randy)
NEXT
NEXT
ENDSUB // INITFELD
// ------------------------------------------------------------- //
// --- STATIC ---
// ------------------------------------------------------------- //
SUB statik:
BLACKSCREEN
DRAWSPRITE 50, 0, 0
FOR x = 9 TO 0 STEP -1
FOR y = 9 TO 0 STEP -1
feld[x][y].boxalt = feld[x][y].box
IF y > 0
feld[x][y-1].boxalt = feld[x][y-1].box
feld[x][y-1].posyalt = feld[x][y-1].posy
ENDIF
IF b1 = 1
IF mx >= feld[x][y].posx AND mx <= (feld[x][y].posx + 48) AND my >= feld[x][y].posy AND my <= (feld[x][y].posy + 48)
feld[x][y].box = 0
ENDIF
ENDIF
IF feld[x][0].box = 0
feld[x][0].box = (RND(5)+1)
ENDIF
IF feld[x][y].box = 0 THEN DRAWSPRITE 4, feld[x][y].posx,feld[x][y].posy
IF feld[x][y].box = 1 THEN DRAWSPRITE 1, feld[x][y].posx,feld[x][y].posy
IF feld[x][y].box = 2 THEN DRAWSPRITE 2, feld[x][y].posx,feld[x][y].posy
IF feld[x][y].box = 3 THEN DRAWSPRITE 3, feld[x][y].posx,feld[x][y].posy
IF feld[x][y].box = 4 THEN DRAWSPRITE 5, feld[x][y].posx,feld[x][y].posy
IF feld[x][y].box = 5 THEN DRAWSPRITE 6, feld[x][y].posx,feld[x][y].posy
IF feld[x][y].box = 6 THEN DRAWSPRITE 7, feld[x][y].posx,feld[x][y].posy
MOUSESTATE mx, my, b1, b2
DRAWSPRITE 20, mx+1, my+1
PRINT mx, 10, 20
PRINT my, 10, 30
NEXT
NEXT
USEASBMP
ENDSUB // STATIC
// ------------------------------------------------------------- //
// --- MOVEMENT ---
// ------------------------------------------------------------- //
SUB movement:
FOR y = 9 TO 1 STEP -1
//////////////////////////////////
SELECT feld[9][y].box
CASE 0
IF feld[9][y].wandern = 0
feld[9][y].boxalt=feld[9][y-1].box
feld[9][y].posyalt=feld[9][y-1].posy
feld[9][y].wandern = 1
ENDIF
feld[9][y-1].box = 0
IF feld[9][y].wandern = 1
feld[9][y].posyalt = feld[9][y].posyalt + 1
DRAWSPRITE feld[9][y].boxalt, feld[9][y].posy, feld[9][y].posyalt
ENDIF
IF feld[9][y].posy = feld[9][y].posyalt
feld[9][y].box = feld[9][y].boxalt
feld[9][y].wandern = 0
ENDIF
ENDSELECT
//////////////////////////////////
SELECT feld[8][y].box
CASE 0
IF feld[8][y].wandern = 0
feld[8][y].boxalt=feld[8][y-1].box
feld[8][y].posyalt=feld[8][y-1].posy
feld[8][y].wandern = 1
ENDIF
feld[8][y-1].box = 0
IF feld[8][y].wandern = 1
feld[8][y].posyalt = feld[8][y].posyalt + 1
DRAWSPRITE feld[8][y].boxalt, feld[8][y].posy, feld[8][y].posyalt
ENDIF
IF feld[8][y].posy = feld[8][y].posyalt
feld[8][y].box = feld[8][y].boxalt
feld[8][y].wandern = 0
ENDIF
ENDSELECT
//////////////////////////////////
SELECT feld[7][y].box
CASE 0
IF feld[7][y].wandern = 0
feld[7][y].boxalt=feld[7][y-1].box
feld[7][y].posyalt=feld[7][y-1].posy
feld[7][y].wandern = 1
ENDIF
feld[7][y-1].box = 0
IF feld[7][y].wandern = 1
feld[7][y].posyalt = feld[7][y].posyalt + 1
DRAWSPRITE feld[7][y].boxalt, feld[7][y].posy, feld[7][y].posyalt
ENDIF
IF feld[7][y].posy = feld[7][y].posyalt
feld[7][y].box = feld[7][y].boxalt
feld[7][y].wandern = 0
ENDIF
ENDSELECT
//////////////////////////////////
SELECT feld[6][y].box
CASE 0
IF feld[6][y].wandern = 0
feld[6][y].boxalt=feld[6][y-1].box
feld[6][y].posyalt=feld[6][y-1].posy
feld[6][y].wandern = 1
ENDIF
feld[6][y-1].box = 0
IF feld[6][y].wandern = 1
feld[6][y].posyalt = feld[6][y].posyalt + 1
DRAWSPRITE feld[6][y].boxalt, feld[6][y].posy, feld[6][y].posyalt
ENDIF
IF feld[6][y].posy = feld[6][y].posyalt
feld[6][y].box = feld[6][y].boxalt
feld[6][y].wandern = 0
ENDIF
ENDSELECT
//////////////////////////////////
SELECT feld[5][y].box
CASE 0
IF feld[5][y].wandern = 0
feld[5][y].boxalt=feld[5][y-1].box
feld[5][y].posyalt=feld[5][y-1].posy
feld[5][y].wandern = 1
ENDIF
feld[5][y-1].box = 0
IF feld[5][y].wandern = 1
feld[5][y].posyalt = feld[5][y].posyalt + 1
DRAWSPRITE feld[5][y].boxalt, feld[5][y].posy, feld[5][y].posyalt
ENDIF
IF feld[5][y].posy = feld[5][y].posyalt
feld[5][y].box = feld[5][y].boxalt
feld[5][y].wandern = 0
ENDIF
ENDSELECT
//////////////////////////////////
SELECT feld[4][y].box
CASE 0
IF feld[4][y].wandern = 0
feld[4][y].boxalt=feld[4][y-1].box
feld[4][y].posyalt=feld[4][y-1].posy
feld[4][y].wandern = 1
ENDIF
feld[4][y-1].box = 0
IF feld[4][y].wandern = 1
feld[4][y].posyalt = feld[4][y].posyalt + 1
DRAWSPRITE feld[4][y].boxalt, feld[4][y].posy, feld[4][y].posyalt
ENDIF
IF feld[4][y].posy = feld[4][y].posyalt
feld[4][y].box = feld[4][y].boxalt
feld[4][y].wandern = 0
ENDIF
ENDSELECT
//////////////////////////////////
SELECT feld[3][y].box
CASE 0
IF feld[3][y].wandern = 0
feld[3][y].boxalt=feld[3][y-1].box
feld[3][y].posyalt=feld[3][y-1].posy
feld[3][y].wandern = 1
ENDIF
feld[3][y-1].box = 0
IF feld[3][y].wandern = 1
feld[3][y].posyalt = feld[3][y].posyalt + 1
DRAWSPRITE feld[3][y].boxalt, feld[3][y].posy, feld[3][y].posyalt
ENDIF
IF feld[3][y].posy = feld[3][y].posyalt
feld[3][y].box = feld[3][y].boxalt
feld[3][y].wandern = 0
ENDIF
ENDSELECT
//////////////////////////////////
SELECT feld[2][y].box
CASE 0
IF feld[2][y].wandern = 0
feld[2][y].boxalt=feld[2][y-1].box
feld[2][y].posyalt=feld[2][y-1].posy
feld[2][y].wandern = 1
ENDIF
feld[2][y-1].box = 0
IF feld[2][y].wandern = 1
feld[2][y].posyalt = feld[2][y].posyalt + 1
DRAWSPRITE feld[2][y].boxalt, feld[2][y].posy, feld[2][y].posyalt
ENDIF
IF feld[2][y].posy = feld[2][y].posyalt
feld[2][y].box = feld[2][y].boxalt
feld[2][y].wandern = 0
ENDIF
ENDSELECT
//////////////////////////////////
SELECT feld[1][y].box
CASE 0
IF feld[1][y].wandern = 0
feld[1][y].boxalt=feld[1][y-1].box
feld[1][y].posyalt=feld[1][y-1].posy
feld[1][y].wandern = 1
ENDIF
feld[1][y-1].box = 0
IF feld[1][y].wandern = 1
feld[1][y].posyalt = feld[1][y].posyalt + 1
DRAWSPRITE feld[1][y].boxalt, feld[1][y].posy, feld[1][y].posyalt
ENDIF
IF feld[1][y].posy = feld[1][y].posyalt
feld[1][y].box = feld[1][y].boxalt
feld[1][y].wandern = 0
ENDIF
ENDSELECT
//////////////////////////////////
SELECT feld[0][y].box
CASE 0
IF feld[0][y].wandern = 0
feld[0][y].boxalt=feld[0][y-1].box
feld[0][y].posyalt=feld[0][y-1].posy
feld[0][y].wandern = 1
ENDIF
feld[0][y-1].box = 0
IF feld[0][y].wandern = 1
feld[0][y].posyalt = feld[0][y].posyalt + 1
DRAWSPRITE feld[0][y].boxalt, feld[0][y].posy, feld[0][y].posyalt
ENDIF
IF feld[0][y].posy = feld[0][y].posyalt
feld[0][y].box = feld[0][y].boxalt
feld[0][y].wandern = 0
ENDIF
ENDSELECT
//////////////////////////////////
NEXT
ENDSUB // MOVEMENT
Ich muss jetzt einfach mal nen neuen post machen, ist wichtig.(okay für mich zumindest)
Ich hab jetzt bisschen probiert, und das Ganze der Übersicht halber auf ein eindimensionales array beschränkt, welches bei maustastenbetätigung, das unterste feld leeren soll, und eigentlich alles oben drüber nach unten "gleiten" soll.
und ich habs geschafft, zumindest in diesem beispiel hab ich die gewünschte funktionsweise erreicht.
muss ich das nur noch auf ein 2d array umbiegen.
wer mir dabei helfen will, Hilfe nehme ich dankend an.
[edit] okay es hat noch seine macken, stelle ich fest, aber naja wie gesagt, sagt ruhig was dazu.
(und zum thema doppelpostkasse, ich sponsor für den nächsten contest ein board, cpu und ein grafiktablet, grins)
// --------------------------------- //
// Project: 1dfall
// Start: Tuesday, April 08, 2008
// IDE Version: 5.222
SETSCREEN 800,600,0
LIMITFPS 25
tiles=7
TYPE Ttest
tx
ty
voll
typ
sx
sy
alt
ENDTYPE
LOCAL feld[] AS Ttest
DIM feld[tiles]
LOADSPRITE "box1.png",1
LOADSPRITE "box2.png",2
LOADSPRITE "box3.png",3
LOADSPRITE "box5.png",4
LOADSPRITE "box6.png",5
LOADSPRITE "boxclear.png",8
LOADBMP "hintergrund.bmp"
feld[1].tx = 0
feld[1].ty = 0
feld[2].tx = 0
feld[2].ty = 50
feld[3].tx = 0
feld[3].ty = 100
feld[4].tx = 0
feld[4].ty = 150
feld[5].tx = 0
feld[5].ty = 200
feld[6].tx = 0
feld[6].ty = 250
FOR x = 0 TO tiles-1
feld[x].typ = (RND(4)+1)
NEXT
WHILE TRUE
FOR x = 0 TO tiles-1
DRAWSPRITE feld[x].typ, feld[x].tx, feld[x].ty
NEXT
//fallen
FOR x = 0 TO tiles-1
IF x = 0
IF feld[x].typ = 0 THEN feld[x].typ = (RND(4)+1)
ENDIF
MOUSESTATE mx, my, b1, b2
IF b1 = 1 THEN feld[6].voll = 1
IF x > 1
IF feld[x].voll = 1
feld[x-1].alt = feld[x-1].typ
feld[x].typ = 0
feld[x-1].sy = feld[x-1].ty
feld[x].voll = 0
ENDIF
IF feld[x].typ = 0
feld[x-1].typ = 8 /////////////////////musste ich auf 1 setzen sonst verschwinden alle
DRAWSPRITE feld[x-1].alt, 0, feld[x-1].sy
feld[x-1].sy = feld[x-1].sy +1
IF feld[x-1].sy = feld[x].ty
feld[x].typ = feld[x-1].alt
feld[x-1].voll = 1
feld[x-1].sy = feld[x-1].ty
ENDIF
ENDIF
ENDIF
NEXT
//fallen ende
SHOWSCREEN
WEND
Haste den auch eine Art -> Mousehit <- gemacht?
Da du ja jeden Schleifendurchlauf, wenn du auf der Maustaste bist, wieder ein Feld löschst....
Nur mal so als Anregung :)
[edit] so der code funktioniert jetzt auf jeden fall erstmal soweit.
aber vielleicht weiß jemand, ob es einen fehler geben könnte, wenn ich den code in mein spiel einbaue, aus dem anderen thread, und mehr als nur ein feld gelöscht wird.
werd das heute abend mal testen, aber da muss ich ja erst noch das restliche spiel fertigmachen, damit die steine durch einfache kombinationen entfernt werden, bin schon sehr gespannt.
// --------------------------------- //
// Project: 1dfall
// Start: Tuesday, April 08, 2008
// IDE Version: 5.222
SETSCREEN 800,600,0
LIMITFPS 25
tiles=7
TYPE Ttest
tx
ty
voll
typ
sx
sy
alt
ENDTYPE
LOCAL feld[] AS Ttest
DIM feld[tiles]
LOADSPRITE "pfeil.png",20
LOADSPRITE "box1.png",1
LOADSPRITE "box2.png",2
LOADSPRITE "box3.png",3
LOADSPRITE "box5.png",4
LOADSPRITE "box6.png",5
LOADSPRITE "boxclear.png",8
LOADBMP "hintergrund.bmp"
feld[1].tx = 0
feld[1].ty = 0
feld[2].tx = 0
feld[2].ty = 50
feld[3].tx = 0
feld[3].ty = 100
feld[4].tx = 0
feld[4].ty = 150
feld[5].tx = 0
feld[5].ty = 200
feld[6].tx = 0
feld[6].ty = 250
FOR x = 0 TO tiles-1
feld[x].typ = (RND(4)+1)
NEXT
WHILE TRUE
FOR x = 1 TO tiles-1
DRAWSPRITE feld[x].typ, feld[x].tx, feld[x].ty
NEXT
//fallen
FOR x = 1 TO tiles-1
IF x = 1
IF feld[x].typ = 0 THEN feld[x].typ = (RND(4)+1)
ENDIF
IF feld[x].voll = 1
feld[x-1].alt = feld[x-1].typ
feld[x].typ = 0
feld[x-1].sy = feld[x-1].ty
feld[x].voll = 0
ENDIF
IF feld[x].typ = 0
IF x > 1
feld[x-1].typ = 8 /////////////////////musste ich auf 1 setzen sonst verschwinden alle
DRAWSPRITE feld[x-1].alt, 0, feld[x-1].sy
feld[x-1].sy = feld[x-1].sy +5
IF feld[x-1].sy = feld[x].ty
feld[x].typ = feld[x-1].alt
feld[x-1].voll = 1
feld[x-1].sy = feld[x-1].ty
ENDIF
ENDIF
ENDIF
IF b1 = 1
IF mx >= feld[x].tx AND mx <= (feld[x].tx + 48) AND my >= feld[x].ty AND my <= (feld[x].ty + 48)
feld[x].voll = 1
ENDIF
ENDIF
NEXT
DRAWSPRITE 20, mx, my
MOUSESTATE mx, my, b1, b2
//fallen ende
SHOWSCREEN
WEND
[Anregung]
IF b1 = 1
IF mx >= feld[x].tx AND mx <= (feld[x].tx + 48) AND my >= feld[x].ty AND my <= (feld[x].ty + 48)
feld[x].voll = 1
ENDIF
ENDIF
Wieso benutzt du nicht einfach BOXCOLL ?
Achja, und da man da den Mauspointer auf 1 Pixel Breite setzten muss, machst du folgendes:
Pseudo:
IF BOXCOLL(X+1,Y+1,SX-2,SY-2,MX,MY,1,1) // +1 / -2 damit du nicht 2 Felder gleichzeitig anklicken kannst
IF B1
Feld[X][Y] = 0 // nix mehr drin
ENDIF
ENDIF
[/Anregung]
och naja, ich lass das erstmal so, kann ich ja später im nachgang bei den optimierungen mit einbauen.
hauptsache ich bekomm das mit den fallenden steinen korrekt in mein komplettes feld rein.
achja, wie meintest du das mit dem Mousehit? Gibts dafür nen beispiel, oder wie macht man das am elegantesten, und einfachsten?
alle felder mittels schleife druchgehen, und die maustastenabfrage nur zulassen, wenn alle felder gefüllt sind?)
[edit] gabs hier nicht auch noch irgendwo nen codeschnippsel, wo man den code auf unterschiedlichen pc´s gleich schnell laufen läßt?
muss ja dann später auch noch rein.
Gleich schnell bei Bejeweled? LIMITFPS 60
ja ich dachte wegen den fallenden steinen, dass die überall gleich schnell fallen......
Eben. Bei LIMITFPS fallen die überall gleich schnell. Nur mit LIMITFPS -1 muss man aufpassen. Aber das ist nur für 3D Spiele interessant.
was passiert denn bei -1?
Kein Limit. Showscreen so schnell wie geht - schau mal in die Hilfe.
Ich kapier es einfach nicht, kann sich nicht jemand das ganze anschauen, sodass mein code wenn ein feld gelöscht wird(oder auch mehrere übereinander, oder nebeneinander) alle darüberliegenden fliessend nachrutschen.
bitte bitte
postzusammenführung
alles klar.
So hab mal wieder ein update zu verzeichnen, und wie es dem topic entspricht: Wer findet den Fehler? lach.
Nein, im Ernst, hab jetzt die Fallroutine einfach mal da reingeschustert, und eigentlich sollte, wenn man auf eine kugel klickt, na ihr wißt schon, alles schön nach unten rutschen.als eindimensionales feld hat das auch im großen ganzen geklappt, nur hier mal wieder nicht.[edit] ich glaub die ganze STATIK Sub ist Schrott und gehört so nicht mehr da rein, wenn ich das jetzt richtig flüchtig geschaut hab.Und wenn ich in der oberen Zeile klicke, stürzt es komplett ab....mmmmmm.....
Werd da morgen mal in Ruhe durchgehen, aber wer mir ein wenig Zeit sparen will, nur zu.Im Anhang gleich mal mit die sources komplett.
[edit] hab die statik sub mal rausgenommen, und die abfrage wenn es die oberste zeile ist auch, um erstmal den fall zu testen.
mmmmmmm ab und an geht das auch, aber nicht bei jedem feld so wie es soll, auch wird irgendwie an der position des gefallenen steins eine zufallszahl erzeugt.......menno, das kann doch nicht so schwer sein....
wenn ihr die sourcen nehmt, dann den aktuellen code hier reinkopieren.
// --------------------------------- //
// Project: aqua
// Start: Tuesday, April 01, 2008
// IDE Version: 5.204
SETSCREEN 580, 580, 0
LIMITFPS 60
GOSUB variablen
GOSUB initdim
GOSUB material
GOSUB initfeld
WHILE TRUE
GOSUB movement
MOUSESTATE mx, my, b1, b2
DRAWSPRITE 20, mx+1, my+1
PRINT mx, 10, 20
PRINT my, 10, 30
SHOWSCREEN
WEND
///Ende Hauptschleife
// ------------------------------------------------------------- //
// --- VARIABLEN ---
// ------------------------------------------------------------- //
SUB variablen:
GLOBAL TileSize = 50
GLOBAL tilesX = 10
GLOBAL tilesY = 10
GLOBAL randy = 50
GLOBAL randx = 50
ENDSUB // VARIABLEN
// ------------------------------------------------------------- //
// --- INITDIM ---
// ------------------------------------------------------------- //
SUB initdim:
TYPE Tinfo
posx
posy
box
alt
sy
voll
wandern
ENDTYPE
GLOBAL feld[] AS Tinfo
DIM feld[tilesX][tilesY]
ENDSUB // INITDIM
// ------------------------------------------------------------- //
// --- MATERIAL ---
// ------------------------------------------------------------- //
SUB material:
LOADSPRITE "pfeil.png",20
LOADSPRITE "box1.png",1
LOADSPRITE "box2.png",2
LOADSPRITE "box3.png",3
LOADSPRITE "box5.png",5
LOADSPRITE "box6.png",6
LOADSPRITE "box7.png",7
LOADSPRITE "boxclear.png",4
LOADBMP "hintergrund.bmp"
ENDSUB // MATERIAL
// ------------------------------------------------------------- //
// --- INITFELD ---
// ------------------------------------------------------------- //
SUB initfeld:
FOR x = 0 TO tilesX-1
FOR y = 0 TO tilesY-1
feld[x][y].box = (RND(5)+1)
WHILE ( y>1 AND feld[x][y-1].box = feld[x][y].box AND feld[x][y-2].box = feld[x][y].box) OR ( x>1 AND feld[x-1][y].box = feld[x][y].box AND feld[x-2][y].box = feld[x][y].box)
feld[x][y].box = (RND(5)+1)
WEND
NEXT
NEXT
FOR x = 0 TO tilesX-1
FOR y = 0 TO tilesY-1
feld[x][y].posx = ((x*TileSize)+randx)
feld[x][y].posy = ((y*TileSize)+randy)
NEXT
NEXT
ENDSUB // INITFELD
// ------------------------------------------------------------- //
// --- MOVEMENT ---
// ------------------------------------------------------------- //
SUB movement:
//fallen
FOR x = 0 TO tilesX-1
FOR y = 0 TO tilesY-1
IF feld[x][y].voll = 1
feld[x][y].box = 0
feld[x][y].alt = feld[x][y-1].box
feld[x][y].sy = feld[x][y-1].posy
feld[x][y-1].box = 0
feld[x][y].wandern = 1
feld[x][y].voll = 0
ENDIF
IF feld[x][y].box = 0
IF feld[x][y].sy = feld[x][y].posy
feld[x][y].box = feld[x][y].alt
feld[x][y].wandern = 0
ELSE
DRAWSPRITE feld[x][y].alt, feld[x][y].posx, feld[x][y].sy
feld[x][y].sy = feld[x][y].sy +1
ENDIF
ENDIF
IF feld[x][y].box = 0 THEN DRAWSPRITE 4, feld[x][y].posx,feld[x][y].posy
IF feld[x][y].box = 1 THEN DRAWSPRITE 1, feld[x][y].posx,feld[x][y].posy
IF feld[x][y].box = 2 THEN DRAWSPRITE 2, feld[x][y].posx,feld[x][y].posy
IF feld[x][y].box = 3 THEN DRAWSPRITE 3, feld[x][y].posx,feld[x][y].posy
IF feld[x][y].box = 4 THEN DRAWSPRITE 5, feld[x][y].posx,feld[x][y].posy
IF feld[x][y].box = 5 THEN DRAWSPRITE 6, feld[x][y].posx,feld[x][y].posy
IF feld[x][y].box = 6 THEN DRAWSPRITE 7, feld[x][y].posx,feld[x][y].posy
IF feld[x][y].box <> 0
IF b1 = 1
IF mx >= feld[x][y].posx AND mx <= (feld[x][y].posx + 48) AND my >= feld[x][y].posy AND my <= (feld[x][y].posy + 48)
feld[x][y].voll = 1
ENDIF
ENDIF
ENDIF
NEXT
NEXT
//fallen ende
ENDSUB // MOVEMENT
game1.zip - 0.63MB (http://www.zshare.net/download/10299677bd527ec9/)
[postzusammenführung]
ich wende mich nochmal vertrauensvoll an euch.
hab jetzt immer wieder codeänderungen vollzogen, aber es will einfach nicht, und ich weiß nicht warum.
okay der code mit den types ist jetzt nicht der übersichtlichste, und wahrscheinlich nicht optimal, aber trotzdem verstehe ich nicht, warum er nicht funktioniert.
daher bitte ich euch nochmal, mit zu helfen.
der problematische teil liegt in der "movement" sub, ist nicht viel code, aber eben funzt es nicht....
also das scrolling funktioniert teilweise, aber wenn ich z.b. ein feld ganz unten anklicke, dann verschwindet gleich das darüberliegende, und dann scrollt es einige felder darüber korrekt, dann verschwindet wieder mal eins und kommt plötzlich wieder.
// --------------------------------- //
// Project: aqua
// Start: Tuesday, April 01, 2008
// IDE Version: 5.204
SETSCREEN 580, 580, 0
LIMITFPS 60
GOSUB variablen
GOSUB initdim
GOSUB material
GOSUB initfeld
WHILE TRUE
GOSUB movement
MOUSESTATE mx, my, b1, b2
DRAWSPRITE 20, mx+1, my+1
PRINT mx, 10, 20
PRINT my, 10, 30
SHOWSCREEN
WEND
///Ende Hauptschleife
// ------------------------------------------------------------- //
// --- VARIABLEN ---
// ------------------------------------------------------------- //
SUB variablen:
GLOBAL TileSize = 50
GLOBAL tilesX = 10
GLOBAL tilesY = 10
GLOBAL randy = 50
GLOBAL randx = 50
ENDSUB // VARIABLEN
// ------------------------------------------------------------- //
// --- INITDIM ---
// ------------------------------------------------------------- //
SUB initdim:
TYPE Tinfo
posx
posy
box
alt
sy
belegt
scroll
ENDTYPE
GLOBAL feld[] AS Tinfo
DIM feld[tilesX][tilesY]
ENDSUB // INITDIM
// ------------------------------------------------------------- //
// --- MATERIAL ---
// ------------------------------------------------------------- //
SUB material:
LOADSPRITE "pfeil.png",20
LOADSPRITE "box1.png",1
LOADSPRITE "box2.png",2
LOADSPRITE "box3.png",3
LOADSPRITE "box5.png",5
LOADSPRITE "box6.png",6
LOADSPRITE "box7.png",7
LOADSPRITE "boxclear.png",4
LOADBMP "hintergrund.bmp"
ENDSUB // MATERIAL
// ------------------------------------------------------------- //
// --- INITFELD ---
// ------------------------------------------------------------- //
SUB initfeld:
FOR x = 0 TO tilesX-1
FOR y = 0 TO tilesY-1
feld[x][y].box = (RND(5)+1)
WHILE ( y>1 AND feld[x][y-1].box = feld[x][y].box AND feld[x][y-2].box = feld[x][y].box) OR ( x>1 AND feld[x-1][y].box = feld[x][y].box AND feld[x-2][y].box = feld[x][y].box)
feld[x][y].box = (RND(5)+1)
WEND
NEXT
NEXT
FOR x = 0 TO tilesX-1
FOR y = 0 TO tilesY-1
feld[x][y].posx = ((x*TileSize)+randx)
feld[x][y].posy = ((y*TileSize)+randy)
NEXT
NEXT
ENDSUB // INITFELD
// ------------------------------------------------------------- //
// --- MOVEMENT ---
// ------------------------------------------------------------- //
SUB movement:
//fallen
FOR x = 0 TO tilesX-1
FOR y = 0 TO tilesY-1
IF y = 0 AND feld[x][y].box = 0 THEN feld[x][y].box = (RND(5)+1)
IF y > 0
IF feld[x][y].belegt = 1
feld[x][y].box = 0
feld[x][y].alt = feld[x][y-1].box
feld[x][y].sy = feld[x][y-1].posy
feld[x][y-1].box = 0
feld[x][y].scroll = 1
feld[x][y].belegt = 0
ENDIF
ENDIF
IF feld[x][y].box = 0 AND feld[x][y].scroll = 1
IF feld[x][y].sy = feld[x][y].posy
feld[x][y].box = feld[x][y].alt
feld[x][y].scroll = 0
feld[x][y-1].belegt = 1
feld[x][y].belegt = 0
ENDIF
DRAWSPRITE feld[x][y].alt, feld[x][y].posx, feld[x][y].sy
feld[x][y].sy = feld[x][y].sy +1
feld[x][y].belegt = 0
ENDIF
IF feld[x][y].box = 0 THEN DRAWSPRITE 4, feld[x][y].posx,feld[x][y].posy
IF feld[x][y].box = 1 THEN DRAWSPRITE 1, feld[x][y].posx,feld[x][y].posy
IF feld[x][y].box = 2 THEN DRAWSPRITE 2, feld[x][y].posx,feld[x][y].posy
IF feld[x][y].box = 3 THEN DRAWSPRITE 3, feld[x][y].posx,feld[x][y].posy
IF feld[x][y].box = 4 THEN DRAWSPRITE 5, feld[x][y].posx,feld[x][y].posy
IF feld[x][y].box = 5 THEN DRAWSPRITE 6, feld[x][y].posx,feld[x][y].posy
IF feld[x][y].box = 6 THEN DRAWSPRITE 7, feld[x][y].posx,feld[x][y].posy
IF b1 = 1
IF mx >= feld[x][y].posx AND mx <= (feld[x][y].posx + 48) AND my >= feld[x][y].posy AND my <= (feld[x][y].posy + 48)
feld[x][y].belegt = 1
ENDIF
ENDIF
NEXT
NEXT
//fallen ende
ENDSUB // MOVEMENT
hier nochmal die movement extra, achja, und wegen der maustastenabfrage erstmal unbeachtet lassen, das mach ich später, weiß auch schon wie.
// ------------------------------------------------------------- //
// --- MOVEMENT ---
// ------------------------------------------------------------- //
SUB movement:
//fallen
FOR x = 0 TO tilesX-1
FOR y = 0 TO tilesY-1
IF y = 0 AND feld[x][y].box = 0 THEN feld[x][y].box = (RND(5)+1)
IF y > 0
IF feld[x][y].belegt = 1
feld[x][y].box = 0
feld[x][y].alt = feld[x][y-1].box
feld[x][y].sy = feld[x][y-1].posy
feld[x][y-1].box = 0
feld[x][y].scroll = 1
feld[x][y].belegt = 0
ENDIF
ENDIF
IF feld[x][y].box = 0 AND feld[x][y].scroll = 1
IF feld[x][y].sy = feld[x][y].posy
feld[x][y].box = feld[x][y].alt
feld[x][y].scroll = 0
feld[x][y-1].belegt = 1
feld[x][y].belegt = 0
ENDIF
DRAWSPRITE feld[x][y].alt, feld[x][y].posx, feld[x][y].sy
feld[x][y].sy = feld[x][y].sy +1
feld[x][y].belegt = 0
ENDIF
IF feld[x][y].box = 0 THEN DRAWSPRITE 4, feld[x][y].posx,feld[x][y].posy
IF feld[x][y].box = 1 THEN DRAWSPRITE 1, feld[x][y].posx,feld[x][y].posy
IF feld[x][y].box = 2 THEN DRAWSPRITE 2, feld[x][y].posx,feld[x][y].posy
IF feld[x][y].box = 3 THEN DRAWSPRITE 3, feld[x][y].posx,feld[x][y].posy
IF feld[x][y].box = 4 THEN DRAWSPRITE 5, feld[x][y].posx,feld[x][y].posy
IF feld[x][y].box = 5 THEN DRAWSPRITE 6, feld[x][y].posx,feld[x][y].posy
IF feld[x][y].box = 6 THEN DRAWSPRITE 7, feld[x][y].posx,feld[x][y].posy
IF b1 = 1
IF mx >= feld[x][y].posx AND mx <= (feld[x][y].posx + 48) AND my >= feld[x][y].posy AND my <= (feld[x][y].posy + 48)
feld[x][y].belegt = 1
ENDIF
ENDIF
NEXT
NEXT
//fallen ende
ENDSUB // MOVEMENT
[EDIT]: Ich raffs nicht, hab jetzt den movement code bestimmt 5 mal verändert und neu schritt für schritt zusammengebaut, ich gebs bald auf, ich find den verdammten fehler nicht, macht mich wahnsinnig...
hab jetzt nochmal was probiert.
was sagt ihr dazu, könnte das in etwa funktionieren?
glb spuckt fehler aus, was ist daran falsch?
SUB movement:
//fallen
IF b1 = 1 //maustaste
IF mx >= feld[x][y].px AND mx <= (feld[x][y].px + 48) AND my >= feld[x][y].py AND my <= (feld[x][y].py + 48) AND anim = 0
FOR x = 0 TO tilesX - 1
FOR y = tilesY - 2 TO 1 STEP -1
IF feld[x][y].box <> 0 AND feld[x][y+1].box = 0
anim = -tileSize //Animation starten
feld[x][y+1].animation = anim //Animation starten
feld[x][y+1].box = feld[x][y].box
feld[x][y].box = 0
END IF
NEXT
NEXT
ENDIF
ENDIF
//animation
IF anim < 0 //Animation
anim = anim + 1
FOR x = 0 TO tilesX - 1
FOR y = 0 TO tilesY - 1
IF feld[x][y].animation < 0
feld[x][y].animation = anim
END IF
NEXT
NEXT
END IF
//////////////////////////////////////////////////
FOR x = 0 TO tilesX-1
FOR y = 0 TO tilesY-1
IF feld[x][y].box = 1 THEN DRAWSPRITE 1, feld[x][y].px,feld[x][y].py
IF feld[x][y].box = 2 THEN DRAWSPRITE 2, feld[x][y].px,feld[x][y].py
IF feld[x][y].box = 3 THEN DRAWSPRITE 3, feld[x][y].px,feld[x][y].py
IF feld[x][y].box = 4 THEN DRAWSPRITE 5, feld[x][y].px,feld[x][y].py
IF feld[x][y].box = 5 THEN DRAWSPRITE 6, feld[x][y].px,feld[x][y].py
IF feld[x][y].box = 6 THEN DRAWSPRITE 7, feld[x][y].px,feld[x][y].py
NEXT
NEXT
//fallen ende
ENDSUB // MOVEMENT
keine ideen?
Das ist total schwierig so einen langen Code erstmal zu lesen und dann versuchen zu verstehen. Ich hab kurz drübergeschaut und aufgegeben.
Aber: Mach doch einfach ein 2. Feld in dem alle Steine, die Fallen mit "1" eingetragen sind. Dann lass alle diese weich runterrutschen.
mmm stimmt, und ich geb zu dass ich mir das auch schon gedacht hatte zwischendurch.
aber hey endlich mal einer, der versteht, warum ich nicht mehr durchgesehen habe.
mal schauen was ich heute abend zustande kriege.
Wo und wie sollte ich die Bewegungskoordinaten am besten speichern?
Also wie würde ich das am besten umsetzen müssen.
Ich könnte mich so um ein wenig Denkarbeit drücken sonst seh ich am Ende wieder nicht durch.
So ein MoveSprite von-nach koord. wäre cool, in diesem moment.
Na, ich würde eine "fall_y" variable machen, die von 0 bis "blockbröße" durchzählt.
Vorher alle fallenden Blöcke aus dem Hintergrund-Feld rausnehmen.
Dann die fallenden Blöcke um diesen Wert nach unten verschoben zeichnen.
Dann die gefallenen Blöcke wieder in das Hintergrundfeld einfügen, aber halt um 1 tiefer.
es müsste also jedesmal, wenn ein block gelöscht wird, der darüber mit gelöscht werden, und bei beiden im anderen feld der fall des oberen blockes realisiert werden.
nach dem fall den wert des gefallenen blockes in das darunterliegene array legen und fallen auf 0 stellen.
frage mich nur, wie ich das am besten anstelle, wegen den darüberliegenden, weil jedesmal ja der alte wert zwischengespeichert werden müsste, weil wenn unten ein feld gelöscht wird, alle darüber ja auch gelöscht werden.
und die fall_y variable bleibt ja gleich oder?wird in der fallroutine als andere variable die fall_y + 1 enthält, richtig?
Du machst eine Schleife, die von 0 bis y_geloescht-1 zählt, und kopierst alle diese Felder in das "fallen" Feld und nimmst sie gleichzietig aus dem statischen Feld raus.
Dann noch den y_geloescht aus dem statischen Feld rausnehmen und fertig.
Noch besser: trag alle Steine im "fallen" Feld da ein, wo sie _hinmüssen_. Das hat den Vorteil, dass Du bei y=0 noch einen zufälligen Stein dazupacken kannst.
PS: Meine Frau hat einen Acer Extensa 5220 mit Ubuntu für 400,-!!
QuoteDu machst eine Schleife, die von 0 bis y_geloescht-1 zählt, und kopierst alle diese Felder in das "fallen" Feld und nimmst sie gleichzietig aus dem statischen Feld raus.
Dann noch den y_geloescht aus dem statischen Feld rausnehmen und fertig.
Noch besser: trag alle Steine im "fallen" Feld da ein, wo sie _hinmüssen_. Das hat den Vorteil, dass Du bei y=0 noch einen zufälligen Stein dazupacken kannst.
da komm ich jetzt nicht so ganz mit...
könntest du so einen code eventuell posten?
also ich mein ein 10x10 feld gefüllt mit steinen, können ja drawrects sein.und beim draufklicken eines steins, fällt alles drüber schön smooth runter.
ich quäl mich jetzt schon so lange.büdde büdde
einer von den beiden lappis war auch mit irgend so einem linux für 399....
@gernot: könntest du so einen code eventuell posten?
also ich mein ein 10x10 feld gefüllt mit steinen, können ja drawrects sein.und beim draufklicken eines steins, fällt alles drüber schön smooth runter.
ich quäl mich jetzt schon so lange.büdde büdde
Wenn ich mal Zeit finde. Z.Zt. ist viel los. Sorry.
danke dir, wäre echt suuuupernett von dir.
wäre cool, wenn noch jemand dannach schauen würde, da ich momentan wenig Zeit habe.
Ich ziehe in 14 tagen ca. nach Bayern und hab daher wenig Zeit zum proggen bzw. auch keinen Kopf dafür.
Nach dem Umzug und wenn ich dann wieder irgendwo Netz hab, bin ich natürlich wieder voll dabei.
Wohin ziehst du den?
Füssen wirds wohl werden.
Gleich bei mir um die Ecke :D
Ist ja krass :)
Da können Bee und ich dich mal besuchen kommen :P
echt, cool.ich folge meinem herzen und daher verschlägt es mich zu euch in die ecke.
hab mir für eine woche ein zimmer dort gemietet, und such mir dort irgendeinen job und eine wohnung.
tja die liebe halt.
wo wohnt ihr denn genau?
Ich Kaufbeuren und BumbleBee glaub Richtung Bad Wörishofen...
Ziehst du da wegen deiner Flamme(Freundin) hin?
Was haste den gelernt wenn ich mal so fragen darf?
Bei uns suchen die öfter mal einen ( Metallverarbeingsbetrieb)
In der Elektrobranche hab ich mal gelernt, aber auf grund eines Pflegefalls (die Tochter meiner Ex Frau war schwerstbehindert) hatte ich keine Möglichkeit noch was zu machen.
Und hier im Osten ist es eh schwierig mit Arbeit.
Daher versuch ich es dort im gastronomischen Bereich und mal schauen vielleicht bekomm ich meinen Fachinformatiker noch irgendwann hin.
Im moment ist mir nur wichtig Füssen und egal was für eine Arbeit.Und eben Unterkunft.
Ja der Grund ist meine naja sagen wir mal fast wieder Flamme.
Ist etwas kompliziert, aber wir gehören zusammen, dass haben wir beide feststellen müssen, der eine kann nicht ohne den anderen.
So, nun back to topic, ich meld mich, oder wir tauschen mal handynummern aus, weil ich nicht weiß inwieweit dort dann auf die schnelle internet möglich ist.
Am 17.05. fahr ich auf jeden Fall.
Ich schreib dir mal eine E-Mail mit meiner Nummer :)
Stimmt die *******@seznam.cz E-Mail Adresse ?
Oh, Füssen, super :)
Wir rutschen immer weiter zusammen :)
ja die adresse stimmt, ich schick dir dann meine per sms
Das GLBasic-Imperium wächst zusammen .... Muhahaha ( muss ich direkt an Austin Powers denken :D )
Wir sind dann das GLBI GlobalBasicImperium
:D
du kannst auch gern an nobody7001(ät)googlemail.com schreiben wegen der nummer.
@gernot: wenn du magst, kannst du dir ja meinen code nochmal anschauen.
So ?Heiko? Mail ist raus :)
hab ich, und ich meld mich, danke dir/euch.
:) kein problem
achja, da ich mein finanzielles polster doch ein wenig mehr aufstocken muss, verkaufe ich meinen lappi, der rest ist schon weg.
so muss ich mir, bevor ich das nächste mal dann online gehen kann, ab dem 17. erst nen neuen pc kaufen wenn ich den rest mit whg. usw. hinbekommen hab.
aber handy nummer hab ich, und achja, falls jemand nen lappi will, einfach bescheid geben.
Kostenfaktor?
okay ich verkauf den jetzt für 199 und da sind nachgerüstet 2GB Ram drin.Keine Ahnung ob den jetzt einer will.Hab nur noch bis Mitte nächste Woche Zeit, da muss er verkauft sein.
so, nun backtotopic
Schreib doch mal ein Fakten zum Laptop :)
Acer Extensa 5220
Intel Celeron M 540 1.86Ghz, 2GB Ram 80GB Festplatte, Broadcom WLAN, X3100 Grafik, DVD-RW-Brenner, Texas Cardreader.Was noch?
Ich hör mich mal um, ich glaub mein Arbeitskollege sucht einen!
das wär super, weil wenn ich den nicht schnellstmöglich verkaufe, geraten meine fahrpläne am 17. ins wanken.
Ich hab den gleichen für meine Frau. Läuft mit Ubuntu, super Gerät, Spitzenpreis!
So, jungens, ich hab beschlossen meinen Lappi doch zu behalten, konnte Geld noch anderweitig auftreiben.
Ich habe eine große Bitte an Gernot, oder sonstjemanden.
Ich würde gern während meiner offline Zeit weiter proggen, aber komm ja bei meinem Problem hier nicht weiter.
Ich bin noch bis Freitag Nacht in de Lage hier reinzuschauen, und wollte bitten, ob jemand mir bei der Lösung der Fallroutine helfen kann?
Also dass die steine auch richtig fliessend fallen.
Wäre echt supernett, wenn da jemand helfen könnte.
Ich fahr' später weg inn Urlaub (nur 2 Tage).
Kann das mal jemand machen? Schranz0r? Schreib's evtl. neu, wenn Du seinen code net verstehst.
Nagut dann werd ich mal =D
Das ist echt supernett.
Heute Abend bzw. Nacht irgendwann hab ich die letzte Möglichkeit online zu gehen, weil morgen früh um 5 fährt mein Zug.
Vielen Vielen Dank
Heute schaff ich es wohl nimmer, kanns dir aber evtl mal geben, wenn wir uns treffen ;)
Kannst dann auch gerne zu mir kommen, da gibts Internet :P
klar, das wird nächste woche sicher.
bin/sind halt nur momentan nicht mobil.
aber wär hammer, da kann ich dann endlich weitermachen.
Zug fährt von Füssen direkt nach Kaufbeuren ;)
Wochenendticket und gut ist :P
Deinen Laptop haste ja noch, also kanns bei mir immer updaten ;)
Bin aus privaten Gründen wieder heim gefahren, nundenn, so bin ich wenigstens wieder online.
waren krasse 2.5 wochen.
Kann sich jetzt vielleicht doch mal einer meiner annehmen, und mir hier helfen?
Ich kann leider net, hab jetzt selber stress. :S
schade, aber ich versuch mich heut nacht selber nochmal dran.