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

Revision 4815, 16.9 KB checked in by vesal, 8 years ago (diff)

Kuvat luokkaan

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