source: 2013/26/OtsoR/Projekti/Projekti/Projekti/Projekti.cs @ 5051

Revision 5051, 32.1 KB checked in by juiitamm, 6 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 Player : PhysicsObject
10{
11    private IntMeter health = new IntMeter(100, 0, 100);
12    public IntMeter Health { get { return health; } }
13    public Color Color1;
14    public Color Color2;
15
16    public Image cannonImage;
17
18    public Player(double width, double height, Shape shape)
19        : base(width, height, shape)
20    {
21        ProgressBar playerhealth = new ProgressBar(8, 3);
22        playerhealth.BindTo(health);
23        playerhealth.BarColor = Color.SpringGreen;
24        playerhealth.BorderColor = Color.Red;
25        playerhealth.X = -8;
26        playerhealth.Angle = Angle.RightAngle;
27        Add(playerhealth);
28        health.LowerLimit += delegate
29        {
30            this.Destroy();
31        };
32    }
33}
34class Enemy : PhysicsObject
35{
36    private IntMeter health = new IntMeter(5, 0, 5);
37    public IntMeter Health { get { return health; } }
38
39    public Enemy(double width, double height, Shape shape, double barwidth, double barheight, double barx)
40        : base(width, height, shape)
41    {
42        ProgressBar enemyhealth = new ProgressBar(barwidth, barheight);
43        enemyhealth.BindTo(health);
44        enemyhealth.X = barx;
45        enemyhealth.Angle = Angle.RightAngle;
46        Add(enemyhealth);
47        health.LowerLimit += delegate
48        {
49            this.Destroy();
50        };
51    }
52}
53public class Projekti : PhysicsGame
54{
55    Image[] shipimages = new Image[100];
56    Color[] shipcolors = { Color.DarkGray, Color.Silver, Color.DarkOrange, Color.Blue };
57    Color[] shipcolors2 = { Color.Ruby, Color.Azure, Color.Emerald, Color.Orange };
58    Image bigenemy = LoadImage("bigenemy");
59    Image shell = LoadImage("bullet");
60    Image pointer = LoadImage("pointer");
61    Image rdamage = LoadImage("rdamage");
62    Image rrepair = LoadImage("rrepair");
63    Image homing = LoadImage("missile");
64
65    String[] weaponnames = { "projectile", "laser", "plasma", "missile" };
66
67    PhysicsObject topedge;
68    PhysicsObject bottomedge;
69    PhysicsObject leftedge;
70    PhysicsObject rightedge;
71
72    Player ship1;
73    Weapon weapon;
74    Player ship2;
75    Weapon weapon2;
76    //PhysicsObject hostile;
77    Weapon hostilew;
78    GameObject line;
79    PhysicsObject ammus;
80
81    Label number;
82    Label number2;
83    Label colour;
84    Label weaponlabel;
85    Label weaponlabel2;
86    Widget aluskuva;
87    Widget aluskuva2;
88    IntMeter shipimg;
89    IntMeter shipcolor1;
90    IntMeter shipwpn;
91    IntMeter shipimg2;
92    IntMeter shipcolor2;
93    IntMeter shipWeapon2;
94    IntMeter points;
95    int shipcounter;
96    int bigshipcounter;
97    int bosscounter;
98    int runecounter;
99    public override void Begin()
100    {
101        for (int i = 1; i <= 100; i++)
102        {
103            shipimages[i - 1] = LoadImage("s" + i);
104        }
105
106        IsMouseVisible = true;
107        MultiSelectWindow numberofplayersmenu = new MultiSelectWindow("Select number of players", "1 Player", "2 Players", "Quit");
108        numberofplayersmenu.ItemSelected += mainmenu;
109        Add(numberofplayersmenu);
110    }
111
112    void mainmenu(int choice)
113    {
114        switch (choice)
115        {
116            case 0:
117                ClearAll();
118                singleplayer();
119                break;
120            case 1:
121                ClearAll();
122                coop();
123                break;
124            case 2:
125                Exit();
126                break;
127        }
128    }
129
130    void singleplayer()
131    {
132        aluskuva = new Widget(50, 50);
133        aluskuva.X = 0;
134        aluskuva.Y = 250;
135        aluskuva.Image = shipimages[0];
136        Add(aluskuva);
137
138        shipimg = new IntMeter(1, 1, 100);
139        shipimg.Changed += Changeship1;
140        shipwpn = new IntMeter(1, 1, 4);
141        shipwpn.Changed += delegate { weaponlabel.Text = weaponnames[shipwpn.Value - 1]; };
142        shipcolor1 = new IntMeter(0, 0, 3);
143        shipcolor1.Changed += Changeship1;
144
145        number = new Label();
146        number.BindTo(shipimg);
147        number.X = 0;
148        number.Y = 300;
149        Add(number);
150
151        colour = new Label("style");
152        colour.X = -125;
153        colour.Y = 125;
154        Add(colour);
155
156        weaponlabel = new Label(weaponnames[0]);
157        weaponlabel.X = 125;
158        weaponlabel.Y = 125;
159        Add(weaponlabel);
160
161        Slider shiptype = new Slider(550, 10);
162        shiptype.X = 0;
163        shiptype.Y = 200;
164        shiptype.BindTo(shipimg);
165        Slider shipcolour = new Slider(125, 15);
166        shipcolour.X = -125;
167        shipcolour.Y = 150;
168        shipcolour.BindTo(shipcolor1);
169        Slider shipweapon = new Slider(125, 15);
170        shipweapon.X = 125;
171        shipweapon.Y = 150;
172        shipweapon.BindTo(shipwpn);
173
174        Add(shiptype);
175        Add(shipcolour);
176        Add(shipweapon);
177
178        List<Label> valikonKohdat;
179        valikonKohdat = new List<Label>(); // Alustetaan lista, johon valikon kohdat tulevat
180        Label kohta1 = new Label("Start");  // Luodaan uusi Label-olio, joka toimii uuden pelin aloituskohtana
181        kohta1.Position = new Vector(0, -100);  // Asetetaan valikon ensimmäinen kohta hieman kentän keskikohdan yläpuolelle
182        valikonKohdat.Add(kohta1);  // Lisätään luotu valikon kohta listaan jossa kohtia säilytetään
183        // Lisätään kaikki luodut kohdat peliin foreach-silmukalla
184        foreach (Label valikonKohta in valikonKohdat)
185        {
186            Add(valikonKohta);
187        }
188        Mouse.ListenOn(kohta1, MouseButton.Left, ButtonState.Pressed, singleplayerbase, null);
189    }
190
191    void Changeship1(int vanha, int uusi)
192    {
193        aluskuva.Image = shipimages[shipimg.Value - 1].Clone();
194        aluskuva.Image.ReplaceColor(Color.White, shipcolors[shipcolor1.Value]);
195        aluskuva.Image.ReplaceColor(Color.Black, shipcolors2[shipcolor1.Value]);
196    }
197
198    void Changeship2(int vanha, int uusi)
199    {
200        aluskuva2.Image = shipimages[shipimg2.Value - 1].Clone();
201        aluskuva2.Image.ReplaceColor(Color.White, shipcolors[shipcolor2.Value]);
202        aluskuva2.Image.ReplaceColor(Color.Black, shipcolors2[shipcolor2.Value]);
203    }
204
205    void Createship(double x, double y)
206    {
207        ship1 = new Player(14, 14, Shape.FromImage(aluskuva.Image));
208        ship1.Image = aluskuva.Image;
209
210        ship1.Restitution = 1.0;
211        ship1.Color1 = shipcolors[shipcolor1.Value];
212        ship1.Color2 = shipcolors2[shipcolor1.Value];
213        ship1.cannonImage = LoadImage("missile");
214        ship1.cannonImage.ReplaceColor(Color.White, ship1.Color1);
215        ship1.cannonImage.ReplaceColor(Color.Black, ship1.Color2);
216
217        ship1.X = x;
218        ship1.Y = y;
219        ship1.KineticFriction = 0.0;
220        ship1.MomentOfInertia = Double.PositiveInfinity;
221        ship1.LinearDamping = 0.95;
222        ship1.AngularDamping = 0.95;
223        Add(ship1);
224        choice(shipwpn.Value);
225        ship1.Add(weapon);
226        ship1.CollisionIgnoreGroup = 1;
227        ship1.Tag = "player";
228        ship1.Destroyed += playerdeath;
229        if (weapon is LaserGun)
230        {
231            line = new GameObject(5000, 1.25);
232            line.Image = pointer;
233            line.X = 2500;
234            ship1.Add(line);
235        }
236    }
237    void Createship2(double x, double y)
238    {
239        ship2 = new Player(14, 14, Shape.FromImage(aluskuva2.Image));
240        ship2.Image = aluskuva2.Image;
241        ship2.X = x;
242        ship2.Y = y;
243        ship2.Color1 = shipcolors[shipcolor2.Value];
244        ship2.Color2 = shipcolors2[shipcolor2.Value];
245        ship2.cannonImage = LoadImage("missile");
246        ship2.cannonImage.ReplaceColor(Color.White, ship2.Color1);
247        ship2.cannonImage.ReplaceColor(Color.Black, ship2.Color2);
248
249        ship2.Restitution = 1.0;
250        ship2.KineticFriction = 0.0;
251        ship2.MomentOfInertia = Double.PositiveInfinity;
252        ship2.LinearDamping = 0.95;
253        ship2.AngularDamping = 0.95;
254        Add(ship2);
255        choice2(shipWeapon2.Value);
256        ship2.Add(weapon2);
257        ship2.CollisionIgnoreGroup = 1;
258        ship2.Tag = "player";
259        ship2.Destroyed += playerdeath;
260        if (weapon is LaserGun)
261        {
262            line = new GameObject(5000, 1.25);
263            line.Image = pointer;
264            line.X = 2500;
265            ship1.Add(line);
266        }
267    }
268    void Spawnhostiles()
269    {
270        while (shipcounter < 39)
271        {
272            int hostileship = RandomGen.NextInt(0, 100);
273            double hostiley = 0.0;
274            double hostilex = 0.0;
275            if (RandomGen.NextBool())
276            {
277                hostiley = Level.Bottom + 2 * Level.Top * RandomGen.NextInt(0, 2);
278                hostilex = RandomGen.NextDouble(Level.Left, Level.Right);
279            }
280            else
281            {
282                hostiley = RandomGen.NextDouble(Level.Bottom, Level.Top);
283                hostilex = Level.Left + 2 * Level.Right * RandomGen.NextInt(0, 2);
284            }
285            Createhostile(hostileship, hostiley, hostilex);
286            shipcounter++;
287        }
288        while (bigshipcounter < 4)
289        {
290            double bighostiley = 0.0;
291            double bighostilex = 0.0;
292            if (RandomGen.NextBool())
293            {
294                bighostiley = Level.Bottom + 2 * Level.Top * RandomGen.NextInt(0, 2);
295                bighostilex = RandomGen.NextDouble(Level.Left, Level.Right);
296            }
297            else
298            {
299                bighostiley = RandomGen.NextDouble(Level.Bottom, Level.Top);
300                bighostilex = Level.Left + 2 * Level.Right * RandomGen.NextInt(0, 2);
301            }
302            Createbighostile(bighostiley, bighostilex);
303            bigshipcounter++;
304        }
305    }
306    void Createhostile(int randomship, double randomy, double randomx)
307    {
308        Enemy hostile = new Enemy(14, 14, Shape.FromImage(shipimages[randomship]), 5, 2.5, -8);
309        hostile.Image = shipimages[randomship];
310        hostile.Y = randomy;
311        hostile.X = randomx;
312        hostile.Restitution = 1.0;
313        hostile.KineticFriction = 0.0;
314        hostile.MomentOfInertia = Double.PositiveInfinity;
315        hostile.LinearDamping = 0.95;
316        hostile.AngularDamping = 1;
317        hostile.Tag = "hostile";
318        hostile.Health.MaxValue = 5;
319        hostile.Health.Value = 5;
320        hostile.CollisionIgnoreGroup = 2;
321        hostile.Image.ReplaceColor(Color.White, Color.Ultramarine);
322        hostile.Image.ReplaceColor(Color.Black, Color.Green);
323        Add(hostile);
324
325        hostile.Destroyed += enemydeath;
326
327        AssaultRifle hostilew = new AssaultRifle(0, 0);
328        hostilew.ProjectileCollision = delegate(PhysicsObject ammus, PhysicsObject kohde) { weaponhit(ammus, kohde, 10, 0); };
329        hostilew.FireRate = 0.5;
330        hostilew.Power.DefaultValue = 15;
331        hostilew.Power.Value = 15;
332        hostile.Add(hostilew);
333
334        FollowerBrain brain = new FollowerBrain("player");
335        brain.Speed = 20;
336        brain.DistanceFar = 10000;
337        brain.DistanceClose = 125;
338        brain.StopWhenTargetClose = false;
339        brain.TargetClose += delegate { fire(hostilew, null); };
340        brain.TurnWhileMoving = true;
341        hostile.Brain = brain;
342    }
343    void Createbighostile(double y, double x)
344    {
345        Enemy Big1 = new Enemy(50, 28, Shape.FromImage(bigenemy), 20, 2.5, -28);
346        Big1.Image = bigenemy;
347        Big1.X = x;
348        Big1.Y = y;
349        Big1.Restitution = 1.0;
350        Big1.KineticFriction = 0.0;
351        Big1.MomentOfInertia = Double.PositiveInfinity;
352        Big1.LinearDamping = 0.95;
353        Big1.AngularDamping = 1;
354        Big1.Tag = "hostile";
355        Big1.Health.MaxValue = 40;
356        Big1.Health.Value = 40;
357        Big1.CollisionIgnoreGroup = 2;
358        Big1.Image.ReplaceColor(Color.White, Color.Ultramarine);
359        Big1.Image.ReplaceColor(Color.Black, Color.Green);
360        Add(Big1);
361        Big1.Destroyed += bigenemydeath;
362
363        Cannon Big1w = new Cannon(0, 0);
364        Big1w.ProjectileCollision = delegate(PhysicsObject ammus, PhysicsObject kohde) { weaponhit(ammus, kohde, 3, 0); };
365        Big1w.FireRate = 0.3;
366        Big1w.CanHitOwner = false;
367        Big1w.Power.DefaultValue = 1500;
368        Big1w.Power.Value = 1500;
369        Big1.Add(Big1w);
370
371        FollowerBrain bigbrain = new FollowerBrain("player");
372        bigbrain.Speed = 15;
373        bigbrain.DistanceFar = 10000;
374        bigbrain.DistanceClose = 325;
375        bigbrain.TurnSpeed = UnlimitedAngle.FromDegrees(25);
376        bigbrain.StopWhenTargetClose = false;
377        bigbrain.TargetClose += delegate { firehoming(Big1w); };
378        bigbrain.TurnWhileMoving = true;
379        Big1.Brain = bigbrain;
380    }
381    void playerdeath()
382    {
383        MessageDisplay.Add("Ship lost");
384        MediaPlayer.Play("Daah");
385    }
386    void enemydeath()
387    {
388        shipcounter--;
389        points.Value += 5;
390    }
391    void bigenemydeath()
392    {
393        bigshipcounter--;
394        points.Value += 40;
395    }
396    void boss1death()
397    {
398    }
399    void boss2death()
400    {
401    }
402    void createedges()
403    {
404        PhysicsObject leftedge = Level.CreateLeftBorder();
405        leftedge.Restitution = 1.0;
406        leftedge.KineticFriction = 0.0;
407        leftedge.IsVisible = false;
408        leftedge.CollisionIgnoreGroup = 2;
409        PhysicsObject rightedge = Level.CreateRightBorder();
410        rightedge.Restitution = 1.0;
411        rightedge.KineticFriction = 0.0;
412        rightedge.IsVisible = false;
413        rightedge.CollisionIgnoreGroup = 2;
414        PhysicsObject topedge = Level.CreateTopBorder();
415        topedge.Restitution = 1.0;
416        topedge.KineticFriction = 0.0;
417        topedge.IsVisible = false;
418        topedge.CollisionIgnoreGroup = 2;
419        PhysicsObject bottomedge = Level.CreateBottomBorder();
420        bottomedge.Restitution = 1.0;
421        bottomedge.IsVisible = false;
422        bottomedge.KineticFriction = 0.0;
423        topedge.CollisionIgnoreGroup = 2;
424    }
425
426    void coop()
427    {
428        aluskuva = new Widget(50, 50);
429        aluskuva.X = -300;
430        aluskuva.Y = 250;
431        aluskuva.Image = shipimages[0];
432        Add(aluskuva);
433
434        aluskuva2 = new Widget(50, 50);
435        aluskuva2.X = 300;
436        aluskuva2.Y = 250;
437        aluskuva2.Image = shipimages[0];
438        Add(aluskuva2);
439
440        shipimg = new IntMeter(1, 1, 100);
441        shipimg.Changed += Changeship1;
442        shipwpn = new IntMeter(1, 1, 4);
443        shipwpn.Changed += delegate { weaponlabel.Text = weaponnames[shipwpn.Value - 1]; };
444
445        Slider shipColorP1 = new Slider(125, 15);
446        shipColorP1.X = -425;
447        shipColorP1.Y = 150;
448        shipcolor1 = new IntMeter(0, 0, 3);
449        shipcolor1.Changed += Changeship1;
450        shipColorP1.BindTo(shipcolor1);
451
452        Slider shipcolour2 = new Slider(125, 15);
453        shipcolour2.X = 225;
454        shipcolour2.Y = 150;
455        shipcolor2 = new IntMeter(0, 0, 3);
456        shipcolor2.Changed += Changeship2;
457        shipcolour2.BindTo(shipcolor2);
458
459        shipimg2 = new IntMeter(1, 1, 100);
460        shipimg2.Changed += Changeship2;
461        shipWeapon2 = new IntMeter(1, 1, 4);
462        shipWeapon2.Changed += delegate
463        {
464            weaponlabel2.Text = weaponnames[shipWeapon2.Value - 1];
465        };
466        number = new Label();
467        number.BindTo(shipimg);
468        number.X = -300;
469        number.Y = 300;
470        Add(number);
471
472        number2 = new Label();
473        number2.BindTo(shipimg2);
474        number2.X = 300;
475        number2.Y = 300;
476        Add(number2);
477
478        weaponlabel = new Label(weaponnames[0]);
479        weaponlabel.X = -225;
480        weaponlabel.Y = 125;
481        Add(weaponlabel);
482        weaponlabel2 = new Label(weaponnames[0]);
483        weaponlabel2.X = 425;
484        weaponlabel2.Y = 125;
485        Add(weaponlabel2);
486
487        Slider shiptype = new Slider(550, 10);
488        shiptype.X = -300;
489        shiptype.Y = 200;
490        shiptype.BindTo(shipimg);
491
492        Slider shipweapon = new Slider(125, 15);
493        shipweapon.X = -225;
494        shipweapon.Y = 150;
495        shipweapon.BindTo(shipwpn);
496
497        Slider shiptype2 = new Slider(550, 10);
498        shiptype2.X = 300;
499        shiptype2.Y = 200;
500        shiptype2.BindTo(shipimg2);
501
502        Slider shipweapon2 = new Slider(125, 15);
503        shipweapon2.X = 425;
504        shipweapon2.Y = 150;
505        shipweapon2.BindTo(shipWeapon2);
506        Add(shiptype);
507        Add(shipColorP1);
508        Add(shipweapon);
509        Add(shiptype2);
510        Add(shipcolour2);
511        Add(shipweapon2);
512        List<Label> valikonKohdat2;
513        valikonKohdat2 = new List<Label>(); // Alustetaan lista, johon valikon kohdat tulevat
514        Label kohta2 = new Label("Start");  // Luodaan uusi Label-olio, joka toimii uuden pelin aloituskohtana
515        kohta2.Position = new Vector(0, -100);  // Asetetaan valikon ensimmäinen kohta hieman kentän keskikohdan yläpuolelle
516        valikonKohdat2.Add(kohta2);  // Lisätään luotu valikon kohta listaan jossa kohtia säilytetään
517        // Lisätään kaikki luodut kohdat peliin foreach-silmukalla
518        foreach (Label valikonKohta2 in valikonKohdat2)
519        {
520            Add(valikonKohta2);
521        }
522        Mouse.ListenOn(kohta2, MouseButton.Left, ButtonState.Pressed, coopbase, null);
523    }
524
525    void choice(int choice)
526    {
527        switch (choice)
528        {
529            case 1:
530                weapon = new AssaultRifle(0, 0);
531                weapon.ProjectileCollision = delegate(PhysicsObject ammus, PhysicsObject kohde) { weaponhit(ammus, kohde, 0, 1); };
532                weapon.FireRate = 4.5;
533                weapon.Power.Value = 25;
534                weapon.Power.DefaultValue = 25;
535                break;
536            case 2:
537                weapon = new LaserGun(0, 0);
538                weapon.ProjectileCollision = delegate(PhysicsObject ammus, PhysicsObject kohde) { weaponhit(ammus, kohde, 0, 5); };
539                weapon.FireRate = 0.8;
540                weapon.Power.DefaultValue = 1000;
541                weapon.Power.Value = 1000;
542                break;
543            case 3:
544                weapon = new PlasmaCannon(0, 0);
545                weapon.ProjectileCollision = delegate(PhysicsObject ammus, PhysicsObject kohde) { weaponhit(ammus, kohde, 0, 3); };
546                weapon.FireRate = 1.5;
547                weapon.Power.Value = 400;
548                weapon.Power.DefaultValue = 400;
549                break;
550            case 4:
551                weapon = new Cannon(0, 0);
552                weapon.ProjectileCollision = delegate(PhysicsObject ammus, PhysicsObject kohde) { weaponhit(ammus, kohde, 0, 5); };
553                weapon.FireRate = 0.8;
554                weapon.Power.DefaultValue = 1500;
555                weapon.Power.Value = 1500;
556                break;
557        }
558    }
559    void choice2(int choice)
560    {
561        switch (choice)
562        {
563            case 1:
564                weapon2 = new AssaultRifle(0, 0);
565                weapon2.ProjectileCollision = delegate(PhysicsObject ammus, PhysicsObject kohde) { weaponhit(ammus, kohde, 0, 1); };
566                weapon2.FireRate = 4.5;
567                weapon2.Power.Value = 25;
568                weapon2.Power.DefaultValue = 25;
569                break;
570            case 2:
571                weapon2 = new LaserGun(0, 0);
572                weapon2.ProjectileCollision = delegate(PhysicsObject ammus, PhysicsObject kohde) { weaponhit(ammus, kohde, 0, 5); };
573                weapon2.FireRate = 1;
574                weapon2.Power.DefaultValue = 1000;
575                weapon2.Power.Value = 1000;
576                break;
577            case 3:
578                weapon2 = new PlasmaCannon(0, 0);
579                weapon2.ProjectileCollision = delegate(PhysicsObject ammus, PhysicsObject kohde) { weaponhit(ammus, kohde, 0, 3); };
580                weapon2.FireRate = 1.5;
581                weapon2.Power.Value = 400;
582                weapon2.Power.DefaultValue = 400;
583                break;
584            case 4:
585                weapon2 = new Cannon(0, 0);
586                weapon2.ProjectileCollision = delegate(PhysicsObject ammus, PhysicsObject kohde) { weaponhit(ammus, kohde, 0, 5); };
587                weapon2.FireRate = 0.8;
588                weapon2.Power.DefaultValue = 1500;
589                weapon2.Power.Value = 1500;
590                break;
591        }
592    }
593
594    void fire(Weapon ase, Player ship)
595    {
596        PhysicsObject ammus = ase.Shoot();
597        if (ammus != null)
598        {
599            //Add(ammus, 2);
600            //ammus.Size *= ;
601            //ammus.Image = ...;
602            //ammus.MaximumLifetime = TimeSpan.FromSeconds(2.0);
603            ammus.MaximumLifetime = TimeSpan.FromSeconds(10.0);
604            if (ase is AssaultRifle)
605            {
606                ammus.IgnoresCollisionResponse = true;
607                ammus.Image = shell;
608                ammus.Size *= 0.4;
609                ammus.CollisionIgnoreGroup = 4;
610                AddCollisionHandler(ammus, AmmusOsui);
611            }
612            if (ase is LaserGun)
613            {
614                ammus.Size *= 2;
615                ammus.IgnoresCollisionResponse = true;
616                ammus.Tag = "laser";
617            }
618            if (ase is PlasmaCannon)
619            {
620                ammus.Size *= 0.9;
621                AddCollisionHandler(ammus, AmmusOsui);
622                ammus.IgnoresCollisionResponse = true;
623                ammus.CollisionIgnoreGroup = 3;
624            }
625            if (ase is Cannon)
626            {
627                ammus.Size *= 0.8;
628                // ammus.Image = homing;
629                ammus.Image = ship.cannonImage;
630                AddCollisionHandler(ammus, missilehit);
631                ammus.AngularDamping = 1.0;
632                ammus.IgnoresCollisionResponse = true;
633
634                FollowerBrain ammusbrain = new FollowerBrain("hostile", "laser");
635                //ammusbrain.DistanceFar = 125;
636                ammusbrain.DistanceFar = 50;
637                ammusbrain.Speed = 80;
638                ammusbrain.TurnSpeed = UnlimitedAngle.FromDegrees(360);
639                ammusbrain.StopWhenTargetClose = false;
640                ammusbrain.TurnWhileMoving = true;
641                ammus.Brain = ammusbrain;
642            }
643        }
644    }
645    void AmmusOsui(PhysicsObject ammus, PhysicsObject kohde)
646    {
647        if (kohde.Tag == "powerup")
648        {
649            return;
650        }
651        ammus.Destroy();
652    }
653
654    void missilehit(PhysicsObject tormaaja, PhysicsObject kohde)
655    {
656        if (kohde.Tag == "powerup")
657        {
658            return;
659        }
660        Explosion missilecrash = new Explosion(8);
661        missilecrash.Position = tormaaja.Position;
662        missilecrash.UseShockWave = false;
663        Add(missilecrash);
664        tormaaja.Destroy();
665    }
666    void firehoming(Weapon ase)
667    {
668        PhysicsObject ammus = ase.Shoot();
669        if (ammus != null)
670        {
671            //Add(ammus, 2);
672            //ammus.Size *= ;
673            //ammus.Image = ...;
674            //ammus.MaximumLifetime = TimeSpan.FromSeconds(2.0);
675            ammus.MaximumLifetime = TimeSpan.FromSeconds(5.0);
676            ammus.Image = homing;
677            AddCollisionHandler(ammus, missilehit);
678            ammus.IgnoresCollisionResponse = true;
679            ammus.Size *= 0.8;
680            ammus.AngularDamping = 1.0;
681            ammus.Image.ReplaceColor(Color.White, Color.Ultramarine);
682            ammus.Image.ReplaceColor(Color.Black, Color.Green);
683            AddCollisionHandler(ammus, "player1", CollisionHandler.DestroyObject);
684            FollowerBrain ammusbrain = new FollowerBrain("player", "laser");
685            //ammusbrain.DistanceFar = 125;
686            ammusbrain.DistanceFar = 50;
687            ammusbrain.Speed = 80;
688            ammusbrain.TurnSpeed = UnlimitedAngle.FromDegrees(360);
689            ammusbrain.StopWhenTargetClose = false;
690            ammusbrain.TurnWhileMoving = true;
691            ammus.Brain = ammusbrain;
692        }
693    }
694    void weaponhit(PhysicsObject ammus, PhysicsObject kohde, int playerDamage, int enemyDamage)
695    {
696        if (kohde.Tag == "player")
697        {
698            Player ship = kohde as Player;
699            //ship.Health.Value -= 3;
700            ship.Health.Value -= playerDamage;
701        }
702        if (kohde.Tag == "hostile")
703        {
704            Enemy ship = kohde as Enemy;
705            //ship.Health.Value -= 1;
706            ship.Health.Value -= enemyDamage;
707        }
708    }
709    void Controlsship()
710    {
711        Keyboard.Listen(Key.W, ButtonState.Down, movement, null, 0, 100, ship1);
712        Keyboard.Listen(Key.S, ButtonState.Down, movement, null, 0, -100, ship1);
713        Keyboard.Listen(Key.A, ButtonState.Down, movement, null, -100, 0, ship1);
714        Keyboard.Listen(Key.D, ButtonState.Down, movement, null, 100, 0, ship1);
715        Keyboard.Listen(Key.Space, ButtonState.Down, fire, "", weapon, ship1);
716        Mouse.ListenMovement(0, Aim, null, ship1);
717        Mouse.Listen(MouseButton.Left, ButtonState.Down, fire, null, weapon, ship1);
718        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, null);
719        Keyboard.Listen(Key.K, ButtonState.Pressed, delegate { MessageDisplay.Add(ship1.Position.ToString()); }, null);
720    }
721    void Aim(AnalogState hiirenLiike, Player ship)
722    {
723        Vector suunta = (Mouse.PositionOnWorld - ship.AbsolutePosition).Normalize();
724        ship.Angle = suunta.Angle;
725    }
726    void movement(int x, int y, PhysicsObject ship)
727    {
728        ship.Push(new Vector(x, y));
729    }
730    void Controlsship1()
731    {
732        Keyboard.Listen(Key.W, ButtonState.Down, thrust, "", 1.0, ship1);
733        Keyboard.Listen(Key.S, ButtonState.Down, thrust, "", -1.0, ship1);
734        Keyboard.Listen(Key.A, ButtonState.Down, tilt, "", 1.0, ship1);
735        Keyboard.Listen(Key.D, ButtonState.Down, tilt, "", -1.0, ship1);
736        Keyboard.Listen(Key.Space, ButtonState.Down, fire, "", weapon, ship1);
737        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
738    }
739    void Controlsship2()
740    {
741        Keyboard.Listen(Key.NumPad8, ButtonState.Down, thrust, "", 1.0, ship2);
742        Keyboard.Listen(Key.NumPad5, ButtonState.Down, thrust, "", -1.0, ship2);
743        Keyboard.Listen(Key.NumPad4, ButtonState.Down, tilt, "", 1.0, ship2);
744        Keyboard.Listen(Key.NumPad6, ButtonState.Down, tilt, "", -1.0, ship2);
745        Keyboard.Listen(Key.Add, ButtonState.Down, fire, "", weapon2, ship2);
746    }
747    void thrust(double direction, Player ship)
748    {
749        Vector shipdirection = Vector.FromLengthAndAngle(100.0 * direction, ship.Angle);
750        ship.Push(shipdirection);
751    }
752
753    void tilt(double direction, Player ship)
754    {
755        ship.AngularAcceleration = 10.0 * direction;
756    }
757
758    void singleplayerbase()
759    {
760        ClearAll();
761        GameObject background = new GameObject(1500, 1500);
762        Level.Background.CreateStars();
763        background.Image = Level.Background.Image;
764        background.Tag = "background";
765        Add(background, -1);
766        Level.Background.Image = null;
767
768        Level.Size = new Vector(1500, 1500);
769        createedges();
770        Createship(0, 0);
771        Camera.Zoom(2);
772        Camera.Follow(ship1);
773        Camera.StayInLevel = true;
774        Spawnhostiles();
775        Controlsship();
776
777        Timer spawnrune = new Timer();
778        spawnrune.Interval = 10;
779        spawnrune.Timeout += Spawnrunes;
780        spawnrune.Start();
781
782        points = new IntMeter(0);
783        Label pointsdisplay = new Label();
784        pointsdisplay.Title = "Points";
785        pointsdisplay.X = Screen.Right - 100;
786        pointsdisplay.Y = Screen.Top - 100;
787        pointsdisplay.TextColor = Color.White;
788        pointsdisplay.Color = Color.Black;
789        pointsdisplay.BindTo(points);
790        Add(pointsdisplay);
791
792        Timer a = new Timer();
793        a.Interval = 5;
794        a.Timeout += Spawnhostiles;
795        a.Start();
796    }
797    void coopbase()
798    {
799        ClearAll();
800        //Level.Background.CreateStars();
801        GameObject background = new GameObject(Screen.Width * 2, Screen.Height * 2);
802        Level.Background.CreateStars();
803        background.Image = Level.Background.Image;
804        Add(background, -3);
805        Level.Background.Image = null;
806        createedges();
807        //Camera.ZoomToLevel();
808        Createship(-100, 0);
809        Createship2(100, 0);
810        Spawnhostiles();
811        Controlsship1();
812        Controlsship2();
813
814        Timer spawnrune = new Timer();
815        spawnrune.Interval = 15;
816        spawnrune.Timeout += Spawnrunes;
817        spawnrune.Start();
818
819        points = new IntMeter(0);
820        Label pointsdisplay = new Label();
821        pointsdisplay.Title = "Points";
822        pointsdisplay.X = Screen.Right - 100;
823        pointsdisplay.Y = Screen.Top - 100;
824        pointsdisplay.TextColor = Color.White;
825        pointsdisplay.Color = Color.Black;
826        pointsdisplay.BindTo(points);
827        Add(pointsdisplay);
828
829        Timer spawnenemy = new Timer();
830        spawnenemy.Interval = 5;
831        spawnenemy.Timeout += Spawnhostiles;
832        spawnenemy.Start();
833    }
834    void Spawnrunes()
835    {
836        if (runecounter < 6)
837        {
838            int runetype = RandomGen.NextInt(1, 3);
839            double runey = 0.0;
840            double runex = 0.0;
841            Vector paikka = GetRandomFreePosition("background", 5.0);
842            runey = paikka.Y;
843            runex = paikka.X;
844            Createrune(runetype, runey, runex);
845            runecounter++;
846        }
847    }
848    void Createrune(int runetype, double y, double x)
849    {
850        PhysicsObject Rune = new PhysicsObject(10, 10);
851        Rune.X = x;
852        Rune.Y = y;
853        Rune.CollisionIgnoreGroup = 2 & 3 & 4;
854        Rune.IgnoresCollisionResponse = true;
855        Rune.MakeStatic();
856        Rune.Tag = "powerup";
857        Rune.AngularVelocity = 5;
858        Add(Rune);
859        switch (runetype)
860        {
861            case 1:
862                //Addcollision
863                Rune.Image = rdamage;
864                Rune.Height = 15;
865                Rune.Width = 10;
866                AddCollisionHandler(Rune, "player", delegate(PhysicsObject tormaaja, Player ship) { damagerune(tormaaja, ship); });
867                break;
868            case 2:
869                //Addcollision
870                Rune.Image = rrepair;
871                AddCollisionHandler(Rune, "player", delegate(PhysicsObject tormaaja, Player ship) { repairrune(tormaaja, ship); });
872                Rune.Height = 14;
873                Rune.Width = 14;
874                break;
875            case 3:
876                //Addcollision
877                //Rune.Image = ...;
878                break;
879        }
880    }
881
882    void damagerune(PhysicsObject rune, Player ship)
883    {
884        rune.Destroy();
885        weapon.FireRate *= 2;
886        Timer.SingleShot(15.0, delegate { 
887            weapon.FireRate /= 2; }
888            );
889        MessageDisplay.Add("Weapons Improved");
890        MediaPlayer.Play("Damage");
891        runecounter--;
892    }
893    void repairrune(PhysicsObject rune, Player ship)
894    {
895        ship.Health.Value += 100;
896        MessageDisplay.Add("Hull restored");
897        MediaPlayer.Play("Repair");
898        rune.Destroy();
899        runecounter--;
900    }
901    //void rune3(PhysicsObject rune, Player ship)
902    //{
903    //
904    //}
905
906    /// <summary>
907    /// Palauttaa satunnaisen vapaan paikan kentän sisältä.
908    /// </summary>
909    /// <param name="ignoresTag">Minkätagisia olioita ei huomioida.</param>
910    /// <param name="radius">Alueen halkaisija, jonka tulee olla vapaana paikan ympärillä.</param>
911    /// <returns>Vapaa paikka.</returns>
912    Vector GetRandomFreePosition(String ignoresTag, double radius)
913    {
914        Vector pos;
915        do
916        {
917            pos = RandomGen.NextVector(Level.Left, Level.Bottom, Level.Right, Level.Top);
918
919        } while(IsOccupied(pos, ignoresTag, radius));
920        return pos;
921    }
922
923    bool IsOccupied(Vector position, String ignoresTag, double radius)
924    {
925        GameObject o = GetObjectAt(position, radius);
926        if (o == null) return false;
927        if (o.Tag.ToString() == ignoresTag) return false;
928        return true;
929    }
930}
Note: See TracBrowser for help on using the repository browser.