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

Revision 7986, 11.8 KB checked in by tesatapa, 3 years ago (diff)

Gameover, kun elämät ja pelaajat loppuvat

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            SetGeneralKeys();
85        }
86
87        private Player CreatePlayer1(Vector position, double width, double height)
88        {
89            if (advenae.Count > 0 && !advenae[0].IsVisible) { advenae[0].Reappear(); return advenae[0]; };
90
91            var advenA = MakePlayer(position, width, height, 1, new List<Key> { Key.Up, Key.Down, Key.Left, Key.Right, Key.Enter }, advenaBlob);
92            advenA.Color = Color.HotPink;
93            advenA.AnimWalk = new Animation(advenaImages);
94            advenA.AnimWalk.Start();
95            advenA.AnimCrouch = new Animation(advenaCrouch);
96            advenA.AnimCrouch.Start();
97            advenae.Add(advenA);
98            respawnPoint = position;
99            return advenA;
100        }
101
102        private Player CreatePlayer2(Vector position, double width, double height)
103        {
104            if (advenae.Count > 1 && !advenae[1].IsVisible) { advenae[1].Reappear(); return advenae[1]; };
105
106            var advenB = MakePlayer(position, width, height, 2, new List<Key> { Key.W, Key.S, Key.A, Key.D, Key.E }, advenbBlob);
107            advenB.Color = Color.Harlequin;
108            advenB.AnimWalk = new Animation(advenbImages);
109            advenB.AnimWalk.Start();
110            advenB.AnimCrouch = new Animation(advenbCrouch);
111            advenB.AnimCrouch.Start();
112            advenae.Add(advenB);
113            return advenB;
114        }
115
116        private Player MakePlayer(Vector position, double width, double height, int playerNum, List<Key> keys, Image blobImage)
117        {
118            var adven = new Player(TileSize * 0.99, TileSize * 1.96);
119            adven.Position = position;
120            adven.Friction = 0.2;
121            adven.Tag = "player";
122            adven.Crushed += adven.Die;
123            adven.CollisionIgnoreGroup = playerNum;
124            adven.PlayerNumber = playerNum;
125            adven.ControlKeys = keys;
126            adven.OnInteractedWith += Pickup;
127            Add(adven);
128           
129
130            adven.AddCollisionHandler("death", (a, b) => adven.Die());
131            adven.AddCollisionHandler("collectible", (a, b) => pointsCounter.Value += 1000);
132
133            adven.Died += () =>
134            {
135                lives.Value--;
136                for (int i = 0; i < 15; i++)
137                {
138                    var blob = new SimplePhysics.Object(15, 15)
139                    {
140                        Image = blobImage,
141                        Position = adven.Position,
142                        RestitutionX = 0.7,
143                        RestitutionY = 0.7,
144                        Friction = 0.2,
145                        LifetimeLeft = TimeSpan.FromSeconds(RandomGen.NextDouble(3.0, 6.0)),
146                        CollideOnlyWithTiles = true,
147                        Velocity = RandomGen.NextVector(300, 800)
148                    };
149                    Add(blob, 1);
150                    var updateTimer = new Timer { Interval = 0.02 };
151                    updateTimer.Timeout += () => blob.Size *= 0.99;
152                    updateTimer.Start();
153                    blob.Destroyed += updateTimer.Stop;
154                }
155                CheckRespawn();
156            };
157
158            SetMovementKeys(adven, keys);
159
160            return adven;
161        }
162
163        private void CheckRespawn()
164        {
165            int alive = advenae.Count(x => x.IsAlive);
166            if (lives.Value > 0 && alive == 0)
167            {
168                Timer.SingleShot(2.0, Respawn);
169                return;
170            }
171            if (lives.Value == 0 && alive == 0)
172            {
173                GameOver();
174            }
175        }
176
177        void Respawn()
178        {
179            advenae[0] = CreatePlayer1(respawnPoint, advenae[0].Width, advenae[0].Height);
180
181        }
182
183        private void CreateWaterDrip(Vector position, double width, double height, Dictionary<string, string> properties)
184        {
185            // Luo ajastetusti vesipisaroita.
186            var dripTimer = new Timer { Interval = RandomGen.NextDouble(1.0, 4.0) };
187            dripTimer.Timeout += () =>
188            {
189                Add(new SimplePhysics.Object(10, 10)
190                {
191                    Position = position,
192                    Image = dripImage,
193                    LifetimeLeft = TimeSpan.FromSeconds(5),
194                    IgnoresCollisionResponse = true
195                }, -1);
196            };
197            dripTimer.Start();
198        }
199
200        private void CreateMovingPlatform(Vector position, double width, double height, Dictionary<string, string> properties)
201        {
202            var dirX = double.Parse(properties["directionx"]);
203            var dirY = double.Parse(properties["directiony"]);
204            var distance = double.Parse(properties["distance"]);
205            var platform = new MovingPlatform(position, new Vector(dirX, dirY), distance, width, height);
206            Add(platform);
207        }
208
209        private void CreateDoor(Vector position, double width, double height, Dictionary<string, string> properties)
210        {
211            string lvlName = properties["levelName"];
212            var door = new InteractableObject(width, height);
213            door.Position = position;
214            door.Color = Color.Purple;
215            door.Image = LoadImage("portal");
216            door.OnInteractedWith += delegate (SimplePhysics.Object actor, InteractableObject actedDoor)
217            {
218                EnterDoor(actor, actedDoor, lvlName);
219            };
220            Add(door);
221        }
222
223        private void EnterDoor(SimplePhysics.Object actor, InteractableObject actedDoor, string lvlName)
224        {
225            //Tämä tänne, jotta anim. tai jotain jos joskus halutaan, muuten suoraan voi vaihtaa kenttää delegattissa
226            StartLevel(lvlName);
227        }
228
229        private void CreateShipPart(Vector position, double width, double height, Dictionary<string, string> properties)
230        {
231            string lvlName = properties["levelName"];
232            var part = new InteractableObject(width, height);
233            part.Position = position;
234            part.Image = LoadImage(collectedParts.Contains(currentLevelName)?"portal":"shippart");
235            part.OnInteractedWith += delegate
236            {
237                if (!collectedParts.Contains(currentLevelName))
238                    collectedParts.Add(currentLevelName);
239                StartLevel(lvlName);
240            };
241            Add(part);
242        }
243
244        private void Foreground(int x, int y, Image image, string layerName, Dictionary<string, string> properties)
245        {
246            var tile = new SimplePhysics.Object(TileSize, TileSize) { IsStatic = true };
247            tile.Image = image;
248            tile.IgnoresCollisionResponse = true;
249            Add(tile, 3);
250            SetTile(x, y, tile);
251        }
252
253        private void TileMethod(int x, int y, Image image, string layerName, Dictionary<string, string> properties)
254        {
255            var tile = new SimplePhysics.Object(TileSize, TileSize) { IsStatic = true };
256            tile.Image = image;
257            Add(tile);
258            SetTile(x, y, tile);
259
260            if (properties.ContainsKey("type"))
261            {
262                var features = properties["type"].Split(',');
263                foreach (var feature in features)
264                {
265                    ApplyFeature(tile, feature);
266                }
267            }
268        }
269
270        private void ApplyFeature(SimplePhysics.Object tile, string feature)
271        {
272            switch (feature)
273            {
274                case "ice":
275                    tile.Friction = 0.0;
276                    break;
277
278                case "death":
279                    tile.Tag = "death";
280                    break;
281
282                case "oneway":
283                    tile.OneWayPlatform = true;
284                    break;
285
286                case "fragile":
287                    double lifeTime = 2.0;
288                    tile.AddCollisionHandler("player", (t, player) =>
289                    {
290                        lifeTime -= 0.1;
291                        if (lifeTime <= 0.0)
292                        {
293                            tile.Destroy();
294                        }
295                    });
296                    break;
297
298                case "break":
299                    tile.AddCollisionHandler("player", (t, player) =>
300                    {
301                        if (player.Top <= tile.Bottom)
302                        {
303                            tile.Destroy();
304                        }
305                    });
306                    break;
307                default:
308                    throw new Exception("Unknown tile feature: " + feature);
309            }
310        }
311    }
312}
Note: See TracBrowser for help on using the repository browser.