source: 2010/30/vematata/SeikailuRoolipeli/Peli.cs @ 1438

Revision 1438, 11.2 KB checked in by vematata, 10 years ago (diff)
Line 
1using System;
2using Jypeli;
3using Jypeli.Assets;
4using Jypeli.Widgets;
5using Physics2DDotNet.Ignorers;
6
7public class Peli : PhysicsGame
8{
9    Vector nopeusYlos = new Vector(0, 300);
10    Vector nopeusAlas = new Vector(0, -300);
11    Vector nopeusVasen = new Vector(-300, 0);
12    Vector nopeusOikea = new Vector(300, 0);
13    double voima = 20;
14    DoubleMeter elamat;
15    //PhysicsObject pallo;
16
17    PhysicsObject hahmo;
18    PhysicsObject miekka;
19    PhysicsObject nuoli;
20    ObjectIgnorer ignorer;
21
22    Image miekanKuva = LoadImage("Miekka");
23
24   
25
26    protected override void Begin()
27    {
28        ignorer = new ObjectIgnorer();
29        ElamaPalkki();
30        Testi();
31        AsetaOhjaimet();
32    }
33
34    void Testi()
35    {
36        Hahmo(-40, -40);
37        Kivi(45, -100, 180);
38        Kivi(50, 100, 100);
39        Kivi(200, 400, 50);
40        Otus(40, 40);
41        Otus(-100, -100);
42        Puu(40, -100, 100);
43        Puu(20, -190, -20);
44        Level.CreateBorders();
45    }
46
47    void Hahmo(double x, double y)
48    {
49        hahmo = new PhysicsObject(20,40, Shapes.Circle, CollisionShapeQuality.Best);
50        //hahmo.Shape = Shapes.Circle;
51        hahmo.Color = Color.GreenYellow;
52        hahmo.LinearDamping = 0.95;
53        hahmo.CanRotate = false;
54        hahmo.CollisionIgnorer = ignorer;     
55     
56
57        Add(hahmo,0);
58        //Miekka();
59
60        Camera.Follow(hahmo);
61        Camera.Zoom(1.5);
62    }
63
64    BarGauge ElamaPalkki() 
65    {
66        elamat = new DoubleMeter(1000);
67        elamat.MaxValue = 1000;
68        BarGauge elamaPalkki = new BarGauge(10, 500);
69        elamaPalkki.BindTo(elamat);
70        elamaPalkki.X = (Screen.LeftSafe+275);
71        elamaPalkki.Y = (Screen.TopSafe-20);
72        elamaPalkki.BorderColor = Color.White;
73        elamaPalkki.Angle = Angle.Degrees(90);
74        elamat.LowerLimit += ElamatLoppui;
75        Add(elamaPalkki);
76        return elamaPalkki;
77    }
78
79    void ElamatLoppui(double mittarinArvo)
80    {
81        MessageDisplay.Add("Elamat loppuivat, voi voi.");
82    }
83
84    void VahennaElamia()
85    {
86        elamat.Value--;
87    }
88
89    void LisaaElamia()
90    {
91        elamat.Value += 0.2;
92    }
93   
94
95    void Nuoli() 
96    {
97        nuoli = new PhysicsObject(10,3,Shapes.Circle);
98        nuoli.CollisionIgnorer = ignorer;
99        AddCollisionHandler(nuoli, Osuma);
100        nuoli.Angle = hahmo.Angle;
101        nuoli.Position = hahmo.Position;
102        Add(nuoli,-3);
103
104        nuoli.Hit(Vector.FromLengthAndAngle(500, nuoli.Angle));
105    }
106
107    void Osuma(PhysicsObject ammus, PhysicsObject kohde)
108    {
109        if (kohde.Tag.ToString() == "vihollinen")
110        {
111            kohde.Brain.Active = false;
112            kohde.Destroy();
113            ammus.Destroy();
114        }
115        else ammus.Destroy();
116    }
117
118
119
120
121    PhysicsObject Otus(double x, double y)
122    {
123        PhysicsObject otus = new PhysicsObject(20, 20, Shapes.Circle);
124        RandomMoverBrain satunnaisAivot = new RandomMoverBrain();
125        otus.Brain = satunnaisAivot;
126        otus.X = x;
127        otus.Y = y;
128        otus.Restitution = 0.0;
129        otus.Tag = "vihollinen";
130        Add(otus,0);
131        Timer Ajastin = new Timer();
132        Ajastin.Interval = 0.1;
133        Ajastin.Trigger += Aivot;
134        Ajastin.Tag = otus;
135        Ajastin.Start();
136        return (otus);
137
138    }
139
140    void Aivot(Timer Ajastin)
141    {
142        PhysicsObject kohde = Ajastin.Tag as PhysicsObject;
143        if (kohde.IsDestroyed())
144        {
145            return; 
146        }
147
148        if(kohde != null)
149        {
150            Vector etaisyys = new Vector(kohde.X - hahmo.X, kohde.Y - hahmo.Y);
151            if (etaisyys.Magnitude < kohde.Width*4 && (kohde.Brain is RandomMoverBrain||kohde.Brain is WandererBrain))
152            {
153                FollowerBrain seuraajaAivot = new FollowerBrain();
154                seuraajaAivot.Target = hahmo;
155                seuraajaAivot.MovingSpeed = 100;
156                seuraajaAivot.TargetFollowDistance = kohde.Width*4;
157                seuraajaAivot.FollowAlways = true;
158                seuraajaAivot.TargetCloseDistance = kohde.Width*2;
159                //seuraajaAivot.StopWhenTargetClose = true;
160               
161                seuraajaAivot.TargetClose += new EventHandler(Hyokkaa);
162
163                kohde.Brain = seuraajaAivot;
164
165            }
166            else 
167            {
168                if(etaisyys.Magnitude > 100 && kohde.Brain is FollowerBrain)
169                {
170                    RandomMoverBrain satunnaisAivot = new RandomMoverBrain();
171                    satunnaisAivot.ChangeMovementSeconds = 1;
172                    kohde.Brain = satunnaisAivot;
173                }
174            }
175        }
176       
177    }
178
179    void Hyokkaa(object sender, EventArgs e)
180    {
181        VahennaElamia();
182        MessageDisplay.Add("mennetit elämiä");
183    }
184
185   
186    PhysicsObject Kivi(double koko, double x, double y) 
187    {
188        PhysicsObject kivi = new PhysicsObject(koko, koko, Shapes.Circle);
189        kivi.Color = Color.DarkGray;
190        kivi.X = x;
191        kivi.Y = y;
192        kivi.LinearDamping = 0.85;
193        if (koko >= 100)
194            kivi.Mass = koko / 2;
195        else
196            kivi.Mass = koko / 10;
197        Add(kivi,0);
198        return(kivi);
199    }
200
201
202    void Poista(Timer Ajastin) 
203    {
204        ((PhysicsObject)Ajastin.Tag).Destroy();
205        Ajastin.Destroy();
206        if (((PhysicsObject)Ajastin.Tag).IsDestroyed() && Ajastin.IsDestroyed())
207            MessageDisplay.Add("tuhottu");
208    }
209
210    PhysicsObject Puu(double koko, double x, double y)
211    {
212        PhysicsObject runko = PhysicsObject.CreateStaticObject(koko, koko, Shapes.Circle);
213        PhysicsObject lehdet = new PhysicsObject(7*koko, 7*koko, Shapes.Circle);
214        lehdet.X = runko.X = x;
215        lehdet.Y = runko.Y = y;
216        lehdet.IgnoresCollisionResponse = true;
217        lehdet.IgnoresExplosions = true;
218        lehdet.Tag = "lehdet";
219        runko.Tag = "runko";
220        runko.Color = Color.Brown;
221        lehdet.Color = Color.ForestGreen;
222
223        lehdet.CollisionIgnorer = ignorer;
224
225        Timer Ajastin = new Timer();
226        Ajastin.Interval = 0.1;
227        Ajastin.Trigger += Lapinakyvyys;
228        Ajastin.Tag = lehdet;
229        Ajastin.Start();
230
231
232
233        Add(runko);
234        Add(lehdet, 3);
235
236        return(runko);
237    }
238
239    void Lapinakyvyys(Timer Ajastin) 
240    {
241        PhysicsObject kohde = Ajastin.Tag as PhysicsObject;
242
243        if(kohde != null)
244        {
245            Vector etaisyys = new Vector(kohde.X - hahmo.X, kohde.Y - hahmo.Y);
246            if (etaisyys.Magnitude < (kohde.Width/2+5))
247            {
248                kohde.IsVisible = false;
249            }
250            else 
251            {
252                kohde.IsVisible = true;
253            }
254        }
255   
256    }
257
258    PhysicsObject Seina(double leveys, double pituus, double x, double y)
259    {
260        PhysicsObject seina = PhysicsObject.CreateStaticObject(leveys, pituus, Shapes.Rectangle);
261        seina.Color = Color.LightYellow;
262        seina.X = x;
263        seina.Y = y;
264        Add(seina);
265        return (seina);
266    }
267   
268    void AsetaOhjaimet()
269    {
270        Keyboard.Listen(Key.W, ButtonState.Down, AsetaNopeus, "Liiku ylös", hahmo, nopeusYlos);
271        Keyboard.Listen(Key.W, ButtonState.Released, AsetaNopeus, null, hahmo, Vector.Zero);
272        Keyboard.Listen(Key.S, ButtonState.Down, AsetaNopeus, "Liiku alas", hahmo, nopeusAlas);
273        Keyboard.Listen(Key.S, ButtonState.Released, AsetaNopeus, null, hahmo, Vector.Zero);
274        Keyboard.Listen(Key.A, ButtonState.Down, AsetaNopeus, "liiku vasemmalle", hahmo, nopeusVasen);
275        Keyboard.Listen(Key.A, ButtonState.Released, AsetaNopeus, null, hahmo, Vector.Zero);
276        Keyboard.Listen(Key.D, ButtonState.Down, AsetaNopeus, "Liiku oikealle", hahmo, nopeusOikea);
277        Keyboard.Listen(Key.D, ButtonState.Released, AsetaNopeus, null, hahmo, Vector.Zero);
278        Keyboard.Listen(Key.Space, ButtonState.Pressed, Nuoli, null);
279
280                                   
281        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
282
283        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, "Poistu");
284
285        AsetaHiiri();
286
287    }
288
289    void AsetaNopeus(PhysicsObject hahmo, Vector nopeus)
290    {
291        hahmo.Velocity = nopeus;
292        //miekka.Velocity = hahmo.Velocity;
293    }
294
295    void AsetaHiiri()
296    {
297        //pallo = new PhysicsObject(10.0, 10.0, Shapes.Circle);
298        //pallo.IgnoresExplosions = pallo.IgnoresCollisionResponse = true;
299        //Add(pallo);
300        Mouse.IsCursorVisible = true;
301        //Mouse.ListenMovement(0.1, KuunteleLiiketta, null);
302        //Mouse.Listen(MouseButton.Left, ButtonState.Pressed, VoimanKeruu, null);
303        Mouse.Listen(MouseButton.Left, ButtonState.Down, LataaVoimaa, null, 2.0);
304        Mouse.Listen(MouseButton.Left, ButtonState.Released, Rajahdys, null);
305        Mouse.Listen(MouseButton.Right, ButtonState.Released, LuoPallo, null);
306
307    }
308    void LuoPallo()
309    {
310        double koko = RandomGen.NextDouble(10,20);
311        PhysicsObject pallo2 = new PhysicsObject(koko, koko, Shapes.Circle);
312        pallo2.Color = RandomGen.NextColor(Color.DarkBlue,Color.DarkViolet);
313        pallo2.Position = Mouse.PositionOnWorld;
314        pallo2.Restitution = 1.05;
315        Add(pallo2,0);
316        Timer Ajastin = new Timer();
317        Ajastin.Interval = 10.0;
318        Ajastin.Trigger += Poista;
319        Ajastin.Tag = pallo2;
320        Ajastin.Start();
321
322        MessageDisplay.Add("kumi pallona luokses pompin...");
323       
324    }
325
326    //void KuunteleLiiketta(AnalogState hiirenTila)
327    //{
328    //    pallo.X = Mouse.PositionOnWorld.X;
329    //    pallo.Y = Mouse.PositionOnWorld.Y;
330    //}
331    void LataaVoimaa(double lataaVoimaa) 
332    {
333        if (voima < 500)
334        {
335            voima += lataaVoimaa;
336            MessageDisplay.Add("lisätään voimaa");
337        }
338        else
339            MessageDisplay.Add("voima max");
340    }
341   
342
343    void Rajahdys() 
344    {
345       
346        Explosion rajahdys = new Explosion(voima/2);
347        rajahdys.Position = Mouse.PositionOnWorld; 
348        rajahdys.Speed = voima/2;
349        rajahdys.Force = voima*2;
350        Add(rajahdys);
351        voima = 20;
352        MessageDisplay.Add("pum");
353    }
354
355    void Teksti()
356    {
357        MessageDisplay.Add("loppu");
358    }
359    void Miekka()
360    {
361        miekka = new PhysicsObject(50,5);
362        miekka.IgnoresCollisionResponse = true;
363        miekka.IgnoresExplosions = true;
364        miekka.IgnoresPhysicsLogics = true;
365        Add(miekka,-1);
366        Timer Ajastin = new Timer();
367        Ajastin.Interval = 0.01;
368        Ajastin.Trigger += Miekansijainti;
369        Ajastin.Tag = miekka;
370        Ajastin.Start();
371    }
372    Vector Jokin;
373     void Miekansijainti(Timer Ajastin) 
374    {       
375         Jokin =new Vector(hahmo.X-25,hahmo.Bottom);
376
377         miekka.Position = Jokin ;
378         miekka.Angle = hahmo.Angle;
379    }
380
381    protected override void Update(Time time)
382    {
383        hahmo.Angle = (Mouse.PositionOnWorld - hahmo.Position).Angle;
384        if (hahmo.Velocity == Vector.Zero) 
385        {
386            LisaaElamia();
387        }
388
389        base.Update(time);
390    }
391
392}
Note: See TracBrowser for help on using the repository browser.