Spiel-Optimierung, zwei Timer in einer Form



  • Hi,

    ich bin dabei ein Spiel zu programmieren, bzw.: ein Grunderüst zu erstellen ...

    Da ich nicht mich nicht mit Spiele programieren auskenne hoffe ich HIER Hilfe zu erhalten.

    In meinem "Spiel" soll ein kleines Viereck, á la Tetris herunterfallen, dies habe ich mit einem Timer gemacht, und ein anderer Timer fragt die Tasten-Eingabe ab. Für die spätere Kollision wird alles in einem Array gespeichert.
    1.) kann ich das irgendwie einfacher/anders/besser machen ?? Form1:OnKeyDown ...

    Wenn ihr dann mein "Spiel" im Builder ausführt werdet Ihr sehen, dass beim schnellen Links und Rechts (Zickzack) auf dem rechten StringGrid Einträge zurückbleiben ...
    2.) Wieso ??

    Anregungen, Tips oder Gut/Schlecht Meinungen sind ausdrücklich erlaubt.

    jetzt endlich der Code:

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "tatris_ver04_cpp.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    TImage *Image[100];
    int i=0,U=0,R=0;
    int koordi[100][100];
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void bild_erstelln()
    {
     i++;
     Image[i]= new TImage(Form1);
     Image[i]->Parent = Form1->Panel1;
     Image[i]->Width = 15;
     Image[i]->Height = 15;
     Image[i]->Top = 0;
     Image[i]->Left = 60;
     Image[i]->Visible  = true;
    // Image[i]->AutoSize = true;
     Form1->ImageList1->GetBitmap(0,Image[i]->Picture->Bitmap);
    // Form1->StringGrid2->Cells[0][0] = "Cre";
    // koordi[0][0] = 1;
     //Form1->StringGrid2->Row = 0;
    /* Form1->Label9->Caption = Form1->StringGrid1->ColCount;
     Form1->Label1->Caption =  Form1->StringGrid1->Col;
     Form1->Label2->Caption = Form1->StringGrid1->Row;
     Form1->Label6->Caption = Row;
    */}
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
      /*if (GetAsyncKeyState(VK_UP) < 0 && Image[i]->Top >= 1)
      {
       Image[i]->Top = Image[i]->Top-15;
      } */
      U = Image[i]-> Top / 15;
      R = Image[i]-> Left / 15;
       if (GetAsyncKeyState(VK_DOWN) < 0 && Image[i]->Top <= Panel1->Height-Image[i]->Height-15)
      {
       Image[i]->Top = Image[i]->Top+15;
       U++;
       koordi[R][U] = 2;
       koordi[R][U-1] = 0;
      }
      if (GetAsyncKeyState(VK_RIGHT) < 0 && Image[i]->Left <= Panel1->Width-Image[i]->Width-2)
      {
       Image[i]->Left = Image[i]->Left+15;
       R++;
       koordi[R][U] = 3;
       koordi[R-1][U] = 0;
      }
       if (GetAsyncKeyState(VK_LEFT) < 0 && Image[i]->Left >= 1)
      {
      Image[i]->Left = Image[i]->Left-15;
       R--;
       koordi[R][U] = 4;
       koordi[R+1][U] = 0;
      }
      Label1->Caption = Panel1->Width-Image[i]->Left;
      Label2->Caption = Image[i]->Top;
      Label3->Caption = Image[i]->Left;
    
      for (int x = 0; x <= 10; x++)
     {
      for (int y = 0; y <= 19; y++)
      {
       Form1->StringGrid1->Cells[x][y] = koordi[x][y];
      }
     }
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::nach_unten(TObject *Sender) // grhört zu Timer2
    {
     U = Image[i]-> Top / 15;
     R = Image[i]-> Left / 15;
     if (Image[i]->Top < Panel1->Height-Image[i]->Height)
     {
      Image[i]->Top = Image[i]->Top+1;
    
      koordi[R][U] = 11;
      koordi[R][U-1] = 0;
    
     }
       if (Image[i]->Top >= Panel1->Height-Image[i]->Height)
       bild_erstelln();
     //Label4->Caption = Panel1->Height-Image[i]->Height;
    /* if (koordi[R][U+1] == 1)
      bild_erstelln();
    */}
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
     bild_erstelln();
    }
    //---------------------------------------------------------------------------
    

    so sieht mein Programm/Spiel aus:

    object Form1: TForm1
      Left = 220
      Top = 113
      Width = 329
      Height = 377
      Caption = 'Form1'
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = []
      OldCreateOrder = False
      OnCreate = FormCreate
      PixelsPerInch = 96
      TextHeight = 13
      object Label1: TLabel
        Left = 1
        Top = 304
        Width = 32
        Height = 13
        Caption = 'Label1'
      end
      object Label2: TLabel
        Left = 41
        Top = 304
        Width = 32
        Height = 13
        Caption = 'Label2'
      end
      object Label3: TLabel
        Left = 81
        Top = 304
        Width = 32
        Height = 13
        Caption = 'Label3'
      end
      object Label4: TLabel
        Left = 121
        Top = 304
        Width = 32
        Height = 13
        Caption = 'Label4'
      end
      object Panel1: TPanel
        Left = 0
        Top = 0
        Width = 150
        Height = 300
        Color = clSkyBlue
        TabOrder = 0
      end
      object ScrollBar1: TScrollBar
        Left = 1
        Top = 320
        Width = 144
        Height = 19
        PageSize = 0
        TabOrder = 2
      end
      object StringGrid1: TStringGrid
        Left = 153
        Top = 0
        Width = 165
        Height = 325
        ColCount = 10
        DefaultColWidth = 15
        DefaultRowHeight = 15
        FixedCols = 0
        RowCount = 20
        FixedRows = 0
        TabOrder = 1
      end
      object Timer1: TTimer
        Tag = 1
        Interval = 100
        OnTimer = Timer1Timer
        Left = 249
        Top = 32
      end
      object Timer2: TTimer
        Interval = 100
        OnTimer = nach_unten
        Left = 201
        Top = 88
      end
      object ImageList1: TImageList
        Left = 257
        Top = 104
        Bitmap = {
          494C010101000400040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
          0000000000003600000028000000400000001000000001002000000000000010
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          000000000000000000000000000000000000FFC58A0000000000000000000000
          000000000000000000000000000000000000FFC58A0000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          000000000000000000000000000000000000FFC58A00FF800000FF800000FF80
          0000FF800000FF8000000000000000000000FFC58A00FF800000FF800000FF80
          0000FF800000FF80000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          000000000000000000000000000000000000FFC58A00FF800000FF800000FF80
          0000FF800000FF8000000000000000000000FFC58A00FF800000FF800000FF80
          0000FF800000FF80000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          000000000000000000000000000000000000FFC58A00FF800000FF800000FF80
          0000FF800000FF8000000000000000000000FFC58A00FF800000FF800000FF80
          0000FF800000FF80000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          000000000000000000000000000000000000FFC58A00FF800000FF800000FF80
          0000FF800000FF8000000000000000000000FFC58A00FF800000FF800000FF80
          0000FF800000FF80000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          000000000000000000000000000000000000FFC58A00FF800000FF800000FF80
          0000FF800000FF8000000000000000000000FFC58A00FF800000FF800000FF80
          0000FF800000FF80000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          000000000000000000000000000000000000FFC58A00FFC58A00FFC58A00FFC5
          8A00FFC58A00FFC58A00FFC58A0000000000FFC58A00FFC58A00FFC58A00FFC5
          8A00FFC58A00FFC58A00FFC58A00000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          000000000000000000000000000000000000FFC58A0000000000000000000000
          000000000000000000000000000000000000FFC58A0000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          000000000000000000000000000000000000FFC58A00FF800000FF800000FF80
          0000FF800000FF8000000000000000000000FFC58A00FF800000FF800000FF80
          0000FF800000FF80000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          000000000000000000000000000000000000FFC58A00FF800000FF800000FF80
          0000FF800000FF8000000000000000000000FFC58A00FF800000FF800000FF80
          0000FF800000FF80000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          000000000000000000000000000000000000FFC58A00FF800000FF800000FF80
          0000FF800000FF8000000000000000000000FFC58A00FF800000FF800000FF80
          0000FF800000FF80000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          000000000000000000000000000000000000FFC58A00FF800000FF800000FF80
          0000FF800000FF8000000000000000000000FFC58A00FF800000FF800000FF80
          0000FF800000FF80000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          000000000000000000000000000000000000FFC58A00FF800000FF800000FF80
          0000FF800000FF8000000000000000000000FFC58A00FF800000FF800000FF80
          0000FF800000FF80000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          000000000000000000000000000000000000FFC58A00FFC58A00FFC58A00FFC5
          8A00FFC58A00FFC58A00FFC58A0000000000FFC58A00FFC58A00FFC58A00FFC5
          8A00FFC58A00FFC58A00FFC58A00000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          000000000000000000000000000000000000424D3E000000000000003E000000
          2800000040000000100000000100010000000000800000000000000000000000
          000000000000000000000000FFFFFF0000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          0000000000000000000000000000000000000000000000000000000000000000
          000000000000}
      end
    end
    


  • Hallo

    In meinem "Spiel" soll ein kleines Viereck, á la Tetris herunterfallen, dies habe ich mit einem Timer gemacht, und ein anderer Timer fragt die Tasten-Eingabe ab. Für die spätere Kollision wird alles in einem Array gespeichert.
    1.) kann ich das irgendwie einfacher/anders/besser machen ?? Form1:OnKeyDown ...

    Ein Timer sollte reichen. OnKeyDown wäre im Gegensatz zu Get..KeyState ein anderes Prinzip, dürfte aber für deine Zwecke keine effektiven Änderungen erreichen.

    Wenn ihr dann mein "Spiel" im Builder ausführt werdet Ihr sehen, dass beim schnellen Links und Rechts (Zickzack) auf dem rechten StringGrid Einträge zurückbleiben ...
    2.) Wieso ??

    Weil TStringGrid nicht das richtige Control für deine Zwecke ist.
    Benutzt lieber eine TPaintBox um mit Canvas-Methoden direkt die Spielelemente zu zeichnen. Hier hast du viel mehr Möglichkeiten zu optimieren und lernen.

    bis bald
    akari



  • @akari danke für die schnelle hilfe...

    mein spielstein ist ein Image aus einer ImageList,
    das StringGrid erleichtert mir die spätere kollisionserkennung,
    ich speichere die koordinaten vom spielstein in einem raster (array),
    der Timer bewegt den stein um die höhe des steines nach unten, in meinem Fall um 15,

    das mit den zwei bzw einen Timer habe ich verstanden, auch das mit dem OnKeyDown,
    nur hast du @akari -glaube ich- nicht mein zweites problem verstanden,
    das StingGrid zweigt mir die position des steines an, ich kennzeichne das mit einer 1,

    mein porblem ist noch bei dem fall, wenn der stein nach unten fällt und gleichzeitig ich den stein zur seite bewege, dann entsteht ein "Treppen-Effekt" , so wie ich das nenne,

    X_______   <- nach links ... nach rechts -> ________X
    ______|                                                   |_______
    an der stelle X bleibt ein wert übrig, den ich nicht haben will,
    

    ich habe mir den Vorschlag von akari wegen der TPaintBox mit Canvas-Methode angeschaut,
    das wäre ja nur eine andere möglichkeit ein spielstein darzustellen,
    aber da kommt mir die frage auf, wie soll ich dann die kollision machen,
    da stört immer noch der "Treppen" effekt...


Anmelden zum Antworten