source: aku_k/AvaruudenMuukalaiset/Peli.cs @ 172

Revision 172, 17.4 KB checked in by akpekorh, 10 years ago (diff)

valmisa pelimoottori, kaksi tasoa!

Line 
1using System;
2using Microsoft.Xna.Framework;
3using Microsoft.Xna.Framework.Graphics;
4using Microsoft.Xna.Framework.Input;
5using Microsoft.Xna.Framework.Media;
6
7using Physics2DDotNet;
8using AdvanceMath;
9using Jypeli;
10using Jypeli.ScreenObjects;
11using Jypeli.Assets;
12
13
14namespace AvaruudenMuukalaiset
15{
16
17
18    /// <summary>
19    /// Aivot, jotka laittavat omistajansa liikkumaan satunnaisesti eri suuntiin törmäyksissä ja tietyn ajan jälkeen.
20    /// </summary>
21    public class AlienRandomMoverBrain : Brain
22    {
23
24        double x1, x2, y1, y2;
25        /// <summary>
26        /// Luo uudet aivot.
27        /// </summary>
28        public AlienRandomMoverBrain(double x1, double x2, double y1, double y2) {
29            this.x1 = x1;
30            this.x2 = x2;
31            this.y1 = y1;
32            this.y2 = y2;
33        }
34
35        /// <summary>
36        /// Kutsutaan, kun tapahtuu törmäys.
37        /// </summary>
38        /// <param name="target">Olio, johon törmätään.</param>
39        public override void OnCollision(GameObject target)
40        {
41            int luku1 = RandomGen.NextIntRange(-10000, -5000, 5000, 10000);
42            int luku2 = RandomGen.NextIntRange(-10000, -5000, 5000, 10000);
43
44            AttemptMove(new Vector2D(luku1, luku2));
45            base.OnCollision(target);
46        }
47
48        /// <summary>
49        /// Kutsutaan päivityksessä
50        /// </summary>
51        /// <param name="gameTime">Peliaika.</param>
52        public override void OnUpdate(GameTime gameTime)
53        {
54            PhysicsObject physObj = Owner as PhysicsObject;
55            if (gameTime.TotalGameTime.Seconds % 3 == 0)
56            {
57                int luku1 = RandomGen.NextIntRange(-1000, -100, 100, 1000);
58                int luku2 = RandomGen.NextIntRange(-1000, -100, 100, 1000);
59
60                Vector2D movement = new Vector2D(luku1, luku2);
61                physObj.Push(movement * physObj.Mass);
62
63                base.OnUpdate(gameTime);
64                ;
65            }
66
67            if (physObj.X > x2) { physObj.Velocity = new Vector2D(-Math.Abs(physObj.Velocity.X),physObj.Velocity.Y); };
68            if (physObj.X < x1) { physObj.Velocity = new Vector2D(Math.Abs(physObj.Velocity.X), physObj.Velocity.Y); };
69            if (physObj.Y > y2) { physObj.Velocity = new Vector2D(physObj.Velocity.X, -Math.Abs(physObj.Velocity.Y)); };
70            if (physObj.Y < y1) { physObj.Velocity = new Vector2D(physObj.Velocity.X, Math.Abs(physObj.Velocity.Y)); };
71
72            //if (physObj.X > x2) { physObj.X -= 1; physObj.Stop(); };
73            //if (physObj.X < x1) { physObj.X += 1; physObj.Stop(); };
74            //if (physObj.Y > y2) { physObj.Y -= 1; physObj.Stop(); };
75            //if (physObj.Y < y1) { physObj.Y += 1; physObj.Stop(); };
76        }
77    }
78    // Yksinkertainen tasohyppely.
79    class Tasohyppely : PhysicsGame
80    {
81        #region Muuttujat
82
83        const double liikeVoima = 4000;
84        const double hyppyVoima = 2500;
85
86        Meter<int> pisteLaskuri;
87        ValueDisplay pisteNaytto;
88        Meter<int> elamat;
89        ValueDisplay elamaNaytto;
90
91
92        PlatformCharacter pelaaja1;
93        PhysicsObject maali;
94
95        int kenttaNro; // monesko kenttä on menossa
96
97        #endregion
98
99
100        #region Alustukset
101        protected override void LoadContent()
102        {
103            // Asetetaan kentän numero nollaksi, jota kasvatetaan kentän latauksessa (aina siis vähintään 1)
104            kenttaNro = 0;
105
106            DrawPerimeter = false; // ei haluta piirtää kentän reunoja
107
108            // Luodaan pistelaskuri
109            pisteLaskuri = new Meter<int>(0, 0, 1000000);
110
111            // luodaan pistelaskunäyttö
112            pisteNaytto = new ValueDisplay(this);
113            pisteNaytto.Text = "Pisteitä: ";
114            pisteNaytto.X = Screen.RightSafe - 250;
115            pisteNaytto.Y = Screen.TopSafe - 50;
116            pisteNaytto.BindTo(pisteLaskuri);
117            Add(pisteNaytto);    // lisätään peliin
118
119            elamat = new Meter<int>(0, 0, 10);
120
121            elamaNaytto = new ValueDisplay(this);
122            elamaNaytto.Text = "Elämiä: ";
123            elamaNaytto.X = Screen.RightSafe - 250;
124            elamaNaytto.Y = Screen.TopSafe - 75;
125            elamaNaytto.BindTo(elamat);
126            Add(elamaNaytto);
127
128           
129
130           
131
132         
133               
134           
135
136           
137
138            // Asetetaan painovoima
139            Gravity = new Vector2D(0, -1000);
140
141            // Zoomataan lähemmäksi
142            Camera.ZoomFactor = 2.0;
143
144            aloitaUusiPeli();
145
146        }
147       
148
149        void aloitaUusiPeli()
150        {
151            MessageDisplay.Clear();
152            MessageDisplay.Add("Taistele tiesi avaruusalukselle!");
153            pisteLaskuri.Value = 0;
154            elamat.Value = 3;
155            kenttaNro = 0;
156
157           
158            // ladataan kenttä
159            Level = seuraavaKentta();
160
161            // Laitetaan peliohje näyttöön
162
163        }
164
165        #endregion
166
167
168        #region KentanLataus
169        Level seuraavaKentta()
170        {
171           
172
173            kenttaNro += 1; // lisätään kenttänumeroa yhdellä
174            MessageDisplay.Add("Kenttä " + kenttaNro);
175            Level seuraava = luoKentta();
176            lisaaNappaimet();
177            Camera.Follow(pelaaja1);
178            return seuraava;
179           
180
181         
182        }
183
184        Level luoKentta()
185        {
186            if (kenttaNro == 1) return luoKentta1();
187            if (kenttaNro == 2) return luoKentta2();
188            if (kenttaNro == 3)
189            {
190                aloitaUusiPeli();
191            }
192
193
194            return luoKentta1();
195        }
196
197     
198       
199        Level luoKentta1()
200        {
201            Level kentta = new Level(this, 2000, 1000);
202            kentta.CreateBorder();
203            kentta.Borders.Visible = false;
204            kentta.Background.CreateGradient(Color.White, Color.BlueViolet);
205
206            Platform alusta = new Platform(kentta.Width, 300, Color.Green);
207            alusta.X = 0;
208            alusta.Y = kentta.Bottom - alusta.Height / 2;
209            kentta.Objects.Add(alusta);
210
211            lisaaSuuriNelio(kentta, 900, -450);//laatikko
212            lisaaSuuriNelio(kentta, 700, Level.Bottom + 160);//laatikko
213            lisaaSuuriNelio(kentta, 100, -350);//laatikko   
214            lisaaSuuriNelio(kentta, 100, -250);//laatikko
215            lisaaSuuriNelio(kentta, -200, -200);
216           
217            lisaaSuuriNelio(kentta, -60, -450);//laatikko
218            lisaaSuuriNelio(kentta, Level.Left + 150, 0);
219            lisaaSuuriNelio(kentta, -300, -200);
220
221            lisaaPieniNelio(kentta, 0, 190);
222            lisaaPieniNelio(kentta, 60, 190);
223            lisaaPieniNelio(kentta, -60, 190);
224
225           
226           
227
228            lisaaMaali(kentta, 0, 350);
229            lisaaPelaajat(kentta, 700, Level.Bottom + 50);
230            lisaaTahdet(kentta, 50, 120);
231            lisaaTahdet(kentta, 0, 120);
232            lisaaTahdet(kentta, 0, 30);
233            lisaaTahdet(kentta, 0, 40);
234            lisaaTahdet(kentta, 970, -450);
235            lisaaTahdet(kentta, 160, -450);
236            lisaaTahdet(kentta, 170, -450);
237            lisaaTahdet(kentta, 180, -430);
238            lisaaElamat(kentta, 1000, Level.Bottom + 20);
239
240            int vihollistenMaara = kenttaNro;
241            lisaaViholliset(kentta, vihollistenMaara);
242           
243
244            return kentta;
245        }
246       
247        Level luoKentta2()
248        {
249            Level kentta = new Level(this, 2000, 1000);
250            kentta.CreateBorder();
251            kentta.Borders.Visible = false;
252            kentta.Background.CreateGradient(Color.White, Color.BlueViolet);
253
254            Platform alusta = new Platform(kentta.Width, 300, Color.Green);
255            alusta.X = 0;
256            alusta.Y = kentta.Bottom - alusta.Height / 2;
257            kentta.Objects.Add(alusta);
258
259            lisaaSuuriNelio(kentta, 800, -450);
260            lisaaPieniNelio(kentta, 700, -300);
261            lisaaPieniNelio(kentta, 500, -250);
262            lisaaPieniNelio(kentta, 300, -150);
263            lisaaPieniNelio(kentta, -150, -150);
264            lisaaPieniNelio(kentta, -450, 50);
265            lisaaPieniNelio(kentta, -160, 150);
266            lisaaPieniNelio(kentta, 40, 230);
267
268            lisaaTahdet(kentta, 800, -350);
269            lisaaTahdet(kentta, 700, -260);
270            lisaaTahdet(kentta, 500, -190);
271            lisaaTahdet(kentta, 300, -90);
272            lisaaTahdet(kentta, -150, -90);
273            lisaaTahdet(kentta, -450, 110);
274            lisaaTahdet(kentta, -160, 210);
275            lisaaTahdet(kentta, 40, 290);
276
277            lisaaSuuriNelio(kentta, 100, 340);
278
279            lisaaMaali(kentta, 100, Level.Top);
280
281            lisaaPelaajat(kentta, Level.Right + -250, Level.Bottom + 50);
282
283            return kentta;
284        }
285
286
287
288        void lisaaSuuriNelio(Level kentta, double x, double y)
289        {
290            Platform taso = new Platform(100, 100, Color.Black);
291            taso.X = x;
292            taso.Y = y;
293            taso.Texture = Content.Load<Texture2D>("laatikko");
294            kentta.Objects.Add(taso);
295        }
296
297        void lisaaPieniNelio(Level kentta, double x, double y)
298        {
299            Platform taso = new Platform(60, 60, Color.Black);
300            taso.X = x;
301            taso.Y = y;
302            taso.Texture = Content.Load<Texture2D>("laatikko");
303            kentta.Objects.Add(taso);
304        }
305
306        void lisaaPieniTaso(Level kentta, double x, double y)
307        {
308            Platform taso = new Platform(100, 30, Color.Beige);
309            taso.X = x;
310            taso.Y = y;
311            kentta.Objects.Add(taso);
312        }
313
314
315        void lisaaPelaajat(Level kentta, double x, double y)
316        {
317            pelaaja1 = new PlatformCharacter(4, Shapes.CreateCircle(25));
318            //pelaaja1.Texture = Content.Load<Texture2D>("pelihahmo2");
319            Texture2D[] tekstuurit =
320            {
321                Content.Load<Texture2D>( "pelihahmo2" ),
322                Content.Load<Texture2D>( "pelihahmo2anim" ),
323                Content.Load<Texture2D>( "pelihahmo2anim2" ),
324                Content.Load<Texture2D>( "pelihahmo2anim3" ),
325            };
326            AnimatedTexture kavelyTekstuuri = new AnimatedTexture(tekstuurit);
327            kavelyTekstuuri.FPS = 0;
328
329            pelaaja1.RightWalkingTexture = kavelyTekstuuri;
330            pelaaja1.LeftWalkingTexture = Textures.Mirror(kavelyTekstuuri);
331            pelaaja1.RightIdleTexture = new AnimatedTexture(Content.Load<Texture2D>("pelihahmo2"));
332            pelaaja1.LeftIdleTexture = new AnimatedTexture(Textures.Mirror(Content.Load<Texture2D>("pelihahmo2")));
333            pelaaja1.AnimationPerPixel = 0.001;
334
335            pelaaja1.X = x;
336            pelaaja1.Y = y;
337
338            AddCollisionHandler(pelaaja1, osuiMaaliin);
339
340            kentta.Objects.Add(pelaaja1);
341        }
342
343        void lisaaTahdet(Level kentta, double x, double y)
344        {
345
346                PhysicsObject tahti = new PhysicsObject(0.005, Shapes.CreateCircle(12));
347                //tahti.X = RandomGen.NextDouble(-475.0, 475.0);
348                tahti.X = x;
349                tahti.Y = y;
350                tahti.Texture = Content.Load<Texture2D>("coin");
351                tahti.Restitution = 0.0;
352                AddCollisionHandler(tahti, keraaTahti);
353                kentta.Objects.Add(tahti);
354
355             
356        }
357
358        void lisaaElamat(Level kentta, double x, double y)
359        {
360           
361                PhysicsObject elama = new PhysicsObject(0.005, Shapes.CreateCircle(15));
362                elama.X = x;
363                elama.Y = y;
364                elama.Texture = Content.Load<Texture2D>("1up");
365                elama.Restitution = 1.0;
366                AddCollisionHandler(elama, keraaElama);
367                kentta.Objects.Add(elama);
368
369           
370        }
371        void lisaaMaali(Level kentta, double x, double y)
372        {
373            maali = PhysicsObject.CreateStaticObject(Shapes.CreateCircle(60));
374            maali.Tag = "maali";
375            maali.IgnoresCollisionResponse = true;
376            maali.X = x;
377            maali.Y = y;
378            maali.Texture = Content.Load<Texture2D>("alus");
379            kentta.Objects.Add(maali);
380        }
381
382        void lisaaViholliset(Level kentta, int kpl)
383        {
384            for (int i = 0; i < kpl; i++)
385            {
386                PlatformCharacter vihollinen = new PlatformCharacter(100, Shapes.CreateCircle(30));
387                vihollinen.Brain = new AlienRandomMoverBrain(0, 300, -450, -220);
388                vihollinen.X = 180;
389                vihollinen.Y = Level.Bottom + 30;
390                vihollinen.IgnoresGravity = true;
391                vihollinen.Texture = Content.Load<Texture2D>("vihulainen");
392                AddCollisionHandler(vihollinen, tuuppaa);
393                kentta.Objects.Add(vihollinen);
394            }
395        }
396        #endregion
397
398
399        #region Nappaimet
400        // Lisää peliin kaikki näppäimet
401        void lisaaNappaimet()
402        {
403            ClearControls();
404
405            //Yleiset näppäimet
406            Controls.Listen(Keys.Enter, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
407
408            // Pelaajan näppäimet
409            Controls.Listen(Keys.Left, ButtonPosition.Down, liikuta, "Liikkuu vasemmalle", pelaaja1, new Vector2D(-liikeVoima, 0));
410            Controls.Listen(Keys.Right, ButtonPosition.Down, liikuta, "Liikkuu oikealle", pelaaja1, new Vector2D(liikeVoima, 0));
411            Controls.Listen(Keys.Up, ButtonPosition.Pressed, hyppaa, "Hyppää", pelaaja1, hyppyVoima);
412
413            lisaaGamePadNappaimet(PlayerIndex.One, pelaaja1);
414        }
415
416        void lisaaGamePadNappaimet(PlayerIndex pelaajaNro, PlatformCharacter pelaaja)
417        {
418            //Yleiset näppäimet
419            Controls.Listen(pelaajaNro, Buttons.Start, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
420
421            Controls.Listen(pelaajaNro, Buttons.DPadLeft, ButtonPosition.Down, liikuta, "Pelaaja liikkuu vasemmalle", pelaaja, new Vector2D(-liikeVoima, 0));
422            Controls.Listen(pelaajaNro, Buttons.DPadRight, ButtonPosition.Down, liikuta, "Pelaaja liikkuu oikealle", pelaaja, new Vector2D(liikeVoima, 0));
423            Controls.Listen(pelaajaNro, Buttons.A, ButtonPosition.Pressed, hyppaa, "Pelaaja hyppää", pelaaja, hyppyVoima);
424        }
425
426        // Näppäimiin liitetyt toiminnot alkavat tästä -->
427        bool liikuta(ControlEvent e)
428        {
429            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
430            Vector2D voima = e.Parameter1.ToVector2D();
431            hahmo.Walk(e.Time, voima);
432            return false;
433        }
434
435        bool hyppaa(ControlEvent e)
436        {
437            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
438            double voima = e.Parameter1.ToDouble();
439
440            if (hahmo.Jump(voima))
441            {
442                this.PlaySound("hyppays");
443            }
444            return false;
445        }
446
447        bool uusiPeli(ControlEvent e)
448        {
449            aloitaUusiPeli();
450            return true;
451        }
452        #endregion
453
454
455        #region Tapahtumat
456        // Kun osutaan maaliin
457        void osuiMaaliin(Collision collision)
458        {
459            if (collision.Other.Tag == "maali")
460            {
461                this.PlaySound("maali");
462                int edellisenKentanPisteet = pisteLaskuri.Value;
463                Level = seuraavaKentta();
464                MessageDisplay.Add("Pääsit läpi kentän! Pisteitä: " + edellisenKentanPisteet);
465               
466            }
467        }
468
469        // Kerää tähden ja antaa pisteen
470        void keraaTahti(Collision collision)
471        {
472            if (collision.Other.Equals(pelaaja1))
473            {
474                PhysicsObject tahti = collision.Obj;
475                tahti.Lifetime.IsExpired = true;
476
477                this.PlaySound("kerays", -0.5, 0.5);
478                pisteLaskuri.Value += 10;
479            }
480        }
481
482        void keraaElama(Collision collision)
483        {
484            if (collision.Other.Equals(pelaaja1))
485
486            {
487                PhysicsObject elama = collision.Obj;
488                elama.Lifetime.IsExpired = true;
489                elamat.Value += 1;
490
491                pisteLaskuri.Value += 15;
492            }
493        }
494
495     
496        // Haamu tuuppaa pelaajaa
497        void tuuppaa(Collision collision)
498        {
499            if (collision.Other == pelaaja1 )
500            {
501                //double luku1 = RandomGen.NextIntRange(-10000, -8000, 8000, 10000);
502                //double luku2 = RandomGen.NextIntRange(-10000, -8000, 8000, 10000);
503                elamat.Value -= 1;
504               
505                if (elamat.Value == 0)
506                {
507                    aloitaUusiPeli();
508                    MessageDisplay.Add("Hävisit! Aloita alusta!");
509                }
510
511                if (collision.Other == pelaaja1)
512                {
513                    // pieni värinä törmäyksestä
514                    Controls.GameControllers[PlayerIndex.One].Vibrate(0.5, 0.5, 0.0, 0.0, 0.1);
515                   
516                }
517                this.PlaySound("tuuppaus");
518                //collision.Other.Hit(new Vector2D(luku1, luku2));
519                //elamat.Value -= 1;
520            }
521
522        }
523        #endregion
524    }
525}
Note: See TracBrowser for help on using the repository browser.