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

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