source: arho_m/Avaruuspeli2/Peli.cs @ 274

Revision 274, 7.6 KB checked in by armahlam, 10 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 Avaruuspeli2
20{
21    public class Peli : PhysicsGame
22    {
23        #region Muuttujat
24        BattleObject pelaaja1;
25        PlasmaCannon ase;
26        BarGauge hitpointNaytto;
27        double vihu_interv = 0.5;
28        bool nopeuta_vihuja = true;
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 elämänäyttö
44            hitpointNaytto = new BarGauge(this);
45            hitpointNaytto.Size = new Vector2D(30, 250);
46            hitpointNaytto.Angle = Angle.Radians(Math.PI / 2);
47            hitpointNaytto.ValueColor = Color.LightGreen;
48            hitpointNaytto.BackColor = Color.Red;
49            hitpointNaytto.Max = 5;
50            hitpointNaytto.Position = new Vector2D(Screen.RightSafe - 300, Screen.TopSafe - 170);
51            Add(hitpointNaytto);
52        }
53        #endregion
54
55        #region KentänLataus
56        private void lataaUusiKentta()
57        {
58            ClearPhysics();
59
60            Level = luoKentta();
61
62            lisaaNappaimet();
63            Camera.Follow(pelaaja1);
64        }
65
66        Level luoKentta()
67        {
68            Level kentta = new Level(this, 800, 600);
69            kentta.CreateBorder();
70            kentta.BackgroundColor = Color.Black;
71
72            Texture2D bgtex = Content.Load<Texture2D>("bgtex");
73
74            lisaaPelaajat(kentta);
75
76            return kentta;
77        }
78
79        private void lisaaPelaajat(Level kentta)
80        {
81            Texture2D alus = Content.Load<Texture2D>("alus");
82            IShape pelaaja_shape = Shapes.CreateFromTexture(alus, new Vector2D(50, 40), 8.0);
83
84            pelaaja1 = new BattleObject(pelaaja_shape, 15, 5);
85            pelaaja1.Texture = alus;
86
87            hitpointNaytto.BindTo(pelaaja1.HitPoints);
88            pelaaja1.HitpointsReachedZero += new EventHandler(rajahdys);
89
90            // Estää tahattoman pyörimisen
91            pelaaja1.MomentOfInertia = double.PositiveInfinity;
92
93            AddCollisionHandler(pelaaja1, tormays);
94            kentta.Objects.Add(pelaaja1);
95
96            // luodaan ase
97            ase = new PlasmaCannon(new PlasmaParticle());
98            ase.SetOwner(pelaaja1, kentta);
99            ase.Visible = true;
100            ase.Size = new Vector2D(0, 0);
101            ase.Color = Color.SteelBlue;
102            ase.FireRate = 8;
103            ase.Power = new Meter<double>(5000, 5000, 5000);
104            kentta.Objects.Add(ase);
105
106            Timer tm = new Timer();
107            tm.Interval = vihu_interv;
108            tm.Trigger += new Timer.TriggerHandler(spawnVihu);
109            tm.Start();
110            AddTimer(tm);
111        }
112        #endregion
113
114        #region Näppäimet
115
116        private void lisaaNappaimet()
117        {
118            ClearControls();
119
120            //Yleiset näppäimet
121            Controls.Listen(Keys.Enter, ButtonPosition.Pressed, UusiPeli);
122
123            // Pelaajan 1 näppäimet
124            const double nopeus = 850.0;
125            Controls.Listen(Keys.Left, ButtonPosition.Down, LiikuX, null, pelaaja1, -nopeus);
126            Controls.Listen(Keys.Right, ButtonPosition.Down, LiikuX, null, pelaaja1, nopeus);
127            Controls.Listen(Keys.Up, ButtonPosition.Down, LiikuY, null, pelaaja1, nopeus);
128            Controls.Listen(Keys.Down, ButtonPosition.Down, LiikuY, null, pelaaja1, -nopeus);
129            Controls.Listen(Keys.Space, ButtonPosition.Down, Ammu);
130        }
131
132        private Boolean UusiPeli(ControlEvent e)
133        {
134            lataaUusiKentta();
135            return true;
136        }
137
138        private Boolean Ammu(ControlEvent e)
139        {
140            // luodaan ammus
141            Projectile ammus = ase.Use();
142            if (ammus == null)
143                return false;
144
145            ammus.Position = ammus.Position + (Vector2D.FromLengthAndAngle(40, ase.Angle.Radian));
146            ammus.Push(ammus.Velocity); //?
147            ammus.IgnoresExplosions = true;
148
149            Level.Objects.Add(ammus);
150
151            return false;
152        }
153
154        private Boolean LiikuY(ControlEvent e)
155        {
156            PhysicsObject pelaaja = e.Parameter0.ToPhysicsObject();
157            double nopeus = e.Parameter1.ToDouble();
158
159            Vector2D v = new Vector2D(0, nopeus);
160            pelaaja.Hit(v);
161
162            return false;
163        }
164
165        private Boolean LiikuX(ControlEvent e)
166        {
167            PhysicsObject pelaaja = e.Parameter0.ToPhysicsObject();
168            double nopeus = e.Parameter1.ToDouble();
169
170            Vector2D v = new Vector2D(nopeus,0);
171            pelaaja.Hit(v);
172
173            return false;
174        }
175
176        //<--- näppäimiin liitetyt toiminnot loppuivat
177        #endregion
178
179        #region Tapahtumat
180
181        void rajahdys(object sender, EventArgs e)
182        {
183            PhysicsObject po = sender.ToPhysicsObject();
184            Explosion ex = new Explosion(po.Width * 1.25);
185            ex.Position = po.Position;
186            ex.Force = 2000;
187            Level.Objects.Add(ex);
188            po.Destroy();
189
190            if (po == pelaaja1)
191                ase.Destroy();
192        }
193
194        void tormays(Collision collision)
195        {
196            if (!(collision.Obj is BattleObject && collision.Other is BattleObject)) return;
197
198            BattleObject bo1 = (collision.Obj as BattleObject);
199            bo1.TakeDamage(new Damage(1));
200            BattleObject bo2 = (collision.Other as BattleObject);
201            bo2.TakeDamage(new Damage(1));
202        }
203
204        void spawnVihu(Timer t)
205        {
206            IShape shape;
207
208            int numero = RandomGen.NextInt(0, 1);
209            switch (numero)
210            {
211                case 0:
212                    shape = Shapes.CreateRectangle(40, 40);
213                    break;
214
215                case 1:
216                    shape = Shapes.CreateCircle(20.0);
217                    break;
218
219                default:
220                    return;
221            }
222
223            BattleObject bo = new BattleObject(shape, 25.0, 25);
224
225            bo.X = Level.Right - (bo.Width/2.0);
226            bo.Y = RandomGen.NextDouble(Level.Bottom, Level.Top);
227            bo.HitpointsReachedZero += new EventHandler(rajahdys);
228            AddCollisionHandler(bo, VihuTormHandler);
229
230            Vector2D v = new Vector2D(RandomGen.NextDouble(-12000,-6000), RandomGen.NextDouble(-4000,4000));
231            bo.Hit(v);
232
233            Level.Objects.Add(bo);
234
235            double kerroin = 1.4;
236
237            if (nopeuta_vihuja)
238                vihu_interv /= kerroin;
239            else
240                vihu_interv *= kerroin;
241
242            if (vihu_interv < 0.01 || vihu_interv > 0.5)
243                nopeuta_vihuja = !nopeuta_vihuja;
244
245            t.Interval = vihu_interv;
246        }
247
248        void VihuTormHandler(Collision c)
249        {
250            if (c.Other == Level.LeftBorder)
251                c.Obj.Destroy();
252        }
253
254        #endregion
255    }
256}
Note: See TracBrowser for help on using the repository browser.