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

Revision 7638, 4.6 KB checked in by sieerinn, 3 years ago (diff)

Alkeellinen versio fysiikkamoottorista (jossa liikkuvat tasanteet ei vielä toimi)

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 SimplePlatformCharacter(double width, double height) : base(width, height)
14    {
15    }
16
17    public override void Update(Time time)
18    {
19        base.Update(time);
20        IsGrounded = Game.CanCollide(this, new Vector(0, -2));
21    }
22}
23
24class MovingPlatform : SimplePhysics.Object
25{
26    private readonly Vector startPosition;
27
28    private Vector direction;
29
30    public MovingPlatform(Vector position, double width, double height) : base(width, height)
31    {
32        direction = new Vector(0, 100);
33        Position = startPosition = position;
34        IsStatic = true;
35    }
36
37    public override void Update(Time time)
38    {
39        if (Vector.Distance(startPosition, Position) > 200)
40        {
41            direction = -direction;
42        }
43        Velocity = direction;
44        Position += Velocity * time.SinceLastUpdate.TotalSeconds;
45        base.Update(time);
46    }
47}
48
49public class SimplePhysicsTest : SimplePhysics.Game
50{
51    private SimplePlatformCharacter player;
52
53    public SimplePhysicsTest() : base(tileSize: 30)
54    {
55    }
56
57    public override void Begin()
58    {
59        Debug.SetLabelPosition(new Vector(0, Screen.Top - 50));
60        IsMouseVisible = true;
61
62        Gravity = new Vector(0, -600);
63
64        var tilemap = new SimplePhysics.TileMap("level1");
65        tilemap.SetTileMethod(Color.Black, CreateTile);
66        tilemap.SetTileMethod(Color.FromHexCode("C6723D"), CreateOneWayTile);
67        tilemap.SetTileMethod(Color.FromHexCode("00FFFF"), CreateMovingPlatform);
68        tilemap.SetTileMethod(Color.Blue, CreatePlayer);
69        tilemap.SetTileMethod(Color.Red, CreateEnemy);
70        tilemap.SetTileMethod(Color.Red, CreateEnemy);
71        tilemap.Execute();
72
73        Camera.ZoomToLevel();
74
75        Keyboard.Listen(Key.Right, ButtonState.Down, Walk, null, player, 200.0);
76        Keyboard.Listen(Key.Left, ButtonState.Down, Walk, null, player, -200.0);
77        Keyboard.Listen(Key.Up, ButtonState.Down, Jump, null, player);
78        Keyboard.Listen(Key.R, ButtonState.Pressed, () => { ClearAll(); Begin(); }, "Lopeta peli");
79        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
80    }
81
82    #region Tile Methods
83
84    private void CreateTile(int x, int y)
85    {
86        var tile = new SimplePhysics.Object(TileSize, TileSize);
87        tile.Color = Color.Green;
88        tile.IsStatic = true;
89        Add(tile);
90        SetTile(x, y, tile);
91    }
92
93    private void CreateOneWayTile(int x, int y)
94    {
95        var tile = new SimplePhysics.Object(TileSize, TileSize);
96        tile.Color = Color.Brown;
97        tile.IsStatic = true;
98        tile.OneWayPlatform = true;
99        Add(tile, -1);
100        SetTile(x, y, tile);
101    }
102
103    private void CreatePlayer(int x, int y)
104    {
105        player = new SimplePlatformCharacter(TileSize * 0.98, TileSize * 1.98);
106        player.Position = TileToWorldPosition(x, y);
107        player.AddCollisionHandler("enemy", HitsEnemy);
108        Add(player);
109    }
110
111    private void CreateMovingPlatform(int x, int y)
112    {
113        var pos = TileToWorldPosition(x, y);
114        var platform = new MovingPlatform(pos, TileSize, TileSize);
115        Add(platform);
116    }
117
118    private void CreateEnemy(int x, int y)
119    {
120        var enemy = new SimplePhysics.Object(TileSize * 0.99, TileSize * 0.99);
121        enemy.Position = TileToWorldPosition(x, y);
122        enemy.Tag = "asdasd";
123        Add(enemy);
124    }
125
126    #endregion
127
128    private void Walk(SimplePhysics.Object obj, double speed)
129    {
130        player.Velocity = new Vector(speed, player.Velocity.Y);
131    }
132
133    private void Jump(SimplePlatformCharacter obj)
134    {
135        if (obj.IsGrounded)
136            player.Velocity = new Vector(player.Velocity.X, 500);
137    }
138
139    private void HitsEnemy(SimplePhysics.Object player, SimplePhysics.Object enemy)
140    {
141        //player.Destroy();
142        enemy.Destroy();
143    }
144
145    protected override void Paint(Canvas canvas)
146    {
147        Debug.DrawOnCanvas(canvas);
148        Debug.Rects.Clear();
149        base.Paint(canvas);
150    }
151
152    protected override void Update(Time time)
153    {
154        var mouseTile = WorldToTilePosition(Mouse.PositionOnWorld);
155        Debug.ShowValue("mouse", $"x: {mouseTile.X}, y: {mouseTile.Y}");
156        Debug.DrawTile(mouseTile);
157        base.Update(time);
158    }
159}
Note: See TracBrowser for help on using the repository browser.