source: sipi_o/Avaruuspeli1/Peli.cs @ 187

Revision 64, 8.3 KB checked in by sikajeov, 11 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        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            ClearControls();
68
69            Level = luoKentta();
70
71            lisaaNappaimet();
72            Camera.Follow(pelaaja1);
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.Background.CreateStars();
82
83            lisaaPelaajat(kentta);
84            luoAsteroideja(kentta, 500, 2000);
85
86            return kentta;
87        }
88
89        private void lisaaPelaajat(Level kentta)
90        {
91            // Pelaaja 1
92            Texture2D alus = Content.Load<Texture2D>("alus");
93            pelaaja1 = new BattleObject(Shapes.CreateFromTexture(alus, new Vector2D(50, 40), 10), 10, 5);
94            pelaaja1.Texture = alus;
95            hitpointNaytto.BindTo(pelaaja1.HitPoints);
96            pelaaja1.HitpointsReachedZero += new EventHandler(rajahdys);
97
98            // Estää tahattoman pyörimisen
99            pelaaja1.MomentOfInertia = double.PositiveInfinity;
100
101            AddCollisionHandler(pelaaja1, tormays);
102            kentta.Objects.Add(pelaaja1);
103
104            // luodaan ase
105            ase = new PlasmaCannon(new PlasmaParticle());
106            ase.SetOwner(pelaaja1, kentta);
107            ase.Visible = true;
108            ase.Color = Color.SteelBlue;
109            ase.FireRate = 1000;
110            ase.Power = new Meter<double>(5000, 5000, 5000);
111            kentta.Objects.Add(ase);
112        }
113
114        void luoAsteroideja(Level kentta, int maara, int maksimiNopeus)
115        {
116            for (int i = 0; i < maara; i++)
117            {
118                BattleObject asteroidi = new BattleObject(Shapes.CreateRandom(RandomGen.NextDouble(40.0, 80.0), RandomGen.NextDouble(40.0, 80.0), 10), 100, 10);
119                asteroidi.Position = kentta.GetRandomPosition();
120
121                asteroidi.Hit(RandomGen.NextVector(-maksimiNopeus, -maksimiNopeus, maksimiNopeus, maksimiNopeus));
122                asteroidi.HitpointsReachedZero += new EventHandler(rajahdys);
123                asteroidi.HitPoints.DefaultValue = 1;
124                asteroidi.HitPoints.MaxValue = 1;
125                asteroidi.HitPoints.MinValue = 0;
126                kentta.Objects.Add(asteroidi);
127            }
128        }
129        #endregion
130
131        #region Näppäimet
132
133        private void lisaaNappaimet()
134        {
135            //Yleiset näppäimet
136            //Controls.Listen( Keys.F1, ButtonPosition.Pressed, NaytaOhjeet, "Näyttää ohjeet" );
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.Lifetime.IsExpired = true;
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.