source: 2014/30/AtteB/Peli/Peli/Peli/Peli.cs @ 5599

Revision 5599, 13.5 KB checked in by athebla, 6 years ago (diff)

Peli päivitetty + lisää tekstuureita #2

Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8
9class Vihollinen : PlatformCharacter
10{
11    private IntMeter elamaLaskuri;
12    public IntMeter ElamaLaskuri { get { return elamaLaskuri; } }
13
14    public Vihollinen(double leveys, double korkeus, int elama)
15        : base(leveys, korkeus)
16    {
17        elamaLaskuri = new IntMeter(elama, 0, elama);
18        elamaLaskuri.LowerLimit += delegate { this.Destroy(); };
19    }
20}
21
22class Inventory : Widget
23{
24
25    /// Tapahtuma, kun esine on valittu.
26    public event Action<PhysicsObject> ItemSelected;
27
28    /// Luo uuden esinevalikon.
29    public Inventory()
30        : base(new HorizontalLayout())
31    {
32    }
33
34    /// Lisää esineen.
35    public void AddItem(PhysicsObject item, Image kuva)
36    {
37        PushButton icon = new PushButton(kuva);
38        Add(icon);
39        icon.Clicked += delegate() { SelectItem(item); };
40    }
41
42    void SelectItem(PhysicsObject item)
43    {
44        if (ItemSelected != null)
45        {
46            ItemSelected(item);
47        }
48    }
49}
50
51public class Peli : PhysicsGame
52{
53    DoubleMeter elämäLaskuri;
54
55    AssaultRifle P1FireBall;
56
57    const double nopeus = 200;
58    const double hyppyNopeus = 750;
59    const int RUUDUN_KOKO = 40;
60
61    PlatformCharacter pelaaja1;
62    PhysicsObject Vihollinen;
63    Vihollinen Slime;
64
65    Image tahtiKuva = LoadImage("tahti");
66    Image StoneKuva = LoadImage("StoneWall");
67    Image StoneTaso = LoadImage("Stone_katto");
68    Image StoneKuva_katto = LoadImage("Stone_katto");
69    Image Pelaaja_Seisoo = LoadImage("Pelaaja_Seisoo");
70    Image Pelaaja_Juoksee = LoadImage("Pelaaja_Juoksee");
71    Image StoneBrickTaso = LoadImage("Stone_brick_tile");
72    Image Slime1 = LoadImage("Slime");
73    Image FireBall1 = LoadImage("FireBall_1");
74    Image FireBall2 = LoadImage("FireBall_2");
75    Image FireBall3 = LoadImage("FireBall_3");
76    Image FireBall4 = LoadImage("FireBall_4");
77    Image Clear = LoadImage("Clear");
78    Image Heart1 = LoadImage("heart");
79    Image SlimeBall = LoadImage("SlimeBall");
80
81    SoundEffect maaliAani = LoadSoundEffect("maali");
82    SoundEffect HowItBegins = LoadSoundEffect("HowItBegins");
83    SoundEffect PlayerShoot1 = LoadSoundEffect("PlayerShoot");
84
85    public override void Begin()
86    {
87        Gravity = new Vector(0, -1000);
88
89        IsMouseVisible = true;
90        SetWindowSize(1000, 800);
91
92        LuoKentta();
93        LisaaNappaimet();
94        LuoElämäLaskuri();
95
96        Camera.Follow(pelaaja1);
97        Camera.ZoomFactor = 1.2;
98        Camera.StayInLevel = true;
99
100        SmoothTextures = false;
101
102        Inventory inventory = new Inventory();
103        Add(inventory);
104
105        Camera.FollowedObject = pelaaja1;
106        Camera.Zoom(1.5);
107
108        MediaPlayer.Play("howitbegins");
109    }
110
111    void LuoKentta()
112    {
113        TileMap kentta = TileMap.FromLevelAsset("kentta1");
114        kentta.SetTileMethod('#', LisaaTaso);
115        kentta.SetTileMethod('N', LisaaPelaaja);
116        kentta.SetTileMethod('P', LisaaStoneLattia);
117        kentta.SetTileMethod('+', LisaaStoneKatto);
118        kentta.SetTileMethod('?', LisaaStoneBrickLattia);
119        kentta.SetTileMethod('S', LuoSlime);
120        kentta.SetTileMethod('H', LisaaHeart);
121        kentta.Execute(RUUDUN_KOKO, RUUDUN_KOKO);
122        Level.CreateBorders();
123        Level.Background.Image = StoneKuva;
124        Level.Background.TileToLevel();
125    }
126
127    void LisaaTaso(Vector paikka, double leveys, double korkeus)
128    {
129        PhysicsObject taso = PhysicsObject.CreateStaticObject(leveys, korkeus);
130        taso.Position = paikka;
131        taso.Image = StoneTaso;
132        Add(taso);
133    }
134
135    void LisaaStoneLattia(Vector paikka, double leveys, double korkeus)
136    {
137        PhysicsObject Stone = PhysicsObject.CreateStaticObject(leveys, korkeus);
138        Stone.IgnoresCollisionResponse = true;
139        Stone.Position = paikka;
140        Stone.Image = StoneKuva;
141        Add(Stone);
142       
143    }
144
145    void LisaaStoneBrickLattia(Vector paikka, double leveys, double korkeus)
146    {
147        PhysicsObject stoneBrick = PhysicsObject.CreateStaticObject(leveys, korkeus);
148        stoneBrick.IgnoresCollisionResponse = false;
149        stoneBrick.Position = paikka;
150        stoneBrick.Image = StoneBrickTaso;
151        Add(stoneBrick);
152
153    }
154
155    void LisaaStoneKatto(Vector paikka, double leveys, double korkeus)
156    {
157        PhysicsObject Stone = PhysicsObject.CreateStaticObject(leveys, korkeus);
158        Stone.IgnoresCollisionResponse = true;
159        Stone.Position = paikka;
160        Stone.Image = StoneKuva_katto;
161        Add(Stone);
162
163    }
164
165    void LisaaHeart(Vector paikka, double leveys, double korkeus)
166    {
167        PhysicsObject heart = PhysicsObject.CreateStaticObject(leveys, korkeus);
168        heart.IgnoresCollisionResponse = true;
169        heart.Position = paikka;
170        heart.Image = Heart1;
171        heart.Tag = "health";
172        Add(heart);
173    }
174
175    void LisaaPelaaja(Vector paikka, double leveys, double korkeus)
176    {
177        pelaaja1 = new PlatformCharacter(leveys, korkeus);
178        pelaaja1.Position = paikka;
179        pelaaja1.Mass = 10.0;
180        pelaaja1.Tag = "pelaaja";
181        pelaaja1.Image = Pelaaja_Seisoo;
182        AddCollisionHandler(pelaaja1, "vihollinen", PelaajaOsuuViholliseen);
183        AddCollisionHandler(pelaaja1, "health", PelaajaOsuuHeart);
184        Add(pelaaja1);
185
186        P1FireBall = new AssaultRifle(30, 10);
187
188        // Ammusten määrä
189        P1FireBall.Ammo.Value = 100000;
190
191        // Ammus osuu = mitä tapahtuu
192        P1FireBall.ProjectileCollision = AmmusOsuiViholliseen;
193        P1FireBall.Image = Clear;
194
195        pelaaja1.Add(P1FireBall);
196
197        P1FireBall.AttackSound = null;
198    }
199
200    void LisaaNappaimet()
201    {
202        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
203        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
204        Keyboard.Listen(Key.LeftShift, ButtonState.Down, AmmuAseella, "Ammu", P1FireBall);
205
206        Keyboard.Listen(Key.A, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja1, -nopeus);
207        Keyboard.Listen(Key.D, ButtonState.Down, Liikuta, "Liikkuu vasemmalle", pelaaja1, nopeus);
208        Keyboard.Listen(Key.W, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja1, hyppyNopeus);
209        Keyboard.Listen(Key.Space, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja1, hyppyNopeus);
210
211        ControllerOne.Listen(Button.Back, ButtonState.Pressed, Exit, "Poistu pelistä");
212
213        ControllerOne.Listen(Button.DPadLeft, ButtonState.Down, Liikuta, "Pelaaja liikkuu vasemmalle", pelaaja1, -nopeus);
214        ControllerOne.Listen(Button.DPadRight, ButtonState.Down, Liikuta, "Pelaaja liikkuu oikealle", pelaaja1, nopeus);
215        ControllerOne.Listen(Button.A, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja1, hyppyNopeus);
216
217        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
218    }
219
220    void Liikuta(PlatformCharacter hahmo, double nopeus)
221    {
222        hahmo.Walk(nopeus);
223    }
224
225    void Hyppaa(PlatformCharacter hahmo, double nopeus)
226    {
227        hahmo.Jump(nopeus);
228    }
229
230    void LuoVihollinen(Vector paikka, double leveys, double korkeus)
231    {
232        PhysicsObject vihollinen = new PhysicsObject(leveys, korkeus);
233        vihollinen.Position = paikka;
234        vihollinen.Tag = "vihollinen";
235        //AddCollisionHandler(vihollinen, "ammus", AmmusOsuiViholliseen);
236        Add(vihollinen);
237    }
238
239    void LuoHealthPotion(Vector paikka, double leveys, double korkeus)
240    {
241        PhysicsObject potion = new PhysicsObject(leveys, korkeus);
242        potion.Position = paikka;
243        potion.Tag = "health";
244        Add(potion);
245    }
246
247    public void PelaajaOsuuViholliseen(PhysicsObject pelaaja1, PhysicsObject kohde)
248    {
249        elämäLaskuri.Value -= 10;
250
251        if (elämäLaskuri <= 0)
252            pelaaja1.Destroy();
253    }
254
255    public void PelaajaOsuuHeart(PhysicsObject pelaaja1, PhysicsObject kohde)
256    {
257        if (elämäLaskuri <= elämäLaskuri.MaxValue - 10)
258        {
259            elämäLaskuri.Value += elämäLaskuri + 20;
260            kohde.Destroy();
261        }
262    }
263
264    void LuoSlime(Vector paikka, double leveys, double korkeus)
265    {
266        Vihollinen Slime = new Vihollinen(leveys, korkeus * 0.5, 5);
267        Slime.CanRotate = false;
268        Slime.Position = paikka;
269        Slime.Tag = "vihollinen";
270        Slime.Image = Slime1;
271        Add(Slime);
272       
273        PlatformWandererBrain tasoAivot = new PlatformWandererBrain();
274        tasoAivot.Speed = 150;
275        Slime.Brain = tasoAivot;
276       
277        FollowerBrain SlimeAivot = new FollowerBrain("pelaaja");
278        SlimeAivot.Speed = 200;
279        SlimeAivot.DistanceFar = 600;
280        SlimeAivot.DistanceClose = 300;
281        SlimeAivot.StopWhenTargetClose = true;
282        SlimeAivot.FarBrain = tasoAivot;
283
284        Slime.Weapon = new AssaultRifle(30, 10);
285        Slime.Weapon.ProjectileCollision = AmmusOsuiPelaajaan;
286        Slime.Weapon.IsVisible = true;
287        Slime.Weapon.AttackSound = null;
288
289        Timer ajastin = new Timer();
290        ajastin.Interval = 0.5;
291        ajastin.Timeout += delegate
292        {
293            PhysicsObject ammus = Slime.Weapon.Shoot();
294            if (ammus != null)
295            {
296                ammus.Image = SlimeBall;
297                ammus.Size = new Vector(20, 20);
298                ammus.MaximumLifetime = TimeSpan.FromSeconds(1.0);
299                ammus.Tag = "ammus";
300
301            }
302        };
303        ajastin.Start();
304
305        Timer ajastin2 = new Timer();
306        ajastin2.Interval = 0.01;
307        ajastin2.Timeout += delegate
308        {
309
310            Vector suunta = (pelaaja1.Position - Slime.Position).Normalize();
311            Slime.Weapon.Angle = suunta.Angle;
312
313        };
314        ajastin2.Start();
315    }
316
317    void LuoBoss1(Vector paikka, double leveys, double korkeus)
318    {
319        Vihollinen Boss1 = new Vihollinen(leveys, korkeus * 0.5, 20);
320        Boss1.CanRotate = false;
321        Boss1.Position = paikka;
322        Boss1.Tag = "vihollinen";
323        Boss1.Image = Slime1;
324        Add(Boss1);
325
326        PlatformWandererBrain tasoAivot = new PlatformWandererBrain();
327        tasoAivot.Speed = 150;
328        Boss1.Brain = tasoAivot;
329
330        FollowerBrain SlimeAivot = new FollowerBrain("vihollinen");
331        SlimeAivot.Speed = 200;
332        SlimeAivot.DistanceFar = 600;
333        SlimeAivot.DistanceClose = 300;
334        SlimeAivot.StopWhenTargetClose = true;
335        SlimeAivot.FarBrain = tasoAivot;
336
337        Boss1.Weapon = new AssaultRifle(30, 10);
338        Boss1.Weapon.ProjectileCollision = AmmusOsuiPelaajaan;
339        Boss1.Weapon.IsVisible = false;
340        Boss1.Weapon.AttackSound = null;
341
342        Timer ajastin = new Timer();
343        ajastin.Interval = 1.0;
344        ajastin.Timeout += delegate
345        {
346            PhysicsObject ammus = Boss1.Weapon.Shoot();
347            if (ammus != null)
348            {
349                ammus.Image = SlimeBall;
350                ammus.Size = new Vector(20, 20);
351                ammus.MaximumLifetime = TimeSpan.FromSeconds(1.0);
352                ammus.Tag = "ammus";
353            }
354        };
355        ajastin.Start();
356        if (Boss1.IsDestroyed)
357        {
358            ajastin.Stop();
359        }
360    }
361
362    void AmmusOsuiViholliseen(PhysicsObject ammus, PhysicsObject kohde)
363    {
364        ammus.Destroy();
365
366        if (kohde.Tag.ToString() == "vihollinen")
367        {
368            (kohde as Vihollinen).ElamaLaskuri.Value--;
369        }
370    }
371
372    void AmmusOsuiPelaajaan(PhysicsObject ammus, PhysicsObject kohde)
373    {
374        ammus.Destroy();
375
376        if (kohde.Tag.ToString() == "pelaaja")
377        {
378            elämäLaskuri.Value--;
379        }
380    }
381
382    void AmmuAseella(AssaultRifle ase)
383    {
384        ase.AbsoluteAngle = pelaaja1.FacingDirection.Angle;
385        PhysicsObject ammus = ase.Shoot();
386
387        if (ammus != null)
388        {
389            ammus.Image = FireBall1;
390            ammus.Size = new Vector(40, 40);
391            ammus.MaximumLifetime = TimeSpan.FromSeconds(2.0);
392            ammus.Tag = "ammus";
393        }
394    }
395
396    void Tähtää()
397    {
398        pelaaja1.Weapon.Angle = pelaaja1.FacingDirection.Angle;
399    }
400
401    void LuoElämäLaskuri()
402    {
403        elämäLaskuri = new DoubleMeter(100);
404        elämäLaskuri.MaxValue = 100;
405        elämäLaskuri.LowerLimit += ElämäLoppui;
406
407        ProgressBar elämäPalkki = new ProgressBar(150, 20);
408        elämäPalkki.X = Screen.Left + 500;
409        elämäPalkki.Y = Screen.Top - 100;
410        elämäPalkki.BindTo(elämäLaskuri);
411        elämäPalkki.Color = Color.Transparent;
412        elämäPalkki.BarColor = Color.Red;
413        elämäPalkki.BorderColor = Color.Black;
414        Add(elämäPalkki);
415    }
416
417    void ElämäLoppui()
418    {
419        Explosion PelaajaRäjähtää = new Explosion(200);
420        PelaajaRäjähtää.Position = pelaaja1.Position;
421        PelaajaRäjähtää.Sound = null;
422        Add(PelaajaRäjähtää);
423
424        MessageDisplay.Add("Elämät loppuivat, voi voi.");
425        pelaaja1.Destroy();
426
427        Timer.SingleShot(4.0, AloitaPeliAlusta);
428    }
429
430    public void SlimeLähelläPelaajaa()
431    {
432        Vector suunta = (pelaaja1.Position - Slime.Position).Normalize();
433
434        Slime.Angle = suunta.Angle;
435    }
436
437    void AloitaPeliAlusta()
438    {
439        ClearAll();
440        Begin();
441    }
442
443}
Note: See TracBrowser for help on using the repository browser.