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

Revision 4821, 18.7 KB checked in by anlakane, 7 years ago (diff)

Laskeutuva ja nouseva verho.

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