Wer findet den Fehler?

Previous topic - Next topic

Kitty Hello

Eben. Bei LIMITFPS fallen die überall gleich schnell. Nur mit LIMITFPS -1 muss man aufpassen. Aber das ist nur für 3D Spiele interessant.

x-tra

was passiert denn bei -1?

Kitty Hello

Kein Limit. Showscreen so schnell wie geht - schau mal in die Hilfe.

x-tra

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

[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...

x-tra

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

x-tra


Kitty Hello

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.

x-tra

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.

Kitty Hello

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.

x-tra

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?

Kitty Hello

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,-!!

x-tra

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....

x-tra

@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

Kitty Hello

Wenn ich mal Zeit finde. Z.Zt. ist viel los. Sorry.

x-tra

danke dir, wäre echt suuuupernett von dir.