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

Revision 4804, 12.4 KB checked in by vesal, 7 years ago (diff)

pyorita

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("norsu"), LoadImage("norsu"), LoadImage("kasi"), LoadImage("miekka") };
48    private Image[] muriaaninKuvat = { LoadImage("norsu"), LoadImage("norsu"), LoadImage("kasi"), LoadImage("miekka") };
49    private Image[] knihdinKuvat = { LoadImage("norsu"), LoadImage("norsu"), LoadImage("kasi"), LoadImage("miekka") };
50    private Image[] mankinKuvat = { LoadImage("norsu"), LoadImage("norsu"), LoadImage("kasi"), LoadImage("tahti") };
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        // Add(poika1.KiinnitysVartaloon);
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 hyppää", 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, Pois, "Pelaaja poispäin", poika, nopeus);
143        controller.Listen(Button.DPadDown, ButtonState.Down, Takaisin, "Pelaaja takaisinpäin", poika, nopeus);
144        controller.Listen(Button.Y, ButtonState.Down, Nouse, "Pelaaja nousee", poika, -nopeus);
145        controller.Listen(Button.A, ButtonState.Down, Polvistu, "Pelaaja polvistuu", poika, nopeus);
146        controller.Listen(Button.RightTrigger, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", poika, hyppyNopeus);
147        controller.Listen(Button.RightShoulder, ButtonState.Pressed, () => poika.Pyorita(), "Pyöritä tähteä");
148        controller.Listen(Button.X, ButtonState.Pressed, () => poika.MiekkaTuppeen(), "Miekka tuppeen");
149        controller.Listen(Button.B, ButtonState.Pressed, () => poika.MiekkaEsiin(), "Miekka esiin");
150
151        controller.ListenAnalog(AnalogControl.RightStick, 0.03, LiikutaKatta, "Liikuta kättä", poika);
152
153        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
154    }
155
156    void LiikutaKatta(AnalogState a, Tiernapoika poika)
157    {
158        double kulma = a.StateVector.Y * 90;
159        poika.LiikkuvaOsa.Tavoite = Angle.FromDegrees(kulma);
160    }
161
162    void Liikuta(Tiernapoika hahmo, double nopeus)
163    {
164        hahmo.Walk(nopeus);
165    }
166
167    void Polvistu(Tiernapoika hahmo, double nopeus)
168    {
169        hahmo.Polvistu(nopeus);
170    }
171
172    void Nouse(Tiernapoika hahmo, double nopeus)
173    {
174        hahmo.Nouse(nopeus);
175    }
176
177    void Pois(Tiernapoika hahmo, double nopeus)
178    {
179        hahmo.Pois(nopeus);
180    }
181
182    void Takaisin(Tiernapoika hahmo, double nopeus)
183    {
184        hahmo.Takaisin(nopeus);
185    }
186
187    void Hyppaa(Tiernapoika hahmo, double nopeus)
188    {
189        hahmo.Nouse(nopeus);
190        hahmo.Jump(nopeus);
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
201public class Tiernapoika : PlatformCharacter
202{
203
204    private KaantyvaOsa liikkuvaOsa;
205    private Direction suunta;
206    private Vector koko;
207    private Vector liikkuvaKoko;
208    private Vector miekanKoko;
209    private PhysicsGame peli;
210    private PhysicsObject miekka;
211
212    public KaantyvaOsa LiikkuvaOsa
213    {
214        get { return liikkuvaOsa; }
215    }
216
217
218    public Tiernapoika(PhysicsGame peli, double leveys, double korkeus, Image[] kuvat)
219        : base(leveys, korkeus)
220    {
221        Image = kuvat[0];
222
223        // Pojan oikea käsi
224        liikkuvaOsa = new KaantyvaOsa(leveys, korkeus / 4);
225        liikkuvaOsa.Left = Right - Width / 10;
226        liikkuvaOsa.Y = Top - Height / 4;
227        liikkuvaOsa.Color = Color.Gray;
228        // Poika ja käsi eivät saa törmätä toisiinsa
229        CollisionIgnoreGroup = 1;
230        liikkuvaOsa.CollisionIgnoreGroup = 1;
231        liikkuvaOsa.Image = kuvat[2];
232        liikkuvaKoko = liikkuvaOsa.Size;
233        Add(liikkuvaOsa);
234
235        DirectionChanged += new Action<Direction>(Kaantyi);
236        koko = Size;
237        Mass = 40000.0;
238        suunta = Direction.Right;
239
240        miekka = new PhysicsObject(leveys * 1.5, 1);
241        miekka.Image = kuvat[3];
242        miekka.Height = miekka.Width * miekka.Image.Height / miekka.Image.Width;
243        miekka.IgnoresGravity = true;
244        miekka.CollisionIgnoreGroup = 1;
245        miekanKoko = miekka.Size;
246        miekka.Angle = Angle.FromDegrees(10);
247        liikkuvaOsa.Add(miekka);
248
249        peli.Add(this, 1);
250        //peli.Add(liikkuvaOsa);
251        this.peli = peli;
252        SaadaKoko(koko);
253    }
254
255    private void Kaantyi(Direction suunta)
256    {
257        miekka.StopAngular();
258        if (suunta == Direction.Left)
259        {
260            liikkuvaOsa.X = -Width / 2 * 0.9;
261            miekka.Angle = Angle.FromDegrees(-10);
262        }
263        else
264        {
265            liikkuvaOsa.X = Width / 2 * 0.9;
266            miekka.Angle = Angle.FromDegrees(10);
267        }
268        liikkuvaOsa.Suunta = suunta;
269        this.suunta = suunta;
270        liikkuvaOsa.Y = Height / 6;
271    }
272
273
274    private void SaadaKoko(Vector uusikoko)
275    {
276        Size = uusikoko;
277        liikkuvaOsa.Size = liikkuvaKoko * Size.Y / koko.Y;
278        miekka.Size = miekanKoko * Size.Y / koko.Y;
279        miekka.Position = new Vector(liikkuvaOsa.Width / 2 - 10, 0);
280        Kaantyi(suunta);
281    }
282
283
284    internal void Nouse(double nopeus)
285    {
286        SaadaKoko(koko);
287        Kaantyi(suunta);
288    }
289
290
291    internal void Polvistu(double nopeus)
292    {
293        SaadaKoko(new Vector(Width, koko.Y / 2));
294    }
295
296
297    internal void Pois(double nopeus)
298    {
299        if (Height < koko.Y / 2) return;
300        SaadaKoko(Size * 0.99);
301        //  peli.Remove(this);
302        //  peli.Add(this, -1);
303    }
304
305
306    internal void Takaisin(double nopeus)
307    {
308        if (Height > koko.Y) Nouse(nopeus);
309        SaadaKoko(Size * 1.01);
310        // peli.Remove(this);
311        // peli.Add(this, 1);
312    }
313
314    internal void MiekkaTuppeen()
315    {
316        miekka.IsVisible = false;
317        liikkuvaOsa.Tavoite = Angle.FromDegrees(-90);
318    }
319
320    internal void MiekkaEsiin()
321    {
322        miekka.IsVisible = true;
323    }
324
325    internal void Pyorita()
326    {
327        miekka.ApplyTorque(100000);
328    }
329}
330
331
332/// @author  Vesa Lappalainen
333/// @version 16.10.2011
334/// <summary>
335/// Osa, jolle voidaan asettaa suunta johon se pyrkii.
336/// </summary>
337public class KaantyvaOsa : PhysicsObject
338{
339    private Angle oikea = Angle.FromDegrees(0);
340    private Angle vasen = Angle.FromDegrees(180);
341    private Angle suuntaero = Angle.FromDegrees(0);
342    private int s = 1;
343    /// <summary>
344    /// Tavoitekulma, johon maila pyrkii osoittamaan
345    /// </summary>
346    public Angle Tavoite { get { return tavoite; } set { tavoite = value; saavutettu = false; } }
347    private Angle tavoite;
348    private bool saavutettu = true;
349    public Direction Suunta
350    {
351        set
352        {
353            if (value == Direction.Left) { suuntaero = vasen; s = -1; } else { suuntaero = oikea; s = 1; }
354            Tavoite = Tavoite;
355        }
356    }
357
358
359    public KaantyvaOsa(double width, double height)
360        : base(width, height)
361    {
362        // MakeStatic();
363        Mass = 10000;
364        IgnoresGravity = true;
365        IsUpdated = true;
366    }
367
368
369    /// <summary>
370    /// Uusi versio Update-metodista, jossa nyt käännetään mailaa kohti tavoitekulmaa.
371    /// </summary>
372    /// <param name="time">Peliaika</param>
373    public override void Update(Time time)
374    {
375        if (saavutettu) { base.Update(time); return; }
376        Angle diff = s * Tavoite + suuntaero - Angle;
377        double suunta = diff.Degrees;
378        double d = 2;
379        if (Math.Abs(suunta) > d)
380        {
381            this.StopAngular();
382            this.ApplyTorque(10000000 * 35.0 * suunta); // kokeiltu hihavakio
383        }
384        else
385        {
386            Stop();
387            saavutettu = true;
388        }
389        base.Update(time);
390    }
391}
392
Note: See TracBrowser for help on using the repository browser.