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

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