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

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