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

Revision 7643, 8.7 KB checked in by sieerinn, 3 years ago (diff)

Dokumentaatiota ja CollisionIgnoreGroup?-ominaisuus lisätty

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.Blue, CreatePlayer);
130        tilemap.SetTileMethod(Color.Red, CreateEnemy);
131        tilemap.SetTileMethod(Color.Red, CreateEnemy);
132        tilemap.Execute();
133
134        Camera.ZoomToLevel();
135
136        Keyboard.Listen(Key.Right, ButtonState.Down, Walk, null, player1, 200.0);
137        Keyboard.Listen(Key.Left, ButtonState.Down, Walk, null, player1, -200.0);
138        Keyboard.Listen(Key.Up, ButtonState.Down, Jump, null, player1);
139        Keyboard.Listen(Key.Space, ButtonState.Pressed, Shoot, null, player1);
140        Keyboard.Listen(Key.B, ButtonState.Down, MegaShoot, null, player1);
141        Keyboard.Listen(Key.R, ButtonState.Pressed, () => { ClearAll(); Begin(); }, "Lopeta peli");
142        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
143    }
144
145    #region Tile Methods
146
147    private void CreateTile(int x, int y)
148    {
149        var tile = new SimplePhysics.Object(TileSize, TileSize) { IsStatic = true };
150        tile.Color = Color.Green;
151        Add(tile);
152        SetTile(x, y, tile);
153    }
154
155    private void CreateIceTile(int x, int y)
156    {
157        var tile = new SimplePhysics.Object(TileSize, TileSize) { IsStatic = true };
158        tile.Color = Color.Cyan;
159        tile.Friction = 0.0;
160        Add(tile);
161        SetTile(x, y, tile);
162    }
163
164    private void CreateDangerousBlock(int x, int y)
165    {
166        var tile = new SimplePhysics.Object(TileSize, TileSize) { IsStatic = true };
167        tile.Color = Color.Red;
168        tile.Tag = "death";
169        Add(tile);
170        SetTile(x, y, tile);
171    }
172
173    private void CreateOneWayTile(int x, int y)
174    {
175        var tile = new SimplePhysics.Object(TileSize, TileSize) { IsStatic = true };
176        tile.Color = Color.Brown;
177        tile.OneWayPlatform = true;
178        Add(tile, -1);
179        SetTile(x, y, tile);
180    }
181
182    private void CreatePlayer(int x, int y)
183    {
184        player1 = new SimplePlatformCharacter(TileSize * 0.98, TileSize * 1.98);
185        player1.Position = TileToWorldPosition(x, y);
186        player1.Tag = "player";
187        player1.Crushed += player1.Destroy;
188        Add(player1);
189
190        player1.AddCollisionHandler("enemy", HitsEnemy);
191        player1.AddCollisionHandler("death", (a, b) => player1.Destroy());
192    }
193
194    private void CreateMovingPlatform(int x, int y)
195    {
196        var pos = TileToWorldPosition(x, y);
197        var platform = new MovingPlatform(pos, 3*TileSize, TileSize);
198        Add(platform);
199    }
200
201    private void CreateEnemy(int x, int y)
202    {
203        var enemy = new Enemy(TileSize * 0.99, TileSize * 0.99);
204        enemy.Position = TileToWorldPosition(x, y);
205        enemy.Tag = "enemy";
206        enemy.Speed = 50;
207        enemy.FallOffPlatforms = true;
208        Add(enemy);
209    }
210
211    #endregion
212
213    private void Walk(SimplePlatformCharacter player, double speed)
214    {
215        //player1.Velocity = new Vector(speed, player1.Velocity.Y);
216        player.Walk(speed);
217    }
218
219    private void Jump(SimplePlatformCharacter obj)
220    {
221        if (obj.IsGrounded)
222            player1.Velocity = new Vector(player1.Velocity.X, 500);
223    }
224   
225    private SimplePhysics.Object CreateProjectile(SimplePlatformCharacter player)
226    {
227        var direction = player.FacingDirection.GetVector().X;
228        var proj = new SimplePhysics.Object(10, 10);
229        proj.Position = new Vector(player.X + direction * TileSize, player.Y);
230        proj.RestitutionX = 1.0;
231        proj.RestitutionY = 0.7;
232        proj.Friction = 0.2;
233        proj.Tag = "proj";
234        proj.CollisionIgnoreGroup = 1;
235        proj.MaximumLifetime = TimeSpan.FromSeconds(3);
236        Add(proj);
237
238        if (Collisions(proj, Vector.Zero, true).Count > 0)
239        {
240            proj.Destroy();
241        }
242
243        proj.AddCollisionHandler((a, b) =>
244        {
245            if (b is SimplePlatformCharacter)
246            {
247                proj.Destroy();
248            }
249        });
250
251        return proj;
252    }
253
254    private void Shoot(SimplePlatformCharacter player)
255    {
256        var proj = CreateProjectile(player);
257        var direction = player.FacingDirection.GetVector().X;
258        proj.Velocity = player.Velocity + new Vector(direction * 200, 100);
259    }
260
261    private void MegaShoot(SimplePlatformCharacter player)
262    {
263        for (int i = 0; i < 3; i++)
264        {
265            var proj = CreateProjectile(player);
266            var direction = player.FacingDirection.GetVector().X;
267            proj.Velocity = player.Velocity + new Vector(direction * 200, 100) + RandomGen.NextVector(0, 100);
268        }
269    }
270
271    private void HitsEnemy(SimplePhysics.Object player, SimplePhysics.Object enemy)
272    {
273        //player1.Destroy();
274        //enemy.Destroy();
275    }
276
277    protected override void Paint(Canvas canvas)
278    {
279        Debug.DrawOnCanvas(canvas);
280        Debug.Rects.Clear();
281        base.Paint(canvas);
282    }
283
284    protected override void Update(Time time)
285    {
286        var mouseTile = WorldToTilePosition(Mouse.PositionOnWorld);
287        Debug.ShowValue("mouse", $"x: {mouseTile.X}, y: {mouseTile.Y}");
288        Debug.DrawTile(mouseTile);
289        base.Update(time);
290    }
291}
Note: See TracBrowser for help on using the repository browser.