source: 2014/27/MikkoL/LM2/LM2/LM2/LM2.cs @ 5376

Revision 5376, 36.7 KB checked in by mijoliim, 5 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
9class player : PhysicsObject
10{
11    public IntMeter health = new IntMeter(100,0,100);
12
13    public player(double width, double height)
14        : base(width, height)
15    {
16        health.LowerLimit += delegate
17        {
18            this.Destroy();
19        };
20    }
21}
22
23class enemy : PhysicsObject
24{
25    public IntMeter health = new IntMeter(100, 0, 100);
26    public IntMeter ScoreValue = new IntMeter(100, 0, int.MaxValue);
27    public bool canShoot = false;
28    public double explosion_scale = 50;
29
30    public enemy(double width, double height)
31        : base(width, height)
32    {
33        health.LowerLimit += delegate { this.Destroy(); };
34    }
35}
36
37class bullet : PhysicsObject
38{
39    public int damage;
40
41    public bullet(double width, double height)
42        : base(width, height) { }
43}
44class frontborder : PhysicsObject
45{
46
47    public frontborder(double width, double height)
48        : base(width, height) { }
49}
50class backborder : PhysicsObject
51{
52
53    public backborder(double width, double height)
54        : base(width, height) { }
55}
56
57public class LM2 : PhysicsGame
58{
59    player player = new player(5, 5);
60    PhysicsObject playership = new PhysicsObject(47, 46);
61    double player_speed = 425;
62    Vector stagespeed = new Vector(-500,0);
63    Vector cntr = new Vector(0, 0);
64
65    //Player
66    Image player_ship_01 = LoadImage("player_ship_01");
67    Image player_ship_02 = LoadImage("player_ship_02");
68    //Bullets
69    Image bullet_green_laser01 = LoadImage("bullet_green_laser01");
70    Image bullet_player01 = LoadImage("bullet_player");
71    Image bullet_player02 = LoadImage("bullet_player02");
72    Image bullet_player03 = LoadImage("bullet_player03");
73    Image bullet_player04 = LoadImage("bullet_player04");
74    Image bullet_player05 = LoadImage("bullet_player05");
75    Image bullet_enemy_01 = LoadImage("bullet_enemy_01");
76    Image bullet_enemy_02 = LoadImage("bullet_enemy_02");
77    //Enemies
78    Image enemy_ship_01 = LoadImage("enemy_ship_01");
79    Image enemy_ship_01_red = LoadImage("enemy_ship_01_red");
80    Image enemy_ship_01_blue = LoadImage("enemy_ship_01_blue");
81    Image enemy_ship_01_blue_inverted = LoadImage("enemy_ship_01_blue_inverted");
82    Image enemy_ship_02 = LoadImage("enemy_ship_02");
83    Image enemy_ship_03 = LoadImage("enemy_ship_03");
84    Image enemy_ship_04 = LoadImage("enemy_ship_04");
85    //Powerups
86    Image powerup_damage = LoadImage("powerup_damage");
87    Image powerup_spread = LoadImage("powerup_spread");
88    //Backgrounds
89    Image space_bg = LoadImage("space_bg");
90    //Explosion
91    private Animation explosion_anim;
92
93    //SFX
94    SoundEffect hurtsfx = LoadSoundEffect("hurt");
95    SoundEffect hitsfx = LoadSoundEffect("hit");
96    SoundEffect shootsfx = LoadSoundEffect("shoot");
97    SoundEffect powerupsfx = LoadSoundEffect("powerup");
98    SoundEffect explosionsfx = LoadSoundEffect("explosion");
99
100    //Weapon
101    double wpn_shootRate = 0.1;
102    IntMeter wpn_damageRatio = new IntMeter(1, 1, 10);
103    DoubleMeter wpn_spread = new DoubleMeter(1,1,10);
104
105    //Collision ignore groups
106    //2: player bullets/enemy bullets
107    //3: enemies
108    //4: powerups
109
110    Timer wpn_timer = new Timer();
111
112
113    public override void Begin()
114    {
115        //Load SFX
116        hurtsfx.Play();
117        explosionsfx.Play();
118        hitsfx.Play();
119        shootsfx.Play();
120        powerupsfx.Play();
121        //Load Anim
122        explosion_anim = LoadAnimation("explosionanim");
123
124        SetWindowSize(1280, 800, false);
125        SmoothTextures = false;
126        Level.Size = new Vector(1280, 800);
127
128        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
129
130        CreateLevel("level_test");
131    }
132
133    //TODO INTRO
134    void introScene()
135    {
136        introBorders();
137
138
139    }
140    void introBorders()
141    {
142        PhysicsObject introBorder = new PhysicsObject(Screen.WidthSafe, Screen.HeightSafe / 4);
143        introBorder.Shape = Shape.Rectangle;
144        introBorder.Color = Color.Black;
145        introBorder.IgnoresCollisionResponse = true;
146        introBorder.IgnoresPhysicsLogics = true;
147        introBorder.Position = new Vector(introBorder.Position.X, Screen.TopSafe - introBorder.Height / 2);
148        Add(introBorder);
149
150        PhysicsObject introBorder2 = new PhysicsObject(Screen.WidthSafe, Screen.HeightSafe / 4);
151        introBorder2.Shape = Shape.Rectangle;
152        introBorder2.Color = Color.Black;
153        introBorder2.IgnoresCollisionResponse = true;
154        introBorder2.IgnoresPhysicsLogics = true;
155        introBorder2.Position = new Vector(introBorder2.Position.X, Screen.BottomSafe + introBorder2.Height / 2);
156        Add(introBorder2);
157    }
158
159    //Stage creation
160    void CreateLevel(string level)
161    {
162        //Level.Background.CreateStars();
163       
164        TileMap lvl = TileMap.FromLevelAsset(level);
165        lvl.SetTileMethod('x', border);
166        lvl.SetTileMethod('%', frontBorder);
167        lvl.SetTileMethod('&', backBorder);
168        lvl.SetTileMethod('P', AddPlayer);
169        lvl.SetTileMethod('1', enemy_ship_1);
170        lvl.SetTileMethod('R', enemy_ship_1_red);
171        lvl.SetTileMethod('B', enemy_ship_1_bottom);
172        lvl.SetTileMethod('T', enemy_ship_1_top);
173        lvl.SetTileMethod('2', enemy_ship_2);
174        lvl.SetTileMethod('3', enemy_ship_3);
175        lvl.SetTileMethod('4', enemy_ship_4_top);
176        lvl.SetTileMethod('$', enemy_ship_4_bottom);
177        lvl.Execute(35, 35);
178
179        Level.Background.Color = Color.LightGray;
180        GameObject bg = new GameObject(1280, 800);
181        bg.Position = cntr;
182        bg.Image = space_bg;
183        bg.MoveTo(cntr - new Vector(1280, 0), 1000);
184
185        GameObject bg2 = new GameObject(1280, 800);
186        bg2.Position = cntr+new Vector(1280,0);
187        bg2.Image = space_bg;
188        bg2.MoveTo(cntr,1000);
189
190        Timer scroll = new Timer();
191        scroll.Interval = 0.001;
192        scroll.Timeout += delegate
193        {
194            if (bg.Position.X <= cntr.X - 1279)
195            {
196                bg.Position = cntr;
197                bg.MoveTo(cntr - new Vector(1280, 0), 1000);
198            };
199            if (bg2.Position.X <= cntr.X + 1)
200            {
201                bg2.Position = cntr+new Vector(1280,0);
202                bg2.MoveTo(cntr, 1000);
203            };
204        };
205        scroll.Start();
206        Add(bg, -3);
207        Add(bg2, -3);
208
209        //AddPlayer(Screen.Center, 0, 0);
210        AddControls();
211        AddHealthbar();
212        setwpn_timer();
213
214        Camera.Position = player.Position;
215        //Camera.ZoomFactor = 0.4;
216       //edgeBorders();
217    }
218    //Tiles for level
219    void border(Vector position, double width, double height)
220    {
221        PhysicsObject border2 = PhysicsObject.CreateStaticObject(width*1.5, height);
222        border2.Position = position;
223        border2.Restitution = 0;
224        border2.KineticFriction = 0;
225        border2.StaticFriction = 0;
226        border2.Color = Color.Lighter(Color.Black, 20);
227        border2.Tag = "border";
228        Add(border2, 1);
229    }
230    void frontBorder(Vector position, double width, double height)
231    {
232        frontborder border = new frontborder(width, height);
233        border.Position = position;
234        border.Color = Color.White;
235        border.Restitution = 0;
236        border.Tag = "border";
237        border.IgnoresCollisionResponse = true;
238        border.IgnoresPhysicsLogics = true;
239        AddCollisionHandler<PhysicsObject, player>(border, frontBorderCollision);
240        AddCollisionHandler<PhysicsObject, enemy>(border, frontBorderCollisionEnemy);
241        Add(border);
242    }
243    void backBorder(Vector position, double width, double height)
244    {
245        backborder border = new backborder(width, height);
246        border.Position = position;
247        border.Color = Color.White;
248        border.Restitution = 0;
249        border.Tag = "border";
250        border.IgnoresCollisionResponse = true;
251        border.IgnoresCollisionResponse = true;
252        AddCollisionHandler<PhysicsObject, player>(border, backBorderCollision);
253        //AddCollisionHandler<PhysicsObject, enemy>(border, backBorderCollisionEnemy);
254        Add(border);
255    }
256    void frontBorderCollision(PhysicsObject border, PhysicsObject target)
257    {
258        player.health.Value = player.health.Value - player.health.Value;
259    }
260    void frontBorderCollisionEnemy(PhysicsObject border, enemy enemy)
261    {
262        enemy.canShoot = true;
263    }
264    void backBorderCollision(PhysicsObject border, PhysicsObject target)
265    {
266        player.health.Value = player.health.Value - player.health.Value;
267    }
268    void backBorderCollisionEnemy(PhysicsObject border, enemy enemy)
269    {
270        enemy.Destroy();
271    }
272
273    void testblock(Vector pos, double width, double height)
274    {
275        PhysicsObject b = new PhysicsObject(width, height);
276        b.Position = pos;
277        b.Shape = Shape.Rectangle;
278        b.Color = Color.Blue;
279        Add(b);
280    }
281
282    //Player related
283    void AddPlayer(Vector pos, double width, double height)
284    {
285        cntr = pos;
286
287        player.Shape = Shape.Circle;
288        player.Color = Color.Red;
289        player.MomentOfInertia = 10;
290        player.Restitution = 0;
291        player.Mass = int.MaxValue;
292        player.CanRotate = true;
293        player.KineticFriction = 0;
294        player.StaticFriction = 0;
295        player.IgnoresGravity = true;
296        player.Position = pos;
297        player.Tag = "player1";
298        Add(player,2);
299
300        playership.Image = player_ship_02;
301        playership.IgnoresCollisionResponse = true;
302        playership.IgnoresPhysicsLogics = true;
303        playership.Angle = Angle.FromDegrees(-90);
304        playership.CanRotate = false;
305        playership.Tag = "playership";
306        //playership.Parent = player;
307        playership.Position = player.Position;
308
309        FollowerBrain playershipbrain = new FollowerBrain(player);
310        playershipbrain.Speed = 500;
311        playershipbrain.DistanceFar = 5000;
312        playershipbrain.DistanceClose = 0;
313        playershipbrain.StopWhenTargetClose = true;
314        playershipbrain.Active = true;
315        playershipbrain.TurnWhileMoving = false;
316
317        playership.Brain = playershipbrain;
318        Add(playership, -1);
319    }
320    void AddHealthbar()
321    {
322        ProgressBar healthBar = new ProgressBar(135, 10);
323        healthBar.BorderColor = Color.Black;
324        healthBar.Color = Color.Black;
325        healthBar.BarColor = Color.Red;
326        healthBar.BindTo(player.health);
327        healthBar.Angle = Angle.RightAngle;
328        healthBar.Position = new Vector(Screen.LeftSafe + 30, Screen.BottomSafe + 200);
329        Add(healthBar);
330    }
331    void AddControls()
332
333    {
334        ControllerOne.Listen(Button.Back, ButtonState.Pressed, Exit, null);
335        ControllerOne.ListenAnalog(AnalogControl.LeftStick, -0.1, move, null);
336
337        ControllerOne.Listen(Button.B, ButtonState.Pressed, shoot, null);
338        ControllerOne.Listen(Button.B, ButtonState.Released, stopShoot, null);
339
340        //cheat
341        Keyboard.Listen(Key.U, ButtonState.Pressed, cheat_upgrade, null);
342        Keyboard.Listen(Key.I, ButtonState.Pressed, cheat_damage, null);
343    }
344    void move(AnalogState speed)
345    {
346        player.Velocity = speed.StateVector * player_speed / (ControllerOne.LeftTriggerState+1);
347    }
348
349    void cheat_upgrade()
350    {
351        wpn_spread.Value++;
352    }
353    void cheat_damage()
354    {
355        wpn_damageRatio.Value++;
356    }
357
358    //Weapon system
359    void shoot()
360    {
361        //wpn_timer.Stop();
362        wpn_timer.Interval = wpn_shootRate;
363
364        wpn_timer.Start();
365    }
366    void setwpn_timer()
367    {
368            wpn_timer.Timeout += delegate
369        {
370            if (!player.IsDestroyed)
371            {
372                if (ControllerOne.GetButtonState(Button.B) == ButtonState.Down)
373                {
374                    Weapon();
375                    wpn_timer.Interval = wpn_shootRate;
376                    shootsfx.Play();
377                }
378            };
379        };
380    }
381    void stopShoot()
382    {
383        wpn_timer.Stop();
384    }
385    void Weapon()
386    {
387        if (wpn_spread.Value == 1)
388        {
389            Projectile(player.Position + new Vector(10, 5), new Vector(1200, 0), new Vector(40, 12) );
390            Projectile(player.Position + new Vector(10, -5), new Vector(1200, 0), new Vector(40, 12) );
391        }
392        else if (wpn_spread.Value == 2)
393        {
394            Projectile(player.Position + new Vector(10, 10), new Vector(1200, 0), new Vector(40, 12) );
395            Projectile(player.Position + new Vector(10, -10), new Vector(1200, 0), new Vector(40, 12) );
396            Projectile(player.Position + new Vector(10, 0), new Vector(1200, 0), new Vector(40, 12) );
397        }
398        else if (wpn_spread.Value == 3)
399        {
400            Projectile(player.Position + new Vector(10, 5), new Vector(1200, 15), new Vector(40, 12) );
401            Projectile(player.Position + new Vector(10, -5), new Vector(1200, -15), new Vector(40, 12) );
402            Projectile(player.Position + new Vector(10, 10), new Vector(1200, 20), new Vector(40, 12) );
403            Projectile(player.Position + new Vector(10, -10), new Vector(1200, -20), new Vector(40, 12) );
404        }
405        else if (wpn_spread.Value == 4)
406        {
407            Projectile(player.Position + new Vector(10, 5), new Vector(1200, 25), new Vector(40, 12) );
408            Projectile(player.Position + new Vector(10, -5), new Vector(1200, -25), new Vector(40, 12) );
409            Projectile(player.Position + new Vector(10, 0), new Vector(1200, 0), new Vector(40, 12) );
410            Projectile(player.Position + new Vector(10, 10), new Vector(1200, 50), new Vector(40, 12) );
411            Projectile(player.Position + new Vector(10, -10), new Vector(1200, -50), new Vector(40, 12) );
412        }
413        else if (wpn_spread.Value == 5)
414        {
415            Projectile(player.Position + new Vector(10, 0), new Vector(1200, 0), new Vector(40, 12) );
416            Projectile(player.Position + new Vector(10, -0), new Vector(1200, 0), new Vector(40, 12) );
417
418            Projectile(player.Position + new Vector(10, 5), new Vector(1200, 50), new Vector(40, 12) );
419            Projectile(player.Position + new Vector(10, -5), new Vector(1200, -50), new Vector(40, 12) );
420
421            Projectile(player.Position + new Vector(10, 10), new Vector(1200, 55), new Vector(40, 12) );
422            Projectile(player.Position + new Vector(10, -10), new Vector(1200, -55), new Vector(40, 12) );
423        }
424        else if (wpn_spread.Value == 6)
425        {
426            Projectile(player.Position + new Vector(10, 0), new Vector(1200, 25), new Vector(40, 12) );
427            Projectile(player.Position + new Vector(10, -0), new Vector(1200, -25), new Vector(40, 12) );
428            Projectile(player.Position + new Vector(10, 0), new Vector(1200, 0), new Vector(40, 12) );
429            Projectile(player.Position + new Vector(10, 5), new Vector(1200, 50), new Vector(40, 12) );
430            Projectile(player.Position + new Vector(10, -5), new Vector(1200, -50), new Vector(40, 12) );
431
432            Projectile(player.Position + new Vector(10, 10), new Vector(1200, 75), new Vector(40, 12) );
433            Projectile(player.Position + new Vector(10, -10), new Vector(1200, -75), new Vector(40, 12) );
434        }
435        else if (wpn_spread.Value == 7)
436        {
437            Projectile(player.Position + new Vector(10, 0), new Vector(1200, 15), new Vector(40, 12) );
438            Projectile(player.Position + new Vector(10, -0), new Vector(1200, -15), new Vector(40, 12) );
439            Projectile(player.Position + new Vector(10, 5), new Vector(1200, 15), new Vector(40, 12) );
440            Projectile(player.Position + new Vector(10, -5), new Vector(1200, -15), new Vector(40, 12) );
441
442            Projectile(player.Position + new Vector(10, 0), new Vector(1200, 50), new Vector(40, 12) );
443            Projectile(player.Position + new Vector(10, -0), new Vector(1200, -50), new Vector(40, 12) );
444
445            Projectile(player.Position + new Vector(10, 10), new Vector(1200, 50), new Vector(40, 12) );
446            Projectile(player.Position + new Vector(10, -10), new Vector(1200, -50), new Vector(40, 12) );
447        }
448        else if (wpn_spread.Value == 8)
449        {
450            Projectile(player.Position + new Vector(10, 0), new Vector(1200, 0), new Vector(40, 12) );
451            Projectile(player.Position + new Vector(10, 0), new Vector(1200, 25), new Vector(40, 12) );
452            Projectile(player.Position + new Vector(10, -0), new Vector(1200, -25), new Vector(40, 12) );
453            Projectile(player.Position + new Vector(10, 5), new Vector(1200, 25), new Vector(40, 12) );
454            Projectile(player.Position + new Vector(10, -5), new Vector(1200, -25), new Vector(40, 12) );
455
456            Projectile(player.Position + new Vector(10, 5), new Vector(1200, 50), new Vector(40, 12) );
457            Projectile(player.Position + new Vector(10, -5), new Vector(1200, -50), new Vector(40, 12) );
458
459            Projectile(player.Position + new Vector(10, 10), new Vector(1200, 50), new Vector(40, 12) );
460            Projectile(player.Position + new Vector(10, -10), new Vector(1200, -50), new Vector(40, 12) );
461        }
462        else if (wpn_spread.Value == 9)
463        {
464            Projectile(player.Position + new Vector(10, 0), new Vector(1200, 15), new Vector(40, 12));
465            Projectile(player.Position + new Vector(10, -0), new Vector(1200, -15), new Vector(40, 12));
466            Projectile(player.Position + new Vector(10, 10), new Vector(1200, 15), new Vector(40, 12));
467            Projectile(player.Position + new Vector(10, -10), new Vector(1200, -15), new Vector(40, 12));
468
469            Projectile(player.Position + new Vector(10, 0), new Vector(1200, 50), new Vector(40, 12));
470            Projectile(player.Position + new Vector(10, -0), new Vector(1200, -50), new Vector(40, 12));
471
472            Projectile(player.Position + new Vector(10, 10), new Vector(1200, 50), new Vector(40, 12));
473            Projectile(player.Position + new Vector(10, -10), new Vector(1200, -50), new Vector(40, 12));
474
475            Projectile(player.Position + new Vector(10, 0), new Vector(1200, 75), new Vector(40, 12));
476            Projectile(player.Position + new Vector(10, -0), new Vector(1200, -75), new Vector(40, 12));
477        }
478        else if (wpn_spread.Value == 10)
479        {
480            Projectile(player.Position + new Vector(10, 0), new Vector(1200, 25), new Vector(40, 12) );
481            Projectile(player.Position + new Vector(10, -0), new Vector(1200, -25), new Vector(40, 12));
482            Projectile(player.Position + new Vector(10, 0), new Vector(1200, 0), new Vector(40, 12));
483            Projectile(player.Position + new Vector(10, 0), new Vector(1200, 50), new Vector(40, 12));
484            Projectile(player.Position + new Vector(10, -0), new Vector(1200, -50), new Vector(40, 12) );
485
486            Projectile(player.Position + new Vector(10, 5), new Vector(1200, 75), new Vector(40, 12) );
487            Projectile(player.Position + new Vector(10, -5), new Vector(1200, -75), new Vector(40, 12) );
488
489            Projectile(player.Position + new Vector(10, 10), new Vector(1200, 100), new Vector(40, 12) );
490            Projectile(player.Position + new Vector(10, -10), new Vector(1200, -100), new Vector(40, 12) );
491
492            Projectile(player.Position + new Vector(10, 10), new Vector(1200, 125), new Vector(40, 12) );
493            Projectile(player.Position + new Vector(10, -10), new Vector(1200, -125), new Vector(40, 12) );
494        }
495    }
496    void Projectile(Vector pos, Vector vel, Vector size)
497    {
498        bullet projectile = new bullet(size.X, size.Y);
499        projectile.Shape = Shape.Diamond;
500        projectile.IgnoresGravity = true;
501        projectile.Position = pos;
502        projectile.Tag = "player_bullet";
503
504        if (wpn_damageRatio <= 2) projectile.Image = bullet_player01;
505        else if (wpn_damageRatio.Value <= 4) projectile.Image = bullet_player03;
506        else if (wpn_damageRatio.Value <= 6) projectile.Image = bullet_player04;
507        else if (wpn_damageRatio.Value <= 8) projectile.Image = bullet_player02;
508        else if (wpn_damageRatio.Value <= 10) projectile.Image = bullet_player05;
509
510        projectile.damage = wpn_damageRatio.Value;
511            projectile.IgnoresCollisionResponse = true;
512
513        projectile.CollisionIgnoreGroup = 2;
514        projectile.MaximumLifetime = TimeSpan.FromSeconds(1.57);
515
516        //AddCollisionHandler(projectile, "border", destroy);
517        AddCollisionHandler<bullet, frontborder>(projectile, destroy);
518        AddCollisionHandler<bullet, enemy>(projectile, damageEnemy);
519
520        Add(projectile, 0);
521        projectile.Hit(vel / 1.5);
522        projectile.Angle = projectile.Velocity.Angle;
523    }
524
525    //Enemies
526    void enemy_ship_1(Vector pos, double width, double height)
527    {
528        enemy enemyship = new enemy(70, 35);
529        enemyship.Shape = Shape.Circle;
530        enemyship.Color = Color.Black;
531        enemyship.Position = pos;
532        enemyship.IgnoresCollisionResponse = true;
533        enemyship.CollisionIgnoreGroup = 3;
534        enemyship.health.MaxValue = 6;
535        enemyship.Image = enemy_ship_01;
536
537        Add(enemyship, -1);
538        enemyship.Hit(stagespeed);
539        AddCollisionHandler<enemy, player>(enemyship, damagePlayerEnemyShip);
540        AddCollisionHandler<enemy, frontborder>(enemyship, enemy_ship_1_frontborder);
541    }
542    void enemy_ship_1_frontborder(enemy enemyship, frontborder border)
543    {
544        enemyship.LifetimeLeft = TimeSpan.FromSeconds(3);
545    }
546    void enemy_ship_1_red(Vector pos, double width, double height)
547    {
548        enemy enemyship = new enemy(70, 35);
549        enemyship.Shape = Shape.Circle;
550        enemyship.Color = Color.Black;
551        enemyship.Position = pos;
552        enemyship.IgnoresCollisionResponse = true;
553        enemyship.health.MaxValue = 6;
554        enemyship.Image = enemy_ship_01_red;
555        enemyship.CollisionIgnoreGroup = 3;
556
557        Add(enemyship, -1);
558        enemyship.Hit(stagespeed);
559        AddCollisionHandler<enemy, player>(enemyship, damagePlayerEnemyShip);
560        AddCollisionHandler<enemy, frontborder>(enemyship, enemy_ship_1_red_frontborder);
561    }
562    void enemy_ship_1_red_frontborder(enemy enemyship, frontborder border)
563    {
564        if (!enemyship.canShoot)
565        {
566            enemyship.Angle = Angle.FromDegrees(180);
567            enemyship.Velocity = -stagespeed;
568            enemyship.Position = new Vector(border.X-1400, enemyship.Position.Y);
569            enemyship.LifetimeLeft = TimeSpan.FromSeconds(3);
570
571            enemyship.canShoot = true;
572        };
573    }
574    void enemy_ship_1_bottom(Vector pos, double width, double height)
575    {
576        enemy enemyship = new enemy(35, 70);
577        enemyship.Shape = Shape.Circle;
578        enemyship.Color = Color.Black;
579        enemyship.Position = pos;
580        enemyship.IgnoresCollisionResponse = true;
581        enemyship.CollisionIgnoreGroup = 3;
582        enemyship.health.MaxValue = 6;
583        enemyship.Image = enemy_ship_01_blue;
584        enemyship.Angle = Angle.FromDegrees(90);
585
586        Add(enemyship, -1);
587        enemyship.Hit(stagespeed);
588        AddCollisionHandler<enemy, player>(enemyship, damagePlayerEnemyShip);
589        AddCollisionHandler<PhysicsObject, frontborder>(enemyship, enemy_ship_1_bottom_frontborder);
590    }
591    void enemy_ship_1_bottom_frontborder(PhysicsObject enemyship, frontborder br)
592    {
593        enemyship.LifetimeLeft = TimeSpan.FromSeconds(3);
594        enemyship.Angle = Angle.FromDegrees(0);
595        enemyship.Velocity = new Vector(0, -stagespeed.X/1.7);
596        enemyship.Position = new Vector(cntr.X + enemyship.Y, -405);
597    }
598    void enemy_ship_1_top(Vector pos, double width, double height)
599    {
600        enemy enemyship = new enemy(35, 70);
601        enemyship.Shape = Shape.Circle;
602        enemyship.Color = Color.Black;
603        enemyship.Position = pos;
604        enemyship.IgnoresCollisionResponse = true;
605        enemyship.CollisionIgnoreGroup = 3;
606        enemyship.health.MaxValue = 6;
607        enemyship.Image = enemy_ship_01_blue_inverted;
608        enemyship.Angle = Angle.FromDegrees(90);
609
610        Add(enemyship, -1);
611        enemyship.Hit(stagespeed);
612        AddCollisionHandler<enemy, player>(enemyship, damagePlayerEnemyShip);
613        AddCollisionHandler<PhysicsObject, frontborder>(enemyship, enemy_ship_1_top_frontborder);
614    }
615    void enemy_ship_1_top_frontborder(PhysicsObject enemysship, frontborder br)
616    {
617        enemysship.LifetimeLeft = TimeSpan.FromSeconds(3);
618        enemysship.Angle = Angle.FromDegrees(0);
619        enemysship.Velocity = new Vector(0, stagespeed.X / 1.75);
620
621        enemysship.Position = new Vector(cntr.X + enemysship.Y, 405);
622    }
623    void enemy_ship_2(Vector pos, double widht, double height)
624    {
625        enemy enemyship = new enemy(70, 30);
626        enemyship.Shape = Shape.Circle;
627        enemyship.Color = Color.Black;
628        enemyship.Position = pos;
629        enemyship.IgnoresCollisionResponse = true;
630        enemyship.CollisionIgnoreGroup = 3;
631        enemyship.health.MaxValue = 12;
632        enemyship.Image = enemy_ship_02;
633
634        Add(enemyship, -1);
635        enemyship.Hit(stagespeed);
636        AddCollisionHandler<enemy, player>(enemyship, damagePlayerEnemyShip);
637        AddCollisionHandler<enemy, frontborder>(enemyship, enemy_ship_2_start_shooting);
638    }
639    void enemy_ship_2_start_shooting(enemy enemyship, frontborder border)
640    {
641        if (!enemyship.canShoot)
642        {
643            enemyship.canShoot = true;
644
645            enemyship.Velocity = enemyship.Velocity / 2;
646
647            double angle = 0;
648            double i = 1;
649            double c = 0;
650            UnlimitedAngle angle2;
651
652            Timer shoot = new Timer();
653            shoot.Interval = 0.01;
654            shoot.Timeout += delegate
655            {
656                if (c >= 200) shoot.Stop();
657                else if (c != 200)
658                {
659                    if (!enemyship.IsDestroyed)
660                    {
661                        angle = angle + i;
662                        i = i + 0.1;
663                        c++;
664                        angle2 = UnlimitedAngle.FromDegrees(angle);
665                        enemy_shoot_2(enemyship.Position,
666
667                            angle2.GetVector() * 500
668                            );
669                    }
670                    else shoot.Stop();
671                };
672
673            };
674
675            Timer wait = new Timer();
676            wait.Interval = 0.5;
677            wait.Timeout += delegate
678            {
679                if (!enemyship.IsDestroyed) shoot.Start();
680                else wait.Stop();
681            };
682            wait.Start(1);
683        }
684    }
685    void enemy_ship_3(Vector pos, double width, double height)
686    {
687        enemy enemyship = new enemy(71, 56);
688        enemyship.Shape = Shape.Circle;
689        enemyship.Position = pos;
690        enemyship.IgnoresCollisionResponse = true;
691        enemyship.CollisionIgnoreGroup = 3;
692        enemyship.health.MaxValue = 40;
693        enemyship.Image = enemy_ship_03;
694        enemyship.explosion_scale = 75;
695
696        Add(enemyship,-1);
697        enemyship.Hit(stagespeed);
698
699        AddCollisionHandler<enemy, frontborder>(enemyship, enemy_ship_3_start_shooting);
700        AddCollisionHandler<enemy, player>(enemyship,damagePlayerEnemyShip2);
701    }
702    void enemy_ship_3_start_shooting(enemy enemyship, frontborder border)
703    {
704        if (!enemyship.canShoot)
705        {
706            enemyship.canShoot = true;
707            enemyship.LifetimeLeft = TimeSpan.FromSeconds(60);
708            enemyship.Velocity = enemyship.Velocity / 3;
709            int i = 0;
710            int e = 0;
711
712            Timer wait = new Timer();
713
714            Timer enemy_shoot = new Timer();
715            enemy_shoot.Interval = 0.02;
716            enemy_shoot.Timeout += delegate
717            {
718                if (e >= 4)
719                {
720                    enemy_shoot.Stop();
721                    enemyship.Velocity = stagespeed / 3;
722                    enemyship.LifetimeLeft = TimeSpan.FromSeconds(6);
723                };
724                i++;
725                if (i == 50 && e != 4)
726                {
727                    enemy_shoot.Stop();
728                    wait.Start(1);
729                    e++;
730                };
731                if (enemyship.IsDestroyed) enemy_shoot.Stop();
732                if (e != 4) enemy_shoot_1(enemyship.Position + new Vector(RandomGen.NextDouble(-30, 30), RandomGen.NextDouble(-30, 30)));
733            };
734
735            wait.Interval = 0.5;
736            wait.Timeout += delegate
737            {
738                if (enemyship.IsDestroyed) wait.Stop();
739                i = 0;
740                enemy_shoot.Start(50);
741            };
742
743            Timer enemy_start = new Timer();
744            enemy_start.Interval = 3;
745            enemy_start.Timeout += delegate
746            {
747                if (!enemyship.IsDestroyed)
748                {
749                    enemy_shoot.Start(50);
750                    enemyship.Velocity = new Vector(0,0);
751                };
752            };
753            enemy_start.Start(1);
754
755        };
756    }
757    void enemy_ship_4_top(Vector pos, double width, double height)
758    {
759        enemy enemyship = new enemy(43, 33);
760        enemyship.Shape = Shape.Circle;
761        enemyship.Color = Color.Black;
762        enemyship.Position = pos;
763        enemyship.IgnoresCollisionResponse = true;
764        enemyship.CollisionIgnoreGroup = 3;
765        enemyship.health.MaxValue = 10;
766        enemyship.Image = enemy_ship_04;
767
768        Add(enemyship, -1);
769        enemyship.Hit(stagespeed);
770        AddCollisionHandler<enemy, player>(enemyship, damagePlayerEnemyShip);
771        AddCollisionHandler<enemy, frontborder>(enemyship, enemy_ship_4_top_frontborder);
772    }
773    void enemy_ship_4_top_frontborder(enemy enemysship, frontborder br)
774    {
775        if (!enemysship.canShoot)
776        {
777            enemysship.canShoot = true;
778
779            //enemysship.LifetimeLeft = TimeSpan.FromSeconds(3);
780            enemysship.Velocity = new Vector(0, stagespeed.X);
781            enemysship.Position = new Vector(cntr.X + enemysship.Y, 405);
782
783            Timer chk = new Timer();
784            chk.Interval = 0.01;
785            chk.Timeout += delegate
786            {
787                if (!enemysship.IsDestroyed)
788                {
789                    if (enemysship.Y >= player.Y - 10 && enemysship.Y <= player.Y + 10)
790                    {
791                        enemysship.Velocity = stagespeed;
792                        if ((player.X - enemysship.X) > 0) enemysship.Velocity = -stagespeed;
793                        chk.Stop();
794                        enemysship.LifetimeLeft = TimeSpan.FromSeconds(3);
795                    }
796                }
797                else if (enemysship.IsDestroyed) chk.Stop();
798            };
799
800            chk.Start();
801        };
802    }
803    void enemy_ship_4_bottom(Vector pos, double width, double height)
804    {
805        enemy enemyship = new enemy(43, 33);
806        enemyship.Shape = Shape.Circle;
807        enemyship.Color = Color.Black;
808        enemyship.Position = pos;
809        enemyship.IgnoresCollisionResponse = true;
810        enemyship.CollisionIgnoreGroup = 3;
811        enemyship.health.MaxValue = 10;
812        enemyship.Image = enemy_ship_04;
813
814        Add(enemyship, -1);
815        enemyship.Hit(stagespeed);
816        AddCollisionHandler<enemy, player>(enemyship, damagePlayerEnemyShip);
817        AddCollisionHandler<enemy, frontborder>(enemyship, enemy_ship_4_bottom_frontborder);
818    }
819    void enemy_ship_4_bottom_frontborder(enemy enemysship, frontborder br)
820    {
821        if (!enemysship.canShoot)
822        {
823            enemysship.canShoot = true;
824            enemysship.Velocity = new Vector(0, -stagespeed.X);
825            enemysship.Position = new Vector(cntr.X + enemysship.Y, -405);
826
827            Timer chk = new Timer();
828            chk.Interval = 0.01;
829            chk.Timeout += delegate
830            {
831                if (!enemysship.IsDestroyed)
832                {
833                    if (enemysship.Y >= player.Y - 10 && enemysship.Y <= player.Y + 10)
834                    {
835                        enemysship.Velocity = stagespeed;
836                        if ((player.X - enemysship.X) > 0) enemysship.Velocity = -stagespeed;
837                        chk.Stop();
838                        enemysship.LifetimeLeft = TimeSpan.FromSeconds(3);
839                    }
840                }
841                else if (enemysship.IsDestroyed) chk.Stop();
842            };
843
844            chk.Start();
845        };
846    }
847
848
849    void enemy_shoot_1(Vector pos)
850    {
851        bullet enemy_bullet = new bullet(27, 27);
852        enemy_bullet.Shape = Shape.Circle;
853        enemy_bullet.Position = pos;
854        enemy_bullet.IgnoresCollisionResponse = true;
855        enemy_bullet.CollisionIgnoreGroup = 2;
856        enemy_bullet.damage = 10;
857        enemy_bullet.MaximumLifetime = TimeSpan.FromSeconds(5);
858        enemy_bullet.Image = bullet_enemy_01;
859
860        enemy_bullet.Hit((player.Position - enemy_bullet.Position).Normalize() * 300);
861        Add(enemy_bullet, 0);
862        AddCollisionHandler<bullet, player>(enemy_bullet, damagePlayerBullet);
863    }
864
865    void enemy_shoot_2(Vector pos, Vector dir)
866    {
867        bullet enemy_bullet = new bullet(27, 27);
868        enemy_bullet.Shape = Shape.Circle;
869        enemy_bullet.Position = pos;
870        enemy_bullet.IgnoresCollisionResponse = true;
871        enemy_bullet.CollisionIgnoreGroup = 2;
872        enemy_bullet.damage = 10;
873        enemy_bullet.MaximumLifetime = TimeSpan.FromSeconds(5);
874        enemy_bullet.Image = bullet_enemy_02;
875
876        Add(enemy_bullet, 0);
877        enemy_bullet.Hit(dir/9);
878        AddCollisionHandler<bullet, player>(enemy_bullet, damagePlayerBullet);
879
880        Timer wait = new Timer();
881        wait.Interval = 0.8;
882        wait.Timeout += delegate
883        {
884            enemy_bullet.Velocity = dir;
885        };
886        wait.Start(1);
887    }
888
889    //Power-ups
890    void powerup(Vector pos)
891    {
892        int a = RandomGen.NextInt(1, 20);
893        if (a == 1)
894        {
895            createPowerup(pos);
896        };
897    }
898    void createPowerup(Vector pos)
899    {
900        int type = RandomGen.NextInt(1, 4);
901
902        PhysicsObject powerup = new PhysicsObject(13, 13);
903        powerup.Position = pos;
904        powerup.Tag = "powerup";
905        powerup.IgnoresCollisionResponse = true;
906        powerup.CollisionIgnoreGroup = 4;
907        powerup.MaximumLifetime = TimeSpan.FromSeconds(5);
908
909        FollowerBrain powerup_follow = new FollowerBrain(player);
910        powerup_follow.DistanceFar = 300;
911        powerup_follow.Speed = 500;
912        powerup_follow.Active = true;
913
914        powerup.Brain = powerup_follow;
915
916        if (type <= 2)
917        {
918            powerup.Image = powerup_damage;
919            AddCollisionHandler(powerup, "playership", powerupdamage);
920        }
921        else if (type >= 3)
922        {
923            powerup.Image = powerup_spread;
924            AddCollisionHandler(powerup, "playership", powerupspread);
925        }
926
927        Add(powerup, -2);
928    }
929    void powerupdamage(PhysicsObject powerup, PhysicsObject p)
930    {
931        wpn_damageRatio.Value++;
932        powerup.Destroy();
933        powerupsfx.Play();
934    }
935    void powerupspread(PhysicsObject powerup, PhysicsObject p)
936    {
937        wpn_spread.Value++;
938        powerup.Destroy();
939        powerupsfx.Play();
940    }
941
942    //Misc
943    void destroy(PhysicsObject p, PhysicsObject target)
944    {
945        p.Destroy();
946    }
947    void damagePlayerEnemyShip(enemy b, player p)
948    {
949        p.health.Value = p.health.Value - 10;
950        b.Destroy();
951        hurtsfx.Play();
952        explosionsfx.Play();
953        explosion_animation(b);
954    }
955    void damagePlayerEnemyShip2(enemy b, player p)
956    {
957        p.health.Value = p.health.Value - 10;
958        hurtsfx.Play();
959    }
960    void damagePlayerBullet(bullet b, player p)
961    {
962        p.health.Value = p.health.Value - b.damage;
963        b.Destroy();
964        hurtsfx.Play();
965    }
966    void damageEnemy(bullet b, enemy e)
967    {
968        e.health.Value = e.health.Value - b.damage;
969        if (e.health.Value <= 0)
970        {
971            powerup(e.Position);
972            explosionsfx.Play();
973            explosion_animation(e);
974        };
975        hitsfx.Play();
976        b.Destroy();
977       
978    }
979    void explosion_animation(enemy enemyship)
980    {
981        GameObject explosion = new GameObject(enemyship.explosion_scale, enemyship.explosion_scale);
982        explosion.Position = enemyship.Position;
983        explosion.Animation = explosion_anim;
984        explosion.MaximumLifetime = TimeSpan.FromSeconds(0.2);
985        Add(explosion,-1);
986        explosion.Animation.Start(1);
987    }
988}
Note: See TracBrowser for help on using the repository browser.