source: 2016/27/SimoR/SimplePhysicsTest/SimplePhysicsTest/SimplePhysicsTest/SimplePhysicsTest.cs @ 7649

Revision 7649, 13.2 KB checked in by sieerinn, 3 years ago (diff)

Kama jonka voi poimia ja heittää

Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8
9class SimplePlatformCharacter : SimplePhysics.Object
10{
11    public bool IsGrounded { get; private set; }
12
13    public Direction FacingDirection { get; private set; }
14
15    public SimplePlatformCharacter(double width, double height) : base(width, height)
16    {
17        FacingDirection = Direction.Right;
18    }
19
20    public void Walk(double speed)
21    {
22        if (speed > 0) FacingDirection = Direction.Right;
23        if (speed < 0) FacingDirection = Direction.Left;
24        Velocity = new Vector(speed, Velocity.Y);
25    }
26
27    public override void Update(Time time)
28    {
29        base.Update(time);
30        IsGrounded = Game.Collisions(this, new Vector(0, -2), true).Count > 0;
31    }
32}
33
34class Player : SimplePlatformCharacter
35{
36    public bool IsCrouching { get; private set; }
37
38    public bool Crouch { get; set; }
39
40    public SimplePhysics.Object Carrying { get; set; }
41
42    private readonly double fullHeight;
43    private readonly double crouchHeight;
44
45    public Player(double width, double height) : base(width, height)
46    {
47        fullHeight = height;
48        crouchHeight = height / 2.0 - 1.0;
49    }
50
51    public override void Update(Time time)
52    {
53        if (!IsCrouching && Crouch)
54        {
55            var oldBottom = Bottom;
56            Height = crouchHeight;
57            Bottom = oldBottom;
58            IsCrouching = true;
59        }
60
61        if (IsCrouching && !Crouch)
62        {
63            var oldBottom = Bottom;
64            Height = fullHeight;
65            Bottom = oldBottom;
66            IsCrouching = false;
67
68            if (Game.Collisions(this, Vector.Zero, true).Count > 0)
69            {
70                Height = crouchHeight;
71                Bottom = oldBottom;
72                IsCrouching = true;
73            }
74        }
75
76        base.Update(time);
77    }
78}
79
80class Enemy : SimplePlatformCharacter
81{
82    public double Speed { get; set; }
83
84    public bool FallOffPlatforms { get; set; }
85
86    private bool walkRight;
87
88    public Enemy(double width, double height) : base(width, height)
89    {
90    }
91
92    public override void Update(Time time)
93    {
94        if (Game.Collisions(this, new Vector(2, 1), true).Count > 0)
95            walkRight = false;
96
97        if (Game.Collisions(this, new Vector(-2, 1), true).Count > 0)
98            walkRight = true;
99
100        if (!FallOffPlatforms)
101        {
102            var bottomLeft = new Vector(Left, Bottom + 2);
103            var bottomRight = new Vector(Right, Bottom + 2);
104
105            if (Game.GetTileAt(Game.WorldToTilePosition(bottomRight)) == null)
106            {
107                walkRight = false;
108            }
109            if (Game.GetTileAt(Game.WorldToTilePosition(bottomLeft)) == null)
110            {
111                walkRight = true;
112            }
113        }
114
115        Walk(walkRight ? Speed : -Speed);
116        base.Update(time);
117    }
118}
119
120class MovingPlatform : SimplePhysics.Object
121{
122    private readonly Vector startPosition;
123
124    private Vector direction;
125
126    public MovingPlatform(Vector position, double width, double height) : base(width, height)
127    {
128        direction = new Vector(100, 0);
129        Position = startPosition = position;
130        IgnoresGravity = true;
131    }
132
133    public override void Update(Time time)
134    {
135        if (Vector.Distance(startPosition, Position) > 100)
136        {
137            direction = -direction;
138        }
139        Velocity = direction;
140        Game.UpdateMovingPlatform(this, time);
141        //base.Update(time);
142    }
143}
144
145public class SimplePhysicsTest : SimplePhysics.Game
146{
147    private Player player1;
148
149    public SimplePhysicsTest() : base(tileSize: 30)
150    {
151    }
152
153    public override void Begin()
154    {
155        Debug.SetLabelPosition(new Vector(0, Screen.Top - 50));
156        IsMouseVisible = true;
157
158        Gravity = new Vector(0, -600);
159
160        var tilemap = new SimplePhysics.TileMap("level1");
161        tilemap.SetTileMethod(Color.Black, CreateTile);
162        tilemap.SetTileMethod(Color.FromHexCode("C6723D"), CreateOneWayTile);
163        tilemap.SetTileMethod(Color.FromHexCode("00FFFF"), CreateIceTile);
164        tilemap.SetTileMethod(Color.FromHexCode("D525DB"), CreateMovingPlatform);
165        tilemap.SetTileMethod(Color.FromHexCode("B70909"), CreateDangerousBlock);
166        tilemap.SetTileMethod(Color.FromHexCode("FFB949"), CreateDestroyableBrick);
167        tilemap.SetTileMethod(Color.FromHexCode("FFFF00"), CreateCoin);
168        tilemap.SetTileMethod(Color.FromHexCode("BCB2FF"), CreateTestItem);
169        tilemap.SetTileMethod(Color.Blue, CreatePlayer);
170        tilemap.SetTileMethod(Color.Red, CreateEnemy);
171        tilemap.SetTileMethod(Color.Red, CreateEnemy);
172        tilemap.Execute();
173
174        Camera.ZoomToLevel();
175
176        Keyboard.Listen(Key.Right, ButtonState.Down, Walk, null, player1, 200.0);
177        Keyboard.Listen(Key.Left, ButtonState.Down, Walk, null, player1, -200.0);
178        Keyboard.Listen(Key.Up, ButtonState.Down, Jump, null, player1);
179        Keyboard.Listen(Key.Down, ButtonState.Pressed, Crouch, null, player1, true);
180        Keyboard.Listen(Key.Down, ButtonState.Released, Crouch, null, player1, false);
181        Keyboard.Listen(Key.Space, ButtonState.Pressed, PickupThrow, null, player1);
182        Keyboard.Listen(Key.Z, ButtonState.Pressed, Shoot, null, player1);
183        Keyboard.Listen(Key.X, ButtonState.Down, MegaShoot, null, player1);
184        Keyboard.Listen(Key.R, ButtonState.Pressed, () => { ClearAll(); Begin(); }, "Lopeta peli");
185        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
186    }
187
188    #region Tile Methods
189
190    private void CreateTile(int x, int y)
191    {
192        var tile = new SimplePhysics.Object(TileSize, TileSize) { IsStatic = true };
193        tile.Color = Color.Green;
194        Add(tile);
195        SetTile(x, y, tile);
196    }
197
198    private void CreateIceTile(int x, int y)
199    {
200        var tile = new SimplePhysics.Object(TileSize, TileSize) { IsStatic = true };
201        tile.Color = Color.Cyan;
202        tile.Friction = 0.0;
203        Add(tile);
204        SetTile(x, y, tile);
205    }
206
207    private void CreateDestroyableBrick(int x, int y)
208    {
209        var tile = new SimplePhysics.Object(TileSize, TileSize) { IsStatic = true };
210        tile.Color = Color.Orange;
211        tile.Tag = "brick";
212        Add(tile);
213        SetTile(x, y, tile);
214
215        // Tiili hajoaa jos pelaaja törmää siihen alapuolelta.
216        tile.AddCollisionHandler("player", (t, player) =>
217        {
218            if (player.Top <= tile.Bottom)
219            {
220                tile.Destroy();
221            }
222        });
223    }
224
225    private void CreateDangerousBlock(int x, int y)
226    {
227        var tile = new SimplePhysics.Object(TileSize, TileSize) { IsStatic = true };
228        tile.Color = Color.Red;
229        tile.Tag = "death";
230        Add(tile);
231        SetTile(x, y, tile);
232    }
233
234    private void CreateOneWayTile(int x, int y)
235    {
236        var tile = new SimplePhysics.Object(TileSize, TileSize) { IsStatic = true };
237        tile.Color = Color.Brown;
238        tile.OneWayPlatform = true;
239        Add(tile, -1);
240        SetTile(x, y, tile);
241    }
242
243    private void CreatePlayer(int x, int y)
244    {
245        player1 = new Player(TileSize * 0.98, TileSize * 1.98);
246        player1.Position = TileToWorldPosition(x, y);
247        player1.Friction = 0.2;
248        player1.Tag = "player";
249        player1.Crushed += player1.Destroy;
250        player1.CollisionIgnoreGroup = 1;
251        Add(player1);
252
253        // Ajastin, joka pitää kannossa olevan kaman pään päällä.
254        var timer = new Timer { Interval = 0.01 };
255        timer.Timeout += () =>
256        {
257            if (player1.Carrying != null)
258            {
259                player1.Carrying.X = player1.X;
260                player1.Carrying.Bottom = player1.Top;
261            }
262        };
263        timer.Start();
264
265        // Kuollessa pudotetaan kannossa ollut kama.
266        player1.Destroyed += () =>
267        {
268            timer.Stop();
269            if (player1.Carrying != null)
270            {
271                player1.Carrying.Velocity = player1.Velocity;
272                player1.Carrying.IgnoresGravity = false;
273                player1.Carrying = null;
274            }
275        };
276
277        player1.AddCollisionHandler("enemy", HitsEnemy);
278        player1.AddCollisionHandler("death", (a, b) => player1.Destroy());
279        player1.AddCollisionHandler("coin", (a, b) => b.Destroy());
280    }
281
282    private void CreateMovingPlatform(int x, int y)
283    {
284        var pos = TileToWorldPosition(x, y);
285        var platform = new MovingPlatform(pos, 3 * TileSize, TileSize);
286        Add(platform);
287    }
288
289    private void CreateEnemy(int x, int y)
290    {
291        var enemy = new Enemy(TileSize * 0.99, TileSize * 0.99);
292        enemy.Position = TileToWorldPosition(x, y);
293        enemy.Color = Color.Purple;
294        enemy.Tag = "enemy";
295        enemy.Speed = 50;
296        enemy.FallOffPlatforms = true;
297        Add(enemy);
298    }
299
300    private void CreateCoin(int x, int y)
301    {
302        var coin = new SimplePhysics.Object(TileSize * 0.99, TileSize * 0.99);
303        coin.Position = TileToWorldPosition(x, y);
304        coin.Tag = "coin";
305        coin.Color = Color.Yellow;
306        coin.Shape = Shape.Star;
307        coin.IgnoresCollisionResponse = true;
308        coin.IgnoresGravity = true;
309        Add(coin);
310    }
311
312    private void CreateTestItem(int x, int y)
313    {
314        var item = new SimplePhysics.Object(TileSize * 0.99, TileSize * 0.99);
315        item.Position = TileToWorldPosition(x, y);
316        item.Tag = "item";
317        item.Color = Color.DarkGreen;
318        item.Shape = Shape.Circle;
319        item.RestitutionX = 0.5;
320        item.RestitutionY = 0.5;
321        item.CollisionIgnoreGroup = 1;
322        Add(item);
323    }
324
325    #endregion
326
327    private void Walk(Player player, double speed)
328    {
329        player.Walk(speed);
330    }
331
332    private void Jump(SimplePlatformCharacter player)
333    {
334        if (player.IsGrounded)
335            player.Velocity = new Vector(player.Velocity.X, 500);
336    }
337
338    private SimplePhysics.Object CreateProjectile(SimplePlatformCharacter player)
339    {
340        var direction = player.FacingDirection.GetVector().X;
341        var proj = new SimplePhysics.Object(10, 10);
342        proj.Position = new Vector(player.X + direction * TileSize, player.Y);
343        proj.RestitutionX = 1.0;
344        proj.RestitutionY = 0.7;
345        proj.Friction = 0.2;
346        proj.Tag = "proj";
347        proj.CollisionIgnoreGroup = 1;
348        proj.MaximumLifetime = TimeSpan.FromSeconds(3);
349        Add(proj);
350
351        if (Collisions(proj, Vector.Zero, true).Count > 0)
352        {
353            proj.Destroy();
354        }
355
356        proj.AddCollisionHandler((a, b) =>
357        {
358            if (b is SimplePlatformCharacter)
359            {
360                proj.Destroy();
361            }
362        });
363
364        return proj;
365    }
366
367    private void Crouch(Player player, bool crouch)
368    {
369        player.Crouch = crouch;
370    }
371
372    private void PickupThrow(Player player)
373    {
374        // Heitetään kannossa oleva kama.
375        if (player.Carrying != null)
376        {
377            if (Collisions(player.Carrying, Vector.Zero, true).Count == 0)
378            {
379                player.Carrying.IgnoresGravity = false;
380                player.Carrying.Velocity = new Vector(player.Velocity.X * 2, player.Velocity.Y + 100);
381                player.Carrying = null;
382            }
383        }
384        else // Tai sitten poimitaan lähellä oleva kama.
385        {
386            var items = GetObjectsWithTag("item");
387            foreach (var item in items)
388            {
389                if (player.IntersectsWith(item))
390                {
391                    player.Carrying = (SimplePhysics.Object)item;
392                    player.Carrying.IgnoresGravity = true;
393                    break;
394                }
395            }
396        }
397    }
398
399    private void Shoot(SimplePlatformCharacter player)
400    {
401        var proj = CreateProjectile(player);
402        var direction = player.FacingDirection.GetVector().X;
403        proj.Velocity = player.Velocity + new Vector(direction * 200, 100);
404    }
405
406    private void MegaShoot(SimplePlatformCharacter player)
407    {
408        for (int i = 0; i < 3; i++)
409        {
410            var proj = CreateProjectile(player);
411            var direction = player.FacingDirection.GetVector().X;
412            proj.Velocity = player.Velocity + new Vector(direction * 200, 100) + RandomGen.NextVector(0, 100);
413        }
414    }
415
416    private void HitsEnemy(SimplePhysics.Object player, SimplePhysics.Object enemy)
417    {
418        //player1.Destroy();
419        //enemy.Destroy();
420    }
421
422    protected override void Paint(Canvas canvas)
423    {
424        Debug.DrawOnCanvas(canvas);
425        Debug.Rects.Clear();
426        base.Paint(canvas);
427    }
428
429    protected override void Update(Time time)
430    {
431        var mouseTile = WorldToTilePosition(Mouse.PositionOnWorld);
432        Debug.ShowValue("mouse", $"x: {mouseTile.X}, y: {mouseTile.Y}");
433        Debug.DrawTile(mouseTile);
434        base.Update(time);
435    }
436}
Note: See TracBrowser for help on using the repository browser.