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

Revision 4803, 11.9 KB checked in by vesal, 8 years ago (diff)

miekka

Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8
9public class Tiernapoika : PlatformCharacter
10{
11
12    private KaantyvaOsa liikkuvaOsa;
13    private Direction suunta;
14    private Vector koko;
15    private Vector liikkuvaKoko;
16    private Vector miekanKoko;
17    private PhysicsGame peli;
18    private PhysicsObject miekka;
19
20    public KaantyvaOsa LiikkuvaOsa
21    {
22        get { return liikkuvaOsa; }
23    }
24
25
26    public Tiernapoika(PhysicsGame peli, double leveys, double korkeus, Image[] kuvat)
27        : base(leveys, korkeus)
28    {
29        // Pojan oikea käsi
30        liikkuvaOsa = new KaantyvaOsa(leveys, korkeus / 4);
31        liikkuvaOsa.Left = Right - Width / 10;
32        liikkuvaOsa.Y = Top - Height / 4;
33        liikkuvaOsa.Color = Color.Gray;
34        // Add(kiinnitysVartaloon);
35        // Poika ja käsi eivät saa törmätä toisiinsa
36        CollisionIgnoreGroup = 1;
37        liikkuvaOsa.CollisionIgnoreGroup = 1;
38        liikkuvaOsa.Image = kuvat[2];
39        Image = kuvat[0];
40        DirectionChanged += new Action<Direction>(Kaantyi);
41        koko = Size;
42        Mass = 40000.0;
43        liikkuvaKoko = liikkuvaOsa.Size;
44        suunta = Direction.Right;
45        Add(liikkuvaOsa);
46        peli.Add(this, 1);
47        //peli.Add(liikkuvaOsa);
48        this.peli = peli;
49        miekka = new PhysicsObject(leveys*1.5,1 );
50        miekka.Image = kuvat[3];
51        miekka.Height = miekka.Width * miekka.Image.Height / miekka.Image.Width;
52        miekka.IgnoresGravity = true;
53        miekka.CollisionIgnoreGroup = 1;
54        liikkuvaOsa.Add(miekka);
55        miekanKoko = miekka.Size;
56        miekka.Angle = Angle.FromDegrees(20);
57        SaadaKoko(koko);
58    }
59
60    private void Kaantyi(Direction suunta)
61    {
62        if (suunta == Direction.Left)
63        {
64            liikkuvaOsa.X = -Width / 2 * 0.9;
65            miekka.Angle = Angle.FromDegrees(-20);
66        }
67        else
68        {
69            liikkuvaOsa.X = Width / 2 * 0.9;
70            miekka.Angle = Angle.FromDegrees(20);
71        }
72        liikkuvaOsa.Suunta = suunta;
73        this.suunta = suunta;
74        liikkuvaOsa.Y = Height / 6;
75    }
76
77
78    private void SaadaKoko(Vector uusikoko)
79    {
80        Size = uusikoko;
81        liikkuvaOsa.Size = liikkuvaKoko * Size.Y / koko.Y;
82        miekka.Size = miekanKoko * Size.Y / koko.Y;
83        miekka.Position = new Vector(liikkuvaOsa.Width / 2 - 10, 0);
84        Kaantyi(suunta);
85    }
86
87
88    internal void Nouse(double nopeus)
89    {
90        SaadaKoko(koko);
91        Kaantyi(suunta);
92    }
93
94
95    internal void Polvistu(double nopeus)
96    {
97        SaadaKoko(new Vector(Width, koko.Y / 2));
98    }
99
100
101    internal void Pois(double nopeus)
102    {
103        if (Height < koko.Y / 2) return;
104        SaadaKoko(Size * 0.99);
105        //  peli.Remove(this);
106        //  peli.Add(this, -1);
107    }
108
109
110    internal void Takaisin(double nopeus)
111    {
112        if (Height > koko.Y) Nouse(nopeus);
113        SaadaKoko(Size * 1.01);
114        // peli.Remove(this);
115        // peli.Add(this, 1);
116    }
117
118    internal void MiekkaTuppeen()
119    {
120        miekka.IsVisible = false;
121    }
122
123    internal void MiekkaEsiin()
124    {
125        miekka.IsVisible = true;
126    }
127}
128
129
130/// @author  Vesa Lappalainen
131/// @version 16.10.2011
132/// <summary>
133/// Osa, jolle voidaan asettaa suunta johon se pyrkii.
134/// </summary>
135public class KaantyvaOsa : PhysicsObject
136{
137    private Angle oikea = Angle.FromDegrees(0);
138    private Angle vasen = Angle.FromDegrees(180);
139    private Angle suuntaero = Angle.FromDegrees(0);
140    private int s = 1;
141    /// <summary>
142    /// Tavoitekulma, johon maila pyrkii osoittamaan
143    /// </summary>
144    public Angle Tavoite { get { return tavoite; } set { tavoite = value; saavutettu = false; } }
145    private Angle tavoite;
146    private bool saavutettu = true;
147    public Direction Suunta
148    {
149        set
150        {
151            if (value == Direction.Left) { suuntaero = vasen; s = -1; } else { suuntaero = oikea; s = 1; }
152            Tavoite = Tavoite;
153        }
154    }
155
156
157    public KaantyvaOsa(double width, double height)
158        : base(width, height)
159    {
160        // MakeStatic();
161        Mass = 10000;
162        IgnoresGravity = true;
163        IsUpdated = true;
164    }
165
166
167    /// <summary>
168    /// Uusi versio Update-metodista, jossa nyt käännetään mailaa kohti tavoitekulmaa.
169    /// </summary>
170    /// <param name="time">Peliaika</param>
171    public override void Update(Time time)
172    {
173        if (saavutettu) { base.Update(time); return; }
174        Angle diff = s * Tavoite + suuntaero - Angle;
175        double suunta = diff.Degrees;
176        double d = 2;
177        if (Math.Abs(suunta) > d)
178        {
179            this.StopAngular();
180            this.ApplyTorque(10000000 * 35.0 * suunta); // kokeiltu hihavakio
181        }
182        else
183        {
184            Stop();
185            saavutettu = true;
186        }
187        base.Update(time);
188    }
189}
190
191
192
193public class Tiernapojat : PhysicsGame
194{
195
196    private static readonly string[] taso0 = {
197"         *            ",
198"         #            ",
199"                      ",
200"                      ",
201"                      ",
202"                      ",
203"                      ",
204"                      ",
205"                      ",
206"                      ",
207"                      ",
208"                      ",
209"                      ",
210"                      ",
211"                      ",
212"  H    M     K      N ",
213"=                     ",
214                                             };
215
216
217    const double nopeus = 200;
218    const double hyppyNopeus = 750;
219    const int RUUDUN_KOKO = 40;
220
221    private List<Tiernapoika> pojat = new List<Tiernapoika>();
222
223    private Image pelaajanKuva = LoadImage("norsu");
224    private Image tahtiKuva = LoadImage("tahti");
225    private Image kadenkuva = LoadImage("kasi");
226    private Image miekankuva = LoadImage("miekka");
227
228    //                                             sivu              taka               käsi
229    private Image[] herodeksenKuvat = { LoadImage("norsu"), LoadImage("norsu"), LoadImage("kasi"), LoadImage("miekka") };
230    private Image[] muriaaninKuvat = { LoadImage("norsu"), LoadImage("norsu"), LoadImage("kasi"), LoadImage("miekka") };
231    private Image[] knihdinKuvat = { LoadImage("norsu"), LoadImage("norsu"), LoadImage("kasi"), LoadImage("miekka") };
232    private Image[] mankinKuvat = { LoadImage("norsu"), LoadImage("norsu"), LoadImage("kasi"), LoadImage("tahti") };
233
234    private SoundEffect maaliAani = LoadSoundEffect("maali");
235
236    public override void Begin()
237    {
238        GamePad[] ohjaimet = { ControllerOne, ControllerTwo, ControllerThree, ControllerFour };
239        Gravity = new Vector(0, -1000);
240
241        LuoKentta();
242
243        int ci = 0;
244        foreach (Tiernapoika poika in pojat)
245        {
246            LisaaNappaimet(ohjaimet[ci++], poika);
247            if (ci >= ohjaimet.Length) break;
248        }
249
250        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
251        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
252
253        // Camera.Follow(poika1);
254        Camera.ZoomFactor = 1.5;
255        //Camera.ZoomToAllObjects(0);
256        // Camera.StayInLevel = true;
257    }
258
259    void LuoKentta()
260    {
261        // TileMap kentta = TileMap.FromLevelAsset("kentta1");
262        TileMap kentta = TileMap.FromStringArray(taso0);
263        kentta.SetTileMethod('#', LisaaTaso);
264        kentta.SetTileMethod('=', LisaaPohjaTaso);
265        kentta.SetTileMethod('*', LisaaTahti);
266        kentta.SetTileMethod('H', (p, l, k) => LisaaPelaaja(p, l, k, herodeksenKuvat));
267        kentta.SetTileMethod('M', (p, l, k) => LisaaPelaaja(p, l, k, muriaaninKuvat));
268        kentta.SetTileMethod('K', (p, l, k) => LisaaPelaaja(p, l, k, knihdinKuvat));
269        kentta.SetTileMethod('N', (p, l, k) => LisaaPelaaja(p, l, k, mankinKuvat));
270        kentta.Execute(RUUDUN_KOKO, RUUDUN_KOKO);
271        //Level.CreateBorders();
272        Level.Background.CreateGradient(Color.White, Color.SkyBlue);
273    }
274
275    void LisaaTaso(Vector paikka, double leveys, double korkeus)
276    {
277        PhysicsObject taso = PhysicsObject.CreateStaticObject(leveys, korkeus);
278        taso.Position = paikka;
279        taso.Color = Color.Green;
280        Add(taso);
281    }
282
283    void LisaaPohjaTaso(Vector paikka, double leveys, double korkeus)
284    {
285        PhysicsObject taso = PhysicsObject.CreateStaticObject(leveys * 100, korkeus);
286        taso.Position = paikka;
287        taso.Color = Color.Green;
288        Add(taso);
289    }
290
291    void LisaaTahti(Vector paikka, double leveys, double korkeus)
292    {
293        PhysicsObject tahti = PhysicsObject.CreateStaticObject(leveys, korkeus);
294        tahti.IgnoresCollisionResponse = true;
295        tahti.Position = paikka;
296        tahti.Image = tahtiKuva;
297        tahti.Tag = "tahti";
298        Add(tahti);
299    }
300
301    void LisaaPelaaja(Vector paikka, double leveys, double korkeus, Image[] kuvat)
302    {
303        Tiernapoika poika = new Tiernapoika(this, leveys * 4, korkeus * 4, kuvat);
304        poika.Position = paikka;
305        poika.Color = Color.Red;
306
307        AddCollisionHandler(poika, "tahti", TormaaTahteen);
308        // Add(poika1.KiinnitysVartaloon);
309        pojat.Add(poika);
310    }
311
312    void LisaaNappaimet(GamePad controller, Tiernapoika poika)
313    {
314
315        Keyboard.Listen(Key.Left, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", poika, -nopeus);
316        Keyboard.Listen(Key.Right, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", poika, nopeus);
317        Keyboard.Listen(Key.Up, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", poika, hyppyNopeus);
318        Keyboard.Listen(Key.Down, ButtonState.Pressed, Polvistu, "Pelaaja hyppää", poika, hyppyNopeus);
319
320        controller.Listen(Button.Back, ButtonState.Pressed, Exit, "Poistu pelistä");
321        controller.Listen(Button.DPadLeft, ButtonState.Down, Liikuta, "Pelaaja liikkuu vasemmalle", poika, -nopeus);
322        controller.Listen(Button.DPadRight, ButtonState.Down, Liikuta, "Pelaaja liikkuu oikealle", poika, nopeus);
323        controller.Listen(Button.DPadUp, ButtonState.Down, Pois, "Pelaaja poispäin", poika, nopeus);
324        controller.Listen(Button.DPadDown, ButtonState.Down, Takaisin, "Pelaaja takaisinpäin", poika, nopeus);
325        controller.Listen(Button.Y, ButtonState.Down, Nouse, "Pelaaja nousee", poika, -nopeus);
326        controller.Listen(Button.A, ButtonState.Down, Polvistu, "Pelaaja polvistuu", poika, nopeus);
327        controller.Listen(Button.RightTrigger, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", poika, hyppyNopeus);
328        controller.Listen(Button.X, ButtonState.Pressed, () => poika.MiekkaTuppeen(), "Miekka tuppeen");
329        controller.Listen(Button.B, ButtonState.Pressed, () => poika.MiekkaEsiin(), "Miekka esiin");
330
331        controller.ListenAnalog(AnalogControl.RightStick, 0.03, LiikutaKatta, "Liikuta kättä", poika);
332
333        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
334    }
335
336    void LiikutaKatta(AnalogState a, Tiernapoika poika)
337    {
338        double kulma = a.StateVector.Y * 90;
339        poika.LiikkuvaOsa.Tavoite = Angle.FromDegrees(kulma);
340    }
341
342    void Liikuta(Tiernapoika hahmo, double nopeus)
343    {
344        hahmo.Walk(nopeus);
345    }
346
347    void Polvistu(Tiernapoika hahmo, double nopeus)
348    {
349        hahmo.Polvistu(nopeus);
350    }
351
352    void Nouse(Tiernapoika hahmo, double nopeus)
353    {
354        hahmo.Nouse(nopeus);
355    }
356
357    void Pois(Tiernapoika hahmo, double nopeus)
358    {
359        hahmo.Pois(nopeus);
360    }
361
362    void Takaisin(Tiernapoika hahmo, double nopeus)
363    {
364        hahmo.Takaisin(nopeus);
365    }
366
367    void Hyppaa(Tiernapoika hahmo, double nopeus)
368    {
369        hahmo.Jump(nopeus);
370    }
371
372    void TormaaTahteen(PhysicsObject hahmo, PhysicsObject tahti)
373    {
374        maaliAani.Play();
375        MessageDisplay.Add("Keräsit tähden!");
376        tahti.Destroy();
377    }
378}
Note: See TracBrowser for help on using the repository browser.