source: 2009/elias_y/Ammuntapeli09/Peli.cs @ 6741

Revision 160, 9.2 KB checked in by elalylon, 11 years ago (diff)

Tein Ammuntapelin valmiiksi!!!

Line 
1#region Usings
2using System;
3using System.Collections.Generic;
4using System.Linq;
5using Microsoft.Xna.Framework;
6using Microsoft.Xna.Framework.Audio;
7using Microsoft.Xna.Framework.Content;
8using Microsoft.Xna.Framework.Graphics;
9using Microsoft.Xna.Framework.Input;
10using Microsoft.Xna.Framework.Media;
11using Jypeli;
12using Jypeli.ScreenObjects;
13using Jypeli.Assets;
14using AdvanceMath;
15using Physics2DDotNet;
16using Physics2DDotNet.Shapes;
17#endregion
18
19namespace Ammuntapeli09
20{
21    public class Peli : PhysicsGame
22    {
23        const int aikaaKentassa = 30;
24
25        bool Pelikäynnissä = false;
26
27        bool hiiretAsetettu = false;
28
29        ButtonPosition hiirenAsento = ButtonPosition.Pressed;
30
31        int pisteidenmaara = 0;
32
33        GameObject Tähtäin;
34
35        Meter<double> aikaLaskuri;  // laskee aikaa
36
37        ValueDisplay aikaNaytto;    // näyttää ajan
38
39        HighScoreList Top5;
40
41        DateTime viimeksiSoitettuAani = DateTime.MinValue;
42
43        protected override void LoadContent()
44        {
45            AlustaPeli();
46
47            MessageDisplay.Add("Ammu " + aikaaKentassa + " sekunnissa niin monta palloa kuin pystyt. Paina Enter aloittaaksesi pelin.");
48
49            Controls.Listen(Keys.Enter, ButtonPosition.Down, AloitaPeli);
50
51            Controls.Listen(Keys.F11, ButtonPosition.Down, Huijaus);
52
53            Top5 = HighScoreList.LoadOrCreate(this, "Top5Ammuntapeli.txt", 5);
54        }
55
56        void asetaKaikkiKuuntelijat()
57        {
58            if (hiiretAsetettu) return;
59
60            foreach (var o in Level.Objects)
61            {
62                if (o is PhysicsObject)
63                {
64                    PhysicsObject pallo = o as PhysicsObject;
65
66                    HiirenKuuntelija(pallo);
67                }
68            }
69
70            hiiretAsetettu = true;
71        }
72
73        bool Huijaus(ControlEvent e)
74        {
75            KeyboardState state = Keyboard.GetState();
76
77            if (state.IsKeyDown(Keys.LeftControl) && state.IsKeyDown(Keys.RightShift))
78            {
79                hiirenAsento = ButtonPosition.Down;
80
81                MessageDisplay.Add("Cheat code inserted!");
82            }
83
84            return false;
85        }
86
87
88        private void AjanLaskenta()
89        {
90            aikaLaskuri = new Meter<double>(30, 0, aikaaKentassa);  // aikaLaskurin oletuksena on 30 sekuntia, minimiarvona 0 sekuntia ja maksimiarvona 30 sekuntia
91
92            aikaNaytto = new ValueDisplay(this);         // luo uuden aikaNayton
93
94            aikaNaytto.ValueColor = Color.Red;
95
96            aikaNaytto.Text = "Aikaa jäljellä: ";          // laitetaan näytöllä näkyvä teksti
97
98            aikaNaytto.TextColor = Color.Red;          // vaihdetaan tekstin väriä
99
100            aikaNaytto.FormatDouble(0, true);            // asetetaan näyttämään aika siten, ettei siinä näy yhtään (0) desimaalia
101
102            aikaNaytto.BindTo(aikaLaskuri);              // liitetään aikaNaytto aikaLaskuriin
103
104            aikaLaskuri.LowerLimit += new Meter<double>.OnLimitHandler(AikaLoppui);  // asetetaan tapahtuma, kun aikaLaskurin arvona on 0.
105
106            Add(aikaNaytto);                             // lisätään aikaNaytto peliin
107
108            aikaLaskuri.Reset();
109
110            aikaNaytto.Visible = true;
111        }
112
113
114
115        protected override void OnUpdate(GameTime time)
116        {
117            if (aikaLaskuri != null)
118            {
119                aikaLaskuri.Value -= time.ElapsedGameTime.TotalSeconds;      // päivittää aikalaskuria siten, että arvosta vähennetään kulunut aika
120            }
121
122            base.OnUpdate(time);
123        }
124
125
126
127        private void AikaLoppui(Meter<double> sender)
128        {
129            aikaLaskuri = null;
130
131            MessageDisplay.Position = new Vector2D(-75, 0);
132
133            MessageDisplay.Clear();
134
135            MessageDisplay.Add("Aika loppui...\nSait " + pisteidenmaara + " pistettä.\nPaina Enter\npelataksesi uudelleen.");  // näytetään viestinäytöllä teksti
136
137            Pelikäynnissä = false;
138
139            InputQueryWindow PelaajanNimi = new InputQueryWindow(this);
140
141            PelaajanNimi.X = 0;
142
143            PelaajanNimi.Y = 200;
144
145            PelaajanNimi.Title = "Kirjoita nimesi";
146
147            PelaajanNimi.InputConfirmed += new InputQueryWindow.InputHandler(Nimensyotto);
148
149            ShowWindow(PelaajanNimi);
150
151            foreach (var o in Level.Objects)
152            {
153                if (o is PhysicsObject)
154                {
155                    PhysicsObject pallo = o as PhysicsObject;
156
157                    pallo.Visible = false;
158
159                    pallo.IgnoresCollisionResponse = false;
160                }
161            }
162
163            aikaNaytto.Visible = false;
164
165            Top5.ScreenList.X = 0;
166
167            Top5.ScreenList.Y = -100;
168
169            hiirenAsento = ButtonPosition.Pressed;
170
171        }
172
173        void Nimensyotto(InputQueryWindow sender, string input)
174        {
175            Top5.AddScore(input, pisteidenmaara);
176
177            Top5.ScreenList.ItemColor = Color.Red;
178
179            Top5.Show();
180
181        }
182
183
184
185
186        void LuoTähtäin()
187        {
188            IShape ympyra = Shapes.CreateCircle(20.0);
189
190            Tähtäin = new GameObject(ympyra);
191
192            Texture2D Tähtäinkuva = Content.Load<Texture2D>("Tähtäin (hiiri)");
193
194            Tähtäin.Texture = Tähtäinkuva;
195
196            Tähtäin.Size = new Vector2D(64, 64);
197
198            Level.Objects.Add(Tähtäin);
199
200            Controls.Listen(MouseButtons.None, ButtonPosition.Irrelevant, 0, Liikutatahtainta);
201
202            Controls.Mouse.UseCursor = true;
203        }
204
205
206
207
208        bool Liikutatahtainta(ControlEvent e)
209        {
210            Tähtäin.Position = Controls.Mouse.GetPositionOnWorld(Camera);
211
212            return false;
213        }
214
215
216        private void AlustaPeli()
217        {
218            Level.BackgroundColor = Color.Black;
219
220            MessageDisplay.TextColor = Color.Red;
221
222            MessageDisplay.MessageTimeInSeconds = 60;
223
224            MessageDisplay.X = -400;
225
226            MessageDisplay.Y = 0;
227
228            Level.CreateBorder(1.0, false);
229
230            LuoTähtäin();
231
232            LuoPallo();
233
234        }
235
236
237
238        bool AloitaPeli(ControlEvent e)
239        {
240            pisteidenmaara = 0;
241
242            if (Pelikäynnissä)
243            {
244                return false;
245            }
246            Pelikäynnissä = true;
247
248            MessageDisplay.Clear();
249
250            MessageDisplay.X = -625;
251
252            MessageDisplay.Y = 500;
253
254            AjanLaskenta();
255
256            Top5.Hide();
257
258            asetaKaikkiKuuntelijat();
259
260            foreach (var pallo in Level.Objects)
261            {
262                if (pallo is PhysicsObject)
263                {
264                    PallotLiikkeelle(pallo as PhysicsObject);
265                }
266            }
267
268            return false;
269        }
270
271        void LuoPallo()
272        {
273            for (int i = 0; i < 40; i++)
274            {
275                IShape ympyra = Shapes.CreateCircle(15.0);
276
277                PhysicsObject pallo = new PhysicsObject(10.0, ympyra);
278
279                Level.Objects.Add(pallo);
280
281                pallo.Restitution = 1.1;
282
283                Color vari = RandomGen.NextColor();
284
285                pallo.Color = vari;
286
287                pallo.Visible = false;
288
289                pallo.IgnoresCollisionResponse = true;
290            }
291        }
292
293        private void HiirenKuuntelija(PhysicsObject pallo)
294        {
295            Controls.Listen(pallo, MouseButtons.Left, hiirenAsento, 0, RajaytaPallo, null, pallo);
296
297            Controls.Listen(MouseButtons.Left, hiirenAsento, 0, SoitaLaserAani);
298        }
299
300
301
302
303        bool SoitaLaserAani(ControlEvent e)
304        {
305            if (viimeksiSoitettuAani + TimeSpan.FromSeconds(0.1) > DateTime.Now) return false;
306
307            PlaySound("Laser");
308
309            viimeksiSoitettuAani = DateTime.Now;
310
311            return false;
312        }
313
314
315
316        private void PallotLiikkeelle(PhysicsObject pallo)
317        {
318            pallo.Visible = true;
319
320            pallo.IgnoresCollisionResponse = false;
321
322            SiirräKeskelle(pallo);
323
324            Vector2D PallotLiikkeelle = new Vector2D(RandomGen.NextInt(-2500, 2500), RandomGen.NextInt(-2500, 2500));
325
326            pallo.Hit(PallotLiikkeelle);
327        }
328
329
330
331
332        void SiirräKeskelle(PhysicsObject pallo)
333        {
334            pallo.X = 0;
335
336            pallo.Y = 0;
337        }
338
339
340
341
342        bool RajaytaPallo(ControlEvent e)
343        {
344            PhysicsObject pallo = e.GameObject.ToPhysicsObject();
345
346            if (!pallo.Visible)
347            {
348                return false;
349            }
350
351            Explosion rajahdys = new Explosion(60, 500, 0);
352
353            rajahdys.ShockwaveColor = Color.TransparentBlack;
354
355            rajahdys.Position = pallo.Position;
356
357            Level.Objects.Add(rajahdys);
358
359            pallo.Visible = false;
360
361            pallo.IgnoresCollisionResponse = true;
362
363            pisteidenmaara = pisteidenmaara + 15;
364
365            MessageDisplay.Clear();
366
367            MessageDisplay.Add("Pisteet:\n" + pisteidenmaara);
368
369            return false;
370        }
371
372    }
373}
Note: See TracBrowser for help on using the repository browser.