source: zhipeng_j/Avaruuspeli1/Peli.cs @ 430

Revision 430, 12.6 KB checked in by zhjiang, 12 years ago (diff)
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 Avaruuspeli1
20{
21    public class Peli : PhysicsGame
22    {
23        #region Muuttujat
24        BattleObject pelaaja1;
25        BattleObject pelaaja2;
26        BattleObject pelaaja3;
27        PlasmaCannon sukellusVeneenAse;
28        PlasmaCannon laivanAse;
29        PlasmaCannon lentokoneenAse;
30        PhysicsObject laiva;
31
32        BarGauge hitpointNaytto;
33        Timer ajastin;
34        #endregion
35
36        #region Alustukset
37        protected override void LoadContent()
38        {
39            alustaNaytot();
40            lataaUusiKentta();
41        }
42
43        private void alustaNaytot()
44        {
45            // viestinäytön tekstin väriksi valkoinen
46            MessageDisplay.TextColor = Color.White;
47
48
49            // luodaan elämänäyttö
50            hitpointNaytto = new BarGauge(this);
51            hitpointNaytto.Size = new Vector2D(30, 250);
52            hitpointNaytto.Angle = Angle.Radians(Math.PI / 2);
53            hitpointNaytto.ValueColor = Color.LightGreen;
54            hitpointNaytto.BackColor = Color.Red;
55            hitpointNaytto.Max = 50;
56            hitpointNaytto.Position = new Vector2D(Screen.RightSafe - 300, Screen.TopSafe - 170);
57            Add(hitpointNaytto);
58        }
59        #endregion
60
61        #region KentänLataus
62        private void lataaUusiKentta()
63        {
64            ClearPhysics();
65            Gravity = new Vector2D(0, -1000);
66
67            Level = luoKentta();
68
69            lisaaNappaimet();
70            //Camera.Follow(pelaaja1);
71            Camera.ZoomToLevel(Level, this);
72            //Camera.StayInLevel = true;
73
74            MessageDisplay.Add("(Paina F1, niin saat näppäinohjeet.)");
75        }
76
77        Level luoKentta()
78        {
79            Level kentta = new Level(this, 4000, 4000);
80            kentta.CreateBorder();
81            kentta.BackgroundColor = Color.LightBlue;
82            kentta.LeftBorder.Visible = false;
83            kentta.RightBorder.Visible = false;
84            kentta.TopBorder.Visible = false;
85            kentta.BottomBorder.Visible = false;
86
87            lisaaPelaajat(kentta);
88
89            LuoLentokone(kentta);
90
91            luolaiva(kentta);
92
93            luomeri(kentta);
94
95            return kentta;
96        }
97
98        protected override void OnUpdate(GameTime time)
99        {
100            if (pelaaja3.Y < 0)
101            {
102                pelaaja3.Push(new Vector2D(0, + 1000000));
103            }
104
105            if (pelaaja1.Y < 0)
106            {
107                pelaaja1.Push(new Vector2D(0, 70000));
108            }
109
110            if (pelaaja2.Y > 0)
111            {
112                pelaaja2.Push(new Vector2D(0,60000));
113            }
114            else
115            {
116               pelaaja2.Push(new Vector2D(0, -1000));
117            }
118            base.OnUpdate(time);
119        }
120
121        private void lisaaPelaajat(Level kentta)
122        {
123            // Pelaaja 1
124            Texture2D alus = Content.Load<Texture2D>("sukellusvene");
125            pelaaja1 = new BattleObject(Shapes.CreateFromTexture(alus , new Vector2D(200, 100), 10), 10, 5);
126            pelaaja1.Texture = alus;
127            hitpointNaytto.BindTo(pelaaja1.HitPoints);
128            pelaaja1.HitpointsReachedZero += new EventHandler(rajahdys);
129
130
131            // Estää tahattoman pyörimisen
132            pelaaja1.MomentOfInertia = double.PositiveInfinity;
133
134            AddCollisionHandler(pelaaja1, tormays);
135            kentta.Objects.Add(pelaaja1);
136
137            // luodaan ase
138            sukellusVeneenAse = new PlasmaCannon(new PlasmaParticle());
139            sukellusVeneenAse.SetOwner(pelaaja1, kentta);
140            sukellusVeneenAse.Visible = true;
141            sukellusVeneenAse.Color = Color.SteelBlue;
142            sukellusVeneenAse.FireRate = 1000;
143            sukellusVeneenAse.Power = new Meter<double>(5000, 5000, 5000);
144            pelaaja1.X = 0;
145            pelaaja1.Y = -900;
146            kentta.Objects.Add(sukellusVeneenAse);
147        }
148
149        private void LuoLentokone(Level kentta)
150        {
151            // Pelaaja 2
152            Texture2D alus = Content.Load<Texture2D>("lentokone");
153            pelaaja2 = new BattleObject(Shapes.CreateFromTexture(alus , new Vector2D(200, 100), 10), 10, 5);
154            pelaaja2.Texture = alus;
155            hitpointNaytto.BindTo(pelaaja2.HitPoints);
156            pelaaja2.HitpointsReachedZero += new EventHandler(rajahdys);
157
158
159            // Estää tahattoman pyörimisen
160            pelaaja2.MomentOfInertia = double.PositiveInfinity;
161
162            AddCollisionHandler(pelaaja2, tormays);
163            kentta.Objects.Add(pelaaja2);
164
165            // luodaan ase
166            lentokoneenAse = new PlasmaCannon(new PlasmaParticle());
167            lentokoneenAse.SetOwner(pelaaja2, kentta);
168            lentokoneenAse.Visible = true;
169            lentokoneenAse.Color = Color.SteelBlue;
170            lentokoneenAse.FireRate = 1000;
171            lentokoneenAse.Power = new Meter<double>(5000, 5000, 5000);
172            pelaaja2.X = -400;
173            pelaaja2.Y = 800;
174            kentta.Objects.Add(lentokoneenAse);
175
176         
177
178        }
179        private void luolaiva(Level kentta)
180        {
181
182            // Pelaaja 3
183            Texture2D alus = Content.Load<Texture2D>("laiva");
184            IShape ympara = Shapes.CreateCircle(100.0);
185            pelaaja3 = new BattleObject(ympara , 10, (int) hitpointNaytto.Max);
186            pelaaja3.Texture = alus;
187            hitpointNaytto.BindTo(pelaaja3.HitPoints);
188            pelaaja3.HitpointsReachedZero += new EventHandler(rajahdys);
189
190
191            // Estää tahattoman pyörimisen
192            pelaaja3.MomentOfInertia = double.PositiveInfinity;
193
194            AddCollisionHandler(pelaaja3, tormays);
195            kentta.Objects.Add(pelaaja3);
196
197            // luodaan ase
198            laivanAse = new PlasmaCannon(new PlasmaParticle());
199            laivanAse.SetOwner(pelaaja3, kentta);
200            laivanAse.Visible = true;
201            laivanAse.Color = Color.SteelBlue;
202            laivanAse.FireRate = 1000;
203            laivanAse.Power = new Meter<double>(5000, 5000, 5000);
204            pelaaja3.X = 0;
205            pelaaja3.Y = 100;
206            kentta.Objects.Add(laivanAse);
207        }
208        PhysicsObject luomeri(Level kentta)
209        {
210            IShape ympyra = Shapes.CreateRectangle(kentta.Width, kentta.Height / 2);
211            PhysicsObject meri = PhysicsObject.CreateStaticObject(ympyra);
212            kentta.Objects.Add(meri);
213            meri.Color = new Color(Color.Blue, 100);
214            meri.IgnoresCollisionResponse = true;
215            meri.X = 0;
216
217            meri.Y = -kentta.Height / 4;
218
219            return meri;
220        }
221
222        private bool liikutapelaajaa(ControlEvent e)
223        {
224            PhysicsObject pelaaja = e.Parameter0.ToPhysicsObject();
225            Vector2D suunta = e.Parameter1.ToVector2D();
226            pelaaja.Push(suunta);
227            return false;
228
229        }
230
231
232        #endregion
233
234        #region Näppäimet
235
236        private void lisaaNappaimet()
237        {
238            ClearControls();
239
240            //Yleiset näppäimet
241            Controls.Listen(Keys.Enter, ButtonPosition.Pressed, UusiPeli, "Aloittaa uuden pelin");
242
243            // Pelaajan 1 näppäimet
244            Controls.Listen(Keys.Left, ButtonPosition.Down, liikutapelaajaa, null, pelaaja1, new Vector2D(-10000, 0));
245            Controls.Listen(Keys.Right, ButtonPosition.Down, liikutapelaajaa, null, pelaaja1, new Vector2D(10000, 0));
246            Controls.Listen(Keys.Up, ButtonPosition.Down, liikutapelaajaa, null, pelaaja1, new Vector2D(0, +10000));
247            Controls.Listen(Keys.Down, ButtonPosition.Down, liikutapelaajaa, null, pelaaja1, new Vector2D(0, -10000));
248            Controls.Listen(Keys.Space, ButtonPosition.Down, Ammu, null, sukellusVeneenAse);
249
250            // Pelaajan 2 näppäimet
251            Controls.Listen(PlayerIndex.One, Buttons .DPadLeft , ButtonPosition.Down, liikutapelaajaa, null, pelaaja2, new Vector2D(-10000, 0));
252            Controls.Listen(PlayerIndex.One, Buttons.DPadRight, ButtonPosition.Down, liikutapelaajaa, null, pelaaja2, new Vector2D(10000, 0));
253            Controls.Listen(PlayerIndex.One, Buttons.DPadUp, ButtonPosition.Down, liikutapelaajaa, null, pelaaja2, new Vector2D(0, +10000));
254            Controls.Listen(PlayerIndex.One, Buttons.DPadDown, ButtonPosition.Down, liikutapelaajaa, null, pelaaja2, new Vector2D(0, -10000));
255            Controls.Listen(PlayerIndex.One, Buttons.A, ButtonPosition.Down, lentokoneAmpuu, null, lentokoneenAse);
256
257
258            // Pelaajan 3 näppäimet
259            Controls.Listen(PlayerIndex.Two, Buttons.DPadLeft, ButtonPosition.Down, liikutapelaajaa, null, pelaaja3, new Vector2D(-10000, 0));
260            Controls.Listen(PlayerIndex.Two, Buttons.DPadRight, ButtonPosition.Down, liikutapelaajaa, null, pelaaja3, new Vector2D(100000, 0));
261            Controls.Listen(PlayerIndex.Two, Buttons.DPadUp, ButtonPosition.Down, liikutapelaajaa, null, pelaaja3, new Vector2D(0, +10000));
262            Controls.Listen(PlayerIndex.Two, Buttons.DPadDown, ButtonPosition.Down, liikutapelaajaa, null, pelaaja3, new Vector2D(0, -10000));
263            Controls.Listen(PlayerIndex.Two, Buttons.A, ButtonPosition.Down, Ammu, null, laivanAse);
264
265
266     
267            Controls.AddHelpText(PyoritaAlusta, "Pyörittää alusta");
268            Controls.AddHelpText(Ammu, "Ammu");
269        }
270
271        // Näppäimiin liitetyt toiminnot alkavat tästä -->
272        private Boolean NaytaOhjeet(ControlEvent e)
273        {
274            ShowControlHelp(MessageDisplay);
275            return false;
276        }
277
278        bool lentokoneAmpuu(ControlEvent e)
279        {
280            PhysicsObject lentokone = e.Parameter0.ToPhysicsObject();
281            CannonBall ohjus = new CannonBall(20, 20);
282            ohjus.Texture = Content.Load<Texture2D>("ohjus1");
283            ohjus.X = lentokone.X + lentokone.Size.X * 8 ;
284            ohjus.Y = lentokone.Y;
285            ohjus.Hit(new Vector2D(1000, 0));
286            Level.Objects.Add(ohjus);
287            return false;
288        }
289
290        private Boolean UusiPeli(ControlEvent e)
291        {
292            lataaUusiKentta();
293            return true;
294        }
295
296        private Boolean Ammu(ControlEvent e)
297        {
298            ProjectileWeapon ase = e.Parameter0 as ProjectileWeapon;
299
300            // luodaan ammus
301            Projectile ammus = ase.Use();
302            if (ammus != null)
303            {
304                ammus.Position = ammus.Position + (Vector2D.FromLengthAndAngle(40, ase.Angle.Radian));
305                ammus.Push(ammus.Velocity); //?
306                ammus.IgnoresExplosions = true;
307
308                Level.Objects.Add(ammus);
309            }
310
311            return false;
312        }
313
314        private Boolean PyoritaAlusta(ControlEvent e)
315        {
316            PhysicsObject pelaaja = e.Parameter0.ToPhysicsObject();
317            pelaaja.Angle = pelaaja.Angle += e.Parameter1.ToAngle();
318            sukellusVeneenAse.Angle = pelaaja.Angle;
319            return false;
320        }
321
322        private Boolean KaytaMoottoria(ControlEvent e)
323        {
324            PhysicsObject pelaaja = e.Parameter0.ToPhysicsObject();
325            pelaaja.Hit(Vector2D.FromLengthAndAngle(e.Parameter1.ToDouble(), pelaaja.Angle.Radian));
326            return false;
327        }
328
329        //<--- näppäimiin liitetyt toiminnot loppuivat
330        #endregion
331
332        #region Tapahtumat
333
334
335        void rajahdys(object sender, EventArgs e)
336        {
337            PhysicsObject po = sender.ToPhysicsObject();
338            Explosion ex = new Explosion(po.Width * 2);
339            ex.Position = po.Position;
340            ex.Force = 4000;
341            Level.Objects.Add(ex);
342            po.Destroy();
343        }
344
345        void tormays(Collision collision)
346        {
347            if (!(collision.Obj is BattleObject && collision.Other is BattleObject)) return;
348
349            BattleObject bo1 = (collision.Obj as BattleObject);
350            bo1.TakeDamage(new Damage(1));
351            BattleObject bo2 = (collision.Other as BattleObject);
352            bo2.TakeDamage(new Damage(1));
353        }
354        #endregion
355    }
356}
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
Note: See TracBrowser for help on using the repository browser.