source: 2012/23/JimB/FPS/FPS/FPS/FPS/FPS.cs @ 2888

Revision 2888, 19.0 KB checked in by jijoback, 10 years ago (diff)

musiikki ja naatti ääni lisätty. Peli ns. valmis.

Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8/// <summary>
9/// Pelaajan luokka -> Pelihahmon asetuksia voi lisätä tänne.
10/// </summary>
11class PeliUkko : PhysicsObject
12{
13    public IntMeter Elamat; //Antaa PeliUkko luokalle mittarin nimellä elmät.
14    public Explosion ViimeisinRajahdys = null; //Estää monen räjähdyksen tulemisen samaan aikaan bugin takia.
15    public bool aseValmiina = true; //->Ei supersarjatulta.
16    public bool naattiValmiina = true; //->Ei naattispämmiä
17
18    public PeliUkko(double leveys, double korkeus) //double = desimaaliluku
19        : base(leveys, korkeus) //ottaa PeliUkon koon desimaaleina
20    {
21        Elamat = new IntMeter(50, 0, 100); //Default HP, Min HP, Max HP
22    }
23}
24public class FPS : PhysicsGame
25{
26
27    PeliUkko pelaaja1, pelaaja2, pelaaja3, pelaaja4; //määrittää pelaajat attribuuteiksi jotta niitä voi käyttää kaikissa aliohjelmissa
28    double ampumisnopeus = 450; //<-
29    ExplosionSystem NaattiPoks; //räjähdyksen partikkelit
30    IntMeter Pelaajat = new IntMeter(4); //Hengissä olevien pelaajien lukumäärä.
31    ExplosionSystem veri; //veripartikkelit
32    bool onkoPeliFullS = false; //fullscreen, 0 false, 1 true.
33    void ResetPelaajat() //resetoi pelaajien määrän neljään uuden pelin aloituksessa.
34    {
35        Pelaajat = new IntMeter(4);
36    }
37
38    /// <summary>
39    /// ylikirjoittaa oletus  PhysicsGame:n Begin metodin
40    /// </summary>
41    public override void Begin()
42    {
43        NaattiPoks = new ExplosionSystem(LoadImage("naattishard"), 1500); //määritetään räjähdyksen partikkelikuva ja niiden maximi määrä
44        Add(NaattiPoks); //lisätään räjähdys peliin (ei näkyviin, mutta niin että se on olemassa)
45        SetWindowSize(1024, 768, false); //false=ei Full, true = full
46        LuoKentta(); //kutsutaan kentänluonti
47        Veri(); //kutsutaan veripartikkelit
48
49        MediaPlayer.Play(RandomGen.SelectOne<string>("music\\M1","music\\M2", "music\\M3", "music\\M4", "music\\M5", "music\\M6", "music\\M7", "music\\M8"));
50        MediaPlayer.Volume = 0.5;
51
52        MessageDisplay.Add("F1 - Näytä Ohjaimet"); //lisätään viestilaatikkoon ohje.
53        Keyboard.Listen(Key.F1, ButtonState.Pressed, Ohjeet, "Näytä ohjaimet"); //Kutsutaan Ohjeet
54        Keyboard.Listen(Key.F11, ButtonState.Pressed, Fullscreen,null);
55        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
56    }
57
58    void Fullscreen()
59    {
60        if (onkoPeliFullS) // jos on koko ruutu
61        {
62            SetWindowSize(1024, 768, false); onkoPeliFullS = false;
63            return;
64        }
65        int w = Microsoft.Xna.Framework.Graphics.GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Width;
66        int h = Microsoft.Xna.Framework.Graphics.GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height;
67        SetWindowSize(w, h, true); onkoPeliFullS = true;
68    }
69    void Ohjeet()
70    {
71        MessageDisplay.Add("Pelaaja 1 - WASD - Q ampuminen - E Kranaatti");
72        MessageDisplay.Add("Pelaaja 2 - Nuolet - Numpad0 ampuminen - CTRL Kranaatti");
73        MessageDisplay.Add("Pelaaja 3 - TFGH - R ampuminen - Y Kranaatti");
74        MessageDisplay.Add("Pelaaja 4 - IJKL - U ampuminen - O Kranaatti");
75        MessageDisplay.Add("F11 -> Fullscreen/Windowed *BUGS ON 16:10*");
76    }
77    void LuoKentta()
78    {
79        TileMap ruudut = TileMap.FromLevelAsset("level"); //ladataan kenttä level.txt tiedostosta.
80        ruudut.SetTileMethod('=', LuoPalikka); //säädetään mitä mikäkin merkki tekstissä on pelissä
81        ruudut.SetTileMethod('s', LuoPalikka); //                                                 |
82        ruudut.SetTileMethod('1', LuoPelaaja1);//                                                 |
83        ruudut.SetTileMethod('2', LuoPelaaja2);//                                                 |
84        ruudut.SetTileMethod('3', LuoPelaaja3);//                                                 |
85        ruudut.SetTileMethod('4', LuoPelaaja4);//                                                 V
86        ruudut.Execute(25, 25); //Kutsutaan ruudut 25x25 kokoisina.
87
88        Level.Background.Image = LoadImage("bg"); //Määritetään taustakuva.
89        Camera.ZoomToLevel();
90    }
91    void LuoPalikka(Vector paikka, double leveys, double korkeus)
92    {
93        PhysicsObject palikka = PhysicsObject.CreateStaticObject(leveys, korkeus); //staattinen objekti->ei liiku.
94        palikka.Position = paikka;
95        palikka.Image = LoadImage("seinaTekstuuri");
96        palikka.Tag = "Seinä";
97        palikka.Restitution = 0; //kimmoisuus 0
98        palikka.Shape = Shape.Rectangle;
99        palikka.Color = Color.White;
100        Add(palikka);
101    }
102    void LuoPelaaja1(Vector paikka, double leveys, double korkeus)
103    {
104
105        pelaaja1 = LuoPelaaja(paikka);
106        pelaaja1.Image = LoadImage("Pelaaja1");
107        pelaaja1.CollisionIgnoreGroup = 1; //omat luodit eivät osu -> tämän pelaajan luodit ovat collisonignoregroup 1:ssä myös + kranaatit.
108
109        LuoHPNaytto(Screen.Left + 10, Screen.Top - 10, pelaaja1.Elamat, Color.Blue);
110
111        //Kontrollit:
112        Keyboard.Listen(Key.A, ButtonState.Down, Liike, null, pelaaja1, new Vector(-200, 0));
113        Keyboard.Listen(Key.A, ButtonState.Released, Liike, null, pelaaja1, new Vector(0, 0));
114        Keyboard.Listen(Key.D, ButtonState.Down, Liike, null, pelaaja1, new Vector(200, 0));
115        Keyboard.Listen(Key.D, ButtonState.Released, Liike, null, pelaaja1, new Vector(0, 0));
116        Keyboard.Listen(Key.S, ButtonState.Down, Liike, null, pelaaja1, new Vector(0, -200));
117        Keyboard.Listen(Key.S, ButtonState.Released, Liike, null, pelaaja1, new Vector(0, 0));
118        Keyboard.Listen(Key.W, ButtonState.Down, Liike, null, pelaaja1, new Vector(0, 200));
119        Keyboard.Listen(Key.W, ButtonState.Released, Liike, null, pelaaja1, new Vector(0, 0));
120        Keyboard.Listen(Key.Q, ButtonState.Down, Ammu, null, pelaaja1);
121        Keyboard.Listen(Key.E, ButtonState.Down, Heita, null, pelaaja1);
122    }
123    void LuoPelaaja2(Vector paikka, double leveys, double korkeus)
124    {
125
126        pelaaja2 = LuoPelaaja(paikka);
127        pelaaja2.Image = LoadImage("Pelaaja2");
128        pelaaja2.CollisionIgnoreGroup = 2;
129        LuoHPNaytto(Screen.Right - 10, Screen.Top - 10, pelaaja2.Elamat, Color.Yellow);
130
131
132        Keyboard.Listen(Key.Left, ButtonState.Down, Liike, null, pelaaja2, new Vector(-200, 0));
133        Keyboard.Listen(Key.Left, ButtonState.Released, Liike, null, pelaaja2, new Vector(0, 0));
134        Keyboard.Listen(Key.Right, ButtonState.Down, Liike, null, pelaaja2, new Vector(200, 0));
135        Keyboard.Listen(Key.Right, ButtonState.Released, Liike, null, pelaaja2, new Vector(0, 0));
136        Keyboard.Listen(Key.Down, ButtonState.Down, Liike, null, pelaaja2, new Vector(0, -200));
137        Keyboard.Listen(Key.Down, ButtonState.Released, Liike, null, pelaaja2, new Vector(0, 0));
138        Keyboard.Listen(Key.Up, ButtonState.Down, Liike, null, pelaaja2, new Vector(0, 200));
139        Keyboard.Listen(Key.Up, ButtonState.Released, Liike, null, pelaaja2, new Vector(0, 0));
140        Keyboard.Listen(Key.NumPad0, ButtonState.Down, Ammu, null, pelaaja2);
141        Keyboard.Listen(Key.RightControl, ButtonState.Down, Heita, null, pelaaja2);
142    }
143    void LuoPelaaja3(Vector paikka, double leveys, double korkeus)
144    {
145
146        pelaaja3 = LuoPelaaja(paikka);
147        pelaaja3.Image = LoadImage("Pelaaja3");
148        pelaaja3.CollisionIgnoreGroup = 3;
149        LuoHPNaytto(Screen.Right - 10, Screen.Bottom + 10, pelaaja3.Elamat, Color.Red);
150
151
152        Keyboard.Listen(Key.F, ButtonState.Down, Liike, null, pelaaja3, new Vector(-200, 0));
153        Keyboard.Listen(Key.F, ButtonState.Released, Liike, null, pelaaja3, new Vector(0, 0));
154        Keyboard.Listen(Key.H, ButtonState.Down, Liike, null, pelaaja3, new Vector(200, 0));
155        Keyboard.Listen(Key.H, ButtonState.Released, Liike, null, pelaaja3, new Vector(0, 0));
156        Keyboard.Listen(Key.G, ButtonState.Down, Liike, null, pelaaja3, new Vector(0, -200));
157        Keyboard.Listen(Key.G, ButtonState.Released, Liike, null, pelaaja3, new Vector(0, 0));
158        Keyboard.Listen(Key.T, ButtonState.Down, Liike, null, pelaaja3, new Vector(0, 200));
159        Keyboard.Listen(Key.T, ButtonState.Released, Liike, null, pelaaja3, new Vector(0, 0));
160        Keyboard.Listen(Key.R, ButtonState.Down, Ammu, null, pelaaja3);
161        Keyboard.Listen(Key.Y, ButtonState.Down, Heita, null, pelaaja3);
162    }
163    void LuoPelaaja4(Vector paikka, double leveys, double korkeus)
164    {
165
166        pelaaja4 = LuoPelaaja(paikka);
167        pelaaja4.Image = LoadImage("Pelaaja4");
168        pelaaja4.CollisionIgnoreGroup = 4;
169        LuoHPNaytto(Screen.Left + 10, Screen.Bottom + 10, pelaaja4.Elamat, Color.Purple);
170
171
172
173
174        Keyboard.Listen(Key.J, ButtonState.Down, Liike, null, pelaaja4, new Vector(-200, 0));
175        Keyboard.Listen(Key.J, ButtonState.Released, Liike, null, pelaaja4, new Vector(0, 0));
176        Keyboard.Listen(Key.L, ButtonState.Down, Liike, null, pelaaja4, new Vector(200, 0));
177        Keyboard.Listen(Key.L, ButtonState.Released, Liike, null, pelaaja4, new Vector(0, 0));
178        Keyboard.Listen(Key.K, ButtonState.Down, Liike, null, pelaaja4, new Vector(0, -200));
179        Keyboard.Listen(Key.K, ButtonState.Released, Liike, null, pelaaja4, new Vector(0, 0));
180        Keyboard.Listen(Key.I, ButtonState.Down, Liike, null, pelaaja4, new Vector(0, 200));
181        Keyboard.Listen(Key.I, ButtonState.Released, Liike, null, pelaaja4, new Vector(0, 0));
182        Keyboard.Listen(Key.U, ButtonState.Down, Ammu, null, pelaaja4);
183        Keyboard.Listen(Key.O, ButtonState.Down, Heita, null, pelaaja4);
184    }
185    PeliUkko LuoPelaaja(Vector paikka)
186    {
187        PeliUkko pelaaja = new PeliUkko(18, 18);
188        pelaaja.Restitution = 0;
189        pelaaja.AngularDamping = Double.Epsilon; //pelaaja ei pyöri törmätessään kulmiin, 0 ei toimi, joten Double.Epsilon on pienin mahdollinen luku.
190        pelaaja.Position = paikka; //Vector paikka -> katsoo ketä pelaajaa luodaan ja pistää sen sen pelaajan sijaintiin level.txt:ssä.
191        pelaaja.Shape = Shape.Circle; //pelaaja on pallo tekstuurin alla :P
192        Add(pelaaja);
193        AddCollisionHandler<PeliUkko, PhysicsObject>(pelaaja, "bullet", Osuma); //jos pelaajaan osuu luoti, kutsutaan osuma, joka vähentää pelaajan HP.
194
195        return pelaaja; //palautetaan luotu pelaaja LuoPelaajaX:lle
196
197    }
198    void KukaKuoli(PeliUkko ukko)
199    {
200        int PelaajanNumero = 1337; //noh, niin :D
201        Pelaajat.Value -= 1; //vähennetään yksi pelaajien lukumäärästä kun joku kuolee. Tämä siksi että peli tietää katsoa kuka on viimeinen hengissä ja ilmoittaa voitosta.
202        if (ukko == pelaaja1)
203        {
204            MessageDisplay.Add("Pelaaja 1 kuoli!"); //Jos ukko (tässä tapauksessa kuolija -> määritetty kuolintapahtumassa) on pelaaja 1, Se ilmoitetaan.
205        }
206        else if (ukko == pelaaja2)
207        {
208            MessageDisplay.Add("Pelaaja 2 kuoli!");
209        }
210        else if (ukko == pelaaja3)
211        {
212            MessageDisplay.Add("Pelaaja 3 kuoli!");
213        }
214        else if (ukko == pelaaja4)
215        {
216            MessageDisplay.Add("Pelaaja 4 kuoli!");
217        }
218        else MessageDisplay.Add("WTF?"); //älkää kysykö ;)
219
220        //jos pelaajia on 1 tai vähemmän...
221        if (Pelaajat.Value <= 1)
222        {
223            if (!pelaaja1.IsDestroyed) PelaajanNumero = 1;  //tarkistetaa onko pelaaja "EI" tuhottu->
224            else if (!pelaaja2.IsDestroyed) PelaajanNumero = 2; //else tarkistetaan onko se pelaaja 2.
225            else if (!pelaaja3.IsDestroyed) PelaajanNumero = 3;
226            else if (!pelaaja4.IsDestroyed) PelaajanNumero = 4;
227            Label Voitto = new Label("Pelaaja" + PelaajanNumero + "Voittaa!"); //teksti keskelle ruutua. "Pelaaja" + Sen pelaajan numero joka ei ollut tuhottu + "Voittaa!"
228            Voitto.TextColor = Color.Crimson;
229            Add(Voitto); //lisätään se viellä näytölle.
230            Timer.SingleShot(2.5, delegate { UusiPeli(); }); //ajastin ennenkuin promptataan uuden pelin alkua. delegate -> saadaan ns. aliohjelma ilman aliohjelmaa, yhdelle riville.
231
232        }
233    }
234    void UusiPeli()
235    {
236        MultiSelectWindow UusiPeli = new MultiSelectWindow("Pelataanko uusi peli?", "Kyllä", "Ei");
237        UusiPeli.ItemSelected += PainettiinValikonNappia; //mitä painettiin? Lisätään muuttujaan monesko nappi. 1 nappi = 0. 2 nappi on 1.
238        Add(UusiPeli);
239    }
240    void PainettiinValikonNappia(int valinta)
241    {
242        switch (valinta)
243        {
244            case 0: //Jos muuttuja oli 0, eli ensimmäinen nappi, aloitetaan uusi peli
245                ClearAll(); //puhdistetaan "melkein kaikki
246                ResetPelaajat(); //nollataan pelaajat takaisin neljään, koska muuten heitä olisi enään 1
247                Begin(); //aloitetaan peli
248                break;
249            case 1: //poistutaan jos toinen nappi.
250                Exit();
251                break;
252        }
253    }
254    void LuoHPNaytto(double x, double y, IntMeter sidottavaMittari, Color taustavari)
255    {
256        Label hp = new Label();
257        hp.Color = taustavari;
258        hp.BindTo(sidottavaMittari);
259        hp.Position = new Vector(x, y);
260        Add(hp);
261    }
262    void Osuma(PeliUkko tormaaja, PhysicsObject ammus)
263    {
264        tormaaja.Elamat.Value -= 3; //kun tormaaja (pelaaja) osuu luotiin, vähennetään 3hp.
265        if (tormaaja.Elamat.Value <= 0)
266        {
267            tormaaja.Destroy(); //jos hp 0 tai pienempi, tuhotaan pelaaja
268            KukaKuoli(tormaaja); //ja tarkistetaan kuka kuoli +ilmoitetaan siitä
269        }
270        veri.AddEffect(tormaaja.Position, 15); //osumasta lentää myös verta, pelaajan kohdalta.
271        ammus.Destroy(); //tuhotaan panos. (ei hylsyjä ;___;)
272    }
273    void Veri()
274    {
275        veri = new ExplosionSystem(LoadImage("blood"), 500); //luodaan veri "räjähdys" ja ladataan kuva, säädetään maksimi määrä partikkeleita(verta)
276        veri.MaxScale = 1.5;
277        veri.MaxLifetime = 0.4; //ei veri lennä liian kauas.
278        veri.MaxVelocity = 0.8; //eikä liian nopeaa ettei se ehdi liian kauas.
279        Add(veri); //lisätään se.
280
281    }
282    void Ammu(PeliUkko pelaaja)
283    {
284        if (pelaaja.IsDestroyed) return; //Ei kuolleet saa ampua!
285        if (pelaaja.aseValmiina) //jos aseella ei ole cd menossa
286        {
287            PhysicsObject bullet = new PhysicsObject(LoadImage("bullet"));
288            Add(bullet);
289            bullet.Tag = "bullet";
290            bullet.Restitution = 0; //eipä kimpoile luoti, bugien varalta tämä tässä, ei mitään järkevää syytä ottaa poiskaan.
291            AddCollisionHandler(bullet, "Seinä", CollisionHandler.DestroyObject); //luoti katoaa maagisesti seinään osuessaan.
292            bullet.Position = pelaaja.Position;
293            bullet.Angle = pelaaja.Angle; //luoti lähtee pelaajan katsomaaan suuntaan.
294            bullet.CollisionIgnoreGroup = pelaaja.CollisionIgnoreGroup; //pistetään luoti samaan collision ignoreen kuin sen ampunut pelaaja, ettei ammuta itseään.
295            Vector suunta = Vector.FromLengthAndAngle(ampumisnopeus, pelaaja.Angle + Angle.RightAngle); //käännellään luotia viellä että sen tekstuurikin on oikenpäin.
296            bullet.Hit(suunta); //tökkäistään luoti liikkeelle.
297            SoundEffect pistolshot = LoadSoundEffect("pistol1"); //mahtava ääni!!
298            pistolshot.Play(); //aivan uskomaton ;D
299            pelaaja.aseValmiina = false; //pistetään cd käyntiin
300            Timer.SingleShot(0.4, delegate { pelaaja.aseValmiina = true; }); //poistetaan cd
301        }
302    }
303    void Heita(PeliUkko pelaaja)
304    {
305        if (pelaaja.IsDestroyed) return;
306        if (pelaaja.naattiValmiina) //jos ei ole naatti cd active.
307        {
308            PhysicsObject naatti = new PhysicsObject(LoadImage("naatti"));
309            Add(naatti);
310            naatti.Tag = "naatti";
311            naatti.Restitution = 0.8; //naatti saa kimpoilla vähän
312            naatti.Position = pelaaja.Position;
313            naatti.Angle = pelaaja.Angle;
314            naatti.CollisionIgnoreGroup = pelaaja.CollisionIgnoreGroup;
315            Vector suunta = Vector.FromLengthAndAngle(ampumisnopeus, pelaaja.Angle + Angle.RightAngle);
316            naatti.Hit(suunta);
317            SoundEffect naattiheitto = LoadSoundEffect("Naattiheitto");
318            naattiheitto.Play();
319            pelaaja.naattiValmiina = false;
320            Timer.SingleShot(1.5, delegate { KranaattiRajahti(naatti.X, naatti.Y, 375); naatti.Destroy(); }); //räjähdys<-aika heitosta
321            Timer.SingleShot(8, delegate { pelaaja.naattiValmiina = true; });
322        }
323
324    }
325    void KranaattiRajahti(double x, double y, int numberOfParticles)
326    {
327        NaattiPoks.X = x; //pistetään räjähdysefetki naatin sijaintiin
328        NaattiPoks.Y = y; 
329        NaattiPoks.MinScale = 1; //partikkeleiden min/max koot
330        NaattiPoks.MaxScale = 10;
331        NaattiPoks.AddEffect(x, y, numberOfParticles);
332        Explosion e = new Explosion(65); //pakko käyttää myös tätä koska ExplosionSystemistä ei saa paineaaltoa.
333        Add(e);
334        e.Position = new Vector(x, y);
335
336        //IPhysicsObject = Kohde johon paineaalto osuu. vektori suuntaa ei tarvita missään, mutta se on silti pakollinen. sitten kutsutaan shockhit näillä arvoilla.
337        e.ShockwaveReachesObject += delegate(IPhysicsObject kohde, Vector suunta) { ShockHit(kohde, suunta, e); }; 
338    }
339    void ShockHit(IPhysicsObject kohde, Vector suunta, Explosion rajahdys)
340    {
341        if (!(kohde is PeliUkko)) return; //jos paineaalto osuu johonkin muuhun kuin pelaajaan, poistutaan.
342        PeliUkko ukko = kohde as PeliUkko; //jos kohde oli pelaajaluokkaa, jatketaan.
343        if (ukko.ViimeisinRajahdys == rajahdys) return; //tarkistetaan että tämä paineealto ei ole osunut ukkoon juuri äsken. Peli bugasi niin että paineaalto osu monta kertaa.
344
345        double etaisyys = Vector.Distance(ukko.Position, rajahdys.Position); //katsotaan kuinka kaukana pelaaja on räjähdyksen keskipisteestä. Pistetään tämä desimaalilukuna muutujaan
346        ukko.Elamat.Value -= (int)Math.Floor(1500 / etaisyys); //pyöristetään etäisyys kokonaislukuihin, int ei ota desimaaleja. Base dmg räjähdyksestä 1500. se jaetaan etäisyydellä.
347        if (ukko.Elamat.Value <= 0)
348        {
349            ukko.Destroy();
350            KukaKuoli(ukko);
351        }
352        ukko.ViimeisinRajahdys = rajahdys; //pistetään viimeisin räjähdys olemaan juuri tämä räjähdys (paineaalto)
353    }
354    void Liike(PeliUkko pelaaja, Vector nopeus)
355    {
356        pelaaja.Velocity = nopeus; //nopeus=tässä käytetään osoittamaan pelaajan liikkumissuuntaa, joten pelaajan tekstuuri kääntyy liikesuuntaan.
357        if (nopeus.Magnitude != 0) //jos pelaaja ei liiku
358        {
359            pelaaja.Angle = nopeus.Angle - Angle.RightAngle; //ei käännetä pelaajaa takaisin oletussuuntaan.
360        }
361    }
362}
Note: See TracBrowser for help on using the repository browser.