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

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