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

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