source: 2015/27/ohjaajat/TheLegendOfGabriel/TheLegendOfGabriel/TheLegendOfGabriel/LevelCreation.cs @ 6713

Revision 6713, 10.3 KB checked in by empaheik, 7 years ago (diff)

Niin näkymättömiä reunoja.

Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using Jypeli;
6using Jypeli.Assets;
7using Jypeli.Widgets;
8
9/*
10 *Klassisia muistutuksia
11 * 3
12 * 2    Pelaajan päällä näkyvät elementit
13 * 1    Pelaaja, kojootit
14 * 0    Lisäkoriste
15 * -1   Perustiili
16 * -2
17 */
18
19
20public partial class TheLegendOfGabriel : PhysicsGame
21{
22    /// <summary>
23    /// Luo kentän .tmx tiedostosta.
24    /// </summary>
25    void CreateLevel(string levelName)
26    {
27        bossSpawnPositions.Clear();
28        var level = TiledTileMap.FromLevelAsset(levelName);
29        level.SetTileMethod("base", CreateBaseTile);
30        level.SetTileMethod("foreground", CreateForegroundTile);
31        level.SetObjectMethod("exit", CreateExit);
32        level.SetTileMethod("decoration", CreateDecoration);
33        level.SetTileMethod("cover", CreateCover);
34        level.SetObjectMethod("story", CreateEncounter);
35        //level.SetObjectMethod("player", CreatePlayer);
36        level.SetObjectMethod("blockade", CreateBlock);
37        level.SetObjectMethod("coyote", CreateCoyote);
38        level.SetObjectMethod("boss", CreateBoss);
39        level.SetObjectMethod("bossspawn", CreateBossSpawn);
40        level.Execute();
41
42        Level.CreateBorders(false);
43
44        Level.Background.Color = Color.Black;
45    }
46
47    void CreateEncounter(Vector position, double width, double height, Angle angle, Shape shape, string name, Dictionary<string, string> properties)
48    {
49        if (storyItems.Count < 2)
50        {
51            PhysicsObject invisible = new PhysicsObject(width, height) { IsVisible = false, Tag = "storyTime" };
52            invisible.MakeStatic();
53            Add(invisible);
54        }
55    }
56
57    void CreateBossSpawn(Vector position, double width, double height, Angle angle, Shape shape, string name, Dictionary<string, string> properties)
58    {
59        bossSpawnPositions.Add(position);
60    }
61
62    void CreateBoss(Vector position, double width, double height, Angle angle, Shape shape, string name, Dictionary<string, string> properties)
63    {
64        MediaPlayer.Play("boss");
65        MediaPlayer.IsRepeating = true;
66
67        BossHealth = new IntMeter(10, 0, 10);
68
69        var bar = new ProgressBar(Level.Width * 0.7, TILE_SIZE * 0.5);
70        bar.Y = Screen.Top - TILE_SIZE * 0.5;
71        bar.BindTo(BossHealth);
72        Add(bar);
73
74        // Juna ilmestyy välillä satunnaiseen spawniin.
75        var bossTimer = new Timer();
76        bossTimer.Interval = 8;
77        bossTimer.Timeout += delegate
78        {
79            // Luodaan päävaunu.
80            var pos = RandomGen.SelectOne<Vector>(bossSpawnPositions);
81            var train = CreateBossTrainPart(pos.X, pos.Y, trainAnimation);
82            double newPositionX = pos.X + train.Width;
83
84            // Luodaan muut vaunut.
85            int carriages = (int)(BossHealth.Value / (double)BossHealth.MaxValue * 6);
86            for (int i = 0; i < carriages; i++)
87            {
88                var part = CreateBossTrainPart(newPositionX, pos.Y, carriageAnimation);
89                newPositionX += part.Width;
90            }
91        };
92        bossTimer.Start();
93
94        BossHealth.LowerLimit += delegate
95        {
96            EnemyDieSound.Play();
97            bossTimer.Stop();
98            Timer.SingleShot(4.0, Victory);
99
100            foreach (var part in GetObjectsWithTag("boss"))
101            {
102                part.Destroy();
103                var smoke = new GameObject(80, 160);
104                smoke.X = part.X;
105                smoke.Bottom = part.Bottom;
106                smoke.Animation = new Animation(smokeAnimation);
107                smoke.Animation.Start(1);
108                smoke.Animation.Played += () => smoke.Destroy();
109                Add(smoke);
110            }
111        };
112    }
113
114    PhysicsObject CreateBossTrainPart(double left, double y, Animation anim)
115    {
116        var part = PhysicsObject.CreateStaticObject(70, 40);
117        part.Left = left;
118        part.Y = y;
119        part.Animation = anim;
120        part.Animation.Start();
121        part.Velocity = new Vector(-80, 0);
122        part.Tag = "boss";
123        part.CollisionIgnoreGroup = 3;
124        Add(part);
125
126        // Pala on näkyvillä vain kentän sisäpuolella.
127        var appearTimer = new Timer();
128        appearTimer.Interval = 0.05;
129        appearTimer.Timeout += delegate
130        {
131            part.IsVisible = part.Left < Level.Right;
132
133            if (part.Right < Level.Left)
134            {
135                part.Destroy();
136                appearTimer.Stop();
137            }
138        };
139        appearTimer.Start();
140
141        // Palat luo vihollisia jatkuvasti.
142        var enemySpawnTimer = new Timer();
143        enemySpawnTimer.Interval = 2.0;
144        enemySpawnTimer.Timeout += delegate
145        {
146            if (part.Right < Level.Right)
147            {
148                CreateCoyote(part.Position, TILE_SIZE, TILE_SIZE, Angle.Zero, Shape.Rectangle, "", null);
149            }
150        };
151        enemySpawnTimer.Start();
152
153        part.Destroyed += delegate
154        {
155            appearTimer.Stop();
156            enemySpawnTimer.Stop();
157        };
158
159        return part;
160    }
161
162    /// <summary>
163    /// Näkymättömiä esteitä.
164    /// </summary>
165    void CreateBlock(Vector position, double width, double height, Angle angle, Shape shape, string name, Dictionary<string, string> properties)
166    {
167        PhysicsObject block = PhysicsObject.CreateStaticObject(width, height);
168        block.Position = position;
169        block.IsVisible = false;
170        Add(block);
171
172    }
173
174    void CreateCoyote(Vector position, double width, double height, Angle angle, Shape shape, string name, Dictionary<string, string> properties)
175    {
176        var enemy = new Creature(width, height, 1);
177        enemy.MoveAnimations = DirectionalAnimations(coyoteLeft, coyoteRight, coyoteUp, coyoteDown);
178        enemy.Image = enemy.MoveAnimations[Direction.Right].CurrentFrame;
179        enemy.Position = position;
180        enemy.Tag = "enemy";
181        enemy.Brain = new FollowerBrain(player) { Speed = 50 };
182        enemy.CollisionIgnoreGroup = 3;
183        Add(enemy, 1);
184        enemies.Add(enemy);
185
186        AddCollisionHandler(enemy, "playerattack", delegate(PhysicsObject e, PhysicsObject a)
187        {
188            enemy.Health.Value--;
189        });
190       
191        enemy.Health.LowerLimit += delegate
192        {
193            enemy.Destroy();
194            RandomItemDrop(enemy.Position);
195
196            EnemyDieSound.Play();
197
198            var smoke = new GameObject(20, 40);
199            smoke.X = enemy.X;
200            smoke.Bottom = enemy.Bottom;
201            smoke.Animation = new Animation(smokeAnimation);
202            smoke.Animation.Start(1);
203            smoke.Animation.Played += () => smoke.Destroy();
204            Add(smoke);
205        };
206    }
207
208    void RandomItemDrop(Vector position)
209    {
210        var chance = RandomGen.NextDouble(0, 100);
211        if (chance < 20)
212        {
213            int itemType = RandomGen.NextInt(1, 3);
214            var item = PhysicsObject.CreateStaticObject(10, 10);
215            item.Position = position;
216            item.Image = itemType == 1 ? GrenadeBoxImage : AmmoBoxImage;
217            item.Tag = itemType == 1 ? "grenadebox" : "ammobox";
218            item.IgnoresCollisionResponse = true;
219            Add(item);
220        }
221    }
222
223    /// <summary>
224    /// Maassa oleva tiili.
225    /// </summary>
226    void CreateBaseTile(Vector position, double width, double height, Image image, string layerName, Dictionary<string, string> properties)
227    {
228        CreateBasicTile(position, width, height, image, -1, properties);
229    }
230
231    /// <summary>
232    /// Pohjan päällä, pelaajan alla näkyvä tiili.
233    /// </summary>
234    void CreateDecoration(Vector position, double width, double height, Image image, string layerName, Dictionary<string, string> properties)
235    {
236        CreateBasicTile(position, width, height, image, 0, properties);
237    }
238
239    /// <summary>
240    /// Pelaajan päällä näkyvä tiili.
241    /// </summary>
242    void CreateForegroundTile(Vector position, double width, double height, Image image, string layerName, Dictionary<string, string> properties)
243    {
244        CreateBasicTile(position, width, height, image, 2, properties);
245    }
246
247    void CreateCover(Vector position, double width, double height, Image image, string layername, Dictionary<string, string> properties)
248    {
249        var tile = new GameObject(width, height);
250        tile.Tag = "cover";
251        tile.Image = image;
252        tile.Position = position;
253        Add(tile, 3);
254    }
255
256    /// <summary>
257    /// Luo tavallisen tiilen.
258    /// </summary>
259    void CreateBasicTile(Vector position, double width, double height, Image image, int layer, Dictionary<string, string> properties)
260    {
261        var tile = properties.ContainsKey("collide") ? PhysicsObject.CreateStaticObject(width, height) : new GameObject(width, height); //new PhysicsObject(width, height)  PhysicsObject.CreateStaticObject(width, height)
262        tile.Image = image;
263        tile.Position = position;
264        Add(tile, layer);
265    }
266
267    /// <summary>
268    /// Luo uloskäynnin, joka vie toiseen kenttään.
269    /// </summary>
270    void CreateExit(Vector position, double width, double height, Angle angle, Shape shape, string name, Dictionary<string, string> properties)
271    {
272        var target = properties["goto"] == "disabled" ? null : properties["goto"].Split('@'); // Jos peli kaatuu tälle riville niin joltain exitiltä puuttuu goto-property.
273        var exit = new Exit(width, height);
274        exit.Position = position;
275        if (target != null)
276        {
277            exit.TargetLevel = target[0];
278            exit.TargetExitName = target[1];
279        }
280        exit.Name = name;
281        Add(exit);
282        exits.Add(exit);
283
284        bool create = properties.ContainsKey("block");
285        if(create)
286        {
287            PhysicsObject fence = PhysicsObject.CreateStaticObject(TILE_SIZE, TILE_SIZE);
288            fence.Image = FenceImage;
289            fence.Position = exit.Position - new Vector(0, TILE_SIZE);
290            Add(fence, 3);
291
292            AddCollisionHandler(fence, "playerattack", delegate(PhysicsObject destroyable, PhysicsObject a)
293            {
294               destroyable.Destroy();
295               destroyable.Tag = "none";
296            });
297       
298        }
299    }
300}
Note: See TracBrowser for help on using the repository browser.