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

Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8using System.Linq;
9
10namespace VenienteFragore
11{
12    public partial class VenienteFragore : SimplePhysics.Game
13    {
14        private delegate void ObjectMethod(Vector position, double width, double height, Dictionary<string, string> properties);
15        private Dictionary<string, ObjectMethod> objectMethods;
16
17        private readonly Image dripImage = LoadImage("drip");
18
19        private List<Player> advenae;
20
21        private Vector cameraSpeed = new Vector(2.0, 4.0);
22        private Vector cameraTarget;
23
24        private SimplePhysics.Object borderleft;
25        private SimplePhysics.Object borderright;
26
27        public VenienteFragore() : base(tileSize: 50)
28        {
29        }
30
31        public override void Begin()
32        {
33            StartLevel("desolatecaves");
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>();
42            objectMethods = new Dictionary<string, ObjectMethod>();
43            objectMethods.Add("ball", TestBall);
44            objectMethods.Add("player", CreatePlayer);
45            objectMethods.Add("moving", CreateMovingPlatform);
46            objectMethods.Add("door", CreateDoor);
47            objectMethods.Add("goomba", CreateGoomba);
48            objectMethods.Add("drip", CreateWaterDrip);
49
50            var tileMap = TiledTileMap.FromLevelAsset(lvlName);
51            tileMap.SetTileMethod("Tiilet", TileMethod);
52            tileMap.SetObjectMethod("Oliot", CreateObject);
53            tileMap.SetTileMethod("Etuala", Foreground);
54            tileMap.Execute();
55
56            Gravity = new Vector(0, -800);
57
58            Level.Background.CreateGradient(Color.Beige, Color.OrangeRed);
59
60            CameraInitialization();
61        }
62
63        private void CameraInitialization()
64        {
65            Camera.StayInLevel = true;
66
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);
72            borderright = new SimplePhysics.Object(TileSize, Level.Height) { X = Camera.X - Window.Width / 2, IsVisible = false };
73            Add(borderright);
74
75            Timer checkit = new Timer();
76            checkit.Interval = 0.02;
77            checkit.Timeout += () => { UpdateCameraTarget(checkit); };
78            checkit.Start();
79        }
80
81        private void UpdateCameraTarget(Timer checkit)
82        {
83            List<Player> activePlayers = advenae.FindAll(o => o.IsVisible == true);
84
85            switch (activePlayers.Count)
86            {
87                case 1:
88                    Camera.StopFollowing();
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:
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;
98                    break;
99                default:
100                    Camera.StopFollowing();
101                    checkit.Stop();
102                    break;
103            }
104
105            borderleft.X = Camera.X + Window.Width / 2;
106            borderright.X = Camera.X - Window.Width / 2;
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        }
116       
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        }
127
128        private void Interact(Player adven)
129        {
130            //Jos kannetaan jotain, viskataan se
131            var carrying = adven.Carrying;
132            if (carrying != null) //Throw
133            {
134                adven.Carrying = null;
135                double dir = adven.FacingDirection == Direction.Left ? -1 : 1;
136                carrying.Velocity = new Vector(dir * 350, 350);
137                carrying.Position = carrying.Position + new Vector(dir * 10, 30);
138                //Pitäisiköhän oma aliohjelma tehdä
139                carrying.IgnoresGravity = false;
140                carrying.IgnoresCollisionResponse = false;
141            }
142
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);
145
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);
151
152            TimerAddons.Until(() => sphere.Width == 100.0, delegate { sphere.Width += 1; sphere.Height += 1; }, 0.01, sphere.Destroy);
153
154            foreach (GameObject item in interactedObjects)
155            {
156                var obj = item as InteractableObject;
157                obj?.InteractWith(adven);
158            }
159        }
160
161        private void Pickup(SimplePhysics.Object player, InteractableObject target)
162        {
163            var adven = player as Player;
164            if (adven != null && adven.Carrying == null)
165            {
166                adven.Carrying = target;
167                target.IgnoresGravity = true;
168                target.IgnoresCollisionResponse = true;
169                //Lentävän palikan nostaminen
170            }
171        }
172
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");
177
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        }
181       
182        /// <summary>
183        /// Sotku
184        /// </summary>
185        /// <param name="playerNro">Sen pelaajan numero, joka haluaa toimia</param>
186        private void SplitOrMorph(int playerNro)
187        {
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            }
196        }
197
198        private void Morph(Player adven)
199        {
200            if (advenae.FindAll(o => o.IsVisible == true).Count != 2) return;
201
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);
205
206                destroyable.ControlKeys.ForEach(delegate (Key key)
207                {
208                    Keyboard.Disable(key);
209                });
210
211                destroyable.Destroy();
212            }
213
214            //TODO: Eeppinen hypäytys takaisin? Samalla voisi ajastimella tarkastaa jatkuvasti, ovatko pelaajat tarpeeksi lähellä toisiaan.
215            /*
216            Vector center = new Vector();
217
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        }
230
231        private void Split(Player adven)
232        {
233            if (advenae.FindAll(o => o.IsVisible == true).Count == 2) return;
234
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            }
245
246            advenNew.Position = adven.Position + new Vector(adven.Width, 0);
247
248            if (Collisions(advenNew, Vector.Zero, true).Count > 0)
249            {
250                advenNew.Destroy();
251                return;
252            }
253
254            advenNew.ControlKeys.ForEach(delegate (Key key)
255            {
256                Keyboard.Enable(key);
257            });
258        }
259
260        private void Walk(Player pelaaja, double nopeus)
261        {
262            pelaaja.Walk(nopeus);
263        }
264
265        private void Jump(SimplePlatformCharacter player)
266        {
267            if (player.IsGrounded)
268                player.Velocity = new Vector(player.Velocity.X, 500);
269        }
270
271        private void Crouch(Player player, bool crouch)
272        {
273            player.Crouch = crouch;
274        }
275    }
276}
Note: See TracBrowser for help on using the repository browser.