source: 2016/27/ohjaajat/VenienteFragore/VenienteFragore/VenienteFragore/VenienteFragore.cs @ 7735

Revision 7735, 6.4 KB checked in by empaheik, 3 years ago (diff)

Testattiin pelaajan liikkumista kämäisillä kontrolleilla. Jänniä uusi tasotyyppejä.

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        FacingDirection = Direction.Right;
18    }
19
20    public void Walk(double speed)
21    {
22        if (speed > 0) FacingDirection = Direction.Right;
23        if (speed < 0) FacingDirection = Direction.Left;
24        Velocity = new Vector(speed, Velocity.Y);
25    }
26
27    public override void Update(Time time)
28    {
29        base.Update(time);
30        IsGrounded = Game.Collisions(this, new Vector(0, -2), true).Count > 0;
31    }
32}
33
34class Player : SimplePlatformCharacter
35{
36    public bool IsCrouching { get; private set; }
37
38    public bool Crouch { get; set; }
39
40    public SimplePhysics.Object Carrying { get; set; }
41
42    private readonly double fullHeight;
43    private readonly double crouchHeight;
44
45    public Player(double width, double height) : base(width, height)
46    {
47        fullHeight = height;
48        crouchHeight = height / 2.0 - 1.0;
49    }
50
51    public override void Update(Time time)
52    {
53        if (!IsCrouching && Crouch)
54        {
55            var oldBottom = Bottom;
56            Height = crouchHeight;
57            Bottom = oldBottom;
58            IsCrouching = true;
59        }
60
61        if (IsCrouching && !Crouch)
62        {
63            var oldBottom = Bottom;
64            Height = fullHeight;
65            Bottom = oldBottom;
66            IsCrouching = false;
67
68            if (Game.Collisions(this, Vector.Zero, true).Count > 0)
69            {
70                Height = crouchHeight;
71                Bottom = oldBottom;
72                IsCrouching = true;
73            }
74        }
75
76        base.Update(time);
77    }
78}
79
80
81public class VenienteFragore : SimplePhysics.Game
82{
83    private delegate void ObjectMethod(Vector position, double width, double height, Dictionary<string, string> properties);
84    private Dictionary<string, ObjectMethod> objectMethods;
85
86    Player advenA;
87
88    public VenienteFragore() : base(tileSize: 50)
89    {
90    }
91
92    public override void Begin()
93    {
94        objectMethods = new Dictionary<string, ObjectMethod>();
95        objectMethods.Add("ball", TestBall);
96        objectMethods.Add("player", CreatePlayer);
97        objectMethods.Add("moving", CreateMovingPlatform);
98
99        var tileMap = TiledTileMap.FromLevelAsset("thehub");
100        tileMap.SetTileMethod("Tiilet", TileMethod);
101        tileMap.SetObjectMethod("Oliot", CreateObject);
102        tileMap.Execute();
103
104        Gravity = new Vector(0, -800);
105
106        Camera.ZoomToAllObjects();
107       
108
109        Level.Background.Color = Color.DarkOrange;
110
111        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
112    }
113
114    private void CreateObject(Vector position, double width, double height, Angle angle, Shape shape, string name, Dictionary<string, string> properties)
115    {
116        objectMethods[name](position, width, height, properties);
117    }
118
119    void TestBall(Vector position, double width, double height, Dictionary<string, string> properties)
120    {
121        var testObject = new SimplePhysics.Object(TileSize * 0.99, TileSize * 0.99);
122        testObject.Position = position;
123        testObject.Color = Color.DarkGreen;
124        testObject.Shape = Shape.Circle;
125        testObject.RestitutionX = 0.5;
126        testObject.RestitutionY = 0.5;
127        testObject.CollisionIgnoreGroup = 1;
128        Add(testObject);
129    }
130
131    void CreatePlayer(Vector position, double width, double height, Dictionary<string, string> properties)
132    {
133        advenA = new Player(TileSize * 0.99, TileSize * 1.98);
134        advenA.Position = position + new Vector(0, advenA.Height);
135        advenA.Friction = 0.2;
136        advenA.Tag = "player";
137        advenA.Crushed += advenA.Destroy;
138        advenA.CollisionIgnoreGroup = 1;
139        Add(advenA);
140
141        Keyboard.ListenWSAD(ButtonState.Down, Liikuta, "hurdur");
142
143    }
144
145    void Liikuta(Vector suunta)
146    {
147        if(suunta.Y > 0)
148        {
149            Jump(advenA);
150        }
151        advenA.Walk(suunta.X * 200);
152    }
153
154    private void Jump(SimplePlatformCharacter player)
155    {
156        if (player.IsGrounded)
157            player.Velocity = new Vector(player.Velocity.X, 500);
158    }
159
160    private void CreateMovingPlatform(Vector position, double width, double height, Dictionary<string, string> properties)
161    {
162        var dirX = double.Parse(properties["directionx"]);
163        var dirY = double.Parse(properties["directiony"]);
164        var distance = double.Parse(properties["distance"]);
165        var platform = new MovingPlatform(position, new Vector(dirX, dirY), distance, width, height);
166        Add(platform);
167    }
168
169    private void TileMethod(int x, int y, Image image, string layerName, Dictionary<string, string> properties)
170    {
171        var tile = new SimplePhysics.Object(TileSize, TileSize) { IsStatic = true };
172        tile.Image = image;
173        Add(tile);
174        SetTile(x, y, tile);
175
176        if (properties.ContainsKey("type"))
177        {
178            var features = properties["type"].Split(',');
179            foreach (var feature in features)
180            {
181                ApplyFeature(tile, feature);
182            }
183        }
184    }
185
186    private void ApplyFeature(SimplePhysics.Object tile, string feature)
187    {
188        switch (feature)
189        {
190            case "ice":
191                tile.Friction = 0.0;
192                break;
193
194            case "death":
195                tile.Tag = "death";
196                break;
197
198            case "oneway":
199                tile.OneWayPlatform = true;
200                break;
201
202            case "break":
203                tile.AddCollisionHandler("player", (t, player) =>
204                {
205                    if (player.Top <= tile.Bottom)
206                    {
207                        tile.Destroy();
208                    }
209                });
210                break;
211            case "foreground":
212                tile.IgnoresCollisionResponse = true;
213                break;
214            default:
215                throw new Exception("Unknown tile feature: " + feature);
216        }
217    }
218}
Note: See TracBrowser for help on using the repository browser.