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

Revision 7807, 13.8 KB checked in by tesatapa, 3 years ago (diff)

Tiedostot omiin luokkiinsa.
InteractableObject?, ja pelaaja ja testball voidaan nostaa kyytiin

Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8
9
10
11
12
13
14
15namespace VenienteFragore
16{
17    public class VenienteFragore : SimplePhysics.Game
18    {
19        private delegate void ObjectMethod(Vector position, double width, double height, Dictionary<string, string> properties);
20        private Dictionary<string, ObjectMethod> objectMethods;
21
22        private List<Player> advenae = new List<Player>();
23
24        public VenienteFragore() : base(tileSize: 50)
25        {
26        }
27
28        public override void Begin()
29        {
30
31
32            objectMethods = new Dictionary<string, ObjectMethod>();
33            objectMethods.Add("ball", TestBall);
34            objectMethods.Add("player", CreatePlayer);
35            objectMethods.Add("moving", CreateMovingPlatform);
36
37            var tileMap = TiledTileMap.FromLevelAsset("thehub");
38            tileMap.SetTileMethod("Tiilet", TileMethod);
39            tileMap.SetObjectMethod("Oliot", CreateObject);
40            tileMap.SetTileMethod("Etuala", Foreground);
41            tileMap.Execute();
42
43            Gravity = new Vector(0, -800);
44
45            Camera.ZoomToLevel();
46
47
48            Level.Background.Color = Color.Beige;
49
50            Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
51        }
52
53        private void CreateObject(Vector position, double width, double height, Angle angle, Shape shape, string name, Dictionary<string, string> properties)
54        {
55            objectMethods[name](position, width, height, properties);
56        }
57
58        void TestBall(Vector position, double width, double height, Dictionary<string, string> properties)
59        {
60            var testObject = new InteractableObject(TileSize * 0.99, TileSize * 0.99);
61            testObject.Position = position;
62            testObject.Color = Color.DarkGreen;
63            testObject.Shape = Shape.Circle;
64            testObject.RestitutionX = 0.5;
65            testObject.RestitutionY = 0.5;
66            testObject.CollisionIgnoreGroup = 1;
67            testObject.OnInteractedWith += Pickup;
68            Add(testObject);
69        }
70
71        void CreatePlayer(Vector position, double width, double height, Dictionary<string, string> properties)
72        {
73            CreatePlayer1(position, width, height);
74            var p = CreatePlayer2(position, width, height);
75            p.Destroy();
76            SetGeneralKeys();
77        }
78
79        Player CreatePlayer1(Vector position, double width, double height)
80        {
81            if (advenae.Count > 0 && !advenae[0].IsVisible) { advenae[0].Reappear(); return advenae[0]; };
82
83            Player advenA = MakePlayer(position, width, height, 1, new List<Key> { Key.Up, Key.Down, Key.Left, Key.Right, Key.Enter });
84            advenA.Color = Color.HotPink;
85            advenae.Add(advenA);
86            return advenA;
87        }
88
89
90        Player CreatePlayer2(Vector position, double width, double height)
91        {
92            if (advenae.Count > 1 && !advenae[1].IsVisible) { advenae[1].Reappear(); return advenae[1]; };
93
94            Player advenA = MakePlayer(position, width, height, 2, new List<Key> { Key.W, Key.S, Key.A, Key.D, Key.E });
95            advenA.Color = Color.Harlequin;
96            advenae.Add(advenA);
97            return advenA;
98        }
99
100        private void SetMovementKeys(Player adven, List<Key> keys)
101        {
102            Keyboard.Listen(keys[3], ButtonState.Down, Walk, null, adven, 200.0);
103            Keyboard.Listen(keys[2], ButtonState.Down, Walk, null, adven, -200.0);
104            Keyboard.Listen(keys[0], ButtonState.Down, Jump, null, adven);
105            Keyboard.Listen(keys[1], ButtonState.Pressed, Crouch, null, adven, true);
106            Keyboard.Listen(keys[1], ButtonState.Released, Crouch, null, adven, false);
107            Keyboard.Listen(keys[4], ButtonState.Pressed, Interact, null, adven);
108            // Keyboard.Listen(keys[4], ButtonState.Pressed, SplitOrMorph, "Splits or morphs the player back to 1 player", adven);
109
110        }
111
112        private void Interact(Player adven)
113        {
114            //Jos kannetaan jotain, viskataan se
115            SimplePhysics.Object carryed = adven.Carrying;
116            if (carryed != null) //Throw
117            {
118                adven.Carrying = null;
119                double dir = adven.FacingDirection == Direction.Left ? -1 : 1;
120                carryed.Velocity = new Vector(dir * 350, 350);
121                carryed.Position = carryed.Position + new Vector(dir * 10, 30);
122                //Pitäisiköhän oma aliohjelma tehdä
123                carryed.IgnoresGravity = false;
124                carryed.IgnoresCollisionResponse = false;
125            }
126
127            Vector pingPoint = adven.Position + (adven.FacingDirection == Direction.Left ? new Vector(-adven.Width, 0) : new Vector(adven.Width, 0));
128            List<GameObject> interactedObjects = GetObjectsAt(pingPoint);
129
130            GameObject sphere = new GameObject(1, 1);
131            sphere.Position = pingPoint;
132            sphere.Shape = Shape.Circle;
133            sphere.Color = new Color(100, 0, 100, 25);
134            Add(sphere, 1);
135
136            TimerAddons.Until(() => sphere.Width == 100.0, delegate { sphere.Width += 1; sphere.Height += 1; }, 0.01, sphere.Destroy);
137
138            foreach (GameObject item in interactedObjects)
139            {
140                InteractableObject obj = item as InteractableObject;
141                if (obj == null)
142                    continue;
143                obj.InteractWith(adven);
144            }
145        }
146
147
148        void Pickup(SimplePhysics.Object player, InteractableObject target)
149        {
150            Player adven = player as Player;
151            if (adven.Carrying == null)
152            {
153                adven.Carrying = target;
154                target.IgnoresGravity = true;
155                target.IgnoresCollisionResponse = true;
156                //Lentävän palikan nostaminen
157            }
158
159        }
160
161
162        /*
163         private void SetMovementKeys(Player adven, Key up, Key down, Key left, Key right, Key morph)
164         {
165             Keyboard.Listen(right, ButtonState.Down, Walk, null, adven, 200.0);
166             Keyboard.Listen(left, ButtonState.Down, Walk, null, adven, -200.0);
167             Keyboard.Listen(up, ButtonState.Down, Jump, null, adven);
168             Keyboard.Listen(down, ButtonState.Pressed, Crouch, null, adven, true);
169             Keyboard.Listen(down, ButtonState.Released, Crouch, null, adven, false);
170
171             Keyboard.Listen(morph, ButtonState.Pressed, SplitOrMorph, "Splits or morphs the player back to 1 player");
172
173         }
174         */
175
176        private void SetGeneralKeys()
177        {
178            Keyboard.Listen(Key.R, ButtonState.Pressed, () => { ClearAll(); advenae = new List<Player>(); Begin(); }, "Lopeta peli");
179            Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
180
181            //Keyboard.Listen(keys[4], ButtonState.Pressed, SplitOrMorph, "Splits or morphs the player back to 1 player", adven);
182            Keyboard.Listen(Key.X, ButtonState.Pressed, SplitOrMorph, "Splits or morphs the player", 2);
183            Keyboard.Listen(Key.RightShift, ButtonState.Pressed, SplitOrMorph, "Splits or morphs the player", 1);
184            Keyboard.Listen(Key.LeftShift, ButtonState.Pressed, () => { advenae[0].Reappear(); advenae[0].X = Level.Left - advenae[0].Width; }, "");
185        }
186
187
188        private Player MakePlayer(Vector position, double width, double height, int playerNum, List<Key> keys)
189        {
190            Player adven = new Player(TileSize * 0.99, TileSize * 1.98);
191            adven.Position = position;
192            adven.Friction = 0.2;
193            adven.Tag = "player";
194            adven.Crushed += adven.Destroy;
195            //adven.Destroyed += delegate { advenae.Remove(adven); };
196            adven.CollisionIgnoreGroup = playerNum;
197            adven.PlayerNumber = playerNum;
198            //adven.AddCollisionHandler("player", HandleMorphing);
199            adven.ControlKeys = keys;
200            adven.OnInteractedWith += Pickup;
201            Add(adven);
202
203            adven.AddCollisionHandler("death", (a, b) => adven.Destroy());
204
205            SetMovementKeys(adven, keys);
206
207            return adven;
208        }
209
210        /// <summary>
211        /// Sotku
212        /// </summary>
213        /// <param name="playerNro">Sen pelaajan numero, joka haluaa toimia</param>
214        private void SplitOrMorph(int playerNro)
215        {
216            //if (advenae.FindAll(o => o.IsVisible == true).Count == 1)
217            if (!advenae[playerNro - 1].IsVisible && advenae[1 - playerNro + 1].IsVisible)
218            {
219                Split(advenae[1 - playerNro + 1]);
220            }
221            else
222            {
223                Morph(advenae[1 - playerNro + 1]);
224            }
225        }
226
227        private void Morph(Player adven)
228        {
229            if (advenae.FindAll(o => o.IsVisible == true).Count != 2) return;
230
231            if (Vector.Distance(advenae[0].Position, advenae[1].Position) < adven.Width * 1.5)
232            {
233                Player destroyable = advenae.Find(o => o.PlayerNumber != adven.PlayerNumber);
234
235                /*destroyable.ControlKeys.ForEach(delegate (Key key)
236                {
237                    Keyboard.Disable(key);
238                });*/
239
240                destroyable.Destroy();
241            }
242
243            //TODO: Eeppinen hypäytys takaisin? Samalla voisi ajastimella tarkastaa jatkuvasti, ovatko pelaajat tarpeeksi lähellä toisiaan.
244            /*
245            Vector center = new Vector();
246
247            for (int i = 0; i < advenae.Count; i++)
248            {
249                center = (advenae[i].Position - center) * 0.5;
250            }
251            foreach (Player item in advenae)
252            {
253                item.Velocity = (center - item.Position) * 3.0;
254            }
255            morphing = true;
256            Timer.SingleShot(2.0, delegate { morphing = false; });
257            */
258        }
259
260        void Split(Player adven)
261        {
262            if (advenae.FindAll(o => o.IsVisible == true).Count == 2) return;
263
264            Player advenNew = new Player(adven.Width, adven.Height);
265            switch (adven.PlayerNumber)
266            {
267                case 1:
268                    advenNew = CreatePlayer2(adven.Position + new Vector(adven.Width, 0), adven.Width, adven.Height);
269                    break;
270                case 2:
271                    advenNew = CreatePlayer1(adven.Position + new Vector(adven.Width, 0), adven.Width, adven.Height);
272                    break;
273                default:
274                    break;
275            }
276
277            advenNew.Position = adven.Position + new Vector(adven.Width, 0);
278
279            if (Collisions(advenNew, Vector.Zero, true).Count > 0)
280            {
281                advenNew.Destroy();
282                return;
283            }
284
285            advenNew.ControlKeys.ForEach(delegate (Key key)
286            {
287                Keyboard.Enable(key);
288            });
289        }
290
291        void Walk(Player pelaaja, double nopeus)
292        {
293            pelaaja.Walk(nopeus);
294        }
295
296        private void Jump(SimplePlatformCharacter player)
297        {
298            if (player.IsGrounded)
299                player.Velocity = new Vector(player.Velocity.X, 500);
300        }
301
302        private void Crouch(Player player, bool crouch)
303        {
304            player.Crouch = crouch;
305        }
306
307        private void CreateMovingPlatform(Vector position, double width, double height, Dictionary<string, string> properties)
308        {
309            var dirX = double.Parse(properties["directionx"]);
310            var dirY = double.Parse(properties["directiony"]);
311            var distance = double.Parse(properties["distance"]);
312            var platform = new MovingPlatform(position, new Vector(dirX, dirY), distance, width, height);
313            Add(platform);
314        }
315
316        private void Foreground(int x, int y, Image image, string layerName, Dictionary<string, string> properties)
317        {
318            var tile = new SimplePhysics.Object(TileSize, TileSize) { IsStatic = true };
319            tile.Image = image;
320            tile.IgnoresCollisionResponse = true;
321            Add(tile, 3);
322            SetTile(x, y, tile);
323        }
324
325        private void TileMethod(int x, int y, Image image, string layerName, Dictionary<string, string> properties)
326        {
327            var tile = new SimplePhysics.Object(TileSize, TileSize) { IsStatic = true };
328            tile.Image = image;
329            Add(tile);
330            SetTile(x, y, tile);
331
332            if (properties.ContainsKey("type"))
333            {
334                var features = properties["type"].Split(',');
335                foreach (var feature in features)
336                {
337                    ApplyFeature(tile, feature);
338                }
339            }
340        }
341
342        private void ApplyFeature(SimplePhysics.Object tile, string feature)
343        {
344            switch (feature)
345            {
346                case "ice":
347                    tile.Friction = 0.0;
348                    break;
349
350                case "death":
351                    tile.Tag = "death";
352                    break;
353
354                case "oneway":
355                    tile.OneWayPlatform = true;
356                    break;
357
358                case "break":
359                    tile.AddCollisionHandler("player", (t, player) =>
360                    {
361                        if (player.Top <= tile.Bottom)
362                        {
363                            tile.Destroy();
364                        }
365                    });
366                    break;
367                default:
368                    throw new Exception("Unknown tile feature: " + feature);
369            }
370        }
371    }
372}
Note: See TracBrowser for help on using the repository browser.