source: 2015/27/PietuR/SoHaG/SoHaG/SoHaG/SoHaG.cs @ 6691

Revision 6691, 12.1 KB checked in by pimaeeru, 4 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8
9public class SoHaG : PhysicsGame
10{
11    //Korjaa sirut
12    //TODO Lisää avain
13    //TODO Lisää valikko
14    //TODO Lisää kenttiä
15
16    int Kenttia = 3;
17
18
19    Image SeinanKuva = LoadImage("Seina1");
20    Image Seinan2Kuva = LoadImage("Seina2");
21    Image Tyypin1Kuva = LoadImage("Tyyppi1");
22    Image Tyypin2Kuva = LoadImage("Tyyppi2");
23    Image Tyypin3Kuva = LoadImage("Tyyppi3");
24    Image Tyypin4Kuva = LoadImage("Tyyppi4");
25    Image NappulanKuva = LoadImage("Nappula");
26    Image ValonKuva = LoadImage("Valo");
27    Image LattianKuva = LoadImage("Lattia");
28    Image LaatanKuva = LoadImage("Lattialaatta");
29    Image Vihun1Kuva = LoadImage("Greed");
30    Image Vihun2Kuva = LoadImage("Hope");
31    Image Sirunkuva = LoadImage("Shard");
32    Image TaskuvalonKuva = LoadImage("Taskulampunvalo");
33    SoundEffect Reversed = LoadSoundEffect("Reversed");
34    SoundEffect Sinister = LoadSoundEffect("Sinister");
35    SoundEffect Button = LoadSoundEffect("Button");
36    SoundEffect GhostKid = LoadSoundEffect("Ghost Kid");
37    SoundEffect Scream = LoadSoundEffect("Scream");
38   
39
40    PhysicsObject Tyyppi1;
41    PhysicsObject Tyyppi2;
42    PhysicsObject Tyyppi3;
43    PhysicsObject Tyyppi4;
44
45    List<Vector> Spawnit = new List<Vector>();
46    List<Vector> VihuSpawnit = new List<Vector>();
47    List<Vector> SiruSpawnit = new List<Vector>();
48
49    List<SoundEffect> soitettu = new List<SoundEffect>();
50
51    public override void Begin()
52    {
53       
54        LuoKentta(RandomGen.NextInt(1, Kenttia+1));
55        Tyyppi1 = Luotyyppi(Tyypin1Kuva);
56        Tyyppi2 = Luotyyppi(Tyypin2Kuva);
57        Tyyppi3 = Luotyyppi(Tyypin3Kuva);
58        Tyyppi4 = Luotyyppi(Tyypin4Kuva);
59
60        Camera.Follow(Tyyppi1, Tyyppi2, Tyyppi3, Tyyppi4);
61
62        LuoShadow();
63        LuoShadow();
64        LuoShadow();
65        LuoHope();
66
67        MediaPlayer.Play(RandomGen.SelectOne("Day of Chaos", "Echoes of Time", "Evening of Chaos", "Night of Chaos", "Penumbra"));
68        GhostKid.Play();
69
70
71        //Timer näkyvyysAjastin = new Timer();
72        //näkyvyysAjastin.Interval = 0.05;
73        //näkyvyysAjastin.Timeout += delegate
74        //{
75        //    Tarkistanakyvyys(Tyyppi1);
76        //    Tarkistanakyvyys(Tyyppi2);
77        //    Tarkistanakyvyys(Tyyppi3);
78        //    Tarkistanakyvyys(Tyyppi4);
79        //};
80        //näkyvyysAjastin.Start();
81
82        Keyboard.Listen(Key.Up, ButtonState.Down, Liikuta, "Liikuttaa pelaajaa1", Tyyppi1, Direction.Up);
83        Keyboard.Listen(Key.Down, ButtonState.Down, Liikuta, "Liikuttaa pelaajaa1", Tyyppi1, Direction.Down);
84        Keyboard.Listen(Key.Left, ButtonState.Down, Liikuta, "Liikuttaa pelaajaa1", Tyyppi1, Direction.Left);
85        Keyboard.Listen(Key.Right, ButtonState.Down, Liikuta, "Liikuttaa pelaajaa1", Tyyppi1, Direction.Right);
86
87        Keyboard.Listen(Key.W, ButtonState.Down, Liikuta, "Liikuttaa pelaajaa2", Tyyppi2, Direction.Up);
88        Keyboard.Listen(Key.S, ButtonState.Down, Liikuta, "Liikuttaa pelaajaa2", Tyyppi2, Direction.Down);
89        Keyboard.Listen(Key.A, ButtonState.Down, Liikuta, "Liikuttaa pelaajaa2", Tyyppi2, Direction.Left);
90        Keyboard.Listen(Key.D, ButtonState.Down, Liikuta, "Liikuttaa pelaajaa2", Tyyppi2, Direction.Right);
91
92        Keyboard.Listen(Key.I, ButtonState.Down, Liikuta, "Liikuttaa pelaajaa3", Tyyppi3, Direction.Up);
93        Keyboard.Listen(Key.K, ButtonState.Down, Liikuta, "Liikuttaa pelaajaa3", Tyyppi3, Direction.Down);
94        Keyboard.Listen(Key.J, ButtonState.Down, Liikuta, "Liikuttaa pelaajaa3", Tyyppi3, Direction.Left);
95        Keyboard.Listen(Key.L, ButtonState.Down, Liikuta, "Liikuttaa pelaajaa3", Tyyppi3, Direction.Right);
96
97        Keyboard.Listen(Key.NumPad8, ButtonState.Down, Liikuta, "Liikuttaa pelaajaa4", Tyyppi4, Direction.Up);
98        Keyboard.Listen(Key.NumPad5, ButtonState.Down, Liikuta, "Liikuttaa pelaajaa4", Tyyppi4, Direction.Down);
99        Keyboard.Listen(Key.NumPad4, ButtonState.Down, Liikuta, "Liikuttaa pelaajaa4", Tyyppi4, Direction.Left);
100        Keyboard.Listen(Key.NumPad6, ButtonState.Down, Liikuta, "Liikuttaa pelaajaa4", Tyyppi4, Direction.Right);
101
102        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
103    }
104
105    void Liikuta(PhysicsObject Tyyppi, Direction Suunta)
106    {
107        Tyyppi.Push(Suunta.GetVector()*3000);
108        Tyyppi.Angle = Tyyppi.Velocity.Angle;
109    }
110
111    void LuoKentta(int KenttaNumero)
112    {
113        Spawnit.Clear();
114        VihuSpawnit.Clear();
115
116        ColorTileMap Ruudut = ColorTileMap.FromLevelAsset("Kenttä"+KenttaNumero);
117        Ruudut.SetTileMethod(Color.FromHexCode("0026FF"), LuoTyypinpaikka);
118        Ruudut.SetTileMethod(Color.Black, LuoSeina);
119        Ruudut.SetTileMethod(Color.FromHexCode("7F0000"), LuoSeina2);
120        Ruudut.SetTileMethod(Color.FromHexCode("FF6A00"), LuoNappula);
121        Ruudut.SetTileMethod(Color.FromHexCode("00FFFF"), LuoSirunpaikka);
122        Ruudut.SetTileMethod(Color.Red, LuoVihunpaikka);
123        Ruudut.Execute(20, 20);
124        Level.Background.Image = LaatanKuva;
125        Level.Background.Color = Color.Black;
126        Level.Background.TileToLevel();
127        Level.Background.TextureWrapSize = new Vector(Ruudut.ColumnCount, Ruudut.RowCount);
128
129        GameObject Pimeys = new GameObject(Level.Width, Level.Height);
130        Pimeys.Color = new Color(0, 0, 0, 210);
131        Add(Pimeys, 2);
132
133    }
134
135    void LuoSeina(Vector Paikka, double leveys, double korkeus)
136    {
137        PhysicsObject Seina = PhysicsObject.CreateStaticObject(leveys, korkeus);
138        Seina.Position = Paikka;
139        Seina.Image = SeinanKuva;
140        Seina.CollisionIgnoreGroup = 1;
141        Add(Seina);
142    }
143    void LuoSeina2(Vector Paikka, double leveys, double korkeus)
144    {
145        PhysicsObject Seina2 = PhysicsObject.CreateStaticObject(leveys, korkeus);
146        Seina2.Position = Paikka;
147        Seina2.Image = Seinan2Kuva;
148        Seina2.CollisionIgnoreGroup = 1;
149        Add(Seina2);
150    }
151    void LuoSiru()
152    {
153        PhysicsObject Siru = new PhysicsObject(20, 20);
154        Siru.Image = Sirunkuva;
155        Siru.Shape = Shape.Circle;
156        Add(Siru);
157
158        AddCollisionHandler(Siru, "Tyyppi", delegate(PhysicsObject N, PhysicsObject T)
159        {
160            Siru.Destroy();
161        });
162
163    }
164
165    void LuoVihu(Image kuva, double speed, bool liikkuuPimeassa, SoundEffect aani)
166    {
167        PhysicsObject Vihu = new PhysicsObject(218 * 0.21, 319 * 0.1);
168        Vihu.LinearDamping = 0.5;
169        Vihu.AngularDamping = 0.7;
170        Vihu.Image = kuva;
171        Vihu.Shape = Shape.Circle;
172        Vector Paikka = RandomGen.SelectOne<Vector>(VihuSpawnit);
173        VihuSpawnit.Remove(Paikka);
174        Vihu.Position = Paikka;
175        Vihu.Tag = "Vihu";
176        Vihu.CollisionIgnoreGroup = 1;
177
178        RandomMoverBrain satunnaisAivot = new RandomMoverBrain(speed);
179        satunnaisAivot.TurnWhileMoving = true;
180
181        FollowerBrain seuraajanAivot = new FollowerBrain(Tyyppi1, Tyyppi2, Tyyppi3, Tyyppi4);
182        seuraajanAivot.Speed = speed;
183        seuraajanAivot.TurnWhileMoving = true;
184        seuraajanAivot.DistanceFar = 600;
185        seuraajanAivot.FarBrain = satunnaisAivot;
186
187        Vihu.Brain = seuraajanAivot;
188
189        Timer päivitysAjastin = new Timer();
190        päivitysAjastin.Interval = 0.05;
191        päivitysAjastin.Timeout += delegate
192        {
193            Tarkistanakyvyys(Vihu);
194
195            if (liikkuuPimeassa)
196            {
197                if (Vihu.IsVisible)
198                {
199                    Vihu.Brain = null;
200                    SoitaAani(aani);
201                }
202                else
203                {
204                    Vihu.Brain = seuraajanAivot;
205                }
206            }
207            else
208            {
209                if (Vihu.IsVisible)
210                {
211                    Vihu.Brain = seuraajanAivot;
212                    SoitaAani(aani);
213                }
214                else
215                {
216                    Vihu.Brain = null;
217                }
218            }
219        };
220        päivitysAjastin.Start();
221
222        Add(Vihu);
223    }
224
225    void SoitaAani(SoundEffect aani)
226    {
227        if (!soitettu.Contains(aani))
228        {
229            soitettu.Add(aani);
230            aani.Play();
231            Timer.SingleShot(4, delegate { soitettu.Remove(aani); });
232        }
233    }
234
235    void LuoShadow()
236    {
237        LuoVihu(Vihun1Kuva, 100, true, Sinister);
238    }
239    void LuoHope()
240    {
241        LuoVihu(Vihun2Kuva, 500, false, Reversed);
242    }
243    void LuoNappula(Vector Paikka, double leveys, double korkeus)
244    {
245        PhysicsObject Nappula = PhysicsObject.CreateStaticObject(leveys, korkeus);
246        Nappula.Position = Paikka;
247        Nappula.Image = NappulanKuva;
248        Nappula.CollisionIgnoreGroup = 1;
249        Add(Nappula);
250
251        DoubleMeter Energia = new DoubleMeter(1, 0, 100);
252        ProgressBar Energiapalkki = new ProgressBar(20, 5);
253        Energiapalkki.Y = 20;
254        Energiapalkki.BarColor = Color.Yellow;
255        Energiapalkki.Color = Color.Black;
256        Energiapalkki.BindTo(Energia);
257        Nappula.Add(Energiapalkki);
258
259        Timer Ajastin = new Timer();
260        Ajastin.Interval = 0.2;
261        Ajastin.Timeout += delegate { Energia.Value -= 1; };
262        Ajastin.Start();
263
264        GameObject Valo = new GameObject(300, 300);
265        Valo.Position = Paikka;
266        Valo.Tag = "valo";
267        Valo.Image = ValonKuva;
268        Add(Valo, 3);
269
270        Energia.LowerLimit += delegate { Valo.IsVisible = false; };
271        AddCollisionHandler(Nappula, "Tyyppi", delegate(PhysicsObject N, PhysicsObject T)
272        {
273            Energia.Value = Energia.MaxValue;
274            Button.Play();
275            Valo.IsVisible = true;
276        });
277
278
279    }
280    PhysicsObject Luotyyppi(Image Kuva)
281    {
282        PhysicsObject Tyyppi = new PhysicsObject(218 * 0.1, 319 * 0.1);
283        Tyyppi.LinearDamping = 0.5;
284        Tyyppi.AngularDamping = 0.7;
285        Tyyppi.Image = Kuva;
286        Tyyppi.Shape = Shape.Circle;
287        Vector Paikka = RandomGen.SelectOne<Vector>(Spawnit);
288        Spawnit.Remove(Paikka);
289        Tyyppi.Position = Paikka;
290        Tyyppi.Tag = "Tyyppi";
291        Add(Tyyppi, 3);
292
293        GameObject Valo = new GameObject(300, 300);
294        //Valo.Position = Paikka;
295        Valo.Tag = "valo";
296        Valo.Image = TaskuvalonKuva;
297        Valo.X = 25;
298        Valo.Y = 5;
299        Tyyppi.Add(Valo);
300
301        AddCollisionHandler(Tyyppi, "Vihu", delegate(PhysicsObject N, PhysicsObject T)
302        {
303            Tyyppi.Destroy();
304            Scream.Play();
305        });
306
307        return Tyyppi;
308    }
309    void LuoTyypinpaikka(Vector Paikka, double leveys, double korkeus)
310    {
311        Spawnit.Add(Paikka);
312    }
313
314    void LuoSirunpaikka(Vector Paikka, double leveys, double korkeus)
315    {
316        SiruSpawnit.Add(Paikka);
317    }
318
319    void LuoVihunpaikka(Vector Paikka, double leveys, double korkeus)
320    {
321        VihuSpawnit.Add(Paikka);
322        VihuSpawnit.Add(Paikka);
323    }
324
325    void Tarkistanakyvyys(PhysicsObject Olio)
326    {
327        bool piilossa = true;
328
329        // Kentässä olevat valot.
330        foreach (var valo in GetObjectsWithTag("valo"))
331        {
332            if (valo.IsVisible && Vector.Distance(valo.Position, Olio.Position) < valo.Width * 0.5)
333            {
334                piilossa = false;
335                break;
336            }
337        }
338
339        PhysicsObject[] pelaajat = { Tyyppi1, Tyyppi2, Tyyppi3, Tyyppi4 };
340        double lampunPituus = 300 * 0.5;
341        double lampunKulma = 45;
342
343        // Pelaajan taskulamppu.
344        foreach (var pelaaja in pelaajat)
345        {
346            if (pelaaja.IsDestroyed)
347                continue;
348
349            Angle kulma = (Olio.Position - pelaaja.Position).Angle;
350            if (Math.Abs(kulma.Degrees - pelaaja.Angle.Degrees) < lampunKulma && Vector.Distance(pelaaja.Position, Olio.Position) < lampunPituus)
351            {
352                piilossa = false;
353            }
354        }
355
356        Olio.IsVisible = !piilossa;
357    }
358}
Note: See TracBrowser for help on using the repository browser.