source: 2009/jaakko_n/Avaruuspeli1/Peli.cs @ 10335

Revision 262, 8.1 KB checked in by jaaknarh, 10 years ago (diff)

Ja taas...

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        PlasmaCannon ase;
26
27        BarGauge hitpointNaytto;
28        Timer ajastin;
29        #endregion
30
31        #region Alustukset
32        protected override void LoadContent()
33        {
34            alustaNaytot();
35            lataaUusiKentta();
36        }
37
38        private void alustaNaytot()
39        {
40            // viestinäytön tekstin väriksi valkoinen
41            MessageDisplay.TextColor = Color.White;
42
43            // luodaan aikalaskuri
44            ajastin = new Timer();
45            ajastin.Interval = 1;
46            ajastin.LimitTimes(10000);
47            ajastin.Trigger += new Timer.TriggerHandler(lisaaAsteroideja);
48            ajastin.Start();
49            AddTimer(ajastin);
50
51            // luodaan elämänäyttö
52            hitpointNaytto = new BarGauge(this);
53            hitpointNaytto.Size = new Vector2D(30, 250);
54            hitpointNaytto.Angle = Angle.Radians(Math.PI / 2);
55            hitpointNaytto.ValueColor = Color.LightGreen;
56            hitpointNaytto.BackColor = Color.Red;
57            hitpointNaytto.Max = 5;
58            hitpointNaytto.Position = new Vector2D(Screen.RightSafe - 300, Screen.TopSafe - 170);
59            Add(hitpointNaytto);
60        }
61        #endregion
62
63        #region KentänLataus
64        private void lataaUusiKentta()
65        {
66            ClearPhysics();
67
68            Level = luoKentta();
69
70            lisaaNappaimet();
71            Camera.Follow(pelaaja1);
72
73            MessageDisplay.Add("(Paina F1, niin saat näppäinohjeet.)");
74        }
75
76        Level luoKentta()
77        {
78            Level kentta = new Level(this, 4000, 4000);
79            kentta.CreateBorder();
80            kentta.Background.CreateStars();
81
82            lisaaPelaajat(kentta);
83            luoAsteroideja(kentta, 500, 2000);
84
85            return kentta;
86        }
87
88        private void lisaaPelaajat(Level kentta)
89        {
90            // Pelaaja 1
91            Texture2D alus = Content.Load<Texture2D>("alus");
92            pelaaja1 = new BattleObject(Shapes.CreateFromTexture(alus, new Vector2D(50, 40), 10), 10, 5);
93            pelaaja1.Texture = alus;
94            hitpointNaytto.BindTo(pelaaja1.HitPoints);
95            pelaaja1.HitpointsReachedZero += new EventHandler(rajahdys);
96
97            // Estää tahattoman pyörimisen
98            pelaaja1.MomentOfInertia = double.PositiveInfinity;
99
100            AddCollisionHandler(pelaaja1, tormays);
101            kentta.Objects.Add(pelaaja1);
102
103            // luodaan ase
104            ase = new PlasmaCannon(new PlasmaParticle());
105            ase.SetOwner(pelaaja1, kentta);
106            ase.Visible = true;
107            ase.Color = Color.SteelBlue;
108            ase.FireRate = 1000;
109            ase.Power = new Meter<double>(5000, 5000, 5000);
110            kentta.Objects.Add(ase);
111        }
112
113        void luoAsteroideja(Level kentta, int maara, int maksimiNopeus)
114        {
115            for (int i = 0; i < maara; i++)
116            {
117                BattleObject asteroidi = new BattleObject(Shapes.CreateRandom(RandomGen.NextDouble(40.0, 80.0), RandomGen.NextDouble(40.0, 80.0), 10), 100, 10);
118                asteroidi.Position = kentta.GetRandomPosition();
119
120                asteroidi.Hit(RandomGen.NextVector(-maksimiNopeus, -maksimiNopeus, maksimiNopeus, maksimiNopeus));
121                asteroidi.HitpointsReachedZero += new EventHandler(rajahdys);
122                asteroidi.HitPoints.DefaultValue = 1;
123                asteroidi.HitPoints.MaxValue = 1;
124                asteroidi.HitPoints.MinValue = 0;
125                kentta.Objects.Add(asteroidi);
126            }
127        }
128        #endregion
129
130        #region Näppäimet
131
132        private void lisaaNappaimet()
133        {
134            ClearControls();
135
136            //Yleiset näppäimet
137            Controls.Listen(Keys.Enter, ButtonPosition.Pressed, UusiPeli, "Aloittaa uuden pelin");
138
139            // Pelaajan 1 näppäimet
140            Controls.Listen(Keys.Left, ButtonPosition.Down, PyoritaAlusta, null, pelaaja1, Angle.Radians(0.05f));
141            Controls.Listen(Keys.Right, ButtonPosition.Down, PyoritaAlusta, null, pelaaja1, Angle.Radians(-0.05f));
142            Controls.Listen(Keys.Up, ButtonPosition.Down, KaytaMoottoria, "Käytä moottoria", pelaaja1, 500);
143            Controls.Listen(Keys.Space, ButtonPosition.Down, Ammu);
144
145            lisaaGamePadNappaimet(PlayerIndex.One, pelaaja1);
146
147            Controls.AddHelpText(PyoritaAlusta, "Pyörittää alusta");
148            Controls.AddHelpText(Ammu, "Ampuu");
149        }
150
151        private void lisaaGamePadNappaimet(PlayerIndex pelaajaNro, PhysicsObject pelaaja)
152        {
153            //Yleiset näppäimet
154            Controls.Listen(pelaajaNro, Buttons.Y, ButtonPosition.Pressed, NaytaOhjeet, "Näyttää ohjeet");
155            Controls.Listen(pelaajaNro, Buttons.Start, ButtonPosition.Pressed, UusiPeli, "Aloittaa uuden pelin");
156
157            // Pelaajan 1 näppäimet
158            Controls.Listen(pelaajaNro, Buttons.DPadLeft, ButtonPosition.Down, PyoritaAlusta, null, pelaaja1, Angle.Radians(0.05f));
159            Controls.Listen(pelaajaNro, Buttons.DPadRight, ButtonPosition.Down, PyoritaAlusta, null, pelaaja1, Angle.Radians(-0.05f));
160            Controls.Listen(pelaajaNro, Buttons.A, ButtonPosition.Down, KaytaMoottoria, "Käytä moottoria", pelaaja1, 500);
161
162            Controls.Listen(pelaajaNro, Buttons.X, ButtonPosition.Down, Ammu);
163        }
164
165        // Näppäimiin liitetyt toiminnot alkavat tästä -->
166        private Boolean NaytaOhjeet(ControlEvent e)
167        {
168            ShowControlHelp(MessageDisplay);
169            return false;
170        }
171
172        private Boolean UusiPeli(ControlEvent e)
173        {
174            lataaUusiKentta();
175            return true;
176        }
177
178        private Boolean Ammu(ControlEvent e)
179        {
180            // luodaan ammus
181            Projectile ammus = ase.Use();
182            ammus.Position = ammus.Position + (Vector2D.FromLengthAndAngle(40, ase.Angle.Radian));
183            ammus.Push(ammus.Velocity); //?
184            ammus.IgnoresExplosions = true;
185
186            Level.Objects.Add(ammus);
187
188            return false;
189        }
190
191        private Boolean PyoritaAlusta(ControlEvent e)
192        {
193            PhysicsObject pelaaja = e.Parameter0.ToPhysicsObject();
194            pelaaja.Angle = pelaaja.Angle += e.Parameter1.ToAngle();
195            ase.Angle = pelaaja.Angle;
196            return false;
197        }
198
199        private Boolean KaytaMoottoria(ControlEvent e)
200        {
201            PhysicsObject pelaaja = e.Parameter0.ToPhysicsObject();
202            pelaaja.Hit(Vector2D.FromLengthAndAngle(e.Parameter1.ToDouble(), pelaaja.Angle.Radian));
203            return false;
204        }
205
206        //<--- näppäimiin liitetyt toiminnot loppuivat
207        #endregion
208
209        #region Tapahtumat
210        void lisaaAsteroideja(Timer sender)
211        {
212            luoAsteroideja(Level, 1, 100000);
213        }
214
215        void rajahdys(object sender, EventArgs e)
216        {
217            PhysicsObject po = sender.ToPhysicsObject();
218            Explosion ex = new Explosion(po.Width * 2);
219            ex.Position = po.Position;
220            ex.Force = 4000;
221            Level.Objects.Add(ex);
222            po.Destroy();
223        }
224
225        void tormays(Collision collision)
226        {
227            if (!(collision.Obj is BattleObject && collision.Other is BattleObject)) return;
228
229            BattleObject bo1 = (collision.Obj as BattleObject);
230            bo1.TakeDamage(new Damage(1));
231            BattleObject bo2 = (collision.Other as BattleObject);
232            bo2.TakeDamage(new Damage(1));
233        }
234        #endregion
235    }
236}
Note: See TracBrowser for help on using the repository browser.