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

Revision 7210, 8.7 KB checked in by sieerinn, 4 years ago (diff)

Kentän alareunaa aloitettu

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