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

Revision 7644, 9.2 KB checked in by sieerinn, 4 years ago (diff)

Hajotettavia palikoita

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