OSDN Git Service

first commit
[fmx-games/snake.git] / Unit1.pas
1 unit Unit1;\r
2 \r
3 interface\r
4 \r
5 uses\r
6   System.SysUtils, System.Types, System.UITypes, System.Classes,\r
7   System.Variants,\r
8   FMX.Types, FMX.Controls, FMX.Forms3D, FMX.Types3D, FMX.Forms, FMX.Graphics,\r
9   FMX.Dialogs, System.Math.Vectors, FMX.Objects3D, FMX.Controls3D,\r
10   FMX.MaterialSources, FMX.StdCtrls, FMX.Layers3D, Generics.Collections;\r
11 \r
12 type\r
13   TRec = record\r
14     X, Y: Single;\r
15     Z: Single;\r
16   end;\r
17 \r
18   TForm1 = class(TForm3D)\r
19     Light1: TLight;\r
20     Cone1: TCone;\r
21     Timer1: TTimer;\r
22     LightMaterialSource1: TLightMaterialSource;\r
23     Cube1: TCube;\r
24     LightMaterialSource2: TLightMaterialSource;\r
25     Text3D1: TText3D;\r
26     procedure Timer1Timer(Sender: TObject);\r
27     procedure Form3DKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char;\r
28       Shift: TShiftState);\r
29     procedure Form3DCreate(Sender: TObject);\r
30     procedure Form3DDestroy(Sender: TObject);\r
31   private\r
32     { private \90é\8c¾ }\r
33     count: integer;\r
34     Char: TList;\r
35     Dummy: TComponent;\r
36     rec: TList<TRec>;\r
37     score: integer;\r
38     procedure Start;\r
39   public\r
40     { public \90é\8c¾ }\r
41   end;\r
42 \r
43 var\r
44   Form1: TForm1;\r
45 \r
46 implementation\r
47 \r
48 {$R *.fmx}\r
49 \r
50 uses Math;\r
51 \r
52 procedure TForm1.Form3DCreate(Sender: TObject);\r
53 begin\r
54   Char := TList.Create;\r
55   rec := TList<TRec>.Create;\r
56   Start;\r
57 end;\r
58 \r
59 procedure TForm1.Form3DDestroy(Sender: TObject);\r
60 begin\r
61   Timer1.Enabled := false;\r
62   Char.Free;\r
63   Dummy.Free;\r
64   rec.Free;\r
65 end;\r
66 \r
67 procedure TForm1.Form3DKeyDown(Sender: TObject; var Key: Word;\r
68   var KeyChar: Char; Shift: TShiftState);\r
69 begin\r
70   case Key of\r
71     vkleft:\r
72       Cone1.RotationAngle.Z := Cone1.RotationAngle.Z - 5;\r
73     vkright:\r
74       Cone1.RotationAngle.Z := Cone1.RotationAngle.Z + 5;\r
75     vkreturn:\r
76       Start;\r
77   end;\r
78 end;\r
79 \r
80 procedure TForm1.Start;\r
81 begin\r
82   Dummy.Free;\r
83   Dummy := TComponent.Create(Form1);\r
84   Char.Clear;\r
85   Char.Add(Cone1);\r
86   Cone1.Position.X := 0;\r
87   Cone1.Position.Y := 0;\r
88   Cube1.Position.X := 9 - Random(19);\r
89   Cube1.Position.Y := 9 - Random(19);\r
90   Randomize;\r
91   score := 0;\r
92   Timer1.Enabled := true;\r
93 end;\r
94 \r
95 procedure TForm1.Timer1Timer(Sender: TObject);\r
96 var\r
97   s1: TCustomMesh;\r
98   i: integer;\r
99   s: TRec;\r
100 begin\r
101   s.X := Cone1.Position.X;\r
102   s.Y := Cone1.Position.Y;\r
103   s.Z := Cone1.RotationAngle.Z;\r
104   rec.Add(s);\r
105   if rec.count > Char.count * 10 then\r
106     rec.Delete(0);\r
107   for i := 1 to Char.count - 1 do\r
108   begin\r
109     s1 := Char[i];\r
110     if i * 10 > rec.count then\r
111       continue;\r
112     s := rec.Items[rec.count - i * 10];\r
113     s1.Position.X := s.X;\r
114     s1.Position.Y := s.Y;\r
115     s1.RotationAngle.Z := s.Z;\r
116     if s1.Visible = false then\r
117       s1.Visible := true;\r
118   end;\r
119   Cone1.Position.X := Cone1.Position.X + 0.1 *\r
120     cos(DegToRad(Cone1.RotationAngle.Z - 90));\r
121   Cone1.Position.Y := Cone1.Position.Y + 0.1 *\r
122     sin(DegToRad(Cone1.RotationAngle.Z - 90));\r
123   if (Abs(Cone1.Position.X - Cube1.Position.X) < 1) and\r
124     (Abs(Cone1.Position.Y - Cube1.Position.Y) < 1) and (Cube1.Visible = true)\r
125   then\r
126   begin\r
127     Cube1.Visible := false;\r
128     Cube1.Position.X := 9 - Random(19);\r
129     Cube1.Position.Y := 9 - Random(19);\r
130     s1 := TCube.Create(Dummy);\r
131     s1.Visible := false;\r
132     s1.MaterialSource := LightMaterialSource1;\r
133     s1.Parent := Form1;\r
134     Char.Add(s1);\r
135     inc(score, 100);\r
136   end;\r
137   if Cube1.Visible = false then\r
138     inc(count);\r
139   if count > 50 then\r
140   begin\r
141     Cube1.Visible := true;\r
142     count := 0;\r
143   end;\r
144   if (Cone1.Position.X < -10) or (Cone1.Position.X > 10) or\r
145     (Cone1.Position.Y < -10) or (Cone1.Position.Y > 10) then\r
146     Timer1.Enabled := false;\r
147   for i := 2 to Char.count - 1 do\r
148   begin\r
149     s1 := TCustomMesh(Char[i]);\r
150     if (Abs(Cone1.Position.X - s1.Position.X) < 1) and\r
151       (Abs(Cone1.Position.Y - s1.Position.Y) < 1) and (s1.Visible = true) then\r
152       Timer1.Enabled := false;\r
153   end;\r
154   inc(score, 10 * Char.count);\r
155   Text3D1.Text := score.ToString;\r
156 end;\r
157 \r
158 end.\r