GLBasic forum

Other languages => GLBasic - de => Topic started by: x-tra on 2008-Apr-05

Title: Wer findet den Fehler?
Post by: x-tra on 2008-Apr-05
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.


Code (glbasic) Select
// --------------------------------- //
// 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/)
Title: Wer findet den Fehler?
Post by: Kitty Hello on 2008-Apr-05
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
Title: Wer findet den Fehler?
Post by: Schranz0r on 2008-Apr-05
Cheater ^^
Title: Wer findet den Fehler?
Post by: x-tra on 2008-Apr-05
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)

Code (glbasic) Select
// --------------------------------- //
// 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.
Title: Wer findet den Fehler?
Post by: Kitty Hello on 2008-Apr-07
Fehle bei:
Code (glbasic) Select
  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:
Code (glbasic) Select
CASE "000" OR "111" ...Hier mal eine Mini-Bejeweled.


Code (glbasic) Select
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
Title: Wer findet den Fehler?
Post by: x-tra on 2008-Apr-07
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.

Code (glbasic) Select
// --------------------------------- //
// 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
Title: Wer findet den Fehler?
Post by: Kitty Hello on 2008-Apr-07
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?
Title: Wer findet den Fehler?
Post by: x-tra on 2008-Apr-07
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.

Code (glbasic) Select
// --------------------------------- //
// 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
Title: Wer findet den Fehler?
Post by: x-tra on 2008-Apr-08
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)

Code (glbasic) Select
// --------------------------------- //
// 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
Title: Wer findet den Fehler?
Post by: Schranz0r on 2008-Apr-08
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 :)
Title: Wer findet den Fehler?
Post by: x-tra on 2008-Apr-08
[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.

Code (glbasic) Select
// --------------------------------- //
// 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
Title: Wer findet den Fehler?
Post by: Schranz0r on 2008-Apr-08
[Anregung]
Code (glbasic) Select
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:
Code (glbasic) Select
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]
Title: Wer findet den Fehler?
Post by: x-tra on 2008-Apr-08
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.
Title: Wer findet den Fehler?
Post by: Kitty Hello on 2008-Apr-09
Gleich schnell bei Bejeweled? LIMITFPS 60
Title: Wer findet den Fehler?
Post by: x-tra on 2008-Apr-09
ja ich dachte wegen den fallenden steinen, dass die überall gleich schnell fallen......
Title: Wer findet den Fehler?
Post by: Kitty Hello on 2008-Apr-09
Eben. Bei LIMITFPS fallen die überall gleich schnell. Nur mit LIMITFPS -1 muss man aufpassen. Aber das ist nur für 3D Spiele interessant.
Title: Wer findet den Fehler?
Post by: x-tra on 2008-Apr-09
was passiert denn bei -1?
Title: Wer findet den Fehler?
Post by: Kitty Hello on 2008-Apr-09
Kein Limit. Showscreen so schnell wie geht - schau mal in die Hilfe.
Title: Wer findet den Fehler?
Post by: x-tra on 2008-Apr-13
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.


Code (glbasic) Select
// --------------------------------- //
// 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.


Code (glbasic) Select
// --------------------------------- //
// 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.

Code (glbasic) Select
// ------------------------------------------------------------- //
// ---  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...
Title: Wer findet den Fehler?
Post by: x-tra on 2008-Apr-13
hab jetzt nochmal was probiert.

was sagt ihr dazu, könnte das in etwa funktionieren?
glb spuckt fehler aus, was ist daran falsch?

Code (glbasic) Select
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
Title: Wer findet den Fehler?
Post by: x-tra on 2008-Apr-17
keine ideen?
Title: Wer findet den Fehler?
Post by: Kitty Hello on 2008-Apr-17
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.
Title: Wer findet den Fehler?
Post by: x-tra on 2008-Apr-17
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.
Title: Wer findet den Fehler?
Post by: Kitty Hello on 2008-Apr-17
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.
Title: Wer findet den Fehler?
Post by: x-tra on 2008-Apr-17
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?
Title: Wer findet den Fehler?
Post by: Kitty Hello on 2008-Apr-17
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,-!!
Title: Wer findet den Fehler?
Post by: x-tra on 2008-Apr-17
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....
Title: Wer findet den Fehler?
Post by: x-tra on 2008-Apr-22
@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
Title: Wer findet den Fehler?
Post by: Kitty Hello on 2008-Apr-22
Wenn ich mal Zeit finde. Z.Zt. ist viel los. Sorry.
Title: Wer findet den Fehler?
Post by: x-tra on 2008-Apr-22
danke dir, wäre echt suuuupernett von dir.
Title: Wer findet den Fehler?
Post by: x-tra on 2008-Apr-30
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.
Title: Wer findet den Fehler?
Post by: Schranz0r on 2008-Apr-30
Wohin ziehst du den?
Title: Wer findet den Fehler?
Post by: x-tra on 2008-Apr-30
Füssen wirds wohl werden.
Title: Wer findet den Fehler?
Post by: Schranz0r on 2008-Apr-30
Gleich bei mir um die Ecke :D
Ist ja krass :)

