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

Revision 7213, 11.0 KB checked in by sieerinn, 4 years ago (diff)

Fontteja lisätty

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