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

Revision 8007, 13.0 KB checked in by tesatapa, 3 years ago (diff)

toimiva respawn

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