source: aku_k/AvaruudenMuukalaiset/Peli.cs @ 161

Revision 161, 15.8 KB checked in by akpekorh, 10 years ago (diff)
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            AlustaKaikki();
176            Level seuraava = luoKentta();
177            lisaaNappaimet();
178            Camera.Follow(pelaaja1);
179            return seuraava;
180           
181
182         
183        }
184
185        private void AlustaKaikki()
186        {
187            //Controls.Clear();
188        }
189
190         
191       
192        Level luoKentta()
193        {
194            Level kentta = new Level(this, 2000, 1000);
195            kentta.CreateBorder();
196            kentta.Borders.Visible = false;
197            kentta.Background.CreateGradient(Color.White, Color.BlueViolet);
198
199            Platform alusta = new Platform(kentta.Width, 300, Color.Green);
200            alusta.X = 0;
201            alusta.Y = kentta.Bottom - alusta.Height / 2;
202            kentta.Objects.Add(alusta);
203
204            lisaaSuuriNelio(kentta, 900, -450);//laatikko
205            lisaaSuuriNelio(kentta, 700, Level.Bottom + 160);//laatikko
206            lisaaSuuriNelio(kentta, 100, -350);//laatikko   
207            lisaaSuuriNelio(kentta, 100, -250);//laatikko
208            lisaaSuuriNelio(kentta, -200, -200);
209           
210            lisaaSuuriNelio(kentta, -60, -450);//laatikko
211            lisaaSuuriNelio(kentta, Level.Left + 100, 0);
212            lisaaSuuriNelio(kentta, -300, -200);
213
214            lisaaPieniNelio(kentta, 0, 190);
215            lisaaPieniNelio(kentta, 60, 190);
216            lisaaPieniNelio(kentta, -60, 190);
217
218           
219           
220
221            lisaaMaali(kentta, 0, 350);
222            lisaaPelaajat(kentta);
223            lisaaTahdet(kentta, 50, 120);
224            lisaaTahdet(kentta, 0, 120);
225            lisaaTahdet(kentta, 0, 30);
226            lisaaTahdet(kentta, 0, 40);
227            lisaaTahdet(kentta, 970, -450);
228            lisaaTahdet(kentta, 160, -450);
229            lisaaTahdet(kentta, 170, -450);
230            lisaaTahdet(kentta, 180, -430);
231            lisaaElamat(kentta, 1000, Level.Bottom + 20);
232
233            int vihollistenMaara = kenttaNro;
234            lisaaViholliset(kentta, vihollistenMaara);
235
236            return kentta;
237        }
238
239        void lisaaSuuriNelio(Level kentta, double x, double y)
240        {
241            Platform taso = new Platform(100, 100, Color.Black);
242            taso.X = x;
243            taso.Y = y;
244            taso.Texture = Content.Load<Texture2D>("laatikko");
245            kentta.Objects.Add(taso);
246        }
247
248        void lisaaPieniNelio(Level kentta, double x, double y)
249        {
250            Platform taso = new Platform(60, 60, Color.Black);
251            taso.X = x;
252            taso.Y = y;
253            taso.Texture = Content.Load<Texture2D>("laatikko");
254            kentta.Objects.Add(taso);
255        }
256
257        void lisaaPieniTaso(Level kentta, double x, double y)
258        {
259            Platform taso = new Platform(100, 30, Color.Beige);
260            taso.X = x;
261            taso.Y = y;
262            kentta.Objects.Add(taso);
263        }
264
265
266        void lisaaPelaajat(Level kentta)
267        {
268            pelaaja1 = new PlatformCharacter(4, Shapes.CreateCircle(25));
269            //pelaaja1.Texture = Content.Load<Texture2D>("pelihahmo2");
270            Texture2D[] tekstuurit =
271            {
272                Content.Load<Texture2D>( "pelihahmo2" ),
273                Content.Load<Texture2D>( "pelihahmo2anim" ),
274                Content.Load<Texture2D>( "pelihahmo2anim2" ),
275                Content.Load<Texture2D>( "pelihahmo2anim3" ),
276            };
277            AnimatedTexture kavelyTekstuuri = new AnimatedTexture(tekstuurit);
278            kavelyTekstuuri.FPS = 0;
279
280            pelaaja1.RightWalkingTexture = kavelyTekstuuri;
281            pelaaja1.LeftWalkingTexture = Textures.Mirror(kavelyTekstuuri);
282            pelaaja1.RightIdleTexture = new AnimatedTexture(Content.Load<Texture2D>("pelihahmo2"));
283            pelaaja1.LeftIdleTexture = new AnimatedTexture(Textures.Mirror(Content.Load<Texture2D>("pelihahmo2")));
284            pelaaja1.AnimationPerPixel = 0.001;
285
286            pelaaja1.X = 700;
287            pelaaja1.Y = kentta.Bottom + 25;
288
289            AddCollisionHandler(pelaaja1, osuiMaaliin);
290
291            kentta.Objects.Add(pelaaja1);
292        }
293
294        void lisaaTahdet(Level kentta, double x, double y)
295        {
296
297                PhysicsObject tahti = new PhysicsObject(0.005, Shapes.CreateCircle(12));
298                //tahti.X = RandomGen.NextDouble(-475.0, 475.0);
299                tahti.X = x;
300                tahti.Y = y;
301                tahti.Texture = Content.Load<Texture2D>("coin");
302                tahti.Restitution = 0.0;
303                AddCollisionHandler(tahti, keraaTahti);
304                kentta.Objects.Add(tahti);
305
306             
307        }
308
309        void lisaaElamat(Level kentta, double x, double y)
310        {
311           
312                PhysicsObject elama = new PhysicsObject(0.005, Shapes.CreateCircle(15));
313                elama.X = x;
314                elama.Y = y;
315                elama.Texture = Content.Load<Texture2D>("1up");
316                elama.Restitution = 1.0;
317                AddCollisionHandler(elama, keraaElama);
318                kentta.Objects.Add(elama);
319
320           
321        }
322        void lisaaMaali(Level kentta, double x, double y)
323        {
324            maali = PhysicsObject.CreateStaticObject(Shapes.CreateCircle(60));
325            maali.Tag = "maali";
326            maali.IgnoresCollisionResponse = true;
327            maali.X = x;
328            maali.Y = y;
329            maali.Texture = Content.Load<Texture2D>("alus");
330            kentta.Objects.Add(maali);
331        }
332
333        void lisaaViholliset(Level kentta, int kpl)
334        {
335            for (int i = 0; i < kpl; i++)
336            {
337                PlatformCharacter vihollinen = new PlatformCharacter(100, Shapes.CreateCircle(30));
338                vihollinen.Brain = new AlienRandomMoverBrain(0, 300, -450, -220);
339                vihollinen.X = 180;
340                vihollinen.Y = Level.Bottom + 30;
341                vihollinen.IgnoresGravity = true;
342                vihollinen.Texture = Content.Load<Texture2D>("vihulainen");
343                AddCollisionHandler(vihollinen, tuuppaa);
344                kentta.Objects.Add(vihollinen);
345            }
346        }
347        #endregion
348
349
350        #region Nappaimet
351        // Lisää peliin kaikki näppäimet
352        void lisaaNappaimet()
353        {
354            ClearControls();
355
356            //Yleiset näppäimet
357            Controls.Listen(Keys.Enter, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
358
359            // Pelaajan näppäimet
360            Controls.Listen(Keys.Left, ButtonPosition.Down, liikuta, "Liikkuu vasemmalle", pelaaja1, new Vector2D(-liikeVoima, 0));
361            Controls.Listen(Keys.Right, ButtonPosition.Down, liikuta, "Liikkuu oikealle", pelaaja1, new Vector2D(liikeVoima, 0));
362            Controls.Listen(Keys.Up, ButtonPosition.Pressed, hyppaa, "Hyppää", pelaaja1, hyppyVoima);
363
364            lisaaGamePadNappaimet(PlayerIndex.One, pelaaja1);
365        }
366
367        void lisaaGamePadNappaimet(PlayerIndex pelaajaNro, PlatformCharacter pelaaja)
368        {
369            //Yleiset näppäimet
370            Controls.Listen(pelaajaNro, Buttons.Start, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
371
372            Controls.Listen(pelaajaNro, Buttons.DPadLeft, ButtonPosition.Down, liikuta, "Pelaaja liikkuu vasemmalle", pelaaja, new Vector2D(-liikeVoima, 0));
373            Controls.Listen(pelaajaNro, Buttons.DPadRight, ButtonPosition.Down, liikuta, "Pelaaja liikkuu oikealle", pelaaja, new Vector2D(liikeVoima, 0));
374            Controls.Listen(pelaajaNro, Buttons.A, ButtonPosition.Pressed, hyppaa, "Pelaaja hyppää", pelaaja, hyppyVoima);
375        }
376
377        // Näppäimiin liitetyt toiminnot alkavat tästä -->
378        bool liikuta(ControlEvent e)
379        {
380            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
381            Vector2D voima = e.Parameter1.ToVector2D();
382            hahmo.Walk(e.Time, voima);
383            return false;
384        }
385
386        bool hyppaa(ControlEvent e)
387        {
388            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
389            double voima = e.Parameter1.ToDouble();
390
391            if (hahmo.Jump(voima))
392            {
393                this.PlaySound("hyppays");
394            }
395            return false;
396        }
397
398        bool uusiPeli(ControlEvent e)
399        {
400            aloitaUusiPeli();
401            return true;
402        }
403        #endregion
404
405
406        #region Tapahtumat
407        // Kun osutaan maaliin
408        void osuiMaaliin(Collision collision)
409        {
410            if (collision.Other.Tag == "maali")
411            {
412                this.PlaySound("maali");
413                int edellisenKentanPisteet = pisteLaskuri.Value;
414                Level = seuraavaKentta();
415                MessageDisplay.Add("Pääsit läpi kentän! Pisteitä: " + edellisenKentanPisteet);
416               
417            }
418        }
419
420        // Kerää tähden ja antaa pisteen
421        void keraaTahti(Collision collision)
422        {
423            if (collision.Other.Equals(pelaaja1))
424            {
425                PhysicsObject tahti = collision.Obj;
426                tahti.Lifetime.IsExpired = true;
427
428                this.PlaySound("kerays", -0.5, 0.5);
429                pisteLaskuri.Value += 10;
430            }
431        }
432
433        void keraaElama(Collision collision)
434        {
435            if (collision.Other.Equals(pelaaja1))
436
437            {
438                PhysicsObject elama = collision.Obj;
439                elama.Lifetime.IsExpired = true;
440                elamat.Value += 1;
441
442                pisteLaskuri.Value += 15;
443            }
444        }
445
446     
447        // Haamu tuuppaa pelaajaa
448        void tuuppaa(Collision collision)
449        {
450            if (collision.Other == pelaaja1 )
451            {
452                //double luku1 = RandomGen.NextIntRange(-10000, -8000, 8000, 10000);
453                //double luku2 = RandomGen.NextIntRange(-10000, -8000, 8000, 10000);
454                elamat.Value -= 1;
455               
456                if (elamat.Value == 0)
457                {
458                    aloitaUusiPeli();
459                    MessageDisplay.Add("Hävisit! Aloita alusta!");
460                }
461
462                if (collision.Other == pelaaja1)
463                {
464                    // pieni värinä törmäyksestä
465                    Controls.GameControllers[PlayerIndex.One].Vibrate(0.5, 0.5, 0.0, 0.0, 0.1);
466                   
467                }
468                this.PlaySound("tuuppaus");
469                //collision.Other.Hit(new Vector2D(luku1, luku2));
470                //elamat.Value -= 1;
471            }
472
473        }
474        #endregion
475    }
476}
Note: See TracBrowser for help on using the repository browser.