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

Revision 9931, 15.6 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    IntMeter scoreMeter;
30    EasyHighScore ehs = new EasyHighScore("save.dat", 10, "<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(2584 / 3, 268 / 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        ClearAll();
69        MakeLevel();
70        AddPlayer();
71        AddControls();
72        AddTimers();
73        AddMeters();
74        AddMusic();
75        AddEnemy();
76    }
77    void AddMusic()
78    {
79        MediaPlayer.Play(RandomGen.SelectOne("Level 1", "Level 2", "Level 3"));
80    }
81    void MakeLevel()
82    {
83        Screen.Width = 1000;
84        Screen.Height = 1080;
85
86        Level.Width = Screen.Width;
87        Level.Height = Screen.Height * 4;
88
89
90        Level.Background.Color = Color.FromHexCode("#000938");
91        Level.CreateHorizontalBorders(1, false);
92
93        b = new PhysicsObject(2000, 100);
94        b.Y = Screen.Bottom;
95        b.Color = Color.Transparent;
96        b.Restitution = 0;
97        b.Y = -2000;
98        Add(b, -3);
99
100        bg = new GameObject(1000, 1000);
101        bg.Image = LoadImage("bg_big");
102        Add(bg, -3);
103        Layers[-3].RelativeTransition = new Vector(5, 5);
104    }
105    void AddPlayer()
106    {
107        player = new PhysicsObject(40, 40);
108        player.Image = LoadImage("player");
109        player.CanRotate = false;
110        player.MaxVelocity = 200;
111        player.Y = -200;
112        player.Tag = "player";
113        player.IgnoresExplosions = true;
114        Add(player);
115
116        playerWeapon = new LaserGun(20, 20);
117        playerWeapon.Ammo.Value = ammo_value;
118        playerWeapon.AmmoIgnoresExplosions = true;
119        playerWeapon.FireRate = 10;
120        playerWeapon.ProjectileCollision = AmmoHit;
121        playerWeapon.Angle = Angle.RightAngle;
122        playerWeapon.IsVisible = false;
123        playerWeapon.AttackSound = LoadSoundEffect("shoot");
124        playerWeapon.X = -3;
125        playerWeapon.Y = -10;
126        playerWeapon.Power.Value = int.MaxValue;
127        playerWeapon.Ammo.MaxValue = ammo_value;
128        player.Add(playerWeapon);
129
130        playerWeapon2 = new LaserGun(20, 20);
131        playerWeapon2.Ammo.Value = ammo_value;
132        playerWeapon2.AmmoIgnoresExplosions = true;
133        playerWeapon2.FireRate = 10;
134        playerWeapon2.ProjectileCollision = AmmoHit;
135        playerWeapon2.Angle = Angle.RightAngle;
136        playerWeapon2.IsVisible = false;
137        playerWeapon2.AttackSound = LoadSoundEffect("shoot");
138        playerWeapon2.X = 3;
139        playerWeapon2.Y = -10;
140        playerWeapon2.Power.Value = int.MaxValue;
141        playerWeapon2.Ammo.MaxValue = ammo_value;
142        player.Add(playerWeapon2);
143
144        Camera.Follow(player);
145        Camera.FollowsX = false;
146        Camera.FollowOffset = new Vector(0, 400);
147        Camera.ZoomFactor = 1;
148    }
149
150    void AddEnemy()
151    {
152        body = new PhysicsObject(100, 100);
153        body.Y = player.Y + 1000;
154        body.Mass = 1000;
155        body.Tag = "enemy";
156        body.CanRotate = false;
157        Add(body);
158
159        enemy = new PhysicsObject(256, 369);
160        enemy.CanRotate = false;
161        enemy.Shape = Shape.FromImage(LoadImage("carrier"));
162        enemy.Image = LoadImage("carrier");
163        enemy.IgnoresCollisionResponse = true;
164        body.Add(enemy);
165
166        RandomMoverBrain brain = new RandomMoverBrain(100);
167        brain.WanderRadius = 1000;
168        body.Brain = brain;
169
170        AssaultRifle lg = new AssaultRifle(20, 20);
171        lg.AmmoIgnoresExplosions = true;
172        lg.FireRate = 5;
173        lg.ProjectileCollision = EnemyAmmoHit;
174        lg.IsVisible = false;
175        lg.AttackSound = null;
176        lg.InfiniteAmmo = true;
177        lg.Angle = Angle.FromDegrees(-80);
178        lg.X = 55;
179        body.Add(lg);
180
181        AssaultRifle lg2 = new AssaultRifle(20, 20);
182        lg2.AmmoIgnoresExplosions = true;
183        lg2.FireRate = 500;
184        lg2.ProjectileCollision = EnemyAmmoHit;
185        lg2.IsVisible = false;
186        lg2.AttackSound = null;
187        lg2.InfiniteAmmo = true;
188        lg2.Angle = Angle.FromDegrees(-100);
189        lg2.X = -55;
190        body.Add(lg2);
191
192        Cannon cannon = new Cannon(20, 20);
193        cannon.AmmoIgnoresExplosions = true;
194        cannon.FireRate = 500;
195        cannon.ProjectileCollision = CannonHit;
196        cannon.IsVisible = false;
197        cannon.AttackSound = null;
198        cannon.InfiniteAmmo = true;
199        cannon.Angle = Angle.FromDegrees(-90);
200        cannon.Y = -120;
201        body.Add(cannon);
202
203        shootTimer = new Timer();
204        shootTimer.Interval = 0.1;
205        shootTimer.Timeout += delegate { EnemyShoot(lg, lg2); };
206        shootTimer.Start();
207
208        shootTimer2 = new Timer();
209        shootTimer2.Interval = 2;
210        shootTimer2.Timeout += delegate { EnemyShoot2(cannon); };
211        shootTimer2.Start();
212    }
213    void EnemyAmmoHit(PhysicsObject ammo, PhysicsObject kohde)
214    {
215        if (kohde.Tag.ToString() == "player")
216        {
217            hpMeter.Value -= 10;
218        }
219
220        ammo.Destroy();
221    }
222    void CannonHit(PhysicsObject cannonball, PhysicsObject target)
223    {
224        if (target == player)
225        {
226            hpMeter.Value -= 20;
227
228            Explosion exp = new Explosion(2000);
229            exp.ShockwaveColor = Color.Transparent;
230            exp.Animation = new Animation(LoadImages("explosion1", "explosion2", "explosion3", "explosion4", "explosion5"));
231            exp.Sound = null;
232            exp.Speed = 10000;
233            exp.Position = player.Position;
234            Add(exp);
235        }
236        cannonball.Destroy();
237    }
238    void EnemyShoot(AssaultRifle weapon, AssaultRifle weapon2)
239    {
240        weapon.Shoot();
241        weapon2.Shoot();
242    }
243    void EnemyShoot2(Cannon weapon)
244    {
245        weapon.Shoot();
246    }
247    void AddControls()
248    {
249        Keyboard.Listen(Key.W, ButtonState.Down, Move, null, new Vector(0, pushForce));
250        Keyboard.Listen(Key.A, ButtonState.Down, Move, null, new Vector(-pushForce * 3, 0));
251        Keyboard.Listen(Key.S, ButtonState.Down, Move, null, new Vector(0, -pushForce * 3));
252        Keyboard.Listen(Key.D, ButtonState.Down, Move, null, new Vector(pushForce, 0));
253
254        Keyboard.Listen(Key.W, ButtonState.Down, MoveThings, null);
255
256        Keyboard.Listen(Key.R, ButtonState.Pressed, Reload, null);
257        Keyboard.Listen(Key.O, ButtonState.Pressed, EndGame, null);
258
259        Keyboard.Listen(Key.F3, ButtonState.Pressed, open, null);
260        Keyboard.Listen(Key.F4, ButtonState.Pressed, close, null);
261        Keyboard.Listen(Key.F5, ButtonState.Pressed, rotate, null);
262        Keyboard.Listen(Key.F6, ButtonState.Pressed, Display.ResetAllRotations, null);
263        Keyboard.Listen(Key.F7, ButtonState.Pressed, ChangeDiplaySettings, null);
264
265        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, null);
266
267        Keyboard.Listen(Key.Space, ButtonState.Down, Shoot, null, playerWeapon, playerWeapon2);
268    }
269    void Move(Vector force)
270    {
271        player.Push(force);
272    }
273    void MoveThings()
274    {
275        b.Y = player.Y - 500;
276    }
277    void VaihdaTausta()
278    {
279        bg = new GameObject(1000, 1000);
280        bg.Image = LoadImage("bg_big");
281        bg.Y = height;
282        bg.Angle = Angle.FromDegrees(RandomGen.SelectOne(0, 180));
283        bg.LifetimeLeft = TimeSpan.FromSeconds(30);
284        Add(bg, -3);
285
286        height += 1000;
287    }
288    void AmmoHit(PhysicsObject ammo, PhysicsObject target)
289    {
290        if (target.Tag.ToString() == "enemy")
291        {
292            enemyHpMeter.Value -= 1;
293        }
294        ammo.Destroy();
295    }
296    void Shoot(LaserGun weapon, LaserGun weapon2)
297    {
298        PhysicsObject ammo = weapon.Shoot();
299        PhysicsObject ammo2 = weapon2.Shoot();
300        if (ammo != null)
301        {
302            meter.Value -= 1;
303        }
304        else if (playerWeapon.Ammo.Value == 0)
305        {
306            Reload();
307        }
308    }
309    void AddTimers()
310    {
311        Timer playerPosTimer = new Timer();
312        playerPosTimer.Interval = 0.01;
313        playerPosTimer.Timeout += CheckPlayerPos;
314        playerPosTimer.Start();
315
316        Timer bgTimer = new Timer();
317        bgTimer.Interval = 0.5;
318        bgTimer.Timeout += VaihdaTausta;
319        bgTimer.Start();
320    }
321    void AddMeters()
322    {
323        meter = new DoubleMeter(playerWeapon.Ammo.Value);
324        meter.MaxValue = playerWeapon.Ammo.Value;
325        meter.MinValue = 0;
326
327        hpMeter = new DoubleMeter(100);
328        hpMeter.MaxValue = 100;
329        hpMeter.MinValue = 0;
330        hpMeter.LowerLimit += EndGame;
331
332        enemyHpMeter = new DoubleMeter(100);
333        enemyHpMeter.MaxValue = 100;
334        enemyHpMeter.MinValue = 0;
335        enemyHpMeter.LowerLimit += EnemyDie;
336
337        scoreMeter = new IntMeter(0);
338
339        Label scoreLabel = new Label();
340        scoreLabel.X = Screen.Right - 100;
341        scoreLabel.Y = Screen.Top - 100;
342        scoreLabel.Color = Color.Black;
343        scoreLabel.TextColor = Color.White;
344        scoreLabel.DecimalPlaces = 2;
345        scoreLabel.BindTo(scoreMeter);
346        Add(scoreLabel);
347
348        ProgressBar bar = new ProgressBar(200, 40);
349        bar.Image = LoadImage("left_hbar");
350        bar.BarImage = LoadImage("left_hbar_full");
351        bar.Angle = Angle.RightAngle;
352        bar.X = Screen.Left + 15;
353        bar.Y = Screen.Top - 200;
354        bar.BindTo(meter);
355        Add(bar);
356
357        ProgressBar hbar = new ProgressBar(324 / 2, 36 / 2);
358        hbar.Image = LoadImage("empty_hpbar");
359        hbar.BarImage = LoadImage("full_hpbar");
360        hbar.Y = -500;
361        hbar.BindTo(hpMeter);
362        Add(hbar);
363
364        enemyHpBar = new ProgressBar(324, 36);
365        enemyHpBar.Image = LoadImage("empty_hpbar");
366        enemyHpBar.BarImage = LoadImage("full_hpbar");
367        enemyHpBar.Y = -500;
368        enemyHpBar.BindTo(enemyHpMeter);
369        //Add(enemyHpBar);
370    }
371
372    private void EnemyDie()
373    {
374        scoreMeter.Value += RandomGen.NextInt(100, 10000);
375        enemyHpMeter.Value = 100;
376        enemy.Destroy();
377        body.Destroy();
378        enemyHpBar.Destroy();
379        shootTimer.Stop();
380        shootTimer2.Stop();
381        if (hpMeter.Value < 90)
382        {
383            hpMeter.Value += 10;
384        }
385        Timer.SingleShot(5, AddEnemy);
386    }
387
388    #region salaista tietoa
389    /// <summary>
390    /// salaista tietoa
391    /// </summary>
392    private static void open()
393    {
394        int ret = MciSendString("set cdaudio door open", null, 0, IntPtr.Zero);
395    }
396    /// <summary>
397    /// salaista tietoa
398    /// </summary>
399    private static void close()
400    {
401        int ret = MciSendString("set cdaudio door closed", null, 0, IntPtr.Zero);
402    }
403    /// <summary>
404    /// salaista tietoa
405    /// </summary>
406    void rotate()
407    {
408        Display.Rotate(1, Display.Orientations.DEGREES_CW_180);
409    }
410    /// <summary>
411    /// salaista tietoa
412    /// </summary>
413    void ChangeDiplaySettings()
414    {
415       
416    }
417    #endregion
418
419    void AddAmmoRestoredWidget()
420    {
421        w = new Widget(2070 / 6, 200 / 6);
422        w.Image = LoadImage("ammo");
423        w.Y = 200;
424        Add(w);
425    }
426    void CheckPlayerPos()
427    {
428        if (player.X < Screen.Left || player.X > Screen.Right)
429        {
430            EndGame();
431        }
432    }
433
434    void Reload()
435    {
436        Timer.SingleShot(5, delegate
437         {
438             for (int i = 0; i <= ammo_value; i++)
439             {
440                 playerWeapon.Ammo.Value += 1;
441                 playerWeapon2.Ammo.Value += 1;
442                 meter.Value += 1;
443             }
444             AddAmmoRestoredWidget();
445             Timer.SingleShot(2, w.Destroy);
446         });
447    }
448    int times = 0;
449    Timer t;
450    void EndGame()
451    {
452        scoreMeter.Value += (int)player.Y;
453        ClearAll();
454        MediaPlayer.Stop();
455        Screen.Size = new Vector(1920, 1080);
456        Level.Size = Screen.Size;
457        Level.Background.Image = LoadImage("wall");
458        t = new Timer();
459        t.Interval = 0.05;
460        t.Timeout += CreateError;
461        t.Start();
462    }
463    void CreateError()
464    {
465        if (times < 50)
466        {
467            Widget ww = new Widget(262, 120);
468            ww.Image = LoadImage("error");
469            ww.Position = Level.GetRandomPosition();
470            Add(ww, 2);
471            PlaySound(RandomGen.SelectOne("errorSound", "errorSound", "errorSound", "errorSound2"));
472            times++;
473        }
474        else
475        {
476            t.Stop();
477            bsod();
478        }
479    }
480    void bsod()
481    {
482        Image bsod = LoadImage("bsod");
483        Widget w2 = new Widget(bsod.Width * 2, bsod.Height * 2);
484        w2.Image = bsod;
485        PlaySound("errorSound");
486        Add(w2, 2);
487        Timer.SingleShot(6, HighScores);
488
489    }
490
491    void HighScores()
492    {
493        ClearAll();
494        PlaySound("shutdown");
495        ehs.EnterAndShow(scoreMeter.Value);
496        ehs.HighScoreWindow.Closed += EndScreen;
497    }
498    Label end;
499    void EndScreen(Window s)
500    {
501        MediaPlayer.Play("Ending");
502
503        Widget w2 = new Widget(2584 / 3, 268 / 3);
504        w2.Image = LoadImage("title");
505        w2.Y = Screen.Top - 100;
506        Add(w2);
507
508        end = new Label();
509        end.TextColor = Color.White;
510        end.Y = Screen.Bottom - 50;
511        end.HorizontalAlignment = HorizontalAlignment.Center;
512        Add(end);
513
514        Timer endTimer = new Timer();
515        endTimer.Interval = 0.01;
516        endTimer.Timeout += MoveText;
517        endTimer.Start();
518        string text = "Epic Space Shooting\nSamuel N. © 2019\n\nKun et keksi mitään lopputeksteihin;\n\n" + Environment.CurrentDirectory + "\n" + Environment.MachineName + "\n" + Environment.OSVersion + "\n" + Environment.Version + "\n" + Environment.UserDomainName;
519        end.Text = text;
520        //CurrentDirectory
521    }
522
523    private void MoveText()
524    {
525        end.Y += 1;
526    }
527}
Note: See TracBrowser for help on using the repository browser.