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

Revision 2897, 19.1 KB checked in by jijoback, 11 years ago (diff)

Parannuksia FUllScreeniin.. Bugaa vielläkin hieman.

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