"Spielfeld" aufbauen dauert "ewig" / mit vielen Images arbeiten



  • Ich möchte ein Spielfeld für ein Schachspiel aufbauen, leider dauert das im Moment sehr lange. Ich mache es so:

    for (int i=0; i<N; i++)
          for (int j=0; j<M; j++)
          {
            image_lst[i][j]=new TImage(WorkForm);
            image_lst[i][j]->Parent=WorkForm; 
            image_lst[i][j]->Picture->Bitmap->LoadFromFile("blablabla.bmp");
            image_lst[i][j]->Height = 32;
            image_lst[i][j]->Width = 32;
            image_lst[i][j]->Top = j*32;
            image_lst[i][j]->Left = i*32;
            image_lst[i][j]->OnClick = Click;
           }
    

    Gibt es da eine effizientere Vorgehensweise?



  • wenn du das spielfeld öfters neu aufbaus könnte es ,abhängig von der größe der bitmaps, was bringen wenn du die bitmaps beim programmstart erst in eine liste lädsts.Auf die einzelen Bitmaps kann man dann über GetBitmap zugreifen.



  • nimm ein einzelnes bild das die komplette spielfläche darstellt!

    ausserdem gibt es nur 2 unterschiedliche felder (schwarz, weiss), warum also jedes mal das bild neu laden?!



  • Das Spiefeld als solches würde ich gar nicht als Bitmap(s) auslegen, sondern direkt auf den Canvas zeichnen. Sind doch nur ein paar Rechtecke.
    Außerdem hast Du dir anscheinend ein Array aus TImages gebastelt. So etwas gibt es schon fertig. Wirf mal einen Blick auf TImageList (nicht für das Spielfeld, sondern die Figuren).



  • Wie das als Code funktioniert, weiß ich jetzt nicht, hab auch keinen BCB zur Hand, aber hier mal die Theorie:

    • Spielfeld aus Rechtecken zeichnen (eine Funktion)
    • Positionen der Spielfiguren ermitteln
    • Spielfiguren aus TImageList laden und auf das Canvas zeichnen (ohne extra TImages)

    Ich denke, dass dir dabei die BCB-Hilfe behilflich sein kann, aber die Suche hier dürfte auch etwas dazu ergeben.

    Die Funktion zum Rechtecke zeichnen ist recht einfach:

    /*** Variablen ***\
    FieldStartLeft  - Position des Spielfeldes von links
    FieldStartTop   - Position des Feldes von oben
    FieldWidth      - Hoehe und Breite eines Feldes
    
    Diese Variablen muessen im Public-Bereich von "TForm1"
    deklariert sein und später definiert werden.
    \*** Ende ***/
    
    void __fastcall TForm1::PaintField(int x,int y)
    {
        for(int _x=0;_x<x;++_x)
        for(int _y=0;_y<y;++_y)
        {
            Canvas->Pen->Color=0xffffff*((_y+(_x&1))&1);
            Canvas->Brush->Color=Canvas->Pen->Color;
            Canvas->RectAngle(FieldStartLeft+_x*FieldWidth,
                              FieldStartTop+_y*FieldWidth,
                              FieldStartLeft+(_x+1)*FieldWidth+1,
                              FieldStartTop+(_y+1)*FieldWidth+1);
        }
    }
    

    Und die Theorie zum Aufbau der Spielfiguren: Es gibt folgende Figuren:

    • Bauer
    • Turm
    • Pferd
    • Läufer
    • Königin
    • König

    Das sind 6 Figuren... am Besten du legst Klassen an (falls du das noch nicht getan hast) und dort eine Eigenschaft "ImageIndex" und mit diesem ImageIndex greifst du auf die TImageList zu... aber du musst noch das Team beachten, es gibt 2 Teams... da wir also 6 Spoielfiguren haben, je weiß und schwarz, macht das 12 Bilder, so rechnest du im tatsächlichen Index einfach ImageIndex + 6 * (Team=="Schwarz")... soweit zur Theorie



  • //bei den Variablen deklarieren
    TPicture *Spielfeld, Bauer_w /*die restlichen der Figuren auch noch*/;
    
    //in der FormCreate-Methode oder vergleichbar:
    
    Spielfeld=new TPicture;//für alle anderen auch
    Image1->Picture=Spielfeld;
    //aufstellung:
    Image1->Canvas->Draw(x,y,Bauer->Graphic);//ebenfalls für alle anderen Figuren noch machen, halt an die richtige stelle.
    

    so musst du dich nur noch um die Position(en) kümmern bzw. ob die Figur überhaupt noch im Spiel ist, so wirds schon viel einfacher. und natürlich das "schachbrett" immer wieder neu zeichnen, sonst ist irgendwann das ganze Feld voller Figuren.


Anmelden zum Antworten