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

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