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

Revision 2858, 18.7 KB checked in by jijoback, 10 years ago (diff)

FullSCreen käyttää nyt käytössä olevaa resoa

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