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

Revision 7976, 9.1 KB checked in by sieerinn, 3 years ago (diff)

Kyykkykuvat peliin asti

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