source: 2016/23/ohjaajat/Punasininen/Punasininen/Punasininen/Punasininen.cs @ 7217

Revision 7217, 13.4 KB checked in by empaheik, 4 years ago (diff)

ruma aseviritelmä ahoy

Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using Jypeli;
5using Jypeli.Assets;
6using Jypeli.Controls;
7using Jypeli.Effects;
8using Jypeli.Widgets;
9
10public class Punasininen : PhysicsGame
11{
12    private const double SPEED = 450;
13    private const double JUMPSPEED = 1250;
14    private const int TILE_SIZE = 60;
15    private const int MATCH_LENGTH = 60;
16
17    private Player blue;
18    private Player red;
19    private Image[] orangeTileImages = LoadImages("orangetile\\orangetile", 12);
20    private Image[] blueTileImages = LoadImages("bluetile\\bluetile", 12);
21    private Image[] orangeWalkImages = LoadImages("walkorange\\walk", 16);
22    private Image[] blueWalkImages = LoadImages("walkblue\\walk", 16);
23    private Image orangeGlow = LoadImage("orangeglow");
24    private Image blueGlow = LoadImage("blueglow");
25
26    Font largeFont = LoadFont("SymtextLarge");
27    Font smallFont = LoadFont("SymtextSmall");
28
29    Color blueColor = Color.FromHexCode("FF1D65CF");
30    Color redColor = Color.FromHexCode("FABE1A");
31
32    private Image cratePic = LoadImage("weaponcrate");
33    private Image bluePistolpic = LoadImage("bluegun");
34    private Image orangePistolpic = LoadImage("orangegun");
35
36    DoubleMeter matchTimer; // Remaining time in seconds.
37    DoubleMeter percentageTracker;
38
39    Dictionary<Vector, WeaponCrate> cratePositions = new Dictionary<Vector, WeaponCrate>();
40
41    private Shader shader;
42
43    public override void Begin()
44    {
45        shader = new Shader(GraphicsDevice, Content, Camera);
46        SmoothTextures = false;
47
48        CreateLevel();
49        AddControls();
50    }
51
52    private static Image[] LoadImages(string prefix, int numberOfImages)
53    {
54        var images = new Image[numberOfImages];
55        for (int i = 1; i <= numberOfImages; i++)
56        {
57            images[i - 1] = LoadImage(string.Format("{0}{1:0000}", prefix, i));
58        }
59        return images;
60    }
61
62    void CreateLevel()
63    {
64        Gravity = new Vector(0, -1000);
65
66        ColorTileMap map = ColorTileMap.FromLevelAsset("dungeon1");
67        map.SetTileMethod(Color.Black, delegate(Vector vektori, double leveys, double korkeus) { AddPlatform(vektori, leveys, korkeus); });
68        map.SetTileMethod(Color.FromHexCode("#FF0026FF"), delegate(Vector paikka, double leveys, double korkeus) { blue = CreatePlayer(paikka, leveys, korkeus, blueColor, blueWalkImages, bluePistolpic); });
69        map.SetTileMethod(Color.FromHexCode("FFD800"), delegate(Vector a, double b, double c) { cratePositions.Add(a, CreateWeaponCrate(a, b, c)); });
70        map.SetTileMethod(Color.Red, delegate(Vector paikka, double leveys, double korkeus) { red = CreatePlayer(paikka, leveys, korkeus, redColor, orangeWalkImages, orangePistolpic); });
71        map.Execute(TILE_SIZE, TILE_SIZE);
72
73        Tile bottom = AddPlatform(new Vector(0, Level.Bottom - 100), Level.Width * 4, 100);
74        bottom.Tag = "death";
75        Add(bottom);
76
77        // Luo ajastimen, joka värittää kokoajan pelaajien lähellä olevia tiiliä.
78        // (pakko laittaa pieni viive, koska GetObjectsWithTag palauttaa muuten tyhjän listan)
79        Timer.SingleShot(0.1, () =>
80        {
81            int coloringDistance = 85;
82            var tiles = GetObjectsWithTag("platform");
83            Timer playerColorTimer = new Timer() { Interval = 0.1 };
84            playerColorTimer.Timeout += () =>
85            {
86                foreach (var tile in tiles)
87                {
88                    if (Vector.Distance(red.Position, tile.Position) < coloringDistance)
89                        ColorTile(red, (PhysicsObject)tile);
90                    if (Vector.Distance(blue.Position, tile.Position) < coloringDistance)
91                        ColorTile(blue, (PhysicsObject)tile);
92                }
93            };
94            playerColorTimer.Start();
95        });
96
97        Timer spawnTimer = new Timer() { };
98
99        Camera.ZoomToLevel();
100        Level.Background.Color = Color.Black;
101
102        percentageTracker = new DoubleMeter(0, 0, 100);
103
104        ProgressBar percentageBar = new ProgressBar(Level.Width / 2, 20) { Y = Screen.Top - 20, BarColor = red.Color, Color = blue.Color };
105        percentageBar.Y = Screen.Top - 20;
106        percentageBar.BindTo(percentageTracker);
107        Add(percentageBar);
108
109        CreateMatchTimer();
110    }
111
112    void CreateMatchTimer()
113    {
114        matchTimer = new DoubleMeter(MATCH_LENGTH);
115        matchTimer.LowerLimit += () =>
116        {
117            Win(percentageTracker.Value >= 50 ? red : blue);
118            var restart = new Timer() { Interval = 5, IgnorePause = true };
119            restart.Timeout += () => { ClearAll(); Begin(); Pause(); };
120            restart.Start();
121        };
122
123        Func<double, double, Color, Label> createLabel = (x, y, color) =>
124        {
125            var label = new Label();
126            label.Font = largeFont;
127            label.Position = new Vector(x, y);
128            label.BindTo(matchTimer);
129            label.TextColor = color;
130            label.DoubleFormatString = "{0}";
131            Add(label);
132            return label;
133        };
134
135        var timeLabelDark = createLabel(5, Window.Height / 2 - 100 - 5, Color.Black);
136        var timeLabel = createLabel(0, Window.Height / 2 - 100, blueColor);
137
138        var matchLabelTimer = new Timer();
139        matchLabelTimer.Interval = 1;
140        matchLabelTimer.Timeout += () =>
141        {
142            matchTimer.Value -= 1;
143            timeLabel.TextColor = matchTimer.Value % 2 == 0 ? blueColor : redColor;
144        };
145        matchLabelTimer.Start();
146
147    }
148
149    WeaponCrate CreateWeaponCrate(Vector place, double width, double height)
150    {
151        WeaponCrate crate = new WeaponCrate(width, height);
152        crate.Position = place;
153        crate.Image = cratePic;
154        crate.IgnoresCollisionResponse = true;
155        crate.MakeStatic();
156        Add(crate);
157
158        crate.Oscillate(Vector.UnitY, 10, 0.4);
159
160        return crate;
161    }
162
163    Tile AddPlatform(Vector paikka, double leveys, double korkeus)
164    {
165        Tile platform = new Tile(leveys, korkeus, paikka);
166        platform.MakeStatic();
167        platform.Color = Color.Black;
168        platform.Tag = "platform";
169        Add(platform);
170        return platform;
171    }
172
173    Player CreatePlayer(Vector paikka, double leveys, double korkeus, Color playersColor, Image[] animation, Image pistolPic)
174    {
175        Player player = new Player(leveys * 1, korkeus * 1.5, playersColor);
176        player.AnimWalk = new Animation(animation) { FPS = 30 };
177        player.AnimIdle = new Animation(new[] { animation[0] });
178        player.Position = paikka + new Vector(0, korkeus / 2);
179        player.Spawn = player.Position;
180        Add(player);
181
182        player.Weapon = new AssaultRifle(leveys * 1.5, korkeus * 1.5)
183        {
184            FireRate = 3,
185            AttackSound = null,
186            MaxAmmoLifetime = TimeSpan.FromSeconds(8),
187            ProjectileCollision = delegate(PhysicsObject a, PhysicsObject b) { ColorTile(a, b); a.Destroy(); },
188            // ProjectileCollision = BulletHitsSomething,
189            Image = pistolPic,
190            Y = 5
191        };
192
193        AddCollisionHandler(player, "platform", delegate(PhysicsObject a, PhysicsObject b)
194        {
195            ColorTile(a, b);
196        });
197        AddCollisionHandler(player, "crate", delegate(PhysicsObject a, PhysicsObject b)
198        {
199            GunLottery(player);
200            b.Destroy();
201        });
202        AddCollisionHandler(player, "death", delegate(PhysicsObject a, PhysicsObject b)
203        {
204            Restore((Player)a);
205        });
206
207        return player;
208    }
209
210    void Restore(Player player)
211    {
212        player.Position = player.Spawn;
213    }
214
215    void GunLottery(Player player)
216    {
217        int hurdur = RandomGen.NextInt(0, 3);
218
219        switch (hurdur)
220        {
221            case 0:
222                player.Weapon = new AssaultRifle(player.Weapon.Width, player.Weapon.Height) { Image = player.Weapon.Image,  ProjectileCollision = delegate(PhysicsObject a, PhysicsObject b) { ColorTile(a, b); a.Destroy(); }, AttackSound = null, MaxAmmoLifetime = TimeSpan.FromSeconds(4) };
223                break;
224            case 1:
225                player.Weapon = new ColorGun(player.Weapon.Width, player.Weapon.Height, player.Weapon.Image, player);
226                break;
227            case 2:
228                player.Weapon = new LaserGun(player.Weapon.Width, player.Weapon.Height) { Image = player.Weapon.Image, ProjectileCollision = delegate(PhysicsObject a, PhysicsObject b) { ColorTile(a, b); a.Destroy(); }, AttackSound = null, MaxAmmoLifetime = TimeSpan.FromSeconds(4) };
229                break;
230            default:
231                break;
232        };
233
234        Timer undo = new Timer() { Interval = 5 };
235        undo.Timeout += delegate()
236        {
237            undo.Stop();
238            player.Weapon = new AssaultRifle(player.Weapon.Width, player.Weapon.Height)
239        {
240            FireRate = 3,
241            AttackSound = null,
242            MaxAmmoLifetime = TimeSpan.FromSeconds(8),
243            Image = player.Weapon.Image,
244            ProjectileCollision = delegate(PhysicsObject a, PhysicsObject b) { ColorTile(a, b); a.Destroy(); },
245            Y = 5,
246        };
247        };
248        undo.Start();
249
250    }
251
252    void Win(Player winner)
253    {
254        Pause();
255
256        // Haluaisin tehdä tähän jonkinlaisen hauskan ponnahdusefektin jossain vaiheessa. Sellaisen napakan zoomin ja sitten boing. Hurdur.
257
258        string victoryText = "Kiva homma hei";
259
260        // Tekstille musta tausta, jotta sen näkee lukea.
261        var announcementDark = new Label(victoryText) { Font = largeFont, TextColor = Color.Black };
262        Add(announcementDark);
263
264        // Voittoteksti.
265        var announcement = new Label(victoryText) { Font = largeFont, TextColor = winner.Color };
266        Add(announcement);
267
268        // Zoomaa voittajaan.
269        double targetZoomFactor = 1.5;
270        var zoomTimer = new Timer() { Interval = 0.01 };
271        zoomTimer.Timeout += () =>
272        {
273            Camera.Position += (winner.Position - Camera.Position) * 0.02;
274            Camera.ZoomFactor += (targetZoomFactor - Camera.ZoomFactor) * 0.01;
275            announcement.Position = Camera.WorldToScreen(winner.Position + new Vector(0, 80));
276            announcementDark.Position = announcement.Position + new Vector(5, -5);
277        };
278        zoomTimer.IgnorePause = true;
279        zoomTimer.Start();
280
281        cratePositions.Clear();
282    }
283
284    public void ColorTile(PhysicsObject player, PhysicsObject platform)
285    {
286        var imgs = player.Color == blueColor ? blueTileImages : orangeTileImages;
287        var glowImg = player.Color == blueColor ? blueGlow : orangeGlow;
288
289        if (platform is Tile)
290        {
291            ((Tile)platform).SetColor(imgs, glowImg, player.Color, UpdatePercentage);
292        }
293    }
294
295    void UpdatePercentage()
296    {
297        List<GameObject> colored = GetObjects(o => (o.Color == red.Color || o.Color == blue.Color) && (String)o.Tag == "platform");
298        percentageTracker.Value = (double)colored.FindAll(o => o.Color == red.Color).Count / colored.Count * 100;
299    }
300
301    void AddControls()
302    {
303        ControllerOne.Listen(Button.Back, ButtonState.Pressed, Exit, "Poistu pelistä");
304
305        ControllerOne.ListenAnalog(AnalogControl.LeftStick, 0.1, Move, "Liikuta pelaajaa", red);
306        ControllerOne.Listen(Button.A, ButtonState.Pressed, Jump, "Pelaaja hyppää", red, JUMPSPEED);
307        ControllerOne.ListenAnalog(AnalogControl.RightStick, 0.1, Aim, "Tähtää", red);
308        ControllerOne.ListenAnalog(AnalogControl.RightTrigger, 0.1, Shoot, "", red);
309        ControllerOne.ListenAnalog(AnalogControl.LeftTrigger, 0.1, Shoot, "", red);
310
311        ControllerTwo.ListenAnalog(AnalogControl.LeftStick, 0.1, Move, "Liikuta pelaajaa", blue);
312        ControllerTwo.Listen(Button.A, ButtonState.Pressed, Jump, "Pelaaja hyppää", blue, JUMPSPEED);
313        ControllerTwo.ListenAnalog(AnalogControl.RightStick, 0.1, Aim, "Tähtää", blue);
314        ControllerTwo.ListenAnalog(AnalogControl.RightTrigger, 0.1, Shoot, "", blue);
315        ControllerTwo.ListenAnalog(AnalogControl.LeftTrigger, 0.1, Shoot, "", blue);
316
317        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Ohjeet");
318        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, "Lopeta");
319
320        Mouse.Listen(MouseButton.Left, ButtonState.Pressed, () => shader.NewWave(Mouse.PositionOnWorld), null);
321    }
322
323    void Move(AnalogState stick, Player player)
324    {
325        if (stick.StateVector.Magnitude > 0.15)
326        {
327            //player.Walk(stick.StateVector.X > 0 ? Direction.Right : Direction.Left);
328            player.Walk(stick.StateVector.X * 300);
329        }
330
331    }
332
333    void Shoot(AnalogState trigger, Player player)
334    {
335        if (player.Weapon != null)
336        {
337            PhysicsObject bullet = player.Weapon.Shoot();
338            if (bullet != null)
339            {
340                bullet.Image = null;
341                bullet.Color = player.Color;
342            }
343        }
344    }
345
346    void Jump(Player player, double speed)
347    {
348        player.Jump(speed);
349    }
350
351    void Aim(AnalogState stickState, Player player)
352    {
353        player.Weapon.Angle = stickState.StateVector.Angle;
354    }
355
356    protected override void Draw(Microsoft.Xna.Framework.GameTime gameTime)
357    {
358        shader.Draw(gameTime, base.Draw);
359    }
360}
Note: See TracBrowser for help on using the repository browser.