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

Revision 7647, 10.2 KB checked in by sieerinn, 3 years ago (diff)

Kyykkyyn meno

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    }
18
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
26    public override void Update(Time time)
27    {
28        base.Update(time);
29        IsGrounded = Game.Collisions(this, new Vector(0, -2), true).Count > 0;
30    }
31}
32
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
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
112        Walk(walkRight ? Speed : -Speed);
113        base.Update(time);
114    }
115}
116
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    {
125        direction = new Vector(100, 0);
126        Position = startPosition = position;
127        IgnoresGravity = true;
128    }
129
130    public override void Update(Time time)
131    {
132        if (Vector.Distance(startPosition, Position) > 100)
133        {
134            direction = -direction;
135        }
136        Velocity = direction;
137        Game.UpdateMovingPlatform(this, time);
138        //base.Update(time);
139    }
140}
141
142public class SimplePhysicsTest : SimplePhysics.Game
143{
144    private Player player1;
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);
160        tilemap.SetTileMethod(Color.FromHexCode("00FFFF"), CreateIceTile);
161        tilemap.SetTileMethod(Color.FromHexCode("FFFF00"), CreateMovingPlatform);
162        tilemap.SetTileMethod(Color.FromHexCode("B70909"), CreateDangerousBlock);
163        tilemap.SetTileMethod(Color.FromHexCode("FFB949"), CreateDestroyableBrick);
164        tilemap.SetTileMethod(Color.Blue, CreatePlayer);
165        tilemap.SetTileMethod(Color.Red, CreateEnemy);
166        tilemap.SetTileMethod(Color.Red, CreateEnemy);
167        tilemap.Execute();
168
169        Camera.ZoomToLevel();
170
171        Keyboard.Listen(Key.Right, ButtonState.Down, Walk, null, player1, 200.0);
172        Keyboard.Listen(Key.Left, ButtonState.Down, Walk, null, player1, -200.0);
173        Keyboard.Listen(Key.Up, ButtonState.Down, Jump, null, player1);
174        Keyboard.Listen(Key.Down, ButtonState.Pressed, Crouch, null, player1, true);
175        Keyboard.Listen(Key.Down, ButtonState.Released, Crouch, null, player1, false);
176        Keyboard.Listen(Key.Space, ButtonState.Pressed, Shoot, null, player1);
177        Keyboard.Listen(Key.B, ButtonState.Down, MegaShoot, null, player1);
178        Keyboard.Listen(Key.R, ButtonState.Pressed, () => { ClearAll(); Begin(); }, "Lopeta peli");
179        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
180    }
181
182    #region Tile Methods
183
184    private void CreateTile(int x, int y)
185    {
186        var tile = new SimplePhysics.Object(TileSize, TileSize) { IsStatic = true };
187        tile.Color = Color.Green;
188        Add(tile);
189        SetTile(x, y, tile);
190    }
191
192    private void CreateIceTile(int x, int y)
193    {
194        var tile = new SimplePhysics.Object(TileSize, TileSize) { IsStatic = true };
195        tile.Color = Color.Cyan;
196        tile.Friction = 0.0;
197        Add(tile);
198        SetTile(x, y, tile);
199    }
200
201    private void CreateDestroyableBrick(int x, int y)
202    {
203        var tile = new SimplePhysics.Object(TileSize, TileSize) { IsStatic = true };
204        tile.Color = Color.Orange;
205        tile.Tag = "brick";
206        Add(tile);
207        SetTile(x, y, tile);
208
209        tile.AddCollisionHandler("player", (t, player) =>
210        {
211            if (player.Top <= tile.Bottom)
212            {
213                tile.Destroy();
214            }
215        });
216    }
217
218    private void CreateDangerousBlock(int x, int y)
219    {
220        var tile = new SimplePhysics.Object(TileSize, TileSize) { IsStatic = true };
221        tile.Color = Color.Red;
222        tile.Tag = "death";
223        Add(tile);
224        SetTile(x, y, tile);
225    }
226
227    private void CreateOneWayTile(int x, int y)
228    {
229        var tile = new SimplePhysics.Object(TileSize, TileSize) { IsStatic = true };
230        tile.Color = Color.Brown;
231        tile.OneWayPlatform = true;
232        Add(tile, -1);
233        SetTile(x, y, tile);
234    }
235
236    private void CreatePlayer(int x, int y)
237    {
238        player1 = new Player(TileSize * 0.98, TileSize * 1.98);
239        player1.Position = TileToWorldPosition(x, y);
240        player1.Friction = 0.2;
241        player1.Tag = "player";
242        player1.Crushed += player1.Destroy;
243        Add(player1);
244
245        player1.AddCollisionHandler("enemy", HitsEnemy);
246        player1.AddCollisionHandler("death", (a, b) => player1.Destroy());
247    }
248
249    private void CreateMovingPlatform(int x, int y)
250    {
251        var pos = TileToWorldPosition(x, y);
252        var platform = new MovingPlatform(pos, 3 * TileSize, TileSize);
253        Add(platform);
254    }
255
256    private void CreateEnemy(int x, int y)
257    {
258        var enemy = new Enemy(TileSize * 0.99, TileSize * 0.99);
259        enemy.Position = TileToWorldPosition(x, y);
260        enemy.Tag = "enemy";
261        enemy.Speed = 50;
262        enemy.FallOffPlatforms = true;
263        Add(enemy);
264    }
265
266    #endregion
267
268    private void Walk(Player player, double speed)
269    {
270        player.Walk(speed);
271    }
272
273    private void Jump(SimplePlatformCharacter player)
274    {
275        if (player.IsGrounded)
276            player.Velocity = new Vector(player.Velocity.X, 500);
277    }
278
279    private SimplePhysics.Object CreateProjectile(SimplePlatformCharacter player)
280    {
281        var direction = player.FacingDirection.GetVector().X;
282        var proj = new SimplePhysics.Object(10, 10);
283        proj.Position = new Vector(player.X + direction * TileSize, player.Y);
284        proj.RestitutionX = 1.0;
285        proj.RestitutionY = 0.7;
286        proj.Friction = 0.2;
287        proj.Tag = "proj";
288        proj.CollisionIgnoreGroup = 1;
289        proj.MaximumLifetime = TimeSpan.FromSeconds(3);
290        Add(proj);
291
292        if (Collisions(proj, Vector.Zero, true).Count > 0)
293        {
294            proj.Destroy();
295        }
296
297        proj.AddCollisionHandler((a, b) =>
298        {
299            if (b is SimplePlatformCharacter)
300            {
301                proj.Destroy();
302            }
303        });
304
305        return proj;
306    }
307
308    private void Crouch(Player player, bool crouch)
309    {
310        player.Crouch = crouch;
311    }
312
313    private void Shoot(SimplePlatformCharacter player)
314    {
315        var proj = CreateProjectile(player);
316        var direction = player.FacingDirection.GetVector().X;
317        proj.Velocity = player.Velocity + new Vector(direction * 200, 100);
318    }
319
320    private void MegaShoot(SimplePlatformCharacter player)
321    {
322        for (int i = 0; i < 3; i++)
323        {
324            var proj = CreateProjectile(player);
325            var direction = player.FacingDirection.GetVector().X;
326            proj.Velocity = player.Velocity + new Vector(direction * 200, 100) + RandomGen.NextVector(0, 100);
327        }
328    }
329
330    private void HitsEnemy(SimplePhysics.Object player, SimplePhysics.Object enemy)
331    {
332        //player1.Destroy();
333        //enemy.Destroy();
334    }
335
336    protected override void Paint(Canvas canvas)
337    {
338        Debug.DrawOnCanvas(canvas);
339        Debug.Rects.Clear();
340        base.Paint(canvas);
341    }
342
343    protected override void Update(Time time)
344    {
345        var mouseTile = WorldToTilePosition(Mouse.PositionOnWorld);
346        Debug.ShowValue("mouse", $"x: {mouseTile.X}, y: {mouseTile.Y}");
347        Debug.DrawTile(mouseTile);
348        base.Update(time);
349    }
350}
Note: See TracBrowser for help on using the repository browser.