Problem bei Breakout Shapes werden nicht gelöscht



  • Hallo,

    Also versuche mich grad an dem Spiel Breakout.
    Und zwar versuche ich das Zerstören von Blöcken wen der sie berührt zu realisieren.
    Habe nun folgendes Problem. Und zwar wenn der Ball(shape) auf ein Block(shape) trifft setze ich den Block auf Visible=false un der Ball fliegt zurück und es werden Punkte addiert. Wenn der Ball dann erneut an die stelle fliegt wo dieser Block sich befand prallt er an dieser stelle ab als ob der Block noch da wäre ,statt dessen müsste er zum nähsten block fliegen un diesen zeurstören.

    Zum Programm:
    Funktion Blocks() wird in einem Timer aufgerufen Intervall=1.

    //Position des Balls
    dp=sh_Ball->Left;
    ap=sh_Ball->Top+9;
    bp=sh_Ball->Left+9;
    cp=sh_Ball->Top;
    
    void __fastcall TForm2::Blocks()
    {
    
        Blockfeld[0]=sh_block1;
        Blockfeld[1]=sh_block2;
        Blockfeld[2]=sh_block3;
        Blockfeld[3]=sh_block4;
        Blockfeld[4]=sh_block5;
        Blockfeld[5]=sh_block6;
        Blockfeld[6]=sh_block7;
        Blockfeld[7]=sh_block8;
        Blockfeld[8]=sh_block9;
        Blockfeld[9]=sh_block10;
        Blockfeld[10]=sh_block11;
        Blockfeld[11]=sh_block12;
        Blockfeld[12]=sh_block13;
        Blockfeld[13]=sh_block14;
        Blockfeld[14]=sh_block15;
        Blockfeld[15]=sh_block16;
        Blockfeld[16]=sh_block17;
        Blockfeld[17]=sh_block18;
        Blockfeld[18]=sh_block19;
        Blockfeld[19]=sh_block20;
        Blockfeld[20]=sh_block21;
        Blockfeld[21]=sh_block22;
        Blockfeld[22]=sh_block23;
        Blockfeld[23]=sh_block24;
        Blockfeld[24]=sh_block25;
        Blockfeld[25]=sh_block26;
        Blockfeld[26]=sh_block27;
        Blockfeld[27]=sh_block28;
        Blockfeld[28]=sh_block29;
        Blockfeld[29]=sh_block30;
    
       for(int i=0;i<30;i++)
       {
    
            Blh=Blockfeld[i]->Top;
            Blhn=Blockfeld[i]->Top+17;
            Blb=Blockfeld[i]->Left;
            Blbn=Blockfeld[i]->Left+65;
    
            if (Blhn>=cp&&cp<=Blhn&&bp>=Blb&&bp<=Blbn)
            {
            Blockfeld[i]->Visible=false;
            score=score+100;
            speed=3;
    
            }
       }
    
    }
    
    void __fastcall TForm2::Timer3Timer(TObject *Sender)
    {
    
     Blocks();
    }
    

    Im Prinzip müsste ich diesen Block bzw. Shape löschen oder?
    Habe es ausprobiert mit delete(Blockfeld[i]), gelöschd wird das Betreffende Feld allerdings prallt auch dann der ball wieder ab wenn es nicht mer da ist.

    Oder hab ich villeicht ein fehler in meiner if abfrage oder ist das ein timing Problem . Komm absolut nicht mehr weiter.

    Vielen Dank schon im Vorraus für eure Hilfe.+

    MfG Chrsitain



  • Hallo
    Es reicht nicht, nur die Eigenschaft Visible auf false zu setzen.
    Das Objekt ist ja noch vorhanden, aber nur nicht mehr sichtbar....
    Ich würde noch ein Array erstellen, beim Treffer einen Wert setzen und mit in die if-Abfrage einbauen .
    wNw



  • kannst auch einfach noch bei dem if mit der Positionsabfrage das ->Visible == true abfragen. Dann werden nur die beachtet, die auch sichtbar sind.

    greetz KN4CK3R



  • Hallo KN4CK3R
    Hast ja recht !
    Aber bei einigen Levels von Breakout haben die Steine mehr als den Status da/nicht da....
    Und um dass jetzt schon einzuplanen, würde ich den Weg über ein Array gehen.

    wNw



  • hallo

    Das mit der Visible=fasle abfrage in der if Bedingung habe ich probiert. Allerdings stütz das Programm dann ab.
    Hab jetz einfach die Blocks aus dem Spielfel verschoben .
    Ich weis nicht gerade die saubere alternative aber es funktioniert.
    Danke für eure Hilfe.

    Christian



  • Hallo

    if (Blhn>=cp && 
        cp<=Blhn && 
        bp>=Blb  &&
        bp<=Blbn &&
        Blockfeld[i]->Visible) // Hier einfach noch abfragen ob "der Stein" sichtbar ist, oder nich!
    {
      Blockfeld[i]->Visible=false;
      score=score+100;
      speed=3;
    }
    

    LG, Micha


Log in to reply