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

Revision 7648, 10.7 KB checked in by sieerinn, 3 years ago (diff)

Kerättävää rahee

RevLine 
[7638]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
[7643]13    public Direction FacingDirection { get; private set; }
14
[7638]15    public SimplePlatformCharacter(double width, double height) : base(width, height)
16    {
17    }
18
[7643]19    public void Walk(double speed)
20    {
21        if (speed > 0) FacingDirection = Direction.Right;
22        if (speed < 0) FacingDirection = Direction.Left;
23        Velocity = new Vector(speed, Velocity.Y);
24    }
25
[7638]26    public override void Update(Time time)
27    {
28        base.Update(time);
[7639]29        IsGrounded = Game.Collisions(this, new Vector(0, -2), true).Count > 0;
[7638]30    }
31}
32
[7647]33class Player : SimplePlatformCharacter
34{
35    public bool IsCrouching { get; private set; }
36
37    public bool Crouch { get; set; }
38
39    private readonly double fullHeight;
40    private readonly double crouchHeight;
41
42    public Player(double width, double height) : base(width, height)
43    {
44        fullHeight = height;
45        crouchHeight = height / 2.0 - 1.0;
46    }
47
48    public override void Update(Time time)
49    {
50        if (!IsCrouching && Crouch)
51        {
52            var oldBottom = Bottom;
53            Height = crouchHeight;
54            Bottom = oldBottom;
55            IsCrouching = true;
56        }
57
58        if (IsCrouching && !Crouch)
59        {
60            var oldBottom = Bottom;
61            Height = fullHeight;
62            Bottom = oldBottom;
63            IsCrouching = false;
64
65            if (Game.Collisions(this, Vector.Zero, true).Count > 0)
66            {
67                Height = crouchHeight;
68                Bottom = oldBottom;
69                IsCrouching = true;
70            }
71        }
72
73        base.Update(time);
74    }
75}
76
[7643]77class Enemy : SimplePlatformCharacter
78{
79    public double Speed { get; set; }
80
81    public bool FallOffPlatforms { get; set; }
82
83    private bool walkRight;
84
85    public Enemy(double width, double height) : base(width, height)
86    {
87    }
88
89    public override void Update(Time time)
90    {
91        if (Game.Collisions(this, new Vector(2, 1), true).Count > 0)
92            walkRight = false;
93
94        if (Game.Collisions(this, new Vector(-2, 1), true).Count > 0)
95            walkRight = true;
96
97        if (!FallOffPlatforms)
98        {
99            var bottomLeft = new Vector(Left, Bottom + 2);
100            var bottomRight = new Vector(Right, Bottom + 2);
101
102            if (Game.GetTileAt(Game.WorldToTilePosition(bottomRight)) == null)
103            {
104                walkRight = false;
105            }
106            if (Game.GetTileAt(Game.WorldToTilePosition(bottomLeft)) == null)
107            {
108                walkRight = true;
109            }
110        }
111
[7647]112        Walk(walkRight ? Speed : -Speed);
[7643]113        base.Update(time);
114    }
115}
116
[7638]117class MovingPlatform : SimplePhysics.Object
118{
119    private readonly Vector startPosition;
120
121    private Vector direction;
122
123    public MovingPlatform(Vector position, double width, double height) : base(width, height)
124    {
[7639]125        direction = new Vector(100, 0);
[7638]126        Position = startPosition = position;
[7639]127        IgnoresGravity = true;
[7638]128    }
129
130    public override void Update(Time time)
131    {
[7639]132        if (Vector.Distance(startPosition, Position) > 100)
[7638]133        {
134            direction = -direction;
135        }
136        Velocity = direction;
[7639]137        Game.UpdateMovingPlatform(this, time);
138        //base.Update(time);
[7638]139    }
140}
141
142public class SimplePhysicsTest : SimplePhysics.Game
143{
[7647]144    private Player player1;
[7638]145
146    public SimplePhysicsTest() : base(tileSize: 30)
147    {
148    }
149
150    public override void Begin()
151    {
152        Debug.SetLabelPosition(new Vector(0, Screen.Top - 50));
153        IsMouseVisible = true;
154
155        Gravity = new Vector(0, -600);
156
157        var tilemap = new SimplePhysics.TileMap("level1");
158        tilemap.SetTileMethod(Color.Black, CreateTile);
159        tilemap.SetTileMethod(Color.FromHexCode("C6723D"), CreateOneWayTile);
[7639]160        tilemap.SetTileMethod(Color.FromHexCode("00FFFF"), CreateIceTile);
[7648]161        tilemap.SetTileMethod(Color.FromHexCode("D525DB"), CreateMovingPlatform);
[7639]162        tilemap.SetTileMethod(Color.FromHexCode("B70909"), CreateDangerousBlock);
[7644]163        tilemap.SetTileMethod(Color.FromHexCode("FFB949"), CreateDestroyableBrick);
[7648]164        tilemap.SetTileMethod(Color.FromHexCode("FFFF00"), CreateCoin);
[7638]165        tilemap.SetTileMethod(Color.Blue, CreatePlayer);
166        tilemap.SetTileMethod(Color.Red, CreateEnemy);
167        tilemap.SetTileMethod(Color.Red, CreateEnemy);
168        tilemap.Execute();
169
170        Camera.ZoomToLevel();
171
[7643]172        Keyboard.Listen(Key.Right, ButtonState.Down, Walk, null, player1, 200.0);
173        Keyboard.Listen(Key.Left, ButtonState.Down, Walk, null, player1, -200.0);
174        Keyboard.Listen(Key.Up, ButtonState.Down, Jump, null, player1);
[7647]175        Keyboard.Listen(Key.Down, ButtonState.Pressed, Crouch, null, player1, true);
176        Keyboard.Listen(Key.Down, ButtonState.Released, Crouch, null, player1, false);
[7643]177        Keyboard.Listen(Key.Space, ButtonState.Pressed, Shoot, null, player1);
178        Keyboard.Listen(Key.B, ButtonState.Down, MegaShoot, null, player1);
[7638]179        Keyboard.Listen(Key.R, ButtonState.Pressed, () => { ClearAll(); Begin(); }, "Lopeta peli");
180        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
181    }
182
183    #region Tile Methods
184
185    private void CreateTile(int x, int y)
186    {
[7639]187        var tile = new SimplePhysics.Object(TileSize, TileSize) { IsStatic = true };
[7638]188        tile.Color = Color.Green;
189        Add(tile);
190        SetTile(x, y, tile);
191    }
192
[7639]193    private void CreateIceTile(int x, int y)
194    {
195        var tile = new SimplePhysics.Object(TileSize, TileSize) { IsStatic = true };
196        tile.Color = Color.Cyan;
197        tile.Friction = 0.0;
198        Add(tile);
199        SetTile(x, y, tile);
200    }
201
[7644]202    private void CreateDestroyableBrick(int x, int y)
203    {
204        var tile = new SimplePhysics.Object(TileSize, TileSize) { IsStatic = true };
205        tile.Color = Color.Orange;
206        tile.Tag = "brick";
207        Add(tile);
208        SetTile(x, y, tile);
209
210        tile.AddCollisionHandler("player", (t, player) =>
211        {
212            if (player.Top <= tile.Bottom)
213            {
214                tile.Destroy();
215            }
216        });
217    }
218
[7639]219    private void CreateDangerousBlock(int x, int y)
220    {
221        var tile = new SimplePhysics.Object(TileSize, TileSize) { IsStatic = true };
222        tile.Color = Color.Red;
223        tile.Tag = "death";
224        Add(tile);
225        SetTile(x, y, tile);
226    }
227
[7638]228    private void CreateOneWayTile(int x, int y)
229    {
[7639]230        var tile = new SimplePhysics.Object(TileSize, TileSize) { IsStatic = true };
[7638]231        tile.Color = Color.Brown;
232        tile.OneWayPlatform = true;
233        Add(tile, -1);
234        SetTile(x, y, tile);
235    }
236
237    private void CreatePlayer(int x, int y)
238    {
[7647]239        player1 = new Player(TileSize * 0.98, TileSize * 1.98);
[7643]240        player1.Position = TileToWorldPosition(x, y);
[7647]241        player1.Friction = 0.2;
[7643]242        player1.Tag = "player";
243        player1.Crushed += player1.Destroy;
244        Add(player1);
[7639]245
[7643]246        player1.AddCollisionHandler("enemy", HitsEnemy);
247        player1.AddCollisionHandler("death", (a, b) => player1.Destroy());
[7648]248        player1.AddCollisionHandler("coin", (a, b) => b.Destroy());
[7638]249    }
250
251    private void CreateMovingPlatform(int x, int y)
252    {
253        var pos = TileToWorldPosition(x, y);
[7647]254        var platform = new MovingPlatform(pos, 3 * TileSize, TileSize);
[7638]255        Add(platform);
256    }
257
258    private void CreateEnemy(int x, int y)
259    {
[7643]260        var enemy = new Enemy(TileSize * 0.99, TileSize * 0.99);
[7638]261        enemy.Position = TileToWorldPosition(x, y);
[7639]262        enemy.Tag = "enemy";
[7643]263        enemy.Speed = 50;
264        enemy.FallOffPlatforms = true;
[7638]265        Add(enemy);
266    }
267
[7648]268    private void CreateCoin(int x, int y)
269    {
270        var coin = new SimplePhysics.Object(TileSize * 0.99, TileSize * 0.99);
271        coin.Position = TileToWorldPosition(x, y);
272        coin.Tag = "coin";
273        coin.Color = Color.Yellow;
274        coin.IgnoresCollisionResponse = true;
275        coin.IgnoresGravity = true;
276        Add(coin);
277    }
278
[7638]279    #endregion
280
[7647]281    private void Walk(Player player, double speed)
[7638]282    {
[7643]283        player.Walk(speed);
[7638]284    }
285
[7647]286    private void Jump(SimplePlatformCharacter player)
[7638]287    {
[7647]288        if (player.IsGrounded)
289            player.Velocity = new Vector(player.Velocity.X, 500);
[7638]290    }
[7647]291
[7643]292    private SimplePhysics.Object CreateProjectile(SimplePlatformCharacter player)
293    {
294        var direction = player.FacingDirection.GetVector().X;
295        var proj = new SimplePhysics.Object(10, 10);
296        proj.Position = new Vector(player.X + direction * TileSize, player.Y);
297        proj.RestitutionX = 1.0;
298        proj.RestitutionY = 0.7;
299        proj.Friction = 0.2;
300        proj.Tag = "proj";
301        proj.CollisionIgnoreGroup = 1;
302        proj.MaximumLifetime = TimeSpan.FromSeconds(3);
303        Add(proj);
[7638]304
[7643]305        if (Collisions(proj, Vector.Zero, true).Count > 0)
306        {
307            proj.Destroy();
308        }
309
310        proj.AddCollisionHandler((a, b) =>
311        {
312            if (b is SimplePlatformCharacter)
313            {
314                proj.Destroy();
315            }
316        });
317
318        return proj;
319    }
320
[7647]321    private void Crouch(Player player, bool crouch)
322    {
323        player.Crouch = crouch;
324    }
325
[7643]326    private void Shoot(SimplePlatformCharacter player)
327    {
328        var proj = CreateProjectile(player);
329        var direction = player.FacingDirection.GetVector().X;
330        proj.Velocity = player.Velocity + new Vector(direction * 200, 100);
331    }
332
333    private void MegaShoot(SimplePlatformCharacter player)
334    {
335        for (int i = 0; i < 3; i++)
336        {
337            var proj = CreateProjectile(player);
338            var direction = player.FacingDirection.GetVector().X;
339            proj.Velocity = player.Velocity + new Vector(direction * 200, 100) + RandomGen.NextVector(0, 100);
340        }
341    }
342
[7638]343    private void HitsEnemy(SimplePhysics.Object player, SimplePhysics.Object enemy)
344    {
[7643]345        //player1.Destroy();
346        //enemy.Destroy();
[7638]347    }
348
349    protected override void Paint(Canvas canvas)
350    {
351        Debug.DrawOnCanvas(canvas);
352        Debug.Rects.Clear();
353        base.Paint(canvas);
354    }
355
356    protected override void Update(Time time)
357    {
358        var mouseTile = WorldToTilePosition(Mouse.PositionOnWorld);
359        Debug.ShowValue("mouse", $"x: {mouseTile.X}, y: {mouseTile.Y}");
360        Debug.DrawTile(mouseTile);
361        base.Update(time);
362    }
363}
Note: See TracBrowser for help on using the repository browser.