source: 2016/27/ohjaajat/VenienteFragore/VenienteFragore/VenienteFragore/VenienteFragore.cs @ 8009

Revision 8009, 16.7 KB checked in by tesatapa, 3 years ago (diff)

menuunkin musiikkia

RevLine 
[7653]1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
[7816]8using System.Linq;
[7653]9
[7807]10namespace VenienteFragore
[7735]11{
[7826]12    public partial class VenienteFragore : SimplePhysics.Game
[7807]13    {
14        private delegate void ObjectMethod(Vector position, double width, double height, Dictionary<string, string> properties);
15        private Dictionary<string, ObjectMethod> objectMethods;
[7735]16
[7826]17        private readonly Image dripImage = LoadImage("drip");
[7832]18        private readonly Image[] minimiiniiImages = LoadImages("minimiiniianim\\minimiiniianim", 1, 4);
[7977]19        private readonly Image[] minimiinii2Images = LoadImages("minimiinii2anim\\anim", 1, 4);
[7920]20        private readonly Image[] advenaImages = LoadImages("advenawalk\\advenawalk00", 1, 49, true);
21        private readonly Image[] advenbImages = LoadImages("advenbwalk\\advenb00", 1, 49, true);
[7825]22
[7983]23        private readonly Image advenaBlob = LoadImage("advenaBlob");
24        private readonly Image advenbBlob = LoadImage("advenbBlob");
25       
[7976]26        private readonly Image advenaCrouch = LoadImage("advenacrouch");
27        private readonly Image advenbCrouch = LoadImage("advenbcrouch");
28
[8008]29
[7983]30        // Lista kenttien nimistä, joista aluksen osa on kerätty.
31        private string currentLevelName;
32        private readonly List<string> collectedParts = new List<string>();
[7985]33        private IntMeter lives;
[7986]34        private DoubleMeter pointsCounter;
[7983]35
[7810]36        private List<Player> advenae;
[7985]37        private Vector respawnPoint;
[7735]38
[7809]39        private Vector cameraSpeed = new Vector(2.0, 4.0);
40        private Vector cameraTarget;
41
[7826]42        private SimplePhysics.Object borderleft;
43        private SimplePhysics.Object borderright;
[7816]44
[7807]45        public VenienteFragore() : base(tileSize: 50)
46        {
47        }
[7735]48
[7807]49        public override void Begin()
50        {
[8009]51            MediaPlayer.Volume = 0.35;
52            MediaPlayer.IsRepeating = true;
53            MediaPlayer.Play("DST-OrganicSpace");
[8008]54
55            IsMouseVisible = true;
56            Level.Background.CreateGradient(Color.DarkBlue, Color.Black);
57
58            Label title = new Label(Screen.Width * 0.65, Screen.Height *0.25);
59            title.Position = new Vector(0, Screen.Top - Screen.Height * 0.15);
60            title.Text = "Veniente Fragore";
61            title.TextScale = new Vector(Screen.Width * 0.004, Screen.Height * 0.003);
62            title.TextColor = new Color(50, 25, 100);
63            title.HorizontalAlignment = HorizontalAlignment.Left;
64            Add(title);
65
66            PushButton start = new PushButton(Screen.Width * 0.15, Screen.Height * 0.1);
67            start.Position = new Vector(0, Screen.Top - Screen.Height * 0.45);
68            start.Text = "Start game";
69            start.Color = Color.DarkBlue;
70            start.Clicked += StartGame;
71
72            Add(start);
73
74            PushButton exit = new PushButton(Screen.Width * 0.15, Screen.Height * 0.1);
75            exit.Position = new Vector(0, Screen.Top - Screen.Height * 0.65);
76            exit.Text = "Exit";
77            exit.Color = Color.DarkBlue;
78            exit.Clicked += Exit;
79
80            Add(exit);
81            Keyboard.Listen(Key.Enter, ButtonState.Pressed, StartGame, null);
82            Keyboard.Listen(Key.Space, ButtonState.Pressed, StartGame, null);
83
84            Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, null);
85
86            Label credits = new Label(@"Music by DST: http://dreade.com/nosoap/");
87            credits.Position = new Vector(0, Screen.Top - Screen.Height * 0.9);
88            Add(credits);
89
90
91        }
92
93
94        private void StartGame()
95        {
96            ClearAll();
[8009]97
[8008]98            MediaPlayer.Play("DST-PhaserSwitch");
99
100            IsMouseVisible = false;
[8004]101            lives = new IntMeter(3, 0, 99);
[7986]102
[8008]103
[7986]104            pointsCounter = new DoubleMeter(0, 0, 1000000);
105            pointsCounter.Changed += PointsGained;
106
[7982]107            StartLevel("thehub");
[8008]108       
[7810]109
110            Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
111        }
112
[7986]113        private void PointsGained(double oldValue, double newValue)
114        {
115            double diff = newValue - oldValue;
116            if(((int)oldValue) / 10000 < ((int)newValue / 10000))
117                {
118                lives.Value++;
119            }
120        }
121
[7985]122        private void CreateGUI()
123        {
[8007]124            Label liveMeter = new Label(Screen.Width * 0.10, Screen.Height * 0.05);
125            liveMeter.Position = new Vector(Screen.Left + Screen.Width * 0.165, Screen.Top - Screen.Height * 0.1);
126         
127           
128            liveMeter.BindTo(lives);
129            liveMeter.HorizontalAlignment = HorizontalAlignment.Center;
[7985]130            Add(liveMeter);
[8007]131
132            Label border = new Label(Screen.Width * 0.1, Screen.Height * 0.05);
133            border.Position = new Vector(Screen.Left + Screen.Width * 0.15, Screen.Top - Screen.Height * 0.1);
134            border.BorderColor = Color.Gold;
135            Add(border);
136
137            Label face = new Label(Screen.Width * 0.035, Screen.Width * 0.05);
138            face.Image = advenaImages[0];
139            face.Position = new Vector(Screen.Left + Screen.Width * 0.12, Screen.Top - Screen.Height * 0.1);
140            Add(face);
[7985]141        }
142
143        private void GameOver()
144        {
145            advenae.ForEach(x => x.Destroy());
146            ClearAll();
147
148            Level.Background.CreateGradient(Color.Black, new Color(0, 0, 35));
149            Label youLose = new Label(Screen.Width, Screen.Height);
150            youLose.Text = "You lost the game";
[7994]151            youLose.TextColor = Color.Red;
[7985]152            Add(youLose);
153
154        }
155
[7832]156        public double DistanceToNearestPlayer(Vector point)
157        {
158            return advenae.Min(p => Vector.Distance(p.Position, point));
159        }
160
[7810]161        private void StartLevel(string lvlName)
162        {
[7983]163            currentLevelName = lvlName;
[7987]164            ClearAll();
[7983]165
[7987]166            // Jos aloitetaan hubista kaikilla kamoilla, niin peli on voitettu.
167            if (collectedParts.Count == 3)
168            {
169                Action<double, string> makeLabel = (y, text) =>
170                {
171                    Add(new Label(text) { Y = y, TextColor = Color.White });
172                };
173                Level.Background.Color = Color.Black;
174                makeLabel(50, "The advenae managed to repair their ship\n          and flew to their home planet.");
175                makeLabel(-50, "Your final score is <insert score here>");
176                Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
177                return;
178            }
179
[7985]180           
[7810]181            advenae = new List<Player>();
[7807]182            objectMethods = new Dictionary<string, ObjectMethod>();
183            objectMethods.Add("ball", TestBall);
184            objectMethods.Add("player", CreatePlayer);
185            objectMethods.Add("moving", CreateMovingPlatform);
[7810]186            objectMethods.Add("door", CreateDoor);
[7811]187            objectMethods.Add("goomba", CreateGoomba);
[7977]188            objectMethods.Add("goomba2", CreateGoomba2);
[7998]189            objectMethods.Add("collectible", CreateCollectible);
[7825]190            objectMethods.Add("drip", CreateWaterDrip);
[7983]191            objectMethods.Add("shippart", CreateShipPart);
[7775]192
[7978]193            string backgroundImageName = null;
194
[7810]195            var tileMap = TiledTileMap.FromLevelAsset(lvlName);
[7807]196            tileMap.SetTileMethod("Tiilet", TileMethod);
197            tileMap.SetObjectMethod("Oliot", CreateObject);
198            tileMap.SetTileMethod("Etuala", Foreground);
[7978]199            tileMap.Execute((levelProperty, value) =>
200            {
201                // Jos kentän propertyistä löytyy "background", niin asetetaan
202                // sen arvon niminen kuva taustakuvaksi.
203                // Kentän propertyjä voi säätää Tiled-editorissa valikosta
204                // Map -> Map Properties
205                if (levelProperty == "background")
206                    backgroundImageName = value;
207            });
[7775]208
[7978]209            if (backgroundImageName != null)
210            {
211                Level.Background.Image = LoadImage(backgroundImageName);
212                Level.Background.TileToLevel();
213            }
214            else Level.Background.CreateGradient(Color.Beige, Color.OrangeRed);
215
[7975]216            Gravity = new Vector(0, -1400);
[7989]217            Camera.Position = advenae[0].Position;
[7809]218            CameraInitialization();
[8008]219
220            CreateGUI();
[7735]221        }
222
[7998]223
224
[7826]225        private void CameraInitialization()
[7809]226        {
227            Camera.StayInLevel = true;
228
[7816]229            Window.Width = 1500;
230            Window.Height = 750;
231
232            borderleft = new SimplePhysics.Object(TileSize, Level.Height) { X = Camera.X + Window.Width / 2, IsVisible = false };
233            Add(borderleft);
[7825]234            borderright = new SimplePhysics.Object(TileSize, Level.Height) { X = Camera.X - Window.Width / 2, IsVisible = false };
[7816]235            Add(borderright);
236
[7809]237            Timer checkit = new Timer();
238            checkit.Interval = 0.02;
239            checkit.Timeout += () => { UpdateCameraTarget(checkit); };
240            checkit.Start();
241        }
242
[7826]243        private void UpdateCameraTarget(Timer checkit)
[7809]244        {
[8003]245            var activePlayers = advenae.FindAll(o => o.IsVisible);
[7809]246
247            switch (activePlayers.Count)
248            {
249                case 1:
250                    Player soloYolo = activePlayers[0];
251                    cameraTarget.X = soloYolo.Position.X + (soloYolo.FacingDirection.GetVector().X * (TileSize * 4));
252                    if (soloYolo.IsCrouching) cameraTarget.Y = soloYolo.Position.Y - TileSize * 4;
253                    else if (soloYolo.IsGrounded) cameraTarget.Y = soloYolo.Position.Y;
254                    break;
255                case 2:
[7979]256                    var minPosition = new Vector(activePlayers.Max(p => p.X), activePlayers.Min(p => p.Y));
257                    var maxPosition = new Vector(activePlayers.Min(p => p.X), activePlayers.Max(p => p.Y));
[7816]258                    cameraTarget = (minPosition + maxPosition) * 0.5;
[7809]259                    break;
260            }
[7825]261
[7979]262            borderleft.X = Camera.X + Window.Width / 2.0;
263            borderright.X = Camera.X - Window.Width / 2.0;
[7809]264        }
265
266        protected override void Update(Time time)
267        {
268            Camera.X += (cameraTarget.X - Camera.X) * time.SinceLastUpdate.TotalSeconds * cameraSpeed.X;
269            Camera.Y += (cameraTarget.Y - Camera.Y) * time.SinceLastUpdate.TotalSeconds * cameraSpeed.Y;
270
271            base.Update(time);
272        }
[7826]273       
[7807]274        private void SetMovementKeys(Player adven, List<Key> keys)
275        {
276            Keyboard.Listen(keys[3], ButtonState.Down, Walk, null, adven, 200.0);
277            Keyboard.Listen(keys[2], ButtonState.Down, Walk, null, adven, -200.0);
278            Keyboard.Listen(keys[0], ButtonState.Down, Jump, null, adven);
279            Keyboard.Listen(keys[1], ButtonState.Pressed, Crouch, null, adven, true);
280            Keyboard.Listen(keys[1], ButtonState.Released, Crouch, null, adven, false);
281            Keyboard.Listen(keys[4], ButtonState.Pressed, Interact, null, adven);
282            // Keyboard.Listen(keys[4], ButtonState.Pressed, SplitOrMorph, "Splits or morphs the player back to 1 player", adven);
283        }
[7775]284
[7807]285        private void Interact(Player adven)
286        {
287            //Jos kannetaan jotain, viskataan se
[7826]288            var carrying = adven.Carrying;
289            if (carrying != null) //Throw
[7807]290            {
291                adven.Carrying = null;
292                double dir = adven.FacingDirection == Direction.Left ? -1 : 1;
[7826]293                carrying.Velocity = new Vector(dir * 350, 350);
294                carrying.Position = carrying.Position + new Vector(dir * 10, 30);
[7807]295                //Pitäisiköhän oma aliohjelma tehdä
[7826]296                carrying.IgnoresGravity = false;
297                carrying.IgnoresCollisionResponse = false;
[7807]298            }
[7775]299
[7807]300            Vector pingPoint = adven.Position + (adven.FacingDirection == Direction.Left ? new Vector(-adven.Width, 0) : new Vector(adven.Width, 0));
301            List<GameObject> interactedObjects = GetObjectsAt(pingPoint);
[7733]302
[7807]303            GameObject sphere = new GameObject(1, 1);
304            sphere.Position = pingPoint;
305            sphere.Shape = Shape.Circle;
306            sphere.Color = new Color(100, 0, 100, 25);
307            Add(sphere, 1);
[7653]308
[7807]309            TimerAddons.Until(() => sphere.Width == 100.0, delegate { sphere.Width += 1; sphere.Height += 1; }, 0.01, sphere.Destroy);
[7658]310
[7807]311            foreach (GameObject item in interactedObjects)
312            {
[7826]313                var obj = item as InteractableObject;
314                obj?.InteractWith(adven);
[7807]315            }
316        }
[7732]317
[7826]318        private void Pickup(SimplePhysics.Object player, InteractableObject target)
[7807]319        {
[7826]320            var adven = player as Player;
321            if (adven != null && adven.Carrying == null)
[7807]322            {
323                adven.Carrying = target;
324                target.IgnoresGravity = true;
325                target.IgnoresCollisionResponse = true;
326                //Lentävän palikan nostaminen
327            }
328        }
[7658]329
[7807]330        private void SetGeneralKeys()
331        {
332            Keyboard.Listen(Key.R, ButtonState.Pressed, () => { ClearAll(); advenae = new List<Player>(); Begin(); }, "Lopeta peli");
333            Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
[7740]334
[7807]335            Keyboard.Listen(Key.X, ButtonState.Pressed, SplitOrMorph, "Splits or morphs the player", 2);
336            Keyboard.Listen(Key.RightShift, ButtonState.Pressed, SplitOrMorph, "Splits or morphs the player", 1);
337        }
[7826]338       
[7807]339        /// <summary>
340        /// Sotku
341        /// </summary>
342        /// <param name="playerNro">Sen pelaajan numero, joka haluaa toimia</param>
343        private void SplitOrMorph(int playerNro)
[7806]344        {
[7807]345            if (!advenae[playerNro - 1].IsVisible && advenae[1 - playerNro + 1].IsVisible)
346            {
347                Split(advenae[1 - playerNro + 1]);
348            }
349            else
350            {
351                Morph(advenae[1 - playerNro + 1]);
352            }
[7806]353        }
354
[7807]355        private void Morph(Player adven)
[7806]356        {
[7807]357            if (advenae.FindAll(o => o.IsVisible == true).Count != 2) return;
[7806]358
[7807]359            if (Vector.Distance(advenae[0].Position, advenae[1].Position) < adven.Width * 1.5)
360            {
361                Player destroyable = advenae.Find(o => o.PlayerNumber != adven.PlayerNumber);
[7806]362
[7809]363                destroyable.ControlKeys.ForEach(delegate (Key key)
[7807]364                {
365                    Keyboard.Disable(key);
[7809]366                });
[7806]367
[7807]368                destroyable.Destroy();
[8007]369                destroyable.IsAlive = false;
[7994]370                lives.Value++;
[7807]371            }
[7806]372
[7994]373
[7807]374            //TODO: Eeppinen hypäytys takaisin? Samalla voisi ajastimella tarkastaa jatkuvasti, ovatko pelaajat tarpeeksi lähellä toisiaan.
375            /*
376            Vector center = new Vector();
[7775]377
[7807]378            for (int i = 0; i < advenae.Count; i++)
379            {
380                center = (advenae[i].Position - center) * 0.5;
381            }
382            foreach (Player item in advenae)
383            {
384                item.Velocity = (center - item.Position) * 3.0;
385            }
386            morphing = true;
387            Timer.SingleShot(2.0, delegate { morphing = false; });
388            */
389        }
[7775]390
[7826]391        private void Split(Player adven)
[7740]392        {
[7995]393            if (advenae.FindAll(o => o.IsVisible == true).Count == 2 || lives.Value == 0) return;
[7740]394
[7807]395            Player advenNew = new Player(adven.Width, adven.Height);
[7999]396
397           
398
[7807]399            switch (adven.PlayerNumber)
400            {
401                case 1:
402                    advenNew = CreatePlayer2(adven.Position + new Vector(adven.Width, 0), adven.Width, adven.Height);
403                    break;
404                case 2:
405                    advenNew = CreatePlayer1(adven.Position + new Vector(adven.Width, 0), adven.Width, adven.Height);
406                    break;
407            }
[7740]408
[7999]409           
[7807]410            advenNew.Position = adven.Position + new Vector(adven.Width, 0);
[7775]411
[7807]412            if (Collisions(advenNew, Vector.Zero, true).Count > 0)
[7775]413            {
[7807]414                advenNew.Destroy();
415                return;
416            }
[7775]417
[7807]418            advenNew.ControlKeys.ForEach(delegate (Key key)
419            {
420                Keyboard.Enable(key);
421            });
[7994]422
423            lives.Value--;
[7775]424        }
425
[7826]426        private void Walk(Player pelaaja, double nopeus)
[7740]427        {
[7807]428            pelaaja.Walk(nopeus);
[7740]429        }
[7807]430
431        private void Jump(SimplePlatformCharacter player)
[7740]432        {
[7923]433            ((Player)player).Jump();
[7740]434        }
435
[7807]436        private void Crouch(Player player, bool crouch)
[7740]437        {
[7807]438            player.Crouch = crouch;
[7740]439        }
[7731]440    }
[7807]441}
Note: See TracBrowser for help on using the repository browser.