source: 2012/26/VilleS/Garden_Run/Garden_Run/Garden_Run/Garden_Run.cs @ 3486

Revision 3486, 10.4 KB checked in by vivasuom, 8 years ago (diff)

Talletus.

Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8
9public class Garden_Run : PhysicsGame
10{
11    const double nopeus = 10000;
12    const double hyppyNopeus = 1000;
13    const int RUUDUN_KOKO = 100;
14
15    PhysicsObject pelaaja;
16    PhysicsObject maali;
17
18    Image pelaajanKuva = LoadImage("PelaajanKuva");
19    Image tahtiKuva = LoadImage("tahti");
20    Image puskaKuva = LoadImage("puska");
21    Image monsteriKuva = LoadImage("monsteri");
22    Image maaliKuva = LoadImage("trapdoor");
23
24    SoundEffect maaliAani = LoadSoundEffect("maali");
25
26    int kentanNro = 1;
27    IntMeter tahtilaskuri;
28    IntMeter hpLaskuri;
29
30    public override void Begin()
31    {
32        SeuraavaKentta(kentanNro);
33    }
34
35    void SeuraavaKentta(int kenttaNro)
36    {
37        ClearAll();
38        hpLaskuri = new IntMeter(10, 0, 10);
39        hpLaskuri.LowerLimit += PeliHavitty;
40
41        Label hpNaytto = new Label();
42        hpNaytto.BindTo(hpLaskuri);
43        hpNaytto.Color = Color.Black;
44        hpNaytto.TextColor = Color.White;
45        hpNaytto.Position = new Vector(Screen.Right - 50, Screen.Top - 50);
46        Add(hpNaytto);
47
48        if (kenttaNro == 1) LuoKentta("kentta1", "kentta1reitti");
49        else if (kenttaNro == 2) LuoKentta("kentta2", null);
50        LisaaOhjaimet();
51
52        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
53        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
54
55        Level.Background.Image = LoadImage("tausta");
56        Level.Background.FitToLevel();
57        Camera.StayInLevel = true;
58        Camera.Zoom(2.3);
59        Camera.Follow(pelaaja);
60    }
61
62    void PeliHavitty()
63    {
64        ClearAll();
65        Label label = new Label("Hävisit pelin");
66        Add(label);
67    }
68
69    void LuoKentta(string kentta, string kenttaReitti)
70    {
71        List<Vector> vihujenReitti = null;
72        if (kenttaReitti != null)
73        {
74            TileMap kentta1reitti = TileMap.FromLevelAsset(kenttaReitti);
75            vihujenReitti = TeeVihujenReitti(kentta1reitti.Tiles);
76        }
77
78        tahtilaskuri = new IntMeter(0);
79        tahtilaskuri.MinValue = 0;
80        tahtilaskuri.LowerLimit += delegate
81        {
82            maali.Image = LoadImage("trapdoor_open");
83            AddCollisionHandler(pelaaja, "maali", PelaajaSaapuiMaaliin);
84        };
85
86        pelaaja = new PhysicsObject(RUUDUN_KOKO / 1.5, RUUDUN_KOKO / 1.5);
87
88        ColorTileMap kentta1 = ColorTileMap.FromLevelAsset(kentta);
89        kentta1.ColorTolerance = 1;
90        kentta1.SetTileMethod(Color.Yellow, LuoTahti);
91        kentta1.SetTileMethod(Color.Black, LuoPuska);
92        kentta1.SetTileMethod(Color.Blue, LisaaPelaaja);
93        kentta1.SetTileMethod(Color.Red, delegate(Vector paikka, double leveys, double korkeus) { LuoMonsteri(paikka, leveys, korkeus, vihujenReitti); }); // PFB vihu
94        kentta1.SetTileMethod(Color.White, delegate(Vector paikka, double leveys, double korkeus) { LuoMonsteri(paikka, leveys, korkeus); }); //seuraaja vihu
95        kentta1.SetTileMethod(new Color(127, 51, 0), LuoMaali);
96        kentta1.Execute(RUUDUN_KOKO, RUUDUN_KOKO);
97        Camera.ZoomToLevel();
98        Level.CreateBorders();
99    }
100
101    void PelaajaSaapuiMaaliin(PhysicsObject pelaaja, PhysicsObject maali)
102    {
103        MessageDisplay.Add("Maalissa");
104        SeuraavaKentta(2);
105    }
106
107    private List<Vector> TeeVihujenReitti(char[,] ruudut)
108    {
109        List<Vector> reitti = new List<Vector>();
110        int riveja = ruudut.GetLength(0);
111        int sarakkeita = ruudut.GetLength(1);
112        int mikaSeuraavaksi = 1;
113        int i = 0;
114        while (i < ruudut.Length)
115        {
116            int rivi = i / ruudut.GetLength(0);
117            int sarake = i % ruudut.GetLength(1);
118            if (ruudut[rivi, sarake].ToString() == mikaSeuraavaksi.ToString())
119            {
120                double etaisyysVasemmastareunasta = (-sarakkeita * RUUDUN_KOKO / 2) + sarake * RUUDUN_KOKO + RUUDUN_KOKO / 2;
121                double etaisyysYlareunasta = riveja * RUUDUN_KOKO / 2 - rivi * RUUDUN_KOKO - RUUDUN_KOKO / 2;
122                reitti.Add(new Vector(etaisyysVasemmastareunasta, etaisyysYlareunasta));
123                i = 0;
124                mikaSeuraavaksi++;
125            }
126            else
127            {
128                i++;
129            }
130        }
131        return reitti;
132    }
133
134    void LuoEste(Vector paikka, double leveys, double korkeus)
135    {
136        PhysicsObject este = PhysicsObject.CreateStaticObject(leveys, korkeus);
137        este.Position = paikka;
138        este.Shape = Shape.Pentagon;
139        este.Color = Color.Green;
140        Add(este);
141    }
142
143    void LuoPuska(Vector paikka, double leveys, double korkeus)
144    {
145        PhysicsObject puska = PhysicsObject.CreateStaticObject(leveys, korkeus);
146        puska.Position = paikka;
147        puska.Image = puskaKuva;
148        puska.Tag = "puska";
149        Add(puska);
150    }
151
152    void LuoTahti(Vector paikka, double leveys, double korkeus)
153    {
154        PhysicsObject tahti = PhysicsObject.CreateStaticObject(leveys, korkeus);
155        tahti.IgnoresCollisionResponse = true;
156        tahti.Position = paikka;
157        tahti.Image = tahtiKuva;
158        tahti.Tag = "tahti";
159        tahtilaskuri.Value++;
160        Add(tahti);
161    }
162
163    void LisaaPelaaja(Vector paikka, double leveys, double korkeus)
164    {
165        pelaaja.Position = paikka;
166        pelaaja.Mass = 4.0;
167        pelaaja.Image = pelaajanKuva;
168        AddCollisionHandler(pelaaja, "tahti", TormaaTahteen);
169        AddCollisionHandler<PhysicsObject, Vihu>(pelaaja, delegate(PhysicsObject p, Vihu v) { hpLaskuri.Value--; });
170        pelaaja.CollisionIgnoreGroup = 2;
171        pelaaja.AngularDamping = 0.9;
172        pelaaja.LinearDamping = 0.9;
173        Add(pelaaja);
174    }
175
176    void LuoMonsteri(Vector paikka, double leveys, double korkeus)
177    {
178        Vihu monsteri = new Vihu(leveys / 1.5, korkeus / 1.5);
179        monsteri.Position = paikka;
180        monsteri.Mass = 2.0;
181        monsteri.Image = monsteriKuva;
182        Add(monsteri);
183
184        FollowerBrain seuraaja = new FollowerBrain(pelaaja);
185        seuraaja.DistanceClose = 500;
186        seuraaja.DistanceFar = 500;
187        //         seuraaja.DistanceToTarget.AddTrigger(10, TriggerDirection.
188        seuraaja.DistanceToTarget.Changed += delegate
189        {
190            monsteri.Angle = (pelaaja.Position - monsteri.Position).Angle + Angle.FromDegrees(90);
191        };
192        monsteri.Brain = seuraaja;
193    }
194
195    void LuoMonsteri(Vector paikka, double leveys, double korkeus, List<Vector> reitti = null)
196    {
197        Vihu monsteri = new Vihu(leveys / 1.5, korkeus / 1.5);
198        monsteri.Position = paikka;
199        monsteri.Mass = 2.0;
200        monsteri.Image = monsteriKuva;
201        RandomMoverBrain satunnaisAivot = new RandomMoverBrain();
202        monsteri.CollisionIgnoreGroup = 2;
203        Add(monsteri);
204
205        if (reitti != null)
206        {
207            PathFollowerBrain polkuaivot = new PathFollowerBrain();
208            polkuaivot.Loop = true;
209            polkuaivot.Path = reitti.ToArray();
210            // monsteri.Brain = polkuaivot;
211            polkuaivot.Active = true;
212
213            FollowerBrain seuraaja = new FollowerBrain(pelaaja);
214            //seuraaja.DistanceClose = 300;
215            seuraaja.DistanceFar = 300;
216            seuraaja.FarBrain = polkuaivot;
217
218            monsteri.Brain = seuraaja;
219        }
220    }
221
222
223    void LuoMaali(Vector paikka, double leveys, double korkeus)
224    {
225        maali = PhysicsObject.CreateStaticObject(leveys, korkeus);
226        maali.IgnoresCollisionResponse = true;
227        maali.Position = paikka;
228        maali.Image = maaliKuva;
229        maali.Tag = "maali";
230        Add(maali);
231    }
232    void LisaaOhjaimet()
233    {
234        Keyboard.Listen(Key.A, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja, new Vector(-nopeus, 0));
235        Keyboard.Listen(Key.D, ButtonState.Down, Liikuta, "Liikkuu oikealle", pelaaja, new Vector(nopeus, 0));
236        Keyboard.Listen(Key.W, ButtonState.Down, Liikuta, "Liikkuu ylös", pelaaja, new Vector(0, nopeus));
237        Keyboard.Listen(Key.S, ButtonState.Down, Liikuta, "Liikkuu alas", pelaaja, new Vector(0, -nopeus));
238        Keyboard.Listen(Key.A, ButtonState.Released, Liikuta, null, pelaaja, Vector.Zero);
239        Keyboard.Listen(Key.D, ButtonState.Released, Liikuta, null, pelaaja, Vector.Zero);
240        Keyboard.Listen(Key.W, ButtonState.Released, Liikuta, null, pelaaja, Vector.Zero);
241        Keyboard.Listen(Key.S, ButtonState.Released, Liikuta, null, pelaaja, Vector.Zero);
242
243        Mouse.IsCursorVisible = false;
244        Mouse.ListenMovement(0.1, KuunteleLiiketta, null);
245        Mouse.Listen(MouseButton.Left, ButtonState.Pressed, ammu, "ammu", pelaaja);
246
247    }
248
249    void KuunteleLiiketta(AnalogState hiirenTila)
250    {
251        pelaaja.Angle = (Mouse.PositionOnWorld - pelaaja.Position).Angle + Angle.FromDegrees(90);
252
253    }
254
255    void Liikuta(PhysicsObject hahmo, Vector nopeus)
256    {
257        hahmo.Velocity = nopeus;
258    }
259
260
261    void TormaaTahteen(PhysicsObject hahmo, PhysicsObject tahti)
262    {
263        maaliAani.Play();
264        tahti.Destroy();
265        tahtilaskuri.Value--;
266        MessageDisplay.Add("Tähtiä jäljellä: " + tahtilaskuri.Value.ToString());
267    }
268
269    void ammu(PhysicsObject pelaaja)
270    {
271        PhysicsObject luoti = new PhysicsObject(5, 5);
272        luoti.Position = pelaaja.Position + Vector.FromLengthAndAngle(50, pelaaja.Angle - Angle.FromDegrees(90));
273        //luoti.Hit(Vector.FromLengthAndAngle(1000, (Mouse.PositionOnWorld - pelaaja.Position).Angle + Angle.FromDegrees(90)));
274        luoti.Hit(Vector.FromLengthAndAngle(1000, pelaaja.Angle - Angle.RightAngle));
275        luoti.CollisionIgnoreGroup = 2;
276        luoti.Shape = Shape.Circle;
277        luoti.Color = Color.Silver;
278        luoti.Tag = "pelaajanAmmus";
279        luoti.CollisionIgnoreGroup = 2;
280        AddCollisionHandler(luoti, CollisionHandler.DestroyObject);
281        AddCollisionHandler<PhysicsObject, Vihu>(luoti, delegate(PhysicsObject ammus, Vihu vihu) { vihu.elamaLaskuri.Value--; });
282        Add(luoti);
283    }
284}
285
286class Vihu : PhysicsObject
287{
288    public IntMeter elamaLaskuri = new IntMeter(10, 0, 10);
289
290    public Vihu(double leveys, double korkeus)
291        : base(leveys, korkeus)
292    {
293        elamaLaskuri.LowerLimit += delegate { this.Destroy(); };
294    }
295}
296
Note: See TracBrowser for help on using the repository browser.