source: 2013/anlakane/Tiernapojat/Tiernapojat/Tiernapojat/Tiernapojat.cs @ 4811

Revision 4811, 16.2 KB checked in by vesal, 7 years ago (diff)

Murjaani

Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8
9
10
11public class Tiernapojat : PhysicsGame
12{
13
14    private static readonly string[] taso0 = {
15"                   *    ",
16"      *                 ",
17"   *     *     *        ",
18" *        *   *         ",
19"                        ",
20"                        ",
21"                        ",
22"                        ",
23"        *               ",
24"      *  *    *         ",
25"                        ",
26"                        ",
27"                        ",
28"                        ",
29"#                       ",
30"   H    M      K      N ",
31"=                       ",
32                                             };
33
34
35    const double nopeus = 200;
36    const double hyppyNopeus = 750;
37    const int RUUDUN_KOKO = 40;
38
39    private List<Tiernapoika> pojat = new List<Tiernapoika>();
40
41    private Image pelaajanKuva = LoadImage("norsu");
42    private Image tahtiKuva = LoadImage("tahti");
43    private Image kadenkuva = LoadImage("kasi");
44    private Image miekankuva = LoadImage("miekka");
45
46    //                                             sivu              taka               käsi
47    private Image[] herodeksenKuvat = { LoadImage("TP_Herodes"), LoadImage("TP_HerodesBack"), LoadImage("TP_HerodesCrouch"), LoadImage("TP_HerodesHand"), LoadImage("TP_sword"), LoadImage("TP_handle"), LoadImage("TP_HerodesHead"), LoadImage("TP_HerodesHeadBack") };
48    private Image[] murjaaninKuvat = { LoadImage("TP_Murjaani"), LoadImage("TP_MurjaaniBack"), LoadImage("TP_HerodesCrouch"), LoadImage("TP_HerodesHand"), LoadImage("TP_sword"), LoadImage("TP_handle"), LoadImage("TP_MurjaaniHead"), LoadImage("TP_MurjaaniHeadBack") };
49    private Image[] knihdinKuvat = { LoadImage("TP_Knihti"), LoadImage("TP_KnihtiBack"), LoadImage("TP_HerodesCrouch"), LoadImage("TP_HerodesHand"), LoadImage("TP_sword"), LoadImage("miekankahva"), LoadImage("TP_KnihtiHead"), LoadImage("TP_KnihtiHeadBack") };
50    private Image[] mankinKuvat = { LoadImage("TP_Herodes"), LoadImage("TP_Herodes"), LoadImage("TP_HerodesCrouch"), LoadImage("TP_HerodesHand"), LoadImage("tahti"), LoadImage("tahti"), LoadImage("TP_HerodesHead"), LoadImage("TP_HerodesHeadBack") };
51
52    private SoundEffect maaliAani = LoadSoundEffect("maali");
53
54    public override void Begin()
55    {
56        GamePad[] ohjaimet = { ControllerOne, ControllerTwo, ControllerThree, ControllerFour };
57        Gravity = new Vector(0, -1000);
58
59        LuoKentta();
60
61        int ci = 0;
62        foreach (Tiernapoika poika in pojat)
63        {
64            LisaaNappaimet(ohjaimet[ci++], poika);
65            if (ci >= ohjaimet.Length) break;
66        }
67
68        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
69        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
70
71        // Camera.Follow(poika1);
72        Camera.ZoomFactor = 1.5;
73        //Camera.ZoomToAllObjects(0);
74        // Camera.StayInLevel = true;
75    }
76
77    void LuoKentta()
78    {
79        // TileMap kentta = TileMap.FromLevelAsset("kentta1");
80        TileMap kentta = TileMap.FromStringArray(taso0);
81        kentta.SetTileMethod('#', LisaaTaso);
82        kentta.SetTileMethod('=', LisaaPohjaTaso);
83        kentta.SetTileMethod('*', LisaaTahti);
84        kentta.SetTileMethod('H', (p, l, k) => LisaaPelaaja(p, l, k, herodeksenKuvat));
85        kentta.SetTileMethod('M', (p, l, k) => LisaaPelaaja(p, l*1.3, k*1.1, murjaaninKuvat));
86        kentta.SetTileMethod('K', (p, l, k) => LisaaPelaaja(p, l*1.2, k*0.9, knihdinKuvat));
87        kentta.SetTileMethod('N', (p, l, k) => LisaaPelaaja(p, l, k, mankinKuvat));
88        kentta.Execute(RUUDUN_KOKO, RUUDUN_KOKO);
89        //Level.CreateBorders();
90        Level.Background.CreateGradient(Color.SkyBlue, Color.Blue);
91    }
92
93    void LisaaTaso(Vector paikka, double leveys, double korkeus)
94    {
95        PhysicsObject taso = PhysicsObject.CreateStaticObject(leveys, korkeus);
96        taso.Position = paikka;
97        taso.Color = Color.Green;
98        Add(taso);
99    }
100
101    void LisaaPohjaTaso(Vector paikka, double leveys, double korkeus)
102    {
103        PhysicsObject taso = PhysicsObject.CreateStaticObject(leveys * 100, korkeus);
104        taso.Position = paikka;
105        taso.Color = Color.Green;
106        Add(taso);
107    }
108
109    void LisaaTahti(Vector paikka, double leveys, double korkeus)
110    {
111        PhysicsObject tahti = PhysicsObject.CreateStaticObject(leveys, korkeus);
112        tahti.IgnoresCollisionResponse = true;
113        tahti.Position = paikka;
114        tahti.Image = tahtiKuva;
115        tahti.Tag = "tahti";
116        Add(tahti);
117    }
118
119    void LisaaPelaaja(Vector paikka, double leveys, double korkeus, Image[] kuvat)
120    {
121        Tiernapoika poika = new Tiernapoika(this, leveys * 4, korkeus * 4, kuvat);
122        poika.Position = paikka;
123        poika.Color = Color.Red;
124
125        AddCollisionHandler(poika, "tahti", TormaaTahteen);
126        AddCollisionHandler(poika.Miekka, "tahti", TormaaTahteen);
127        pojat.Add(poika);
128    }
129
130    void LisaaNappaimet(GamePad controller, Tiernapoika poika)
131    {
132
133        Keyboard.Listen(Key.Left, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", poika, -nopeus);
134        Keyboard.Listen(Key.Right, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", poika, nopeus);
135        Keyboard.Listen(Key.Up, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", poika, hyppyNopeus);
136        Keyboard.Listen(Key.Multiply, ButtonState.Down, () => poika.Pyorita(), "Pyöritä tähteä");
137        Keyboard.Listen(Key.Down, ButtonState.Pressed, Polvistu, "Pelaaja polvistuu", poika, hyppyNopeus);
138        Keyboard.Listen(Key.Subtract, ButtonState.Down, () => poika.Pois(nopeus), "Kävele pois");
139        Keyboard.Listen(Key.Add, ButtonState.Down, () => poika.Takaisin(nopeus), "Kävele takaisin");
140
141        // controller.Listen(Button.Back, ButtonState.Pressed, Exit, "Poistu pelistä");
142        controller.Listen(Button.DPadLeft, ButtonState.Down, Liikuta, "Pelaaja liikkuu vasemmalle", poika, -nopeus);
143        controller.Listen(Button.DPadRight, ButtonState.Down, Liikuta, "Pelaaja liikkuu oikealle", poika, nopeus);
144        controller.Listen(Button.DPadUp, ButtonState.Down, () => poika.Pois(nopeus), "Pelaaja poispäin");
145        controller.Listen(Button.DPadDown, ButtonState.Down, () => poika.Takaisin(nopeus), "Pelaaja takaisinpäin");
146        controller.Listen(Button.Y, ButtonState.Pressed, () => poika.Nouse(nopeus), "Pelaaja nousee");
147        //controller.Listen(Button.A, ButtonState.Down, Polvistu, "Pelaaja polvistuu", poika, nopeus);
148        controller.Listen(Button.A, ButtonState.Pressed, () => poika.KyykyynYlos(nopeus), "Kyykyyn/Ylös");
149        controller.Listen(Button.RightTrigger, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", poika, hyppyNopeus);
150        controller.Listen(Button.RightShoulder, ButtonState.Pressed, () => poika.Pyorita(), "Pyöritä tähteä");
151        controller.Listen(Button.X, ButtonState.Pressed, () => poika.MiekkaSwap(), "Miekka pois/takaisin");
152        controller.Listen(Button.B, ButtonState.Pressed, () => poika.MiekkaEsiin(), "Miekka esiin");
153
154        controller.ListenAnalog(AnalogControl.RightStick, 0.03, LiikutaKatta, "Liikuta kättä", poika);
155        controller.ListenAnalog(AnalogControl.LeftStick, 0.03, (a) => poika.KaannaPaa(a.StateVector.X * -70), "Käännä pää");
156
157        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
158    }
159
160    void LiikutaKatta(AnalogState a, Tiernapoika poika)
161    {
162        double kulma = a.StateVector.Y * 130;
163        poika.Osoita(kulma);
164    }
165
166    void Liikuta(Tiernapoika hahmo, double nopeus)
167    {
168        hahmo.Walk(nopeus);
169    }
170
171    void Polvistu(Tiernapoika hahmo, double nopeus)
172    {
173        hahmo.Polvistu(nopeus);
174    }
175
176    void Hyppaa(Tiernapoika hahmo, double nopeus)
177    {
178        hahmo.Nouse(nopeus);
179        hahmo.Jump(nopeus);
180    }
181
182    void TormaaTahteen(PhysicsObject hahmo, PhysicsObject tahti)
183    {
184        maaliAani.Play();
185        MessageDisplay.Add("Keräsit tähden!");
186        tahti.Destroy();
187    }
188}
189
190public class Tiernapoika : PlatformCharacter
191{
192    private KaantyvaOsa paa;
193    private KaantyvaOsa kasi;
194    private PhysicsObject miekka;
195    private PhysicsObject miekankahva;
196
197    private Direction suunta;
198    private Vector koko;
199
200    private Vector paanKoko;
201    private Vector kadenKoko;
202    private Vector miekanKoko;
203    private Vector miekanKahvanKoko;
204
205    private Image etu;
206    private Image taka;
207    private Image kyykky;
208    private Image paaetu;
209    private Image paataka;
210
211    private PhysicsGame peli;
212
213    public KaantyvaOsa Kasi
214    {
215        get { return kasi; }
216    }
217
218    public PhysicsObject Miekka
219    {
220        get { return miekka; }
221    }
222
223
224    public Tiernapoika(PhysicsGame peli, double leveys, double korkeus, Image[] kuvat)
225        : base(leveys, korkeus)
226    {
227        double suhde = korkeus/leveys;
228        etu = kuvat[0];
229        taka = kuvat[1];
230        kyykky = kuvat[2];
231        Image = etu;
232        Height = Width * Image.Height / Image.Width * suhde;
233        koko = Size;
234        CollisionIgnoreGroup = 1;
235
236        paa = new KaantyvaOsa(1, 1);
237        paaetu = kuvat[6];
238        paataka = kuvat[7];
239        paa.Image = paaetu;
240        paa.Height = paa.Image.Height * Size.Y / Image.Height;
241        paa.Width = paa.Image.Width * Size.X / Image.Width;
242        paa.IgnoresGravity = true;
243        paa.CollisionIgnoreGroup = 1;
244        paanKoko = paa.Size;
245
246        Add(paa);
247        paa.Mass = 10000;
248        paa.Suunta = Direction.Left;
249
250        // Pojan oikea käsi
251        kasi = new KaantyvaOsa(Height, Height);
252        kasi.Image = kuvat[3];
253        kasi.Height = kasi.Image.Height * Height / Image.Height;
254        kasi.Width = kasi.Height / kasi.Image.Height * kasi.Image.Width;
255        kasi.Left = Right - Width / 10;
256        kasi.Y = Top - Height / 4;
257        kasi.Color = Color.Gray;
258        // Poika ja käsi eivät saa törmätä toisiinsa
259        kasi.CollisionIgnoreGroup = 1;
260        kadenKoko = kasi.Size;
261        kasi.Mass = 2000;
262        Add(kasi);
263
264        DirectionChanged += new Action<Direction>(Kaantyi);
265        Mass = 5000.0;
266        suunta = Direction.Right;
267
268        miekka = new PhysicsObject(Height*0.7, 1);
269        miekka.Image = kuvat[4];
270        miekka.Height = miekka.Width * miekka.Image.Height / miekka.Image.Width;
271        miekka.IgnoresGravity = true;
272        miekka.CollisionIgnoreGroup = 1;
273        miekanKoko = miekka.Size;
274        miekka.Angle = Angle.FromDegrees(10);
275        kasi.Add(miekka);
276
277        miekankahva = new PhysicsObject(Height * 0.7, 1);
278        miekankahva.Image = kuvat[5];
279        miekankahva.Height = miekankahva.Image.Height * miekanKoko.Y / miekka.Image.Height;
280        miekankahva.Width = miekankahva.Image.Width * miekanKoko.X / miekka.Image.Width;
281        miekankahva.IgnoresGravity = true;
282        miekankahva.CollisionIgnoreGroup = 1;
283        miekanKahvanKoko = miekankahva.Size;
284        miekankahva.Angle = Angle.FromDegrees(-20);
285        Add(miekankahva);
286
287
288        peli.Add(this, 1);
289        //peli.Add(liikkuvaOsa);
290        this.peli = peli;
291        MiekkaEsiin();
292        SaadaKoko(koko);
293    }
294
295    private void Kaantyi(Direction suunta)
296    {
297        double suuntakerroin = 1;
298        miekka.StopAngular();
299        if (suunta == Direction.Left) suuntakerroin = -1;
300        miekka.Angle = Angle.FromDegrees(10*suuntakerroin);
301        miekankahva.Angle = Angle.FromDegrees(-20*suuntakerroin);
302        kasi.Suunta = suunta;
303        paa.Suunta = suunta;
304        this.suunta = suunta;
305        kasi.Position = new Vector(Width / 2 * 0.85*suuntakerroin, Height * 0.27);
306        paa.Position = new Vector(Width * 0.1*suuntakerroin, Height * 0.3);
307    }
308
309
310    private void SaadaKoko(Vector uusikoko,bool myosMuut = true)
311    {
312        Size = uusikoko;
313        if (myosMuut)
314        {
315            double kerroin = Size.Y / koko.Y;
316            kasi.Size = kadenKoko * kerroin;
317            miekka.Size = miekanKoko * kerroin;
318            miekankahva.Size = miekanKahvanKoko * kerroin;
319            paa.Size = paanKoko * kerroin;
320            miekankahva.Position = new Vector(0, Height*0.1);
321            miekka.Position = new Vector(kasi.Width / 2 - 10, 0);
322        }
323        Kaantyi(suunta);
324    }
325
326
327    public void Flip()
328    {
329        if (suunta == Direction.Left) Walk(0.1);
330        else Walk(-0.1);
331    }
332
333
334    internal void Nouse(double nopeus)
335    {
336        SaadaKoko(koko);
337        Kaantyi(suunta);
338        Image = etu;
339    }
340
341
342    internal void Polvistu(double nopeus)
343    {
344        SaadaKoko(new Vector(Width, koko.Y / 2),false);
345        MiekkaTuppeen();
346        Image = kyykky;
347    }
348
349
350    internal void Pois(double nopeus)
351    {
352        if (Height < koko.Y / 2) return;
353        SaadaKoko(Size * 0.99);
354        //  peli.Remove(this);
355        //  peli.Add(this, -1);
356        if (Image != taka)
357        {
358            Image = taka;
359            paa.Image = paataka;
360            Flip();
361            miekankahva.IsVisible = false;
362        }
363    }
364
365
366    internal void Takaisin(double nopeus)
367    {
368        if (Height > koko.Y) Nouse(nopeus);
369        SaadaKoko(Size * 1.01);
370        // peli.Remove(this);
371        // peli.Add(this, 1);
372        if (Image != etu)
373        {
374            Image = etu;
375            paa.Image = paaetu;
376            Flip();
377            if (!miekka.IsVisible) miekankahva.IsVisible = true;
378        }
379    }
380
381    internal void MiekkaTuppeen()
382    {
383        miekka.IsVisible = false;
384        miekankahva.IsVisible = true;
385        Osoita(-125);
386    }
387
388    internal void MiekkaEsiin()
389    {
390        Osoita(-110);
391        miekka.IsVisible = true;
392        miekankahva.IsVisible = false;
393    }
394
395    internal void Pyorita()
396    {
397        miekka.ApplyTorque(100000);
398    }
399
400    internal void MiekkaSwap()
401    {
402        if (miekka.IsVisible) MiekkaTuppeen(); else MiekkaEsiin();
403    }
404
405    internal void KyykyynYlos(double nopeus)
406    {
407        if (Height < koko.Y * 0.6) Nouse(nopeus); else Polvistu(nopeus);
408    }
409
410    internal void Osoita(double kulma)
411    {
412        Kasi.Tavoite = Angle.FromDegrees(kulma);
413    }
414
415
416    public void KaannaPaa(double kulma)
417    {
418        paa.Tavoite = Angle.FromDegrees(kulma);
419    }
420}
421
422
423/// @author  Vesa Lappalainen
424/// @version 16.10.2011
425/// <summary>
426/// Osa, jolle voidaan asettaa suunta johon se pyrkii.
427/// </summary>
428public class KaantyvaOsa : PhysicsObject
429{
430    private Angle oikea = Angle.FromDegrees(0);
431    private Angle vasen = Angle.FromDegrees(180);
432    private Angle suuntaero = Angle.FromDegrees(0);
433    private int s = 1;
434    /// <summary>
435    /// Tavoitekulma, johon maila pyrkii osoittamaan
436    /// </summary>
437    public Angle Tavoite { get { return tavoite; } set { tavoite = value; saavutettu = false; } }
438    private Angle tavoite;
439    private bool saavutettu = true;
440    private Direction suunta = Direction.Right;
441    public Direction Suunta
442    {
443        get { return suunta; }
444        set
445        {
446            if ( value != Suunta) FlipImage();
447            suunta = value;
448            if (value == Direction.Left) { suuntaero = vasen; s = -1; } else { suuntaero = oikea; s = 1; }
449            Tavoite = Tavoite;
450        }
451    }
452
453
454    public KaantyvaOsa(double width, double height)
455        : base(width, height)
456    {
457        // MakeStatic();
458        Mass = 10000;
459        IgnoresGravity = true;
460        IsUpdated = true;
461    }
462
463
464    /// <summary>
465    /// Uusi versio Update-metodista, jossa nyt käännetään mailaa kohti tavoitekulmaa.
466    /// </summary>
467    /// <param name="time">Peliaika</param>
468    public override void Update(Time time)
469    {
470        if (saavutettu) { base.Update(time); return; }
471        Angle diff = s * Tavoite + suuntaero - Angle;
472        double suunta = diff.Degrees;
473        double d = 2;
474        if (Math.Abs(suunta) > d)
475        {
476            if (suunta > 180) suunta = 360 - suunta;
477            this.StopAngular();
478            this.ApplyTorque(10000000 * 35.0 * suunta); // kokeiltu hihavakio
479        }
480        else
481        {
482            Stop();
483            saavutettu = true;
484        }
485        base.Update(time);
486    }
487}
488
Note: See TracBrowser for help on using the repository browser.