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

Revision 6705, 9.4 KB checked in by sieerinn, 4 years ago (diff)

Junabossia, savua, sekä kaikenlaista ihme säätöä tehty.

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