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

Revision 7211, 8.6 KB checked in by sieerinn, 4 years ago (diff)

Aseita ja tähtääminen

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