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

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