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

Revision 4807, 15.7 KB checked in by vesal, 7 years ago (diff)

Kuville uudet nimet ja turhia pois

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[] muriaaninKuvat = { LoadImage("TP_Herodes"), LoadImage("TP_Herodes"), LoadImage("TP_HerodesCrouch"), LoadImage("TP_HerodesHand"), LoadImage("TP_sword"), LoadImage("TP_handle"), LoadImage("TP_HerodesHead"), LoadImage("TP_HerodesHeadBack") };
49    private Image[] knihdinKuvat = { LoadImage("TP_Knihti"), LoadImage("TP_Herodes"), LoadImage("TP_HerodesCrouch"), LoadImage("TP_HerodesHand"), LoadImage("TP_sword"), LoadImage("miekankahva"), LoadImage("TP_HerodesHead"), LoadImage("TP_HerodesHeadBack") };
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, k, muriaaninKuvat));
86        kentta.SetTileMethod('K', (p, l, k) => LisaaPelaaja(p, l, k, 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.Down, ButtonState.Pressed, Polvistu, "Pelaaja polvistuu", poika, hyppyNopeus);
137        Keyboard.Listen(Key.Multiply, ButtonState.Pressed, () => poika.Pyorita(), "Pyöritä tähteä");
138
139        // controller.Listen(Button.Back, ButtonState.Pressed, Exit, "Poistu pelistä");
140        controller.Listen(Button.DPadLeft, ButtonState.Down, Liikuta, "Pelaaja liikkuu vasemmalle", poika, -nopeus);
141        controller.Listen(Button.DPadRight, ButtonState.Down, Liikuta, "Pelaaja liikkuu oikealle", poika, nopeus);
142        controller.Listen(Button.DPadUp, ButtonState.Down, () => poika.Pois(nopeus), "Pelaaja poispäin");
143        controller.Listen(Button.DPadDown, ButtonState.Down, () => poika.Takaisin(nopeus), "Pelaaja takaisinpäin");
144        controller.Listen(Button.Y, ButtonState.Pressed, () => poika.Nouse(nopeus), "Pelaaja nousee");
145        //controller.Listen(Button.A, ButtonState.Down, Polvistu, "Pelaaja polvistuu", poika, nopeus);
146        controller.Listen(Button.A, ButtonState.Pressed, () => poika.KyykyynYlos(nopeus), "Kyykyyn/Ylös");
147        controller.Listen(Button.RightTrigger, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", poika, hyppyNopeus);
148        controller.Listen(Button.RightShoulder, ButtonState.Pressed, () => poika.Pyorita(), "Pyöritä tähteä");
149        controller.Listen(Button.X, ButtonState.Pressed, () => poika.MiekkaSwap(), "Miekka pois/takaisin");
150        controller.Listen(Button.B, ButtonState.Pressed, () => poika.MiekkaEsiin(), "Miekka esiin");
151
152        controller.ListenAnalog(AnalogControl.RightStick, 0.03, LiikutaKatta, "Liikuta kättä", poika);
153        controller.ListenAnalog(AnalogControl.LeftStick, 0.03, (a) => poika.KaannaPaa(a.StateVector.X * -70), "Käännä pää");
154
155        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
156    }
157
158    void LiikutaKatta(AnalogState a, Tiernapoika poika)
159    {
160        double kulma = a.StateVector.Y * 130;
161        poika.Osoita(kulma);
162    }
163
164    void Liikuta(Tiernapoika hahmo, double nopeus)
165    {
166        hahmo.Walk(nopeus);
167    }
168
169    void Polvistu(Tiernapoika hahmo, double nopeus)
170    {
171        hahmo.Polvistu(nopeus);
172    }
173
174    void Hyppaa(Tiernapoika hahmo, double nopeus)
175    {
176        hahmo.Nouse(nopeus);
177        hahmo.Jump(nopeus);
178    }
179
180    void TormaaTahteen(PhysicsObject hahmo, PhysicsObject tahti)
181    {
182        maaliAani.Play();
183        MessageDisplay.Add("Keräsit tähden!");
184        tahti.Destroy();
185    }
186}
187
188public class Tiernapoika : PlatformCharacter
189{
190    private KaantyvaOsa paa;
191    private KaantyvaOsa kasi;
192    private PhysicsObject miekka;
193    private PhysicsObject miekankahva;
194
195    private Direction suunta;
196    private Vector koko;
197
198    private Vector paanKoko;
199    private Vector kadenKoko;
200    private Vector miekanKoko;
201    private Vector miekanKahvanKoko;
202
203    private Image etu;
204    private Image taka;
205    private Image kyykky;
206    private Image paaetu;
207    private Image paataka;
208
209    private PhysicsGame peli;
210
211    public KaantyvaOsa Kasi
212    {
213        get { return kasi; }
214    }
215
216    public PhysicsObject Miekka
217    {
218        get { return miekka; }
219    }
220
221
222    public Tiernapoika(PhysicsGame peli, double leveys, double korkeus, Image[] kuvat)
223        : base(leveys, korkeus)
224    {
225        etu = kuvat[0];
226        taka = kuvat[1];
227        kyykky = kuvat[2];
228        Image = etu;
229        Height = Width * Image.Height / Image.Width;
230        koko = Size;
231        CollisionIgnoreGroup = 1;
232
233        paa = new KaantyvaOsa(1, 1);
234        paaetu = kuvat[6];
235        paataka = kuvat[7];
236        paa.Image = paaetu;
237        paa.Height = paa.Image.Height * Size.Y / Image.Height;
238        paa.Width = paa.Image.Width * Size.X / Image.Width;
239        paa.IgnoresGravity = true;
240        paa.CollisionIgnoreGroup = 1;
241        paanKoko = paa.Size;
242
243        Add(paa);
244        paa.Mass = 10000;
245        paa.Suunta = Direction.Left;
246
247        // Pojan oikea käsi
248        kasi = new KaantyvaOsa(Height, Height);
249        kasi.Image = kuvat[3];
250        kasi.Height = kasi.Image.Height * Height / Image.Height;
251        kasi.Width = kasi.Height / kasi.Image.Height * kasi.Image.Width;
252        kasi.Left = Right - Width / 10;
253        kasi.Y = Top - Height / 4;
254        kasi.Color = Color.Gray;
255        // Poika ja käsi eivät saa törmätä toisiinsa
256        kasi.CollisionIgnoreGroup = 1;
257        kadenKoko = kasi.Size;
258        kasi.Mass = 2000;
259        Add(kasi);
260
261        DirectionChanged += new Action<Direction>(Kaantyi);
262        Mass = 5000.0;
263        suunta = Direction.Right;
264
265        miekka = new PhysicsObject(Height*0.7, 1);
266        miekka.Image = kuvat[4];
267        miekka.Height = miekka.Width * miekka.Image.Height / miekka.Image.Width;
268        miekka.IgnoresGravity = true;
269        miekka.CollisionIgnoreGroup = 1;
270        miekanKoko = miekka.Size;
271        miekka.Angle = Angle.FromDegrees(10);
272        kasi.Add(miekka);
273
274        miekankahva = new PhysicsObject(Height * 0.7, 1);
275        miekankahva.Position = new Vector(0, 0);
276        miekankahva.Image = kuvat[5];
277        miekankahva.Height = miekankahva.Image.Height * miekanKoko.Y / miekka.Image.Height;
278        miekankahva.Width = miekankahva.Image.Width * miekanKoko.X / miekka.Image.Width;
279        miekankahva.IgnoresGravity = true;
280        miekankahva.CollisionIgnoreGroup = 1;
281        miekanKahvanKoko = miekankahva.Size;
282        miekankahva.Angle = Angle.FromDegrees(-20);
283        Add(miekankahva);
284
285
286        peli.Add(this, 1);
287        //peli.Add(liikkuvaOsa);
288        this.peli = peli;
289        MiekkaEsiin();
290        SaadaKoko(koko);
291    }
292
293    private void Kaantyi(Direction suunta)
294    {
295        double suuntakerroin = 1;
296        miekka.StopAngular();
297        if (suunta == Direction.Left) suuntakerroin = -1;
298        miekka.Angle = Angle.FromDegrees(10*suuntakerroin);
299        miekankahva.Angle = Angle.FromDegrees(-20*suuntakerroin);
300        kasi.Suunta = suunta;
301        paa.Suunta = suunta;
302        this.suunta = suunta;
303        kasi.Position = new Vector(Width / 2 * 0.85*suuntakerroin, Height * 0.27);
304        paa.Position = new Vector(Width * 0.1*suuntakerroin, Height * 0.3);
305    }
306
307
308    private void SaadaKoko(Vector uusikoko)
309    {
310        Size = uusikoko;
311        double kerroin = Size.Y / koko.Y;
312        kasi.Size = kadenKoko * kerroin;
313        miekka.Size = miekanKoko * kerroin;
314        miekankahva.Size = miekanKahvanKoko * kerroin;
315        paa.Size = paanKoko * kerroin;
316        miekka.Position = new Vector(kasi.Width / 2 - 10, 0);
317        Kaantyi(suunta);
318    }
319
320
321    public void Flip()
322    {
323        if (suunta == Direction.Left) Walk(0.1);
324        else Walk(-0.1);
325    }
326
327
328    internal void Nouse(double nopeus)
329    {
330        SaadaKoko(koko);
331        Kaantyi(suunta);
332        Image = etu;
333    }
334
335
336    internal void Polvistu(double nopeus)
337    {
338        SaadaKoko(new Vector(Width, koko.Y / 2));
339        MiekkaTuppeen();
340        Image = kyykky;
341    }
342
343
344    internal void Pois(double nopeus)
345    {
346        if (Height < koko.Y / 2) return;
347        SaadaKoko(Size * 0.99);
348        //  peli.Remove(this);
349        //  peli.Add(this, -1);
350        if (Image != taka)
351        {
352            Image = taka;
353            paa.Image = paataka;
354            Flip();
355        }
356    }
357
358
359    internal void Takaisin(double nopeus)
360    {
361        if (Height > koko.Y) Nouse(nopeus);
362        SaadaKoko(Size * 1.01);
363        // peli.Remove(this);
364        // peli.Add(this, 1);
365        if (Image != etu)
366        {
367            Image = etu;
368            paa.Image = paaetu;
369            Flip();
370        }
371    }
372
373    internal void MiekkaTuppeen()
374    {
375        miekka.IsVisible = false;
376        miekankahva.IsVisible = true;
377        Osoita(-110);
378    }
379
380    internal void MiekkaEsiin()
381    {
382        Osoita(-110);
383        miekka.IsVisible = true;
384        miekankahva.IsVisible = false;
385    }
386
387    internal void Pyorita()
388    {
389        miekka.ApplyTorque(100000);
390    }
391
392    internal void MiekkaSwap()
393    {
394        if (miekka.IsVisible) MiekkaTuppeen(); else MiekkaEsiin();
395    }
396
397    internal void KyykyynYlos(double nopeus)
398    {
399        if (Height < koko.Y * 0.6) Nouse(nopeus); else Polvistu(nopeus);
400    }
401
402    internal void Osoita(double kulma)
403    {
404        Kasi.Tavoite = Angle.FromDegrees(kulma);
405    }
406
407
408    public void KaannaPaa(double kulma)
409    {
410        paa.Tavoite = Angle.FromDegrees(kulma);
411    }
412}
413
414
415/// @author  Vesa Lappalainen
416/// @version 16.10.2011
417/// <summary>
418/// Osa, jolle voidaan asettaa suunta johon se pyrkii.
419/// </summary>
420public class KaantyvaOsa : PhysicsObject
421{
422    private Angle oikea = Angle.FromDegrees(0);
423    private Angle vasen = Angle.FromDegrees(180);
424    private Angle suuntaero = Angle.FromDegrees(0);
425    private int s = 1;
426    /// <summary>
427    /// Tavoitekulma, johon maila pyrkii osoittamaan
428    /// </summary>
429    public Angle Tavoite { get { return tavoite; } set { tavoite = value; saavutettu = false; } }
430    private Angle tavoite;
431    private bool saavutettu = true;
432    private Direction suunta = Direction.Right;
433    public Direction Suunta
434    {
435        get { return suunta; }
436        set
437        {
438            if ( value != Suunta) FlipImage();
439            suunta = value;
440            if (value == Direction.Left) { suuntaero = vasen; s = -1; } else { suuntaero = oikea; s = 1; }
441            Tavoite = Tavoite;
442        }
443    }
444
445
446    public KaantyvaOsa(double width, double height)
447        : base(width, height)
448    {
449        // MakeStatic();
450        Mass = 10000;
451        IgnoresGravity = true;
452        IsUpdated = true;
453    }
454
455
456    /// <summary>
457    /// Uusi versio Update-metodista, jossa nyt käännetään mailaa kohti tavoitekulmaa.
458    /// </summary>
459    /// <param name="time">Peliaika</param>
460    public override void Update(Time time)
461    {
462        if (saavutettu) { base.Update(time); return; }
463        Angle diff = s * Tavoite + suuntaero - Angle;
464        double suunta = diff.Degrees;
465        double d = 2;
466        if (Math.Abs(suunta) > d)
467        {
468            if (suunta > 180) suunta = 360 - suunta;
469            this.StopAngular();
470            this.ApplyTorque(10000000 * 35.0 * suunta); // kokeiltu hihavakio
471        }
472        else
473        {
474            Stop();
475            saavutettu = true;
476        }
477        base.Update(time);
478    }
479}
480
Note: See TracBrowser for help on using the repository browser.