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

Revision 7981, 10.4 KB checked in by sieerinn, 3 years ago (diff)

Pelaajille Die-metodi ja pelaajat hajoaa palasiksi kuollessaan

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        private void CreateObject(Vector position, double width, double height, Angle angle, Shape shape, string name, Dictionary<string, string> properties)
12        {
13            if (objectMethods.ContainsKey(name))
14                objectMethods[name](position, width, height, properties);
15            else
16                throw new Exception("Unknown object type: " + name);
17        }
18
19        private void TestBall(Vector position, double width, double height, Dictionary<string, string> properties)
20        {
21            var testObject = new InteractableObject(TileSize * 0.99, TileSize * 0.99);
22            testObject.Position = position;
23            testObject.Color = Color.DarkGreen;
24            testObject.Shape = Shape.Circle;
25            testObject.RestitutionX = 0.5;
26            testObject.RestitutionY = 0.5;
27            testObject.CollisionIgnoreGroup = 1;
28            testObject.OnInteractedWith += Pickup;
29            Add(testObject);
30        }
31
32        private void CreateGoomba2(Vector position, double width, double height, Dictionary<string, string> properties)
33        {
34            MakeGoomba(position, minimiinii2Images, false);
35        }
36
37        private void CreateGoomba(Vector position, double width, double height, Dictionary<string, string> properties)
38        {
39            MakeGoomba(position, minimiiniiImages, true);
40        }
41
42        private void MakeGoomba(Vector position, Image[] animImages, bool fallsOff)
43        {
44            var goomba = new GoombaEnemy(TileSize * 0.96, TileSize * 0.96);
45            goomba.Position = position;
46            goomba.Color = Color.Pink;
47            goomba.Tag = "goomba";
48            goomba.Speed = 100;
49            goomba.FallOffPlatforms = fallsOff;
50            goomba.Animation = new Animation(animImages) { FPS = 10 };
51            goomba.Animation.Start();
52            Add(goomba);
53
54            goomba.AddCollisionHandler("player", (a, player) =>
55            {
56                // Litistyy kun pelaaja hyppää päälle.
57                if (player.Bottom >= goomba.Top)
58                {
59                    goomba.Destroy();
60                    player.Velocity = new Vector(player.Velocity.X, 400);
61
62                    var corpse = new GameObject(goomba.Width, goomba.Height * 0.2);
63                    corpse.TextureWrapSize = goomba.TextureWrapSize;
64                    corpse.Image = animImages[0];
65                    corpse.X = goomba.X;
66                    corpse.Bottom = goomba.Bottom;
67                    corpse.LifetimeLeft = TimeSpan.FromSeconds(1.0);
68                    Add(corpse);
69                }
70                else
71                {
72                    // Tappaa pelaajan jos osutaan sivulta päin.
73                    ((Player)player).Die();
74                }
75            });
76        }
77
78        private void CreatePlayer(Vector position, double width, double height, Dictionary<string, string> properties)
79        {
80            CreatePlayer1(position, width, height);
81            CreatePlayer2(position, width, height).Destroy();
82            SetGeneralKeys();
83        }
84
85        private Player CreatePlayer1(Vector position, double width, double height)
86        {
87            if (advenae.Count > 0 && !advenae[0].IsVisible) { advenae[0].Reappear(); return advenae[0]; };
88
89            var advenA = MakePlayer(position, width, height, 1, new List<Key> { Key.Up, Key.Down, Key.Left, Key.Right, Key.Enter }, advenaBlob);
90            advenA.Color = Color.HotPink;
91            advenA.AnimWalk = new Animation(advenaImages);
92            advenA.AnimWalk.Start();
93            advenA.AnimCrouch = new Animation(advenaCrouch);
94            advenA.AnimCrouch.Start();
95            advenae.Add(advenA);
96            return advenA;
97        }
98
99        private Player CreatePlayer2(Vector position, double width, double height)
100        {
101            if (advenae.Count > 1 && !advenae[1].IsVisible) { advenae[1].Reappear(); return advenae[1]; };
102
103            var advenB = MakePlayer(position, width, height, 2, new List<Key> { Key.W, Key.S, Key.A, Key.D, Key.E }, advenbBlob);
104            advenB.Color = Color.Harlequin;
105            advenB.AnimWalk = new Animation(advenbImages);
106            advenB.AnimWalk.Start();
107            advenB.AnimCrouch = new Animation(advenbCrouch);
108            advenB.AnimCrouch.Start();
109            advenae.Add(advenB);
110            return advenB;
111        }
112
113        private Player MakePlayer(Vector position, double width, double height, int playerNum, List<Key> keys, Image blobImage)
114        {
115            var adven = new Player(TileSize * 0.99, TileSize * 1.96);
116            adven.Position = position;
117            adven.Friction = 0.2;
118            adven.Tag = "player";
119            adven.Crushed += adven.Destroy;
120            adven.CollisionIgnoreGroup = playerNum;
121            adven.PlayerNumber = playerNum;
122            adven.ControlKeys = keys;
123            adven.OnInteractedWith += Pickup;
124            Add(adven);
125
126            adven.AddCollisionHandler("death", (a, b) => adven.Die());
127
128            adven.Died += () =>
129            {
130                for (int i = 0; i < 15; i++)
131                {
132                    var blob = new SimplePhysics.Object(15, 15)
133                    {
134                        Image = blobImage,
135                        Position = adven.Position,
136                        RestitutionX = 0.7,
137                        RestitutionY = 0.7,
138                        Friction = 0.2,
139                        LifetimeLeft = TimeSpan.FromSeconds(RandomGen.NextDouble(3.0, 6.0)),
140                        CollideOnlyWithTiles = true,
141                        Velocity = RandomGen.NextVector(300, 800)
142                    };
143                    Add(blob, 1);
144                    var updateTimer = new Timer { Interval = 0.02 };
145                    updateTimer.Timeout += () => blob.Size *= 0.99;
146                    updateTimer.Start();
147                    blob.Destroyed += updateTimer.Stop;
148                }
149            };
150
151            SetMovementKeys(adven, keys);
152
153            return adven;
154        }
155
156        private void CreateWaterDrip(Vector position, double width, double height, Dictionary<string, string> properties)
157        {
158            // Luo ajastetusti vesipisaroita.
159            var dripTimer = new Timer { Interval = RandomGen.NextDouble(1.0, 4.0) };
160            dripTimer.Timeout += () =>
161            {
162                Add(new SimplePhysics.Object(10, 10)
163                {
164                    Position = position,
165                    Image = dripImage,
166                    LifetimeLeft = TimeSpan.FromSeconds(5),
167                    IgnoresCollisionResponse = true
168                }, -1);
169            };
170            dripTimer.Start();
171        }
172
173        private void CreateMovingPlatform(Vector position, double width, double height, Dictionary<string, string> properties)
174        {
175            var dirX = double.Parse(properties["directionx"]);
176            var dirY = double.Parse(properties["directiony"]);
177            var distance = double.Parse(properties["distance"]);
178            var platform = new MovingPlatform(position, new Vector(dirX, dirY), distance, width, height);
179            Add(platform);
180        }
181
182        private void CreateDoor(Vector position, double width, double height, Dictionary<string, string> properties)
183        {
184            string lvlName = properties["levelName"];
185            var door = new InteractableObject(width, height);
186            door.Position = position;
187            door.Color = Color.Purple;
188            door.OnInteractedWith += delegate (SimplePhysics.Object actor, InteractableObject actedDoor)
189            {
190                EnterDoor(actor, actedDoor, lvlName);
191            };
192            Add(door);
193        }
194
195        private void EnterDoor(SimplePhysics.Object actor, InteractableObject actedDoor, string lvlName)
196        {
197            //Tämä tänne, jotta anim. tai jotain jos joskus halutaan, muuten suoraan voi vaihtaa kenttää delegattissa
198            StartLevel(lvlName);
199        }
200
201        private void Foreground(int x, int y, Image image, string layerName, Dictionary<string, string> properties)
202        {
203            var tile = new SimplePhysics.Object(TileSize, TileSize) { IsStatic = true };
204            tile.Image = image;
205            tile.IgnoresCollisionResponse = true;
206            Add(tile, 3);
207            SetTile(x, y, tile);
208        }
209
210        private void TileMethod(int x, int y, Image image, string layerName, Dictionary<string, string> properties)
211        {
212            var tile = new SimplePhysics.Object(TileSize, TileSize) { IsStatic = true };
213            tile.Image = image;
214            Add(tile);
215            SetTile(x, y, tile);
216
217            if (properties.ContainsKey("type"))
218            {
219                var features = properties["type"].Split(',');
220                foreach (var feature in features)
221                {
222                    ApplyFeature(tile, feature);
223                }
224            }
225        }
226
227        private void ApplyFeature(SimplePhysics.Object tile, string feature)
228        {
229            switch (feature)
230            {
231                case "ice":
232                    tile.Friction = 0.0;
233                    break;
234
235                case "death":
236                    tile.Tag = "death";
237                    break;
238
239                case "oneway":
240                    tile.OneWayPlatform = true;
241                    break;
242
243                case "fragile":
244                    double lifeTime = 2.0;
245                    tile.AddCollisionHandler("player", (t, player) =>
246                    {
247                        lifeTime -= 0.1;
248                        if (lifeTime <= 0.0)
249                        {
250                            tile.Destroy();
251                        }
252                    });
253                    break;
254
255                case "break":
256                    tile.AddCollisionHandler("player", (t, player) =>
257                    {
258                        if (player.Top <= tile.Bottom)
259                        {
260                            tile.Destroy();
261                        }
262                    });
263                    break;
264                default:
265                    throw new Exception("Unknown tile feature: " + feature);
266            }
267        }
268    }
269}
Note: See TracBrowser for help on using the repository browser.