source: 2016/27/ohjaajat/VenienteFragore/VenienteFragore/VenienteFragore/LevelCreationMethods.cs @ 8015

Revision 8015, 14.0 KB checked in by sieerinn, 3 years ago (diff)

Kenttiä muokkailtu ja liikkuville tasanteille kuva

Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using Jypeli;
6
7namespace VenienteFragore
8{
9    partial class VenienteFragore
10    {
11
12
13        private void CreateObject(Vector position, double width, double height, Angle angle, Shape shape, string name, Dictionary<string, string> properties)
14        {
15            if (objectMethods.ContainsKey(name))
16                objectMethods[name](position, width, height, properties);
17            else
18                throw new Exception("Unknown object type: " + name);
19        }
20
21        private void TestBall(Vector position, double width, double height, Dictionary<string, string> properties)
22        {
23            var testObject = new InteractableObject(TileSize * 0.99, TileSize * 0.99);
24            testObject.Position = position;
25            testObject.Color = Color.DarkGreen;
26            testObject.Shape = Shape.Circle;
27            testObject.RestitutionX = 0.5;
28            testObject.RestitutionY = 0.5;
29            testObject.CollisionIgnoreGroup = 1;
30            testObject.OnInteractedWith += Pickup;
31            Add(testObject);
32        }
33
34        private void CreateGoomba2(Vector position, double width, double height, Dictionary<string, string> properties)
35        {
36            MakeGoomba(position, minimiinii2Images, false);
37        }
38
39        private void CreateGoomba(Vector position, double width, double height, Dictionary<string, string> properties)
40        {
41            MakeGoomba(position, minimiiniiImages, true);
42        }
43
44        private void MakeGoomba(Vector position, Image[] animImages, bool fallsOff)
45        {
46            var goomba = new GoombaEnemy(TileSize * 0.96, TileSize * 0.96);
47            goomba.Position = position;
48            goomba.Color = Color.Pink;
49            goomba.Tag = "goomba";
50            goomba.Speed = 100;
51            goomba.FallOffPlatforms = fallsOff;
52            goomba.Animation = new Animation(animImages) { FPS = 10 };
53            goomba.Animation.Start();
54            Add(goomba);
55
56            goomba.AddCollisionHandler("player", (a, player) =>
57            {
58                // Litistyy kun pelaaja hyppää päälle.
59                if (player.Bottom >= goomba.Top)
60                {
61                    goomba.Destroy();
62                    player.Velocity = new Vector(player.Velocity.X, 400);
63
64                    var corpse = new GameObject(goomba.Width, goomba.Height * 0.2);
65                    corpse.TextureWrapSize = goomba.TextureWrapSize;
66                    corpse.Image = animImages[0];
67                    corpse.X = goomba.X;
68                    corpse.Bottom = goomba.Bottom;
69                    corpse.LifetimeLeft = TimeSpan.FromSeconds(1.0);
70                    Add(corpse);
71                }
72                else
73                {
74                    // Tappaa pelaajan jos osutaan sivulta päin.
75                    ((Player)player).Die();
76                }
77            });
78        }
79
80        private void CreatePlayer(Vector position, double width, double height, Dictionary<string, string> properties)
81        {
82            CreatePlayer1(position, width, height);
83            CreatePlayer2(position, width, height).Destroy();
84            advenae[1].IsAlive = false;
85            SetGeneralKeys();
86        }
87
88        private Player CreatePlayer1(Vector position, double width, double height)
89        {
90            if (advenae.Count > 0 && !advenae[0].IsVisible) { advenae[0].Reappear(); return advenae[0]; };
91
92            var advenA = MakePlayer(position, width, height, 1, new List<Key> { Key.Up, Key.Down, Key.Left, Key.Right, Key.Enter }, advenaBlob);
93            advenA.Color = Color.HotPink;
94            advenA.AnimWalk = new Animation(advenaImages);
95            advenA.AnimWalk.Start();
96            advenA.AnimCrouch = new Animation(advenaCrouch);
97            advenA.AnimCrouch.Start();
98            advenA.LiftAnim = new Animation(advenaLiftImages);
99            advenA.LiftAnim.Start();
100            advenA.JumpSounds = LoadSoundEffects("jump1", "jump2", "jump3");
101            advenA.GettingHitSounds = LoadSoundEffects("ouch1");
102            advenae.Add(advenA);
103            respawnPoint = position;
104            return advenA;
105        }
106
107        private Player CreatePlayer2(Vector position, double width, double height)
108        {
109            if (advenae.Count > 1 && !advenae[1].IsVisible) { advenae[1].Reappear(); return advenae[1]; };
110
111            var advenB = MakePlayer(position, width, height, 2, new List<Key> { Key.W, Key.S, Key.A, Key.D, Key.E }, advenbBlob);
112            advenB.Color = Color.Harlequin;
113            advenB.AnimWalk = new Animation(advenbImages);
114            advenB.AnimWalk.Start();
115            advenB.AnimCrouch = new Animation(advenbCrouch);
116            advenB.AnimCrouch.Start();
117            advenB.LiftAnim = new Animation(advenbLiftImages);
118            advenB.LiftAnim.Start();
119            advenB.JumpSounds = LoadSoundEffects("jump1", "jump2", "jump3");
120            advenB.GettingHitSounds = LoadSoundEffects("ouch1");
121            advenae.Add(advenB);
122            return advenB;
123        }
124
125        private Player MakePlayer(Vector position, double width, double height, int playerNum, List<Key> keys, Image blobImage)
126        {
127            var adven = new Player(TileSize * 0.99, TileSize * 1.96);
128            adven.Position = position;
129            adven.Friction = 0.2;
130            adven.Tag = "player";
131            adven.Crushed += adven.Die;
132            adven.CollisionIgnoreGroup = playerNum;
133            adven.PlayerNumber = playerNum;
134            adven.ControlKeys = keys;
135            adven.OnInteractedWith += Pickup;
136            Add(adven);
137           
138
139            adven.AddCollisionHandler("death", (a, b) => adven.Die());
140            adven.AddCollisionHandler("collectible", (a, b) =>
141            {
142                pointsCounter.Value += 1000;
143                b.Destroy();
144            });
145
146            adven.Died += () =>
147            {
148
149                for (int i = 0; i < 15; i++)
150                {
151                    var blob = new SimplePhysics.Object(15, 15)
152                    {
153                        Image = blobImage,
154                        Position = adven.Position,
155                        RestitutionX = 0.7,
156                        RestitutionY = 0.7,
157                        Friction = 0.2,
158                        LifetimeLeft = TimeSpan.FromSeconds(RandomGen.NextDouble(3.0, 6.0)),
159                        CollideOnlyWithTiles = true,
160                        Velocity = RandomGen.NextVector(300, 800)
161                    };
162                    Add(blob, 1);
163                    var updateTimer = new Timer { Interval = 0.02 };
164                    updateTimer.Timeout += () => blob.Size *= 0.99;
165                    updateTimer.Start();
166                    blob.Destroyed += updateTimer.Stop;
167                }
168                CheckRespawn();
169            };
170
171            SetMovementKeys(adven, keys);
172
173            return adven;
174        }
175
176        private void CheckRespawn()
177        {
178
179            int alive = advenae.Count(x => x.IsAlive);
180            if (lives.Value > 0 && alive == 0)
181            {
182                lives.Value--;
183                Timer.SingleShot(2.0, Respawn);
184                return;
185            }
186            if (lives.Value == 0 && alive == 0)   
187            {
188                Timer.SingleShot(2.0, GameOver);
189            }
190           
191        }
192
193        void Respawn()
194        {
195            //advenae[0] = CreatePlayer1(respawnPoint, advenae[0].Width, advenae[0].Height);
196            advenae[0].Reappear();
197            advenae[0].Position = respawnPoint;
198            advenae[0].ControlKeys.ForEach(delegate (Key key)
199            {
200                Keyboard.Enable(key);
201            });
202            Camera.Position = advenae[0].Position;
203        }
204
205        private void CreateWaterDrip(Vector position, double width, double height, Dictionary<string, string> properties)
206        {
207            // Luo ajastetusti vesipisaroita.
208            var dripTimer = new Timer { Interval = RandomGen.NextDouble(1.0, 4.0) };
209            dripTimer.Timeout += () =>
210            {
211                Add(new SimplePhysics.Object(10, 10)
212                {
213                    Position = position,
214                    Image = dripImage,
215                    LifetimeLeft = TimeSpan.FromSeconds(5),
216                    IgnoresCollisionResponse = true
217                }, -1);
218            };
219            dripTimer.Start();
220        }
221
222
223        private void CreateCollectible(Vector position, double width, double height, Dictionary<string, string> properties)
224        {
225            SimplePhysics.Object collectible = new SimplePhysics.Object(width, height);
226            collectible.IgnoresGravity = true;
227            collectible.Position = position;
228            collectible.Tag = "collectible";
229            collectible.IgnoresCollisionResponse = true;
230            collectible.Shape = Shape.CreateRegularPolygon(RandomGen.NextInt(3, 8));
231            collectible.Color = Color.Purple;
232            //collectible.Image = jotain;
233            Add(collectible);
234
235        }
236
237        private void CreateMovingPlatform(Vector position, double width, double height, Dictionary<string, string> properties)
238        {
239            var dirX = double.Parse(properties["directionx"]);
240            var dirY = double.Parse(properties["directiony"]);
241            var distance = double.Parse(properties["distance"]);
242            var platform = new MovingPlatform(position, new Vector(dirX, dirY), distance, width, height);
243            platform.Image = platformImage;
244            platform.TextureWrapSize = new Vector(width / TileSize, 1.0);
245            Add(platform);
246        }
247
248        private void CreateDoor(Vector position, double width, double height, Dictionary<string, string> properties)
249        {
250            string lvlName = properties["levelName"];
251            var door = new InteractableObject(width, height);
252            door.Position = position;
253            door.Color = Color.Purple;
254            door.Image = LoadImage("portal");
255            door.OnInteractedWith += delegate (SimplePhysics.Object actor, InteractableObject actedDoor)
256            {
257                EnterDoor(actor, actedDoor, lvlName);
258            };
259            Add(door);
260        }
261
262        private void EnterDoor(SimplePhysics.Object actor, InteractableObject actedDoor, string lvlName)
263        {
264            //Tämä tänne, jotta anim. tai jotain jos joskus halutaan, muuten suoraan voi vaihtaa kenttää delegattissa
265            MediaPlayer.Play(RandomGen.SelectOne(songNames));
266            if (advenae.Count(x => x.IsAlive) > 1) lives.Value++;
267            StartLevel(lvlName);
268        }
269
270        private void CreateShipPart(Vector position, double width, double height, Dictionary<string, string> properties)
271        {
272            string lvlName = properties["levelName"];
273            var part = new InteractableObject(width, height);
274            part.Position = position;
275            part.Image = LoadImage(collectedParts.Contains(currentLevelName)?"portal":"shippart");
276            part.OnInteractedWith += delegate
277            {
278                if (!collectedParts.Contains(currentLevelName))
279                    collectedParts.Add(currentLevelName);
280                StartLevel(lvlName);
281            };
282            Add(part);
283        }
284
285        private void Foreground(int x, int y, Image image, string layerName, Dictionary<string, string> properties)
286        {
287            var tile = new SimplePhysics.Object(TileSize, TileSize) { IsStatic = true };
288            tile.Image = image;
289            tile.IgnoresCollisionResponse = true;
290            Add(tile, 3);
291            SetTile(x, y, tile);
292        }
293
294        private void BackgroundTile(int x, int y, Image image, string layerName, Dictionary<string, string> properties)
295        {
296            var tile = new SimplePhysics.Object(TileSize, TileSize) { IsStatic = true };
297            tile.Image = image;
298            tile.IgnoresCollisionResponse = true;
299            Add(tile, -3);
300            SetTile(x, y, tile);
301        }
302
303        private void TileMethod(int x, int y, Image image, string layerName, Dictionary<string, string> properties)
304        {
305            var tile = new SimplePhysics.Object(TileSize, TileSize) { IsStatic = true };
306            tile.Image = image;
307            Add(tile);
308            SetTile(x, y, tile);
309
310            if (properties.ContainsKey("type"))
311            {
312                var features = properties["type"].Split(',');
313                foreach (var feature in features)
314                {
315                    ApplyFeature(tile, feature);
316                }
317            }
318        }
319
320        private void ApplyFeature(SimplePhysics.Object tile, string feature)
321        {
322            switch (feature)
323            {
324                case "ice":
325                    tile.Friction = 0.0;
326                    break;
327
328                case "death":
329                    tile.Tag = "death";
330                    break;
331
332                case "oneway":
333                    tile.OneWayPlatform = true;
334                    break;
335
336                case "fragile":
337                    double lifeTime = 2.0;
338                    tile.AddCollisionHandler("player", (t, player) =>
339                    {
340                        lifeTime -= 0.1;
341                        if (lifeTime <= 0.0)
342                        {
343                            tile.Destroy();
344                        }
345                    });
346                    break;
347
348                case "break":
349                    tile.AddCollisionHandler("player", (t, player) =>
350                    {
351                        if (player.Top <= tile.Bottom)
352                        {
353                            tile.Destroy();
354                        }
355                    });
356                    break;
357                default:
358                    throw new Exception("Unknown tile feature: " + feature);
359            }
360        }
361    }
362}
Note: See TracBrowser for help on using the repository browser.