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

Revision 7826, 10.4 KB checked in by sieerinn, 3 years ago (diff)

Luomismetodit siirretty LevelCreationMethods?.cs tiedostoon ja kaikenlaista koodin siistimistä tehty

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");
[7825]18
[7810]19        private List<Player> advenae;
[7735]20
[7809]21        private Vector cameraSpeed = new Vector(2.0, 4.0);
22        private Vector cameraTarget;
23
[7826]24        private SimplePhysics.Object borderleft;
25        private SimplePhysics.Object borderright;
[7816]26
[7807]27        public VenienteFragore() : base(tileSize: 50)
28        {
29        }
[7735]30
[7807]31        public override void Begin()
32        {
[7822]33            StartLevel("desolatecaves");
[7810]34
35            Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
36        }
37
38        private void StartLevel(string lvlName)
39        {
40            ClearAll();
41            advenae = new List<Player>();
[7807]42            objectMethods = new Dictionary<string, ObjectMethod>();
43            objectMethods.Add("ball", TestBall);
44            objectMethods.Add("player", CreatePlayer);
45            objectMethods.Add("moving", CreateMovingPlatform);
[7810]46            objectMethods.Add("door", CreateDoor);
[7811]47            objectMethods.Add("goomba", CreateGoomba);
[7825]48            objectMethods.Add("drip", CreateWaterDrip);
[7775]49
[7810]50            var tileMap = TiledTileMap.FromLevelAsset(lvlName);
[7807]51            tileMap.SetTileMethod("Tiilet", TileMethod);
52            tileMap.SetObjectMethod("Oliot", CreateObject);
53            tileMap.SetTileMethod("Etuala", Foreground);
54            tileMap.Execute();
[7775]55
[7807]56            Gravity = new Vector(0, -800);
57
[7810]58            Level.Background.CreateGradient(Color.Beige, Color.OrangeRed);
[7807]59
[7809]60            CameraInitialization();
[7735]61        }
62
[7826]63        private void CameraInitialization()
[7809]64        {
65            Camera.StayInLevel = true;
66
[7816]67            Window.Width = 1500;
68            Window.Height = 750;
69
70            borderleft = new SimplePhysics.Object(TileSize, Level.Height) { X = Camera.X + Window.Width / 2, IsVisible = false };
71            Add(borderleft);
[7825]72            borderright = new SimplePhysics.Object(TileSize, Level.Height) { X = Camera.X - Window.Width / 2, IsVisible = false };
[7816]73            Add(borderright);
74
[7809]75            Timer checkit = new Timer();
76            checkit.Interval = 0.02;
77            checkit.Timeout += () => { UpdateCameraTarget(checkit); };
78            checkit.Start();
79        }
80
[7826]81        private void UpdateCameraTarget(Timer checkit)
[7809]82        {
83            List<Player> activePlayers = advenae.FindAll(o => o.IsVisible == true);
84
85            switch (activePlayers.Count)
86            {
87                case 1:
[7816]88                    Camera.StopFollowing();
[7809]89                    Player soloYolo = activePlayers[0];
90                    cameraTarget.X = soloYolo.Position.X + (soloYolo.FacingDirection.GetVector().X * (TileSize * 4));
91                    if (soloYolo.IsCrouching) cameraTarget.Y = soloYolo.Position.Y - TileSize * 4;
92                    else if (soloYolo.IsGrounded) cameraTarget.Y = soloYolo.Position.Y;
93                    break;
94                case 2:
[7816]95                    Vector minPosition = new Vector(activePlayers.Max(p => p.X), activePlayers.Min(p => p.Y));
96                    Vector maxPosition = new Vector(activePlayers.Min(p => p.X), activePlayers.Max(p => p.Y));
97                    cameraTarget = (minPosition + maxPosition) * 0.5;
[7809]98                    break;
99                default:
100                    Camera.StopFollowing();
101                    checkit.Stop();
102                    break;
103            }
[7825]104
105            borderleft.X = Camera.X + Window.Width / 2;
[7816]106            borderright.X = Camera.X - Window.Width / 2;
[7809]107        }
108
109        protected override void Update(Time time)
110        {
111            Camera.X += (cameraTarget.X - Camera.X) * time.SinceLastUpdate.TotalSeconds * cameraSpeed.X;
112            Camera.Y += (cameraTarget.Y - Camera.Y) * time.SinceLastUpdate.TotalSeconds * cameraSpeed.Y;
113
114            base.Update(time);
115        }
[7826]116       
[7807]117        private void SetMovementKeys(Player adven, List<Key> keys)
118        {
119            Keyboard.Listen(keys[3], ButtonState.Down, Walk, null, adven, 200.0);
120            Keyboard.Listen(keys[2], ButtonState.Down, Walk, null, adven, -200.0);
121            Keyboard.Listen(keys[0], ButtonState.Down, Jump, null, adven);
122            Keyboard.Listen(keys[1], ButtonState.Pressed, Crouch, null, adven, true);
123            Keyboard.Listen(keys[1], ButtonState.Released, Crouch, null, adven, false);
124            Keyboard.Listen(keys[4], ButtonState.Pressed, Interact, null, adven);
125            // Keyboard.Listen(keys[4], ButtonState.Pressed, SplitOrMorph, "Splits or morphs the player back to 1 player", adven);
126        }
[7775]127
[7807]128        private void Interact(Player adven)
129        {
130            //Jos kannetaan jotain, viskataan se
[7826]131            var carrying = adven.Carrying;
132            if (carrying != null) //Throw
[7807]133            {
134                adven.Carrying = null;
135                double dir = adven.FacingDirection == Direction.Left ? -1 : 1;
[7826]136                carrying.Velocity = new Vector(dir * 350, 350);
137                carrying.Position = carrying.Position + new Vector(dir * 10, 30);
[7807]138                //Pitäisiköhän oma aliohjelma tehdä
[7826]139                carrying.IgnoresGravity = false;
140                carrying.IgnoresCollisionResponse = false;
[7807]141            }
[7775]142
[7807]143            Vector pingPoint = adven.Position + (adven.FacingDirection == Direction.Left ? new Vector(-adven.Width, 0) : new Vector(adven.Width, 0));
144            List<GameObject> interactedObjects = GetObjectsAt(pingPoint);
[7733]145
[7807]146            GameObject sphere = new GameObject(1, 1);
147            sphere.Position = pingPoint;
148            sphere.Shape = Shape.Circle;
149            sphere.Color = new Color(100, 0, 100, 25);
150            Add(sphere, 1);
[7653]151
[7807]152            TimerAddons.Until(() => sphere.Width == 100.0, delegate { sphere.Width += 1; sphere.Height += 1; }, 0.01, sphere.Destroy);
[7658]153
[7807]154            foreach (GameObject item in interactedObjects)
155            {
[7826]156                var obj = item as InteractableObject;
157                obj?.InteractWith(adven);
[7807]158            }
159        }
[7732]160
[7826]161        private void Pickup(SimplePhysics.Object player, InteractableObject target)
[7807]162        {
[7826]163            var adven = player as Player;
164            if (adven != null && adven.Carrying == null)
[7807]165            {
166                adven.Carrying = target;
167                target.IgnoresGravity = true;
168                target.IgnoresCollisionResponse = true;
169                //Lentävän palikan nostaminen
170            }
171        }
[7658]172
[7807]173        private void SetGeneralKeys()
174        {
175            Keyboard.Listen(Key.R, ButtonState.Pressed, () => { ClearAll(); advenae = new List<Player>(); Begin(); }, "Lopeta peli");
176            Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
[7740]177
[7807]178            Keyboard.Listen(Key.X, ButtonState.Pressed, SplitOrMorph, "Splits or morphs the player", 2);
179            Keyboard.Listen(Key.RightShift, ButtonState.Pressed, SplitOrMorph, "Splits or morphs the player", 1);
180        }
[7826]181       
[7807]182        /// <summary>
183        /// Sotku
184        /// </summary>
185        /// <param name="playerNro">Sen pelaajan numero, joka haluaa toimia</param>
186        private void SplitOrMorph(int playerNro)
[7806]187        {
[7807]188            if (!advenae[playerNro - 1].IsVisible && advenae[1 - playerNro + 1].IsVisible)
189            {
190                Split(advenae[1 - playerNro + 1]);
191            }
192            else
193            {
194                Morph(advenae[1 - playerNro + 1]);
195            }
[7806]196        }
197
[7807]198        private void Morph(Player adven)
[7806]199        {
[7807]200            if (advenae.FindAll(o => o.IsVisible == true).Count != 2) return;
[7806]201
[7807]202            if (Vector.Distance(advenae[0].Position, advenae[1].Position) < adven.Width * 1.5)
203            {
204                Player destroyable = advenae.Find(o => o.PlayerNumber != adven.PlayerNumber);
[7806]205
[7809]206                destroyable.ControlKeys.ForEach(delegate (Key key)
[7807]207                {
208                    Keyboard.Disable(key);
[7809]209                });
[7806]210
[7807]211                destroyable.Destroy();
212            }
[7806]213
[7807]214            //TODO: Eeppinen hypäytys takaisin? Samalla voisi ajastimella tarkastaa jatkuvasti, ovatko pelaajat tarpeeksi lähellä toisiaan.
215            /*
216            Vector center = new Vector();
[7775]217
[7807]218            for (int i = 0; i < advenae.Count; i++)
219            {
220                center = (advenae[i].Position - center) * 0.5;
221            }
222            foreach (Player item in advenae)
223            {
224                item.Velocity = (center - item.Position) * 3.0;
225            }
226            morphing = true;
227            Timer.SingleShot(2.0, delegate { morphing = false; });
228            */
229        }
[7775]230
[7826]231        private void Split(Player adven)
[7740]232        {
[7807]233            if (advenae.FindAll(o => o.IsVisible == true).Count == 2) return;
[7740]234
[7807]235            Player advenNew = new Player(adven.Width, adven.Height);
236            switch (adven.PlayerNumber)
237            {
238                case 1:
239                    advenNew = CreatePlayer2(adven.Position + new Vector(adven.Width, 0), adven.Width, adven.Height);
240                    break;
241                case 2:
242                    advenNew = CreatePlayer1(adven.Position + new Vector(adven.Width, 0), adven.Width, adven.Height);
243                    break;
244            }
[7740]245
[7807]246            advenNew.Position = adven.Position + new Vector(adven.Width, 0);
[7775]247
[7807]248            if (Collisions(advenNew, Vector.Zero, true).Count > 0)
[7775]249            {
[7807]250                advenNew.Destroy();
251                return;
252            }
[7775]253
[7807]254            advenNew.ControlKeys.ForEach(delegate (Key key)
255            {
256                Keyboard.Enable(key);
257            });
[7775]258        }
259
[7826]260        private void Walk(Player pelaaja, double nopeus)
[7740]261        {
[7807]262            pelaaja.Walk(nopeus);
[7740]263        }
[7807]264
265        private void Jump(SimplePlatformCharacter player)
[7740]266        {
[7807]267            if (player.IsGrounded)
268                player.Velocity = new Vector(player.Velocity.X, 500);
[7740]269        }
270
[7807]271        private void Crouch(Player player, bool crouch)
[7740]272        {
[7807]273            player.Crouch = crouch;
[7740]274        }
[7731]275    }
[7807]276}
Note: See TracBrowser for help on using the repository browser.