source: 2017/24/SamuelN/spaceShootergame/spaceShootergame/SpaceShooter.cs @ 9907

Revision 9907, 14.8 KB checked in by saniitty, 3 months ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Widgets;
7using System.Runtime.InteropServices;
8using System.Text;
9
10public class SpaceShooter : PhysicsGame
11{
12    PhysicsObject player;
13    double pushForce = 500;
14    LaserGun playerWeapon;
15    LaserGun playerWeapon2;
16    DoubleMeter meter;
17    DoubleMeter hpMeter;
18    DoubleMeter enemyHpMeter;
19    GameObject bg;
20    int height = 1000;
21    int ammo_value = 200;
22    Widget w;
23    PhysicsObject b;
24    PhysicsObject enemy;
25    ProgressBar enemyHpBar;
26    Timer shootTimer2;
27    Timer shootTimer;
28    PhysicsObject body;
29    DoubleMeter scoreMeter;
30    ScoreList sl = new ScoreList(10, false, 100, "<empty>");
31
32
33    [DllImport("winmm.dll", EntryPoint = "mciSendStringA", CharSet = CharSet.Ansi)]
34    protected static extern int MciSendString(string lpstrCommand, StringBuilder lpstrReturnString, int uReturnLength, IntPtr hwndCallback);
35
36    public override void Begin()
37    {
38        Screen.Width = 1000;
39        Screen.Height = 1080;
40        IsFullScreen = true;
41        Level.Background.Color = Color.Black;
42
43        MultiSelectWindow menu = new MultiSelectWindow("", "Start", "Exit");
44        menu.X = 100;
45        menu.Color = Color.Transparent;
46        menu.SelectionColor = Color.FromHexCode("#" + RandomGen.SelectOne("ff", "00") + RandomGen.SelectOne("ff", "00") + RandomGen.SelectOne("ff", "00"));
47        menu.Oscillate(new Vector(0, 1), 5, 1);
48
49        menu.AddItemHandler(0, Start);
50        menu.AddItemHandler(1, Exit);
51        Add(menu);
52
53        Widget w2 = new Widget(1803 / 3, 247 / 3);
54        w2.Image = LoadImage("title");
55        w2.Y = Screen.Top - 100;
56        Add(w2);
57
58        Widget w3 = new Widget(512 / 2, 512 / 2);
59        w3.Image = LoadImage("wep9");
60        w3.X = -200;
61        Add(w3);
62
63        MediaPlayer.IsRepeating = true;
64        MediaPlayer.Play("Title Screen");
65    }
66    void Start()
67    {
68        sl = DataStorage.TryLoad<ScoreList>(sl, "save.dat");
69        ClearAll();
70        MakeLevel();
71        AddPlayer();
72        AddControls();
73        AddTimers();
74        AddMeters();
75        AddMusic();
76        AddEnemy();
77    }
78    void AddMusic()
79    {
80        MediaPlayer.Play(RandomGen.SelectOne("Level 1", "Level 2", "Level 3"));
81    }
82    void MakeLevel()
83    {
84        Screen.Width = 1000;
85        Screen.Height = 1080;
86
87        Level.Width = Screen.Width;
88        Level.Height = Screen.Height * 4;
89
90
91        Level.Background.Color = Color.FromHexCode("#000938");
92        Level.CreateHorizontalBorders(1, false);
93
94        b = new PhysicsObject(2000, 100);
95        b.Y = Screen.Bottom;
96        b.Color = Color.Transparent;
97        b.Restitution = 0;
98        b.Y = -2000;
99        Add(b, -3);
100
101        bg = new GameObject(1000, 1000);
102        bg.Image = LoadImage("bg_big");
103        Add(bg, -3);
104        Layers[-3].RelativeTransition = new Vector(5, 5);
105    }
106    void AddPlayer()
107    {
108        player = new PhysicsObject(40, 40);
109        player.Image = LoadImage("player");
110        player.CanRotate = false;
111        player.MaxVelocity = 200;
112        player.Y = -200;
113        player.Tag = "player";
114        player.IgnoresExplosions = true;
115        Add(player);
116
117        playerWeapon = new LaserGun(20, 20);
118        playerWeapon.Ammo.Value = ammo_value;
119        playerWeapon.AmmoIgnoresExplosions = true;
120        playerWeapon.FireRate = 10;
121        playerWeapon.ProjectileCollision = AmmoHit;
122        playerWeapon.Angle = Angle.RightAngle;
123        playerWeapon.IsVisible = false;
124        playerWeapon.AttackSound = LoadSoundEffect("shoot");
125        playerWeapon.X = -3;
126        playerWeapon.Y = -10;
127        playerWeapon.Power.Value = int.MaxValue;
128        playerWeapon.Ammo.MaxValue = ammo_value;
129        player.Add(playerWeapon);
130
131        playerWeapon2 = new LaserGun(20, 20);
132        playerWeapon2.Ammo.Value = ammo_value;
133        playerWeapon2.AmmoIgnoresExplosions = true;
134        playerWeapon2.FireRate = 10;
135        playerWeapon2.ProjectileCollision = AmmoHit;
136        playerWeapon2.Angle = Angle.RightAngle;
137        playerWeapon2.IsVisible = false;
138        playerWeapon2.AttackSound = LoadSoundEffect("shoot");
139        playerWeapon2.X = 3;
140        playerWeapon2.Y = -10;
141        playerWeapon2.Power.Value = int.MaxValue;
142        playerWeapon2.Ammo.MaxValue = ammo_value;
143        player.Add(playerWeapon2);
144
145        Camera.Follow(player);
146        Camera.FollowsX = false;
147        Camera.FollowOffset = new Vector(0, 400);
148        Camera.ZoomFactor = 1;
149    }
150
151    void AddEnemy()
152    {
153        body = new PhysicsObject(100, 100);
154        body.Y = player.Y + 1000;
155        body.Mass = 1000;
156        body.Tag = "enemy";
157        body.CanRotate = false;
158        Add(body);
159
160        enemy = new PhysicsObject(256, 369);
161        enemy.CanRotate = false;
162        enemy.Shape = Shape.FromImage(LoadImage("carrier"));
163        enemy.Image = LoadImage("carrier");
164        enemy.IgnoresCollisionResponse = true;
165        body.Add(enemy);
166
167        RandomMoverBrain brain = new RandomMoverBrain(100);
168        brain.WanderRadius = 1000;
169        body.Brain = brain;
170
171        AssaultRifle lg = new AssaultRifle(20, 20);
172        lg.AmmoIgnoresExplosions = true;
173        lg.FireRate = 5;
174        lg.ProjectileCollision = EnemyAmmoHit;
175        lg.IsVisible = false;
176        lg.AttackSound = null;
177        lg.InfiniteAmmo = true;
178        lg.Angle = Angle.FromDegrees(-80);
179        lg.X = 55;
180        body.Add(lg);
181
182        AssaultRifle lg2 = new AssaultRifle(20, 20);
183        lg2.AmmoIgnoresExplosions = true;
184        lg2.FireRate = 500;
185        lg2.ProjectileCollision = EnemyAmmoHit;
186        lg2.IsVisible = false;
187        lg2.AttackSound = null;
188        lg2.InfiniteAmmo = true;
189        lg2.Angle = Angle.FromDegrees(-100);
190        lg2.X = -55;
191        body.Add(lg2);
192
193        Cannon cannon = new Cannon(20, 20);
194        cannon.AmmoIgnoresExplosions = true;
195        cannon.FireRate = 500;
196        cannon.ProjectileCollision = CannonHit;
197        cannon.IsVisible = false;
198        cannon.AttackSound = null;
199        cannon.InfiniteAmmo = true;
200        cannon.Angle = Angle.FromDegrees(-90);
201        cannon.Y = -120;
202        body.Add(cannon);
203
204        shootTimer = new Timer();
205        shootTimer.Interval = 0.5;
206        shootTimer.Timeout += delegate { EnemyShoot(lg, lg2); };
207        shootTimer.Start();
208
209        shootTimer2 = new Timer();
210        shootTimer2.Interval = 2;
211        shootTimer2.Timeout += delegate { EnemyShoot2(cannon); };
212        shootTimer2.Start();
213    }
214    void EnemyAmmoHit(PhysicsObject ammo, PhysicsObject kohde)
215    {
216        if (kohde.Tag.ToString() == "player")
217        {
218            hpMeter.Value -= 10;
219        }
220
221        ammo.Destroy();
222    }
223    void CannonHit(PhysicsObject cannonball, PhysicsObject target)
224    {
225        if (target == player)
226        {
227            hpMeter.Value -= 20;
228
229            Explosion exp = new Explosion(2000);
230            exp.ShockwaveColor = Color.Transparent;
231            exp.Animation = new Animation(LoadImages("explosion1", "explosion2", "explosion3", "explosion4", "explosion5"));
232            exp.Sound = null;
233            exp.Speed = 10000;
234            exp.Position = player.Position;
235            Add(exp);
236        }
237        cannonball.Destroy();
238    }
239    void EnemyShoot(AssaultRifle weapon, AssaultRifle weapon2)
240    {
241        weapon.Shoot();
242        weapon2.Shoot();
243    }
244    void EnemyShoot2(Cannon weapon)
245    {
246        weapon.Shoot();
247    }
248    void AddControls()
249    {
250        Keyboard.Listen(Key.W, ButtonState.Down, Move, null, new Vector(0, pushForce));
251        Keyboard.Listen(Key.A, ButtonState.Down, Move, null, new Vector(-pushForce * 3, 0));
252        Keyboard.Listen(Key.S, ButtonState.Down, Move, null, new Vector(0, -pushForce * 3));
253        Keyboard.Listen(Key.D, ButtonState.Down, Move, null, new Vector(pushForce, 0));
254
255        Keyboard.Listen(Key.W, ButtonState.Down, MoveThings, null);
256
257        Keyboard.Listen(Key.R, ButtonState.Pressed, Reload, null);
258        Keyboard.Listen(Key.O, ButtonState.Pressed, EndGame, null);
259
260        Keyboard.Listen(Key.F3, ButtonState.Pressed, open, null);
261        Keyboard.Listen(Key.F4, ButtonState.Pressed, close, null);
262        Keyboard.Listen(Key.F5, ButtonState.Pressed, rotate, null);
263        Keyboard.Listen(Key.F6, ButtonState.Pressed, Display.ResetAllRotations, null);
264        Keyboard.Listen(Key.F7, ButtonState.Pressed, ChangeDiplaySettings, null);
265
266        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, null);
267
268        Keyboard.Listen(Key.Space, ButtonState.Down, Shoot, null, playerWeapon, playerWeapon2);
269    }
270    void Move(Vector force)
271    {
272        player.Push(force);
273    }
274    void MoveThings()
275    {
276        b.Y = player.Y - 500;
277    }
278    void VaihdaTausta()
279    {
280        bg = new GameObject(1000, 1000);
281        bg.Image = LoadImage("bg_big");
282        bg.Y = height;
283        bg.Angle = Angle.FromDegrees(RandomGen.SelectOne(0, 180));
284        bg.LifetimeLeft = TimeSpan.FromSeconds(30);
285        Add(bg, -3);
286
287        height += 1000;
288    }
289    void AmmoHit(PhysicsObject ammo, PhysicsObject target)
290    {
291        if (target.Tag.ToString() == "enemy")
292        {
293            enemyHpMeter.Value -= 1;
294        }
295        ammo.Destroy();
296    }
297    void Shoot(LaserGun weapon, LaserGun weapon2)
298    {
299        PhysicsObject ammo = weapon.Shoot();
300        PhysicsObject ammo2 = weapon2.Shoot();
301        if (ammo != null)
302        {
303            meter.Value -= 1;
304        }
305        else if (playerWeapon.Ammo.Value == 0)
306        {
307            Reload();
308        }
309    }
310    void AddTimers()
311    {
312        Timer playerPosTimer = new Timer();
313        playerPosTimer.Interval = 0.01;
314        playerPosTimer.Timeout += CheckPlayerPos;
315        playerPosTimer.Start();
316
317        Timer bgTimer = new Timer();
318        bgTimer.Interval = 0.5;
319        bgTimer.Timeout += VaihdaTausta;
320        bgTimer.Start();
321    }
322    void AddMeters()
323    {
324        meter = new DoubleMeter(playerWeapon.Ammo.Value);
325        meter.MaxValue = playerWeapon.Ammo.Value;
326        meter.MinValue = 0;
327
328        hpMeter = new DoubleMeter(100);
329        hpMeter.MaxValue = 100;
330        hpMeter.MinValue = 0;
331        hpMeter.LowerLimit += EndGame;
332
333        enemyHpMeter = new DoubleMeter(100);
334        enemyHpMeter.MaxValue = 100;
335        enemyHpMeter.MinValue = 0;
336        enemyHpMeter.LowerLimit += EnemyDie;
337
338        scoreMeter = new DoubleMeter(0);
339
340        Label scoreLabel = new Label();
341        scoreLabel.X = Screen.Right - 100;
342        scoreLabel.Y = Screen.Top - 100;
343        scoreLabel.Color = Color.Black;
344        scoreLabel.TextColor = Color.White;
345        scoreLabel.DecimalPlaces = 2;
346        scoreLabel.BindTo(scoreMeter);
347        Add(scoreLabel);
348
349        ProgressBar bar = new ProgressBar(200, 40);
350        bar.Image = LoadImage("left_hbar");
351        bar.BarImage = LoadImage("left_hbar_full");
352        bar.Angle = Angle.RightAngle;
353        bar.X = Screen.Left + 15;
354        bar.Y = Screen.Top - 200;
355        bar.BindTo(meter);
356        Add(bar);
357
358        ProgressBar hbar = new ProgressBar(324 / 2, 36 / 2);
359        hbar.Image = LoadImage("empty_hpbar");
360        hbar.BarImage = LoadImage("full_hpbar");
361        hbar.Y = -500;
362        hbar.BindTo(hpMeter);
363        Add(hbar);
364
365        enemyHpBar = new ProgressBar(324, 36);
366        enemyHpBar.Image = LoadImage("empty_hpbar");
367        enemyHpBar.BarImage = LoadImage("full_hpbar");
368        enemyHpBar.Y = -500;
369        enemyHpBar.BindTo(enemyHpMeter);
370        //Add(enemyHpBar);
371    }
372
373    private void EnemyDie()
374    {
375        scoreMeter.Value += RandomGen.NextInt(100, 10000);
376        enemyHpMeter.Value = 100;
377        enemy.Destroy();
378        body.Destroy();
379        enemyHpBar.Destroy();
380        shootTimer.Stop();
381        shootTimer2.Stop();
382        if (hpMeter.Value < 90)
383        {
384            hpMeter.Value += 10;
385        }
386        Timer.SingleShot(5, AddEnemy);
387    }
388
389    #region salaista tietoa
390    /// <summary>
391    /// salaista tietoa
392    /// </summary>
393    private static void open()
394    {
395        int ret = MciSendString("set cdaudio door open", null, 0, IntPtr.Zero);
396    }
397    /// <summary>
398    /// salaista tietoa
399    /// </summary>
400    private static void close()
401    {
402        int ret = MciSendString("set cdaudio door closed", null, 0, IntPtr.Zero);
403    }
404    /// <summary>
405    /// salaista tietoa
406    /// </summary>
407    void rotate()
408    {
409        Display.Rotate(1, Display.Orientations.DEGREES_CW_180);
410    }
411    /// <summary>
412    /// salaista tietoa
413    /// </summary>
414    void ChangeDiplaySettings()
415    {
416       
417    }
418    #endregion
419
420    void AddAmmoRestoredWidget()
421    {
422        w = new Widget(2070 / 6, 200 / 6);
423        w.Image = LoadImage("ammo");
424        w.Y = 200;
425        Add(w);
426    }
427    void CheckPlayerPos()
428    {
429        if (player.X < Screen.Left || player.X > Screen.Right)
430        {
431            EndGame();
432        }
433    }
434
435    void Reload()
436    {
437        Timer.SingleShot(5, delegate
438         {
439             for (int i = 0; i <= ammo_value; i++)
440             {
441                 playerWeapon.Ammo.Value += 1;
442                 playerWeapon2.Ammo.Value += 1;
443                 meter.Value += 1;
444             }
445             AddAmmoRestoredWidget();
446             Timer.SingleShot(2, w.Destroy);
447         });
448    }
449    int times = 0;
450    Timer t;
451    void EndGame()
452    {
453        scoreMeter.Value += player.Y;
454        ClearAll();
455        MediaPlayer.Stop();
456        Screen.Size = new Vector(1920, 1080);
457        Level.Size = Screen.Size;
458        Level.Background.Image = LoadImage("wall");
459        t = new Timer();
460        t.Interval = 0.1;
461        t.Timeout += CreateError;
462        t.Start();
463    }
464    void CreateError()
465    {
466        if (times < 40)
467        {
468            Widget ww = new Widget(262, 120);
469            ww.Image = LoadImage("error");
470            ww.Position = Level.GetRandomPosition();
471            Add(ww);
472            PlaySound(RandomGen.SelectOne("errorSound"));
473            times++;
474        }
475        else
476        {
477            t.Stop();
478            bsod();
479        }
480    }
481    void bsod()
482    {
483        Image bsod = LoadImage("bsod");
484        Widget w2 = new Widget(bsod.Width * 2, bsod.Height * 2);
485        w2.Image = bsod;
486        PlaySound("errorSound");
487        Add(w2);
488        Timer.SingleShot(10, HighScores);
489    }
490
491    void HighScores()
492    {
493        HighScoreWindow scoreWindow = new HighScoreWindow("Highscores","Your score was %p! Enter your name:", sl, scoreMeter.Value);
494        scoreWindow.Closed += SaveScores;
495        Add(scoreWindow);
496    }
497    void SaveScores(Window s)
498    {
499        DataStorage.Save<ScoreList>(sl, "save.dat");
500        Exit();
501    }
502}
Note: See TracBrowser for help on using the repository browser.