source: 2014/30/MitjaK/Attack to Agora/Attack to Agora/Attack to Agora/Attack to Agora/Attack_to_Agora.cs @ 6358

Revision 6358, 16.4 KB checked in by anlakane, 6 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8using Microsoft.Xna.Framework.Content;
9
10public partial class Attack_to_Agora : PhysicsGame
11{
12    private Animation chuckinkavely;
13    private Animation vihollisenkavely;
14
15    /// <summary>
16    /// Vakiot kannattaa merkitä constiksi (ei voi muuttaa). Tällöin ne kirjoitetaan isolla.
17    /// </summary>
18    const double NOPEUS = 1000; // 250
19    const double HYPPYVOIMA = 1500;
20
21    Image level1 = LoadImage("kentta1");
22    Image taistelijanvarjo = LoadImage("varjo");
23    Image taistelijaOlio = LoadImage("olio");
24    Image cCaseD = LoadImage("laatikko_opening");
25    Image cCaseF = LoadImage("caseavausruutu");
26    Image tormaavavihollinen = LoadImage("ajlauta");
27
28    Image ePalkkiTyhja = LoadImage("healthbarempty");
29    Image ePalkkiTaysi = LoadImage("healthbarfull");
30
31    Image valveAlku = LoadImage("peliaukeaa1");
32    Image ajAlku = LoadImage("peliaukeaa2");
33    private bool stSequenceSkipped = false;
34
35    Elava taistelija;
36    AssaultRifle taistelijanAse;
37    const double ASEEN_DMG = 25.0;
38    const double WEAPON_INACCURACY = 20.0;
39    bool walkBackwards = false;
40
41    int kenttaNro = 1;
42
43    /// <summary>
44    /// Viimeisen pelissä olevan kentän indeksi.
45    /// </summary>
46    const int VIIMEINEN_KENTTA = 18;
47
48    public override void Begin()
49    {
50        vihollisenkavely = LoadAnimation("asemiesliikkuu");
51        LataaContent();
52        AloitusAnimaatio();
53    }
54
55    void AloitaPeli()
56    {
57        ClearAll();
58        LuoKentta();
59        AsetaOhjaimet();
60        KirkastaRuutua(0.03, 1.0);
61        ensimmainentehtava.Play();
62        Timer.SingleShot(4.0, delegate { taustamusiikki_1.Play(); });
63
64    }
65
66
67    protected override void Update(Time time)
68    {
69        if (taistelija != null && taistelijanAse != null)
70        {
71            if (!walkBackwards)
72            {
73                if (taistelija.Velocity.X < 0)
74                    taistelijanAse.Angle = Angle.FromDegrees(180.0);
75                if (taistelija.Velocity.X > 0)
76                    taistelijanAse.Angle = Angle.FromDegrees(0.0);
77            }
78        }
79        base.Update(time);
80    }
81
82    /// <summary>
83    /// Pimennetään ruutua pikku hiljaa.
84    /// Oletusnopeus 0.01.
85    /// </summary>
86    public void PimennaRuutua(double nopeus)
87    {
88        Timer ajastin = new Timer();
89        ajastin.Interval = 0.1;
90        ajastin.Timeout += delegate
91        {
92            Level.AmbientLight -= nopeus;
93            if (Level.AmbientLight <= 0.0)
94            {
95                ajastin.Stop();
96                ajastin.Reset();
97            }
98        };
99        ajastin.Start();
100    }
101
102    /// <summary>
103    /// Pimennetään ruutua pikku hiljaa.
104    /// Oletusnopeus 0.01.
105    /// </summary>
106    public void PimennaRuutua(double nopeus, Action onFinished)
107    {
108        Timer ajastin = new Timer();
109        ajastin.Interval = 0.1;
110        ajastin.Timeout += delegate
111        {
112            Level.AmbientLight -= nopeus;
113            if (Level.AmbientLight <= 0.0)
114            {
115                ajastin.Stop();
116                ajastin.Reset();
117                if (onFinished != null)
118                    onFinished();
119            }
120        };
121        ajastin.Start();
122    }
123
124    /// <summary>
125    /// Kirkastetaan ruutua pikku hiljaa.
126    /// </summary>
127    public void KirkastaRuutua(double nopeus, double tavoite)
128    {
129        Timer ajastin = new Timer();
130        ajastin.Interval = 0.1;
131        ajastin.Timeout += delegate
132        {
133            //if (Level.AmbientLight > 0.1) return;
134            Level.AmbientLight += nopeus;
135            if (Level.AmbientLight > tavoite)
136            {
137                ajastin.Stop();
138                ajastin.Reset();
139            }
140        };
141        ajastin.Start();
142    }
143
144    /// <summary>
145    /// Kirkastetaan ruutua pikku hiljaa.
146    /// </summary>
147    public void KirkastaRuutua(double nopeus, double tavoite, Action onFinished)
148    {
149        Timer ajastin = new Timer();
150        ajastin.Interval = 0.1;
151        ajastin.Timeout += delegate
152        {
153            //if (Level.AmbientLight > 0.1) return;
154            Level.AmbientLight += nopeus;
155            if (Level.AmbientLight > tavoite)
156            {
157                ajastin.Stop();
158                ajastin.Reset();
159                if (onFinished != null)
160                    onFinished();
161            }
162        };
163        ajastin.Start();
164    }
165
166
167    /// <summary>
168    /// Piirretään valojuovia.
169    /// </summary>
170    /// <param name="position">Valojuovan tämänhetkinen sijainti.</param>
171    /// <param name="color">Valojuovan väri.</param>
172    /// <param name="lifetimeInSeconds">Kauanko valojuova pysyy kentällä.</param>
173    void DrawTracers(Vector position, Color color, double lifetimeInSeconds, double brightnessFactor)
174    {
175        color.AlphaComponent = (byte)(32 * brightnessFactor); // 64 toimii
176        GameObject tracer = new GameObject(2, 2);
177        tracer.Shape = Shape.Circle;
178        tracer.Color = color;
179        tracer.Position = position;
180        tracer.MaximumLifetime = TimeSpan.FromSeconds(lifetimeInSeconds);
181        Add(tracer);
182    }
183    /// <summary>
184    /// Piirretään valojuovia.
185    /// </summary>
186    /// <param name="tracingObject">Olio, josta valojuovat tulevat.</param>
187    /// <param name="color">Valojuovan väri.</param>
188    /// <param name="lifetimeInSeconds">Kauanko valojuova pysyy kentällä.</param>
189    /// <param name="brightnessFactor">Valojuovan kirkkaus.</param>
190    void DrawTracers(PhysicsObject tracingObject, Color color, double lifetimeInSeconds, double brightnessFactor)
191    {
192        color.AlphaComponent = (byte)(32 * brightnessFactor); // 64 toimii
193        GameObject tracer = new GameObject(90, 2);
194        tracer.Shape = Shape.Circle;
195        tracer.Color = color;
196        tracer.Position = tracingObject.Position;
197        tracer.Angle = tracingObject.Angle;
198        tracer.MaximumLifetime = TimeSpan.FromSeconds(lifetimeInSeconds);
199        Add(tracer);
200    }
201
202    void AloitusAnimaatio()
203    {
204        Level.Background.Color = Color.Black;
205        Level.AmbientLight = 0.0;
206        GameObject tausta = new GameObject(ajAlku);
207        Add(tausta);
208        KirkastaRuutua(0.05, 1.0);
209        H2Oopening.Play();
210        Keyboard.Listen(Key.Escape, ButtonState.Pressed, delegate {
211            stSequenceSkipped = true;
212            H2Oopening.Stop();
213            AloitaPeli();
214        }, null);
215
216
217        Timer.SingleShot(7.0, delegate {
218            if (!stSequenceSkipped)
219            {
220                PimennaRuutua(0.1, delegate
221                {
222                    if (!stSequenceSkipped)
223                        AloitaPeli();
224                });
225            }
226        });
227    }
228
229
230    void Liikuta(PlatformCharacter pelaaja, double suunta)
231    {
232        pelaaja.Walk(suunta);
233
234        if (!pelaaja.Animation.IsPlaying)
235            pelaaja.Animation.Resume();
236    }
237
238    void LiikutaYlos(PlatformCharacter pelaaja)
239    {
240        pelaaja.Jump(HYPPYVOIMA);
241        pelaaja.Tag = "hyppy";
242        Sound pelaajaHyppyAani = hyppy.CreateSound();
243        pelaajaHyppyAani.Pitch = 0.1;
244        Timer.SingleShot(0.1, delegate { pelaajaHyppyAani.Play(); });
245   
246    }
247
248    void LataaContent()
249    {
250        chuckinkavely = LoadAnimation("pelaaja_anim");
251    }
252
253    void LuoKentta()
254    {
255        SmoothTextures = false;
256        // IsFullScreen = true;
257        Gravity = new Vector(0, -2500);
258        // Synkataan taustakuvan ja colortilemapin pikselit
259        Level.Background.Image = LoadImage("kentta" + kenttaNro.ToString());
260
261        Level.Width = Screen.Width;
262        double kerroin = (double)Level.Background.Image.Width / Level.Background.Image.Height;
263        Level.Height = Level.Width / kerroin;
264        Level.Background.FitToLevel();
265
266        Image pohjaLevynKuva = LoadImage("kentta" + kenttaNro.ToString() + "pohja");
267
268        ColorTileMap pohjaLevy = new ColorTileMap(pohjaLevynKuva);
269        pohjaLevy.SetTileMethod(Color.Gold, LuoPohja);
270        pohjaLevy.SetTileMethod(Color.Cyan, Luotaistelija);
271        pohjaLevy.SetTileMethod(Color.DarkGray, LuoTormaavaVihollinen);
272        pohjaLevy.SetTileMethod(Color.Gray, LuoAmpuvaVihollinen);
273        pohjaLevy.Optimize(Color.Gold);
274
275        // oletuksena 1 pikseli = 1 unit
276        const double BASE_SIZE = 1.0;
277        double widthMultiplier = Level.Width / pohjaLevynKuva.Width;
278        double heightMultiplier = Level.Height / pohjaLevynKuva.Height;
279        pohjaLevy.Execute(BASE_SIZE * widthMultiplier, BASE_SIZE * heightMultiplier);
280
281        // PhysicsObject pohja = Level.CreateBottomBorder();
282        // pohja.Y = Level.Bottom + 100;
283        //pohja.IsVisible = false;
284        PhysicsObject vasenreuna = Level.CreateLeftBorder();
285        vasenreuna.X -= 75;
286        vasenreuna.Tag = "vasenreuna";
287        PhysicsObject oikeareuna = Level.CreateRightBorder();
288        oikeareuna.Tag = "oikeareuna";
289
290        Varjo(taistelija);
291        TeeKenttaKohtaisetAsiat(kenttaNro);
292    }
293
294    void Luotaistelija(Vector paikka, double leveys, double korkeus)
295    {
296
297        taistelija = new Elava(150, 150, 100.0);
298        taistelija.Shape = Shape.Rectangle;
299        taistelija.Animation = new Animation(chuckinkavely);
300        taistelija.Animation.Start();
301        taistelija.Position = paikka;
302        taistelija.Kuoli += PelaajaKuoli;
303
304        AddCollisionHandler(taistelija, "vasenreuna", SeuraavaKentta);
305
306        taistelija.Mass = 10.0;
307        Add(taistelija);
308        Camera.Follow(taistelija);
309        Camera.StayInLevel = true;
310
311        taistelijanAse = new AssaultRifle(20, 10);
312        taistelijanAse.FireRate = 20;
313        taistelijanAse.InfiniteAmmo = true;
314        taistelijanAse.Power.Value = 750;
315        taistelijanAse.Power.DefaultValue = 750;
316        taistelijanAse.AttackSound = ampuminen;
317        taistelija.Add(taistelijanAse);
318
319        LuoElamaPalkki();
320    }
321
322    void LuoElamaPalkki()
323    {
324        ProgressBar elamat = new ProgressBar(532 / 1.5, 49 / 1.5);
325        elamat.BindTo(taistelija.Elamat);
326        elamat.Left = Screen.Left + 40;
327        elamat.Top = Screen.Top - 40;
328        elamat.Image = ePalkkiTyhja;
329        elamat.BarImage = ePalkkiTaysi;
330        Add(elamat);
331    }
332
333    GameObject Varjo(GameObject shadowCaster)
334    {
335        GameObject varjo = new GameObject(70, 30);
336        varjo.Image = taistelijanvarjo;
337        Add(varjo, -1);
338
339        Timer ajastin = new Timer();
340        ajastin.Interval = 1.0 / 60.0;
341        ajastin.Timeout += delegate
342        {
343            varjo.X = shadowCaster.X;
344            varjo.Y = EtsiVarjonY(shadowCaster);
345        };
346        ajastin.Start();
347
348        return varjo;
349    }
350
351    /// <summary>
352    /// Etsii suoraan pelaajan alla olevan lattiapalikan Y-koordinaatin.
353    /// </summary>
354    /// <returns></returns>
355    double EtsiVarjonY(GameObject shadowCaster)
356    {
357        Vector rayDown = new Vector(0.0, -2000.0);
358        List<GameObject> possibleObjects = GetObjects(x => x != shadowCaster && x is PhysicsObject);
359        List<GameObject> objectsBelow = new List<GameObject>();
360
361        for (int i = 0; i < possibleObjects.Count; i++)
362        {
363            if (possibleObjects[i].IsBlocking(new Vector(shadowCaster.X, shadowCaster.Bottom), new Vector(shadowCaster.X, shadowCaster.Bottom) + rayDown))
364            {
365                objectsBelow.Add(possibleObjects[i]);
366            }
367        }
368
369        if (objectsBelow.Count == 0)
370            return double.MinValue;
371
372        double minDistance = double.MaxValue;
373        int minIndex = -1;
374
375        for (int i = 0; i < objectsBelow.Count; i++)
376        {
377            double currentDistance = Math.Abs(shadowCaster.Bottom - objectsBelow[i].Top);
378            if (currentDistance < minDistance)
379            {
380                minDistance = currentDistance;
381                minIndex = i;
382            }
383        }
384
385        return objectsBelow[minIndex].Top;
386    }
387
388
389    void SeuraavaKentta(PhysicsObject tormaaja, PhysicsObject tormatty)
390    {
391        ClearAll();
392        kenttaNro++;
393
394        if (kenttaNro > VIIMEINEN_KENTTA)
395        {
396            VoititPelin();
397        }
398
399        else
400        {
401            LuoKentta();
402            AsetaOhjaimet();
403        }
404    }
405
406    void TeeKenttaKohtaisetAsiat(int kentta)
407    {
408        switch (kentta)
409        {
410            case 18:
411                taistelija.Size *= 0.5;
412                break;
413            default:
414                break;
415        }
416    }
417
418    void LuoPohja(Vector paikka, double leveys, double korkeus)
419    {
420        PhysicsObject pala = PhysicsObject.CreateStaticObject(leveys, korkeus);
421        pala.Position = paikka;
422        pala.IsVisible = false;
423        Add(pala);
424    }
425
426    void LuoChromaCase()
427    {
428        Mouse.IsCursorVisible = true;
429
430        List<GameObject> pItems = new List<GameObject>();
431        GameObject knife = new GameObject(LoadImage("rareitem_knife"));
432        knife.Tag = new object[2] {(object)50.0, (object)ItemType.Knife};
433        pItems.Add(knife);
434
435        GameObject avain = new GameObject(LoadImage("rareitem_avain_small"));
436        avain.Tag = new object[2] { (object)50.0, (object)ItemType.Key };
437        pItems.Add(avain);
438       
439
440        //for (int i = 0; i < 40; i++)
441        //{
442        //    GameObject obj = new GameObject(50, 50);
443        //    obj.Color = RandomGen.NextColor();
444        //    obj.Tag = 50.0;
445        //    pItems.Add(obj);
446        //}
447
448        GameObject cCaseDialog = new GameObject(cCaseD); // koko debug
449        Add(cCaseDialog);
450
451        Mouse.ListenOn(cCaseDialog, MouseButton.Left, ButtonState.Pressed, delegate
452        {
453            cCaseDialog.Destroy();
454
455            GameObject cCaseFront = new GameObject(cCaseF);
456
457            ChromaCase cCase = new ChromaCase(pItems, cCaseFront, null, 20);
458            cCase.Add(new Vector(0.0, Level.Bottom + cCaseFront.Height / 2), 2);
459            cCase.ItemReceived += delegate(GameObject o) { GotItemFromCase(o); };
460            cCase.ItemRelativePosition = new Vector((472 - 467.5), (455 - 204));
461            cCase.Start();
462
463        }, null);
464    }
465
466    void GotItemFromCase(GameObject o)
467    {
468        ItemType gotType = (ItemType)((object[])o.Tag)[0];
469
470        switch (gotType)
471        {
472            case ItemType.Knife:
473                break;
474            case ItemType.Key:
475                break;
476            default:
477                break;
478        }
479    }
480
481    /// <summary>
482    /// Asetetaan pelaajalle ohjaimet.
483    /// </summary>
484    void AsetaOhjaimet()
485    {
486        Keyboard.Listen(Key.A, ButtonState.Down, Liikuta, null, taistelija, -NOPEUS);
487        Keyboard.Listen(Key.D, ButtonState.Down, Liikuta, null, taistelija, NOPEUS);
488        Keyboard.Listen(Key.W, ButtonState.Pressed, LiikutaYlos, null, taistelija);
489        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
490        Keyboard.Listen(Key.Space, ButtonState.Down, Ammu, null);
491        Keyboard.Listen(Key.LeftShift, ButtonState.Pressed, delegate { walkBackwards = true; }, null);
492        Keyboard.Listen(Key.LeftShift, ButtonState.Released, delegate { walkBackwards = false; }, null);
493
494#if DEBUG
495        Keyboard.Listen(Key.C, ButtonState.Pressed, LuoChromaCase, null);
496#endif
497    }
498
499    void Ammu()
500    {
501        if (taistelijanAse == null) 
502            return;
503
504        PhysicsObject ammus = taistelijanAse.Shoot();
505
506        if (ammus == null) 
507            return;
508        ammus.Size *= 0.2;
509
510        ammus.Hit(new Vector(0.0, RandomGen.NextDouble(-WEAPON_INACCURACY, WEAPON_INACCURACY)));
511        ammus.IsUpdated = true;
512        ammus.NeedsUpdateCall = true;
513        ammus.CanRotate = false;
514        ammus.Updated += delegate(PhysicsObject a) 
515        { 
516             DrawTracers(a, Color.Yellow, 0.2, 2.0); 
517        };
518
519        AddCollisionHandler(ammus, "vihollinen", AmmusOsuuViholliseen);
520        AddCollisionHandler<PhysicsObject, PhysicsObject>(ammus, delegate(PhysicsObject a, PhysicsObject k) { ammus.Destroy(); });
521    }
522
523    void AmmusOsuuViholliseen(PhysicsObject ammus, PhysicsObject kohde)
524    {
525        Elava vihu = kohde as Elava;
526
527        if (vihu == null) return;
528
529        vihu.Damagea(ASEEN_DMG);
530    }
531
532    void PelaajaKuoli()
533    {
534
535    }
536
537    void VoititPelin()
538    {
539
540    }
541}
Note: See TracBrowser for help on using the repository browser.