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

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