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

Revision 7212, 10.1 KB checked in by sieerinn, 4 years ago (diff)

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