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

Revision 6365, 16.8 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    const double VIHOLLISEN_TORMAYSDMG = 25.0;
42    int kenttaNro = 1;
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
298        taistelija = new Elava(150, 150, 100.0);
299        taistelija.Shape = Shape.Rectangle;
300        taistelija.Animation = new Animation(chuckinkavely);
301        taistelija.Animation.Start();
302        taistelija.Position = paikka;
303        taistelija.Kuoli += PelaajaKuoli;
304
305        AddCollisionHandler(taistelija, "vasenreuna", SeuraavaKentta);
306        AddCollisionHandler<PhysicsObject, PhysicsObject>(taistelija, "vihollinen", delegate {
307            taistelija.Damagea(VIHOLLISEN_TORMAYSDMG);
308        });
309
310        taistelija.Mass = 10.0;
311        Add(taistelija);
312        Camera.Follow(taistelija);
313        Camera.StayInLevel = true;
314
315        taistelijanAse = new AssaultRifle(20, 10);
316        taistelijanAse.FireRate = 20;
317        taistelijanAse.InfiniteAmmo = true;
318        taistelijanAse.Power.Value = 750;
319        taistelijanAse.Power.DefaultValue = 750;
320        taistelijanAse.AttackSound = ampuminen;
321        taistelija.Add(taistelijanAse);
322
323        LuoElamaPalkki();
324    }
325
326    void LuoElamaPalkki()
327    {
328        ProgressBar elamat = new ProgressBar(532 / 1.5, 49 / 1.5);
329        elamat.BindTo(taistelija.Elamat);
330        elamat.Left = Screen.Left + 40;
331        elamat.Top = Screen.Top - 40;
332        elamat.Image = ePalkkiTyhja;
333        elamat.BarImage = ePalkkiTaysi;
334        Add(elamat);
335    }
336
337    GameObject Varjo(GameObject shadowCaster)
338    {
339        GameObject varjo = new GameObject(70, 30);
340        varjo.Image = taistelijanvarjo;
341        Add(varjo, -1);
342
343        Timer ajastin = new Timer();
344        ajastin.Interval = 1.0 / 60.0;
345        ajastin.Timeout += delegate
346        {
347            varjo.X = shadowCaster.X;
348            varjo.Y = EtsiVarjonY(shadowCaster);
349        };
350        ajastin.Start();
351
352        return varjo;
353    }
354
355    /// <summary>
356    /// Etsii suoraan pelaajan alla olevan lattiapalikan Y-koordinaatin.
357    /// </summary>
358    /// <returns></returns>
359    double EtsiVarjonY(GameObject shadowCaster)
360    {
361        Vector rayDown = new Vector(0.0, -2000.0);
362        List<GameObject> possibleObjects = GetObjects(x => x != shadowCaster && x is PhysicsObject);
363        List<GameObject> objectsBelow = new List<GameObject>();
364
365        for (int i = 0; i < possibleObjects.Count; i++)
366        {
367            if (possibleObjects[i].IsBlocking(new Vector(shadowCaster.X, shadowCaster.Bottom), new Vector(shadowCaster.X, shadowCaster.Bottom) + rayDown))
368            {
369                objectsBelow.Add(possibleObjects[i]);
370            }
371        }
372
373        if (objectsBelow.Count == 0)
374            return double.MinValue;
375
376        double minDistance = double.MaxValue;
377        int minIndex = -1;
378
379        for (int i = 0; i < objectsBelow.Count; i++)
380        {
381            double currentDistance = Math.Abs(shadowCaster.Bottom - objectsBelow[i].Top);
382            if (currentDistance < minDistance)
383            {
384                minDistance = currentDistance;
385                minIndex = i;
386            }
387        }
388
389        return objectsBelow[minIndex].Top;
390    }
391
392
393    void SeuraavaKentta(PhysicsObject tormaaja, PhysicsObject tormatty)
394    {
395        ClearAll();
396        kenttaNro++;
397
398        if (kenttaNro > VIIMEINEN_KENTTA)
399        {
400            VoititPelin();
401        }
402
403        else
404        {
405            LuoKentta();
406            AsetaOhjaimet();
407        }
408    }
409
410    void TeeKenttaKohtaisetAsiat(int kentta)
411    {
412        switch (kentta)
413        {
414            case 18:
415                taistelija.Size *= 0.5;
416                break;
417            default:
418                break;
419        }
420    }
421
422    void LuoPohja(Vector paikka, double leveys, double korkeus)
423    {
424        PhysicsObject pala = PhysicsObject.CreateStaticObject(leveys, korkeus);
425        pala.Position = paikka;
426        pala.IsVisible = false;
427        Add(pala);
428    }
429
430    void LuoChromaCase()
431    {
432        Mouse.IsCursorVisible = true;
433
434        List<GameObject> pItems = new List<GameObject>();
435        GameObject knife = new GameObject(LoadImage("rareitem_knife"));
436        knife.Tag = new object[2] {(object)50.0, (object)ItemType.Knife};
437        pItems.Add(knife);
438
439        GameObject avain = new GameObject(LoadImage("rareitem_avain_small"));
440        avain.Tag = new object[2] { (object)50.0, (object)ItemType.Key };
441        pItems.Add(avain);
442       
443
444        //for (int i = 0; i < 40; i++)
445        //{
446        //    GameObject obj = new GameObject(50, 50);
447        //    obj.Color = RandomGen.NextColor();
448        //    obj.Tag = 50.0;
449        //    pItems.Add(obj);
450        //}
451
452        GameObject cCaseDialog = new GameObject(cCaseD); // koko debug
453        Add(cCaseDialog);
454
455        Mouse.ListenOn(cCaseDialog, MouseButton.Left, ButtonState.Pressed, delegate
456        {
457            cCaseDialog.Destroy();
458
459            GameObject cCaseFront = new GameObject(cCaseF);
460
461            ChromaCase cCase = new ChromaCase(pItems, cCaseFront, null, 20);
462            cCase.Add(new Vector(0.0, Level.Bottom + cCaseFront.Height / 2), 2);
463            cCase.ItemReceived += delegate(GameObject o) { GotItemFromCase(o); };
464            cCase.ItemRelativePosition = new Vector((472 - 467.5), (455 - 204));
465            cCase.Start();
466
467        }, null);
468    }
469
470    void GotItemFromCase(GameObject o)
471    {
472        ItemType gotType = (ItemType)((object[])o.Tag)[0];
473
474        switch (gotType)
475        {
476            case ItemType.Knife:
477                break;
478            case ItemType.Key:
479                break;
480            default:
481                break;
482        }
483    }
484
485    /// <summary>
486    /// Asetetaan pelaajalle ohjaimet.
487    /// </summary>
488    void AsetaOhjaimet()
489    {
490        Keyboard.Listen(Key.A, ButtonState.Down, Liikuta, null, taistelija, -NOPEUS);
491        Keyboard.Listen(Key.D, ButtonState.Down, Liikuta, null, taistelija, NOPEUS);
492        Keyboard.Listen(Key.W, ButtonState.Pressed, LiikutaYlos, null, taistelija);
493        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
494        Keyboard.Listen(Key.Space, ButtonState.Down, Ammu, null);
495        Keyboard.Listen(Key.LeftShift, ButtonState.Pressed, delegate { walkBackwards = true; }, null);
496        Keyboard.Listen(Key.LeftShift, ButtonState.Released, delegate { walkBackwards = false; }, null);
497
498#if DEBUG
499        Keyboard.Listen(Key.C, ButtonState.Pressed, LuoChromaCase, null);
500#endif
501    }
502
503    void Ammu()
504    {
505        if (taistelijanAse == null) 
506            return;
507
508        PhysicsObject ammus = taistelijanAse.Shoot();
509
510        if (ammus == null) 
511            return;
512        ammus.Size *= 0.2;
513
514        ammus.Hit(new Vector(0.0, RandomGen.NextDouble(-WEAPON_INACCURACY, WEAPON_INACCURACY)));
515        ammus.IsUpdated = true;
516        ammus.NeedsUpdateCall = true;
517        ammus.CanRotate = false;
518        ammus.Updated += delegate(PhysicsObject a) 
519        { 
520             DrawTracers(a, Color.Yellow, 0.2, 2.0); 
521        };
522
523        AddCollisionHandler(ammus, "vihollinen", AmmusOsuuViholliseen);
524        AddCollisionHandler<PhysicsObject, PhysicsObject>(ammus, delegate(PhysicsObject a, PhysicsObject k) { ammus.Destroy(); });
525    }
526
527    void AmmusOsuuViholliseen(PhysicsObject ammus, PhysicsObject kohde)
528    {
529        Elava vihu = kohde as Elava;
530
531        if (vihu == null) return;
532
533        vihu.Damagea(ASEEN_DMG);
534    }
535
536    void PelaajaKuoli()
537    {
538        kenttaNro -= kenttaNro % 3; // 3 kentän välein checkpoint
539
540        if (kenttaNro < 1)
541            kenttaNro = 1;
542
543        ClearAll();
544        LuoKentta();
545        AsetaOhjaimet();
546    }
547
548    void VoititPelin()
549    {
550
551    }
552}
Note: See TracBrowser for help on using the repository browser.