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

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