Hilfe bei "Flappy Bird" Clon/TImage

    Hilfe bei "Flappy Bird" Clon/TImage

    Soo hallo erstmal^^
    hatte kp wo ich das sonnst reinpacken sollte also landets hier :3
    Ich soll sowas wie nen kleinen "Flappy Bird-Ableger" programmieren in Delphi 7/Lazarus.
    Soll halt als Presentationsbeispiel für nen Vortrag dienen(Schule unso).
    Hab auch schon ne Idee wies umgesetzt werden kann, sodass die anderen es auch verstehen, deswegen halt nix mit DX usw sondern
    rein mit Delphi/Lazarus Komponenten wie TImage, Timern unso^^
    Meine Idee dazu wars jz das ich mir halt erstmal en lvl als .png erstell, dieses in ein TImage lad, das Fenster auf 400 Breite einstell und
    das dann mit nem timer immer um 1Pixel nach links verschieb. Das hab ich schon alles eingestellt damits passt^^
    Mein problem ist jz: das Image is 4800Pixel lang und die "Röhren" wollte ich halt innem 120-150Pixel abstand(Timer),im nicht sichtbaren Bereich, immer Random(oben,
    mitte oder unten) erstellen lassen und die Position davon im Array speichern für die Kolisionsabfrage später.
    Da sich jedoch das Bild bewegt und deswegen alle gezeichneten Sachen ja gelöscht werden müsste ich ja für alle, sich im momentan sichtbaren Bereich,
    befindlichen Röhren den zeichen Befehl in das onPaint Ereigniss packen, mit nem Array oder so^^
    Hab aber Bedenken das das bei XYZ-Röhren anfängt seeeehr schlecht zu laufen oder zu hängen usw^^
    Genauso hab ich immo iwie ne Denksperre bei der Umsetzung davon und würd mich sehr freuen wenn mir jemand Tipps geben könnte :)
    Keinen Quelltext sondern eher sowas wie ne Anleitung bzw einige Anregungen^^
    Unten is mein Quellcode(ja sehr schlecht und ziemlich wenig aber komm wie gesagt nich ganz weiter:/)
    Bitte um Verständnis :d
    Verschiedene Sachen sind nur zum Testen gewesen und z.B. die Koordinaten der Rohre werden später noch in ner
    eigenen Procedure so angepasst das die sich auch an die richtige Stelle setzen und nicht nur an einer :D
    Spoiler anzeigen

    Delphi-Code

    1. unit Game_u;
    2. {$mode objfpc}{$H+}
    3. interface
    4. uses
    5. Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
    6. ExtCtrls;
    7. type
    8. { TFlappy_Bird }
    9. TFlappy_Bird = class(TForm)
    10. btn_start: TButton;
    11. btn_end: TButton;
    12. btn_stop: TButton;
    13. btn_generieren: TButton;
    14. Image: TImage;
    15. lbl_header: TLabel;
    16. Timer_lauf: TTimer;
    17. Timer_rohr: TTimer;
    18. procedure btn_endClick(Sender: TObject);
    19. procedure btn_startClick(Sender: TObject);
    20. procedure btn_stopClick(Sender: TObject);
    21. procedure btn_generierenClick(Sender: TObject);
    22. procedure FormCreate(Sender: TObject);
    23. procedure ImagePaint(Sender: TObject);
    24. procedure Timer_laufTimer(Sender: TObject);
    25. procedure RohrZeichnen(Hoehe: Integer);
    26. procedure Timer_rohrTimer(Sender: TObject);
    27. private
    28. Roehren: Array of Array['1'..'4'] of Integer;
    29. Rohr :Integer;
    30. public
    31. { public declarations }
    32. end;
    33. var
    34. Flappy_Bird: TFlappy_Bird;
    35. implementation
    36. {$R *.lfm}
    37. { TFlappy_Bird }
    38. procedure TFLappy_Bird.RohrZeichnen(Hoehe: Integer);
    39. begin
    40. if Hoehe=0 then
    41. With Image.Canvas do
    42. begin
    43. Brush.Color:=clGreen;
    44. Rectangle(300,0,335,50); //Rohr oben
    45. Rectangle(295,45,340,65);
    46. Rectangle(300,250,335,120); //Rohr unten
    47. Rectangle(295,115,340,135);
    48. end;
    49. if Hoehe=1 then
    50. With Image.Canvas do
    51. begin
    52. Brush.Color:=clGreen;
    53. Rectangle(300,0,335,90); //Rohr oben
    54. Rectangle(295,85,340,105);
    55. Rectangle(300,250,335,160); //Rohr unten
    56. Rectangle(295,155,340,175);
    57. end;
    58. if Hoehe=2 then
    59. With Image.Canvas do
    60. begin
    61. Brush.Color:=clGreen;
    62. Rectangle(300,0,335,130); //Rohr oben
    63. Rectangle(295,125,340,145);
    64. Rectangle(300,250,335,200); //Rohr unten
    65. Rectangle(295,195,340,215);
    66. end;
    67. end;
    68. procedure TFlappy_Bird.Timer_rohrTimer(Sender: TObject);
    69. begin
    70. Rohr:= Rohr+1;
    71. SetLength(Roehren,Length(Roehren)+1);
    72. end;
    73. procedure TFlappy_Bird.btn_endClick(Sender: TObject);
    74. begin
    75. // if MessageDlg('Beenden','Möchten Sie wirklich beenden?',mtWarning,mbYesNo,'0')=mrYes then
    76. Close;
    77. end;
    78. procedure TFlappy_Bird.btn_startClick(Sender: TObject);
    79. begin
    80. Timer_lauf.Enabled:= True;
    81. end;
    82. procedure TFlappy_Bird.btn_stopClick(Sender: TObject);
    83. begin
    84. Timer_lauf.Enabled:=False;
    85. end;
    86. procedure TFlappy_Bird.btn_generierenClick(Sender: TObject);
    87. begin
    88. end;
    89. procedure TFlappy_Bird.FormCreate(Sender: TObject);
    90. begin
    91. Rohr:= 0;
    92. SetLength(Roehren,1);
    93. end;
    94. procedure TFlappy_Bird.ImagePaint(Sender: TObject);
    95. begin
    96. // Randomize;
    97. // RohrZeichnen(Random(3));
    98. end;
    99. procedure TFlappy_Bird.Timer_laufTimer(Sender: TObject);
    100. begin
    101. Image.Left:=Image.Left-1;
    102. end;
    103. end.

    Jetzt nimm dir doch einfach mal die Zeit, atme tief durch, und dann... Dann lies mal _kritisch_ durch, was du da an Text fabriziert hast. Und wenn du es verstehst, dann meine Gratulation. Anderfalls setzte dich hin und verfasse das ganze noch mal, dann aber so, dass auch ein Buttonormalsterblicher dein Anliegen versteht! Andernfalls sehe ich wenig Aussicht auf Hilfe...

    cckLoud

    ps: hast du vielleicht schon mal was von "objektorientierung" gehört???? Solltest du dir mal zu gemüte führen, bevor du da anfängst, ein Spielchen (das vermutlich sowieso weit jenseits deines Skills liegt) rumzucoden!
    @Rollo62
    Danke für den Link^^ Ich bin jedoch kein Fan von vorlagen:)
    das schrenkt nur meine eigene Kreativität beim Programmieren
    ein:)

    @cckLoud
    Was 'jenseits meines Skills liegt' kannst wohl nur schwer beurteilen :)
    Also sei so doch bitte so lieb und lass solche Äußerungen :)
    Und ja ich seh ein das der Text ziemlich 'verwirrend' geschrieben wurde
    und dafür entschuldige ich mich auch^^
    In der Zwischenzeit hab ich mich mal ran gesetzt und zumindest einen
    etwas 'tauglicheren' Quelltext geschrieben. Es funktioniert soweit alles,
    bis auf die Kollisionsabfrage bei Kontakt mit einer der gezeichneten Rohre.
    Ihr könnt mir ja mal sagen was Ihr davon haltet, dass es bei weitem nicht perfekt
    ist weiß ich und bisher ist das LvL auch nur begrenzt und hört einfach auf.
    Spoiler anzeigen

    Delphi-Code

    1. unit Game_u;
    2. {$mode objfpc}{$H+}
    3. interface
    4. uses
    5. Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
    6. ExtCtrls;
    7. type
    8. { TFlappy_Bird }
    9. TFlappy_Bird = class(TForm)
    10. btn_start: TButton;
    11. btn_end: TButton;
    12. btn_stop: TButton;
    13. btn_jump: TButton;
    14. Image: TImage;
    15. Timer_fall: TTimer;
    16. Timer_jump: TTimer;
    17. Vogel: TImage;
    18. lbl_header: TLabel;
    19. Timer_lauf: TTimer;
    20. procedure btn_endClick(Sender: TObject);
    21. procedure btn_jumpClick(Sender: TObject);
    22. procedure btn_startClick(Sender: TObject);
    23. procedure btn_stopClick(Sender: TObject);
    24. procedure FormCreate(Sender: TObject);
    25. procedure ImagePaint(Sender: TObject);
    26. procedure Timer_fallTimer(Sender: TObject);
    27. procedure Timer_jumpTimer(Sender: TObject);
    28. procedure Timer_laufTimer(Sender: TObject);
    29. procedure RohrZeichnen(Hoehe,I: Integer);
    30. procedure Verloren;
    31. private
    32. Roehren1: Array[1..16] of Integer;
    33. Roehren2: Array[1..16] of Integer;
    34. Roehren3: Array[1..16] of Integer;
    35. RoehrenHoehe: Array[0..28] of Integer;
    36. Looose: Array[0..28] of Integer;
    37. Rohr,Lauf:Integer;
    38. Anfang: Boolean;
    39. public
    40. { public declarations }
    41. end;
    42. var
    43. Flappy_Bird: TFlappy_Bird;
    44. implementation
    45. {$R *.lfm}
    46. { TFlappy_Bird }
    47. procedure TFlappy_Bird.Verloren;
    48. begin
    49. btn_stopClick(Self);
    50. ShowMessage('Sie haben verloren!');
    51. end;
    52. procedure TFLappy_Bird.RohrZeichnen(Hoehe,I: Integer);
    53. begin
    54. if (Hoehe=0)or(Hoehe=3)or(Hoehe=6) then
    55. With Image.Canvas do
    56. begin
    57. Brush.Color:=clGreen;
    58. Rectangle(Roehren1[1]+I*150,Roehren1[2],Roehren1[3]+I*150,Roehren1[4]);
    59. Rectangle(Roehren1[5]+I*150,Roehren1[6],Roehren1[7]+I*150,Roehren1[8]);
    60. Rectangle(Roehren1[9]+I*150,Roehren1[10],Roehren1[11]+I*150,Roehren1[12]);
    61. Rectangle(Roehren1[13]+I*150,Roehren1[14],Roehren1[15]+I*150,Roehren1[16]);
    62. end;
    63. if (Hoehe=1)or(Hoehe=4)or(Hoehe=7) then
    64. With Image.Canvas do
    65. begin
    66. Brush.Color:=clGreen;
    67. Rectangle(Roehren2[1]+I*150,Roehren2[2],Roehren2[3]+I*150,Roehren2[4]);
    68. Rectangle(Roehren2[5]+I*150,Roehren2[6],Roehren2[7]+I*150,Roehren2[8]);
    69. Rectangle(Roehren2[9]+I*150,Roehren2[10],Roehren2[11]+I*150,Roehren2[12]);
    70. Rectangle(Roehren2[13]+I*150,Roehren2[14],Roehren2[15]+I*150,Roehren2[16]);
    71. end;
    72. if (Hoehe=2)or(Hoehe=5)or(Hoehe=8) then
    73. With Image.Canvas do
    74. begin
    75. Brush.Color:=clGreen;
    76. Rectangle(Roehren3[1]+I*150,Roehren3[2],Roehren3[3]+I*150,Roehren3[4]);
    77. Rectangle(Roehren3[5]+I*150,Roehren3[6],Roehren3[7]+I*150,Roehren3[8]);
    78. Rectangle(Roehren3[9]+I*150,Roehren3[10],Roehren3[11]+I*150,Roehren3[12]);
    79. Rectangle(Roehren3[13]+I*150,Roehren3[14],Roehren3[15]+I*150,Roehren3[16]);
    80. end;
    81. end;
    82. procedure TFlappy_Bird.btn_endClick(Sender: TObject);
    83. begin
    84. Timer_lauf.Enabled:=False;
    85. if MessageDlg('Beenden','Möchten Sie wirklich beenden?',mtWarning,mbYesNo,'0')=mrYes then
    86. Close
    87. else
    88. Timer_lauf.Enabled:=True;
    89. end;
    90. procedure TFlappy_Bird.btn_jumpClick(Sender: TObject);
    91. begin
    92. Lauf:=0;
    93. Timer_jump.Enabled:=True;
    94. end;
    95. procedure TFlappy_Bird.btn_startClick(Sender: TObject);
    96. begin
    97. Timer_fall.Enabled:=True;
    98. btn_jump.Enabled:=True;
    99. btn_stop.Enabled:=True;
    100. btn_start.Enabled:=False;
    101. Timer_lauf.Enabled:=True;
    102. end;
    103. procedure TFlappy_Bird.btn_stopClick(Sender: TObject);
    104. begin
    105. Timer_fall.Enabled:=False;
    106. btn_start.Enabled:=True;
    107. btn_jump.Enabled:=False;
    108. btn_stop.Enabled:=False;
    109. Timer_lauf.Enabled:=False;
    110. end;
    111. procedure TFlappy_Bird.FormCreate(Sender: TObject);
    112. begin
    113. Anfang:= True;
    114. end;
    115. procedure TFlappy_Bird.ImagePaint(Sender: TObject);
    116. Var
    117. I, Hoehe: Integer;
    118. begin
    119. if Anfang= True then
    120. begin
    121. //Rohren oben
    122. Roehren1[1]:= 300;
    123. Roehren1[2]:= 0;
    124. Roehren1[3]:= 335;
    125. Roehren1[4]:= 45;
    126. Roehren1[5]:= 295;
    127. Roehren1[6]:= 40;
    128. Roehren1[7]:= 340;
    129. Roehren1[8]:= 60;
    130. Roehren1[9]:= 300;
    131. Roehren1[10]:= 250;
    132. Roehren1[11]:= 335;
    133. Roehren1[12]:= 130;
    134. Roehren1[13]:= 295;
    135. Roehren1[14]:= 120;
    136. Roehren1[15]:= 340;
    137. Roehren1[16]:= 140;
    138. //Roehren mitte
    139. Roehren2[1]:= 300;
    140. Roehren2[2]:= 0;
    141. Roehren2[3]:= 335;
    142. Roehren2[4]:= 80;
    143. Roehren2[5]:= 295;
    144. Roehren2[6]:= 75;
    145. Roehren2[7]:= 340;
    146. Roehren2[8]:= 95;
    147. Roehren2[9]:= 300;
    148. Roehren2[10]:= 255;
    149. Roehren2[11]:= 335;
    150. Roehren2[12]:= 165;
    151. Roehren2[13]:= 295;
    152. Roehren2[14]:= 155;
    153. Roehren2[15]:= 340;
    154. Roehren2[16]:= 175;
    155. //Roehren unten
    156. Roehren3[1]:= 300;
    157. Roehren3[2]:= 0;
    158. Roehren3[3]:= 335;
    159. Roehren3[4]:= 115;
    160. Roehren3[5]:= 295;
    161. Roehren3[6]:= 110;
    162. Roehren3[7]:= 340;
    163. Roehren3[8]:= 130;
    164. Roehren3[9]:= 300;
    165. Roehren3[10]:= 255;
    166. Roehren3[11]:= 335;
    167. Roehren3[12]:= 200;
    168. Roehren3[13]:= 295;
    169. Roehren3[14]:= 190;
    170. Roehren3[15]:= 340;
    171. Roehren3[16]:= 210;
    172. Rohr:= 0;
    173. Randomize;
    174. for I:= 0 to 28 do
    175. begin
    176. Hoehe:= Random(8);
    177. RohrZeichnen(Hoehe,I);
    178. RoehrenHoehe[I]:= Hoehe;
    179. end;
    180. Anfang:= False;
    181. end
    182. else
    183. begin
    184. for I:= 0 to 28 do
    185. begin
    186. RohrZeichnen(RoehrenHoehe[I],I);
    187. end;
    188. end;
    189. end;
    190. procedure TFlappy_Bird.Timer_fallTimer(Sender: TObject);
    191. begin
    192. if Vogel.Top>=280 then
    193. Verloren
    194. else
    195. if Timer_jump.Enabled=False then
    196. Vogel.Top:= Vogel.Top+1;
    197. end;
    198. procedure TFlappy_Bird.Timer_jumpTimer(Sender: TObject);
    199. begin
    200. if (Lauf=25)or(Vogel.Top<=55) then
    201. Timer_jump.Enabled:=False
    202. else
    203. begin
    204. Lauf:= Lauf+1;
    205. Vogel.Top:= Vogel.Top-1;
    206. end;
    207. end;
    208. procedure TFlappy_Bird.Timer_laufTimer(Sender: TObject);
    209. begin
    210. if Image.Left<> -4350 then
    211. Image.Left:=Image.Left-1
    212. end;
    213. end.