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

Revision 4802, 8.7 KB checked in by vesal, 7 years ago (diff)

Lisää tiernapoikia

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 double korkeus;
13    private KaantyvaOsa liikkuvaOsa;
14
15    public KaantyvaOsa LiikkuvaOsa
16    {
17        get { return liikkuvaOsa; }
18    }
19    private AxleJoint kiinnitysVartaloon;
20
21    public AxleJoint KiinnitysVartaloon
22    {
23        get { return kiinnitysVartaloon; }
24    }
25
26    public Tiernapoika(double leveys, double korkeus, Image kuva, Image kasikuva)
27        : base(leveys,korkeus)
28    {
29        // Pojan oikea käsi
30        liikkuvaOsa = new KaantyvaOsa(leveys, korkeus / 4);
31        liikkuvaOsa.X = Right - Width / 10;
32        liikkuvaOsa.Y = Top - Height / 4;
33        liikkuvaOsa.Color = Color.Gray;
34        Add(liikkuvaOsa);
35        kiinnitysVartaloon = new AxleJoint(this, liikkuvaOsa, new Vector(Right, liikkuvaOsa.Y));
36        kiinnitysVartaloon.Softness = 0;
37        // Add(kiinnitysVartaloon);
38        // Poika ja käsi eivät saa törmätä toisiinsa
39        CollisionIgnoreGroup = 1;
40        liikkuvaOsa.CollisionIgnoreGroup = 1;
41        liikkuvaOsa.Image = kasikuva;
42        Image = kuva;
43        DirectionChanged += new Action<Direction>(Kaantyi);
44        this.korkeus = korkeus;
45        Mass = 40000.0;
46    }
47
48    private void Kaantyi(Direction suunta)
49    {
50        if ( suunta == Direction.Left )
51            liikkuvaOsa.X = -Width/2 * 0.9;
52        else
53            liikkuvaOsa.X = Width/2*0.9;
54        liikkuvaOsa.Suunta = suunta;
55
56
57    }
58
59
60
61    internal void Nouse(double nopeus)
62    {
63        Height = korkeus;
64    }
65
66    internal void Polvistu(double nopeus)
67    {
68        Height = korkeus / 2;
69    }
70}
71
72/// @author  Vesa Lappalainen
73/// @version 16.10.2011
74/// <summary>
75/// Osa, jolle voidaan asettaa suunta johon se pyrkii.
76/// </summary>
77public class KaantyvaOsa : PhysicsObject
78{
79    private Angle oikea = Angle.FromDegrees(0);
80    private Angle vasen = Angle.FromDegrees(180);
81    private Angle suuntaero = Angle.FromDegrees(0);
82    private int s = 1;
83    /// <summary>
84    /// Tavoitekulma, johon maila pyrkii osoittamaan
85    /// </summary>
86    public Angle Tavoite { get { return tavoite; } set { tavoite = value ; saavutettu = false; } }
87    private Angle tavoite;
88    private bool saavutettu = true;
89    public Direction Suunta
90    {
91        set
92        {
93            if (value == Direction.Left) { suuntaero = vasen; s = -1; } else { suuntaero = oikea; s = 1; }
94            Tavoite = Tavoite;
95    } }
96
97    public KaantyvaOsa(double width, double height)
98        : base(width, height)
99    {
100        // MakeStatic();
101        Mass = 10000;
102        IgnoresGravity = true;
103        IsUpdated = true;
104    }
105
106
107    /// <summary>
108    /// Uusi versio Update-metodista, jossa nyt käännetään mailaa kohti tavoitekulmaa.
109    /// </summary>
110    /// <param name="time">Peliaika</param>
111    public override void Update(Time time)
112    {
113        if (saavutettu) { base.Update(time); return; }
114        Angle diff = s * Tavoite + suuntaero - Angle;
115        double suunta = diff.Degrees;
116        double d = 2;
117        if (Math.Abs(suunta) > d)
118        {
119            this.StopAngular();
120            this.ApplyTorque(10000000 * 35.0 * suunta); // kokeiltu hihavakio
121        }
122        else
123        {
124            Stop();
125            saavutettu = true;
126        }
127        base.Update(time);
128    }
129}
130
131
132
133public class Tiernapojat : PhysicsGame
134{
135
136    private static readonly string[] taso0 = {
137"         *            ",
138"         #            ",
139"                      ",
140"                      ",
141"                      ",
142"                      ",
143"                      ",
144"                      ",
145"                      ",
146"                      ",
147"                      ",
148"                      ",
149"                      ",
150"                      ",
151"                      ",
152"   N   N  N  N        ",
153"=                     ",
154                                             };
155
156
157    const double nopeus = 200;
158    const double hyppyNopeus = 750;
159    const int RUUDUN_KOKO = 40;
160
161    private List<Tiernapoika> pojat = new List<Tiernapoika>();
162
163    private Image pelaajanKuva = LoadImage("norsu");
164    private Image tahtiKuva = LoadImage("tahti");
165
166    private SoundEffect maaliAani = LoadSoundEffect("maali");
167
168    public override void Begin()
169    {
170        GamePad[] ohjaimet = { ControllerOne, ControllerTwo, ControllerThree, ControllerFour };
171        Gravity = new Vector(0, -1000);
172
173        LuoKentta();
174
175        int ci = 0;
176        foreach (Tiernapoika poika in pojat)
177        {
178            LisaaNappaimet(ohjaimet[ci++], poika);
179            if (ci >= ohjaimet.Length) break;
180        }
181
182        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
183        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
184
185       // Camera.Follow(poika1);
186        Camera.ZoomFactor = 1.5;
187        //Camera.ZoomToAllObjects(0);
188       // Camera.StayInLevel = true;
189    }
190
191    void LuoKentta()
192    {
193        // TileMap kentta = TileMap.FromLevelAsset("kentta1");
194        TileMap kentta = TileMap.FromStringArray(taso0);
195        kentta.SetTileMethod('#', LisaaTaso);
196        kentta.SetTileMethod('=', LisaaPohjaTaso);
197        kentta.SetTileMethod('*', LisaaTahti);
198        kentta.SetTileMethod('N', LisaaPelaaja);
199        kentta.Execute(RUUDUN_KOKO, RUUDUN_KOKO);
200        //Level.CreateBorders();
201        Level.Background.CreateGradient(Color.White, Color.SkyBlue);
202    }
203
204    void LisaaTaso(Vector paikka, double leveys, double korkeus)
205    {
206        PhysicsObject taso = PhysicsObject.CreateStaticObject(leveys, korkeus);
207        taso.Position = paikka;
208        taso.Color = Color.Green;
209        Add(taso);
210    }
211
212    void LisaaPohjaTaso(Vector paikka, double leveys, double korkeus)
213    {
214        PhysicsObject taso = PhysicsObject.CreateStaticObject(leveys*100, korkeus);
215        taso.Position = paikka;
216        taso.Color = Color.Green;
217        Add(taso);
218    }
219
220    void LisaaTahti(Vector paikka, double leveys, double korkeus)
221    {
222        PhysicsObject tahti = PhysicsObject.CreateStaticObject(leveys, korkeus);
223        tahti.IgnoresCollisionResponse = true;
224        tahti.Position = paikka;
225        tahti.Image = tahtiKuva;
226        tahti.Tag = "tahti";
227        Add(tahti);
228    }
229
230    void LisaaPelaaja(Vector paikka, double leveys, double korkeus)
231    {
232        Tiernapoika poika = new Tiernapoika(leveys*4, korkeus*4,pelaajanKuva, LoadImage("kasi"));
233        poika.Position = paikka;
234        poika.Color = Color.Red;
235
236        AddCollisionHandler(poika, "tahti", TormaaTahteen);
237        // Add(poika1.KiinnitysVartaloon);
238        Add(poika);
239        pojat.Add(poika);
240    }
241
242    void LisaaNappaimet(GamePad controller, Tiernapoika poika)
243    {
244
245        Keyboard.Listen(Key.Left, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", poika, -nopeus);
246        Keyboard.Listen(Key.Right, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", poika, nopeus);
247        Keyboard.Listen(Key.Up, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", poika, hyppyNopeus);
248
249        controller.Listen(Button.Back, ButtonState.Pressed, Exit, "Poistu pelistä");
250        controller.Listen(Button.DPadLeft, ButtonState.Down, Liikuta, "Pelaaja liikkuu vasemmalle", poika, -nopeus);
251        controller.Listen(Button.DPadRight, ButtonState.Down, Liikuta, "Pelaaja liikkuu oikealle", poika, nopeus);
252        controller.Listen(Button.DPadUp, ButtonState.Down, Nouse, "Pelaaja nousee", poika, -nopeus);
253        controller.Listen(Button.DPadDown, ButtonState.Down, Polvistu, "Pelaaja polvistuu", poika, nopeus);
254        controller.Listen(Button.A, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", poika, hyppyNopeus);
255
256        controller.ListenAnalog(AnalogControl.RightStick, 0.03, LiikutaKatta, "Liikuta kättä", poika);
257
258        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
259    }
260
261    void LiikutaKatta(AnalogState a, Tiernapoika poika)
262    {
263        double kulma = a.StateVector.Y * 90;
264        poika.LiikkuvaOsa.Tavoite = Angle.FromDegrees(kulma);
265    }
266
267    void Liikuta(Tiernapoika hahmo, double nopeus)
268    {
269        hahmo.Walk(nopeus);
270    }
271
272    void Polvistu(Tiernapoika hahmo, double nopeus)
273    {
274        hahmo.Polvistu(nopeus);
275    }
276
277    void Nouse(Tiernapoika hahmo, double nopeus)
278    {
279        hahmo.Nouse(nopeus);
280    }
281
282    void Hyppaa(Tiernapoika hahmo, double nopeus)
283    {
284        hahmo.Jump(nopeus);
285    }
286
287    void TormaaTahteen(PhysicsObject hahmo, PhysicsObject tahti)
288    {
289        maaliAani.Play();
290        MessageDisplay.Add("Keräsit tähden!");
291        tahti.Destroy();
292    }
293}
Note: See TracBrowser for help on using the repository browser.