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