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

Revision 7216, 12.0 KB checked in by sieerinn, 4 years ago (diff)

Aselaatikoille kuva

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