Da können Bee und ich dich mal besuchen kommen :P
Title: Wer findet den Fehler?
Post by: x-tra on 2008-Apr-30
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?
Title: Wer findet den Fehler?
Post by: Schranz0r on 2008-Apr-30
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)
Title: Wer findet den Fehler?
Post by: x-tra on 2008-Apr-30
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.
Title: Wer findet den Fehler?
Post by: Schranz0r on 2008-May-01
Ich schreib dir mal eine E-Mail mit meiner Nummer :)

Stimmt die *******@seznam.cz E-Mail Adresse ?
Title: Wer findet den Fehler?
Post by: D2O on 2008-May-01
Oh, Füssen, super :)

Wir rutschen immer weiter zusammen :)
Title: Wer findet den Fehler?
Post by: x-tra on 2008-May-01
ja die adresse stimmt, ich schick dir dann meine per sms
Title: Wer findet den Fehler?
Post by: Schranz0r on 2008-May-01
Das GLBasic-Imperium wächst zusammen .... Muhahaha ( muss ich direkt an Austin Powers denken :D )
Title: Wer findet den Fehler?
Post by: x-tra on 2008-May-01
Wir sind dann das GLBI   GlobalBasicImperium
Title: Wer findet den Fehler?
Post by: Schranz0r on 2008-May-01
:D
Title: Wer findet den Fehler?
Post by: x-tra on 2008-May-01
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.
Title: Wer findet den Fehler?
Post by: Schranz0r on 2008-May-01
So ?Heiko? Mail ist raus :)
Title: Wer findet den Fehler?
Post by: x-tra on 2008-May-01
hab ich, und ich meld mich, danke dir/euch.
Title: Wer findet den Fehler?
Post by: Schranz0r on 2008-May-02
:) kein problem
Title: Re: Wer findet den Fehler?
Post by: x-tra on 2008-May-03
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.
Title: Re: Wer findet den Fehler?
Post by: Schranz0r on 2008-May-04
Kostenfaktor?
Title: Re: Wer findet den Fehler?
Post by: x-tra on 2008-May-05
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
Title: Re: Wer findet den Fehler?
Post by: Schranz0r on 2008-May-05
Schreib doch mal ein Fakten zum Laptop :)
Title: Re: Wer findet den Fehler?
Post by: x-tra on 2008-May-05
Acer Extensa 5220

Intel Celeron M 540 1.86Ghz, 2GB Ram 80GB Festplatte, Broadcom WLAN, X3100 Grafik, DVD-RW-Brenner, Texas Cardreader.Was noch?
Title: Re: Wer findet den Fehler?
Post by: Schranz0r on 2008-May-05
Ich hör mich mal um, ich glaub mein Arbeitskollege sucht einen!
Title: Re: Wer findet den Fehler?
Post by: x-tra on 2008-May-05
das wär super, weil wenn ich den nicht schnellstmöglich verkaufe, geraten meine fahrpläne am 17. ins wanken.
Title: Re: Wer findet den Fehler?
Post by: Kitty Hello on 2008-May-05
Ich hab den gleichen für meine Frau. Läuft mit Ubuntu, super Gerät, Spitzenpreis!
Title: Re: Wer findet den Fehler?
Post by: x-tra on 2008-May-14
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.
Title: Re: Wer findet den Fehler?
Post by: Kitty Hello on 2008-May-15
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.
Title: Re: Wer findet den Fehler?
Post by: Schranz0r on 2008-May-15
Nagut dann werd ich mal  =D
Title: Re: Wer findet den Fehler?
Post by: x-tra on 2008-May-16
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
Title: Re: Wer findet den Fehler?
Post by: Schranz0r on 2008-May-16
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
Title: Re: Wer findet den Fehler?
Post by: x-tra on 2008-May-16
klar, das wird nächste woche sicher.
bin/sind halt nur momentan nicht mobil.

aber wär hammer, da kann ich dann endlich weitermachen.
Title: Re: Wer findet den Fehler?
Post by: Schranz0r on 2008-May-16
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 ;)
Title: Re: Wer findet den Fehler?
Post by: x-tra on 2008-Jun-04
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?
Title: Re: Wer findet den Fehler?
Post by: Schranz0r on 2008-Jun-05
Ich kann leider net, hab jetzt selber stress.  :S
Title: Re: Wer findet den Fehler?
Post by: x-tra on 2008-Jun-05
schade, aber ich versuch mich heut nacht selber nochmal dran.