source: 2009/nuutti_m/OmaPeli.cs @ 8910

Revision 279, 10.2 KB checked in by nuvamikk, 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 Tasohyppely2
15{
16    // Yksinkertainen tasohyppely.
17    class Tasohyppely : PhysicsGame
18    {
19        #region Muuttujat
20
21        const double liikeVoima = 4000;
22        const double hyppyVoima = 2500;
23
24        Meter<int> pisteLaskuri;
25        ValueDisplay pisteNaytto;
26
27        PlatformCharacter pelaaja1;
28        PlatformCharacter pelaaja2;
29        PhysicsObject maali;
30
31        int kenttaNro; // monesko kenttä on menossa
32
33        #endregion
34
35
36        #region Alustukset
37        protected override void LoadContent()
38        {
39            // Asetetaan kentän numero nollaksi, jota kasvatetaan kentän latauksessa (aina siis vähintään 1)
40            kenttaNro = 0;
41
42            DrawPerimeter = false; // ei haluta piirtää kentän reunoja
43
44            // Luodaan pistelaskuri
45            pisteLaskuri = new Meter<int>(0, 0, 1000000);
46
47            // luodaan pistelaskunäyttö
48            pisteNaytto = new ValueDisplay(this);
49            pisteNaytto.Text = "Pisteitä: ";
50            pisteNaytto.X = Screen.RightSafe - 250;
51            pisteNaytto.Y = Screen.TopSafe - 50;
52            pisteNaytto.BindTo(pisteLaskuri);
53            Add(pisteNaytto);    // lisätään peliin
54
55            // Asetetaan painovoima
56            Gravity = new Vector2D(0, -1000);
57
58            // Zoomataan lähemmäksi
59            Camera.ZoomFactor = 2.0;
60
61            aloitaUusiPeli();
62
63        }
64
65        void aloitaUusiPeli()
66        {
67            MessageDisplay.Clear();
68
69            kenttaNro = 0;
70
71            // ladataan kenttä
72            Level = seuraavaKentta();
73
74            // Laitetaan peliohje näyttöön
75            MessageDisplay.Add("Etsi iso tähti!");
76            MessageDisplay.Add("Mutta varo haamuja...");
77        }
78        #endregion
79
80
81        #region KentanLataus
82        Level seuraavaKentta()
83        {
84            pisteLaskuri.Reset();
85            kenttaNro += 1; // lisätään kenttänumeroa yhdellä
86            MessageDisplay.Add("Kenttä " + kenttaNro);
87            Level seuraava = luoKentta();
88            lisaaNappaimet();
89            Camera.Follow(pelaaja1);
90            return seuraava;
91        }
92
93        Level luoKentta()
94        {
95            Level kentta = new Level(this, 2000, 1000);
96            kentta.CreateBorder();
97            kentta.Borders.Visible = false;
98            kentta.Background.CreateGradient(Color.White, Color.SkyBlue);
99
100            Platform alusta = new Platform(kentta.Width, 300, Color.LightGreen);
101            alusta.X = 0;
102            alusta.Y = kentta.Bottom - alusta.Height / 2;
103            kentta.Objects.Add(alusta);
104
105            lisaaPieniTaso(kentta, -200, -350);
106            lisaaPieniTaso(kentta, 200, -350);
107            lisaaPieniTaso(kentta, 400, -150);
108            lisaaPieniTaso(kentta, 400, -150);
109
110            lisaaPieniTaso(kentta, 500, 0);
111            lisaaPieniTaso(kentta, -500, 0);
112            lisaaPieniTaso(kentta, -400, 100);
113            lisaaPieniTaso(kentta, 0, 100);
114            lisaaPieniTaso(kentta, -100, 400);
115            lisaaPieniTaso(kentta, 0, -250);
116           
117            lisaaMaali(kentta);
118            lisaaPelaajat(kentta);
119            lisaaTahdet(kentta);
120
121            int vihollistenMaara = kenttaNro;
122            lisaaViholliset(kentta, vihollistenMaara);
123
124            return kentta;
125        }
126
127        void lisaaPieniTaso(Level kentta, double x, double y)
128        {
129            Platform taso = new Platform(100, 30, Color.Green);
130            taso.X = x;
131            taso.Y = y;
132            kentta.Objects.Add(taso);
133        }
134
135        void lisaaPelaajat(Level kentta)
136        {
137            pelaaja1 = new PlatformCharacter(4, Shapes.CreateCircle(20));
138            pelaaja1.Texture = Content.Load<Texture2D>("norsu");
139            pelaaja1.X = 0;
140            pelaaja1.Y = kentta.Bottom + 120;
141
142            pelaaja2 = new PlatformCharacter(4, Shapes.CreateCircle(20));
143            pelaaja2.Texture = Content.Load<Texture2D>("norsu");
144            pelaaja2.X = 10;
145            pelaaja2.Y = kentta.Bottom + 120;
146
147            AddCollisionHandler(pelaaja1, osuiMaaliin);
148            AddCollisionHandler(pelaaja2, osuiMaaliin);
149
150            kentta.Objects.Add(pelaaja1);
151            kentta.Objects.Add(pelaaja2);
152        }
153
154        void lisaaTahdet(Level kentta)
155        {
156            for (int i = 0; i < 20; i++)
157            {
158                PhysicsObject tahti = new PhysicsObject(0.005, Shapes.CreateCircle(12));
159                tahti.X = RandomGen.NextDouble(-475.0, 475.0);
160                tahti.Y = 400.0;
161                tahti.Restitution = 1.0;
162                tahti.Texture = Content.Load<Texture2D>("tahti");
163                AddCollisionHandler(tahti, keraa);
164                kentta.Objects.Add(tahti);
165
166            }
167        }
168
169        void lisaaMaali(Level kentta)
170        {
171            maali = PhysicsObject.CreateStaticObject(Shapes.CreateCircle(25));
172            maali.Tag = "maali";
173            maali.IgnoresCollisionResponse = true;
174            maali.X = 0;
175            maali.Y = 325;
176            maali.Texture = Content.Load<Texture2D>("tahti");
177            kentta.Objects.Add(maali);
178        }
179
180        void lisaaViholliset(Level kentta, int kpl)
181        {
182            for (int i = 0; i < kpl; i++)
183            {
184                PlatformCharacter vihollinen = new PlatformCharacter(100, Shapes.CreateCircle(30));
185                vihollinen.Brain = new RandomMoverBrain();
186                vihollinen.X = maali.X;
187                vihollinen.Y = maali.Y;
188                vihollinen.IgnoresGravity = true;
189                vihollinen.Texture = Content.Load<Texture2D>("vihollinen");
190                AddCollisionHandler(vihollinen, tuuppaa);
191                kentta.Objects.Add(vihollinen);
192            }
193        }
194        #endregion
195
196
197        #region Nappaimet
198        // Lisää peliin kaikki näppäimet
199        void lisaaNappaimet()
200        {
201            ClearControls();
202            //Yleiset näppäimet
203            Controls.Listen(Keys.Enter, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
204
205            // Pelaajan näppäimet
206            Controls.Listen(Keys.Left, ButtonPosition.Down, liikuta, "Liikkuu vasemmalle", pelaaja1, new Vector2D(-liikeVoima, 0));
207            Controls.Listen(Keys.Right, ButtonPosition.Down, liikuta, "Liikkuu oikealle", pelaaja1, new Vector2D(liikeVoima, 0));
208            Controls.Listen(Keys.Up, ButtonPosition.Pressed, hyppaa, "Hyppää", pelaaja1, hyppyVoima);
209
210            Controls.Listen(Keys.A, ButtonPosition.Down, liikuta, "Liikkuu vasemmalle", pelaaja2, new Vector2D(-liikeVoima, 0));
211            Controls.Listen(Keys.D, ButtonPosition.Down, liikuta, "Liikkuu oikealle", pelaaja2, new Vector2D(liikeVoima, 0));
212            Controls.Listen(Keys.W, ButtonPosition.Pressed, hyppaa, "Hyppää", pelaaja2, hyppyVoima);
213
214
215            lisaaGamePadNappaimet(PlayerIndex.One, pelaaja1);
216            lisaaGamePadNappaimet(PlayerIndex.One, pelaaja2);
217        }
218
219        void lisaaGamePadNappaimet(PlayerIndex pelaajaNro, PlatformCharacter pelaaja)
220        {
221            //Yleiset näppäimet
222            Controls.Listen(pelaajaNro, Buttons.Start, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
223
224            Controls.Listen(pelaajaNro, Buttons.DPadLeft, ButtonPosition.Down, liikuta, "Pelaaja liikkuu vasemmalle", pelaaja, new Vector2D(-liikeVoima, 0));
225            Controls.Listen(pelaajaNro, Buttons.DPadRight, ButtonPosition.Down, liikuta, "Pelaaja liikkuu oikealle", pelaaja, new Vector2D(liikeVoima, 0));
226            Controls.Listen(pelaajaNro, Buttons.A, ButtonPosition.Pressed, hyppaa, "Pelaaja hyppää", pelaaja, hyppyVoima);
227        }
228
229        // Näppäimiin liitetyt toiminnot alkavat tästä -->
230        bool liikuta(ControlEvent e)
231        {
232            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
233            Vector2D voima = e.Parameter1.ToVector2D();
234            hahmo.Walk(e.Time, voima);
235            return false;
236        }
237
238        bool hyppaa(ControlEvent e)
239        {
240            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
241            double voima = e.Parameter1.ToDouble();
242
243            if (hahmo.Jump(voima))
244            {
245                this.PlaySound("hyppays");
246            }
247            return false;
248        }
249
250        bool uusiPeli(ControlEvent e)
251        {
252            aloitaUusiPeli();
253            return true;
254        }
255        #endregion
256
257
258        #region Tapahtumat
259        // Kun osutaan maaliin
260        void osuiMaaliin(Collision collision)
261        {
262            if (collision.Other.Tag == "maali")
263            {
264                this.PlaySound("maali");
265                int edellisenKentanPisteet = pisteLaskuri.Value;
266                Level = seuraavaKentta();
267                MessageDisplay.Add("Pääsit läpi kentän " + kenttaNro + ". Pisteitä: " + edellisenKentanPisteet);
268            }
269        }
270
271        // Kerää tähden ja antaa pisteen
272        void keraa(Collision collision)
273        {
274            if (collision.Other.Equals(pelaaja1))
275            {
276                PhysicsObject tahti = collision.Obj;
277                tahti.Destroy();
278
279                this.PlaySound("kerays", -0.5, 0.5);
280                pisteLaskuri.Value += 1;
281            }
282        }
283
284        // Haamu tuuppaa pelaajaa
285        void tuuppaa(Collision collision)
286        {
287            if (collision.Other is PlatformCharacter)
288            {
289                double luku1 = RandomGen.NextIntRange(-10000, -8000, 8000, 10000);
290                double luku2 = RandomGen.NextIntRange(-10000, -8000, 8000, 10000);
291
292                if (collision.Other == pelaaja1)
293                {
294                    // pieni värinä törmäyksestä
295                    Controls.GameControllers[PlayerIndex.One].Vibrate(0.5, 0.5, 0.0, 0.0, 0.1);
296                }
297                this.PlaySound("tuuppaus");
298                collision.Other.Hit(new Vector2D(luku1, luku2));
299            }
300        }
301        #endregion
302    }
303}
Note: See TracBrowser for help on using the repository browser.