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

Revision 7975, 11.3 KB checked in by sieerinn, 3 years ago (diff)

Hyppelyä paranneltu jälleen

Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8using System.Linq;
9
10namespace VenienteFragore
11{
12    public partial class VenienteFragore : SimplePhysics.Game
13    {
14        private delegate void ObjectMethod(Vector position, double width, double height, Dictionary<string, string> properties);
15        private Dictionary<string, ObjectMethod> objectMethods;
16
17        private readonly Image dripImage = LoadImage("drip");
18        private readonly Image[] minimiiniiImages = LoadImages("minimiiniianim\\minimiiniianim", 1, 4);
19        private readonly Image[] advenaImages = LoadImages("advenawalk\\advenawalk00", 1, 49, true);
20        private readonly Image[] advenbImages = LoadImages("advenbwalk\\advenb00", 1, 49, true);
21
22        private List<Player> advenae;
23
24        private Vector cameraSpeed = new Vector(2.0, 4.0);
25        private Vector cameraTarget;
26
27        private SimplePhysics.Object borderleft;
28        private SimplePhysics.Object borderright;
29
30        public VenienteFragore() : base(tileSize: 50)
31        {
32        }
33
34        public override void Begin()
35        {
36            StartLevel("desolatecaves");
37
38            Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
39        }
40
41        public double DistanceToNearestPlayer(Vector point)
42        {
43            return advenae.Min(p => Vector.Distance(p.Position, point));
44        }
45
46        private void StartLevel(string lvlName)
47        {
48            ClearAll();
49            advenae = new List<Player>();
50            objectMethods = new Dictionary<string, ObjectMethod>();
51            objectMethods.Add("ball", TestBall);
52            objectMethods.Add("player", CreatePlayer);
53            objectMethods.Add("moving", CreateMovingPlatform);
54            objectMethods.Add("door", CreateDoor);
55            objectMethods.Add("goomba", CreateGoomba);
56            objectMethods.Add("drip", CreateWaterDrip);
57
58            var tileMap = TiledTileMap.FromLevelAsset(lvlName);
59            tileMap.SetTileMethod("Tiilet", TileMethod);
60            tileMap.SetObjectMethod("Oliot", CreateObject);
61            tileMap.SetTileMethod("Etuala", Foreground);
62            tileMap.Execute();
63
64            Gravity = new Vector(0, -1400);
65
66            // Tilapäisesti pois käytöstä.
67            //Level.Background.CreateGradient(Color.Beige, Color.OrangeRed);
68
69            // TODO: Tausta pitäisi tulla jotenkin kentän perusteella.
70            Level.Background.Image = LoadImage("cavebackground");
71            Level.Background.TileToLevel();
72            //var bg = new GameObject(Level.Width, Level.Height);
73            //bg.Image = LoadImage("cavebackground");
74            //bg.TextureWrapSize = new Vector(8, 4);
75            //Add(bg, -3);
76            //Layers[-3].RelativeTransition = new Vector(0.0, 0.0);
77
78            CameraInitialization();
79        }
80
81        private void CameraInitialization()
82        {
83            Camera.StayInLevel = true;
84
85            Window.Width = 1500;
86            Window.Height = 750;
87
88            borderleft = new SimplePhysics.Object(TileSize, Level.Height) { X = Camera.X + Window.Width / 2, IsVisible = false };
89            Add(borderleft);
90            borderright = new SimplePhysics.Object(TileSize, Level.Height) { X = Camera.X - Window.Width / 2, IsVisible = false };
91            Add(borderright);
92
93            Timer checkit = new Timer();
94            checkit.Interval = 0.02;
95            checkit.Timeout += () => { UpdateCameraTarget(checkit); };
96            checkit.Start();
97        }
98
99        private void UpdateCameraTarget(Timer checkit)
100        {
101            List<Player> activePlayers = advenae.FindAll(o => o.IsVisible == true);
102
103            switch (activePlayers.Count)
104            {
105                case 1:
106                    Camera.StopFollowing();
107                    Player soloYolo = activePlayers[0];
108                    cameraTarget.X = soloYolo.Position.X + (soloYolo.FacingDirection.GetVector().X * (TileSize * 4));
109                    if (soloYolo.IsCrouching) cameraTarget.Y = soloYolo.Position.Y - TileSize * 4;
110                    else if (soloYolo.IsGrounded) cameraTarget.Y = soloYolo.Position.Y;
111                    break;
112                case 2:
113                    Vector minPosition = new Vector(activePlayers.Max(p => p.X), activePlayers.Min(p => p.Y));
114                    Vector maxPosition = new Vector(activePlayers.Min(p => p.X), activePlayers.Max(p => p.Y));
115                    cameraTarget = (minPosition + maxPosition) * 0.5;
116                    break;
117                default:
118                    Camera.StopFollowing();
119                    checkit.Stop();
120                    break;
121            }
122
123            borderleft.X = Camera.X + Window.Width / 2;
124            borderright.X = Camera.X - Window.Width / 2;
125        }
126
127        protected override void Update(Time time)
128        {
129            Camera.X += (cameraTarget.X - Camera.X) * time.SinceLastUpdate.TotalSeconds * cameraSpeed.X;
130            Camera.Y += (cameraTarget.Y - Camera.Y) * time.SinceLastUpdate.TotalSeconds * cameraSpeed.Y;
131
132            base.Update(time);
133        }
134       
135        private void SetMovementKeys(Player adven, List<Key> keys)
136        {
137            Keyboard.Listen(keys[3], ButtonState.Down, Walk, null, adven, 200.0);
138            Keyboard.Listen(keys[2], ButtonState.Down, Walk, null, adven, -200.0);
139            Keyboard.Listen(keys[0], ButtonState.Down, Jump, null, adven);
140            Keyboard.Listen(keys[1], ButtonState.Pressed, Crouch, null, adven, true);
141            Keyboard.Listen(keys[1], ButtonState.Released, Crouch, null, adven, false);
142            Keyboard.Listen(keys[4], ButtonState.Pressed, Interact, null, adven);
143            // Keyboard.Listen(keys[4], ButtonState.Pressed, SplitOrMorph, "Splits or morphs the player back to 1 player", adven);
144        }
145
146        private void Interact(Player adven)
147        {
148            //Jos kannetaan jotain, viskataan se
149            var carrying = adven.Carrying;
150            if (carrying != null) //Throw
151            {
152                adven.Carrying = null;
153                double dir = adven.FacingDirection == Direction.Left ? -1 : 1;
154                carrying.Velocity = new Vector(dir * 350, 350);
155                carrying.Position = carrying.Position + new Vector(dir * 10, 30);
156                //Pitäisiköhän oma aliohjelma tehdä
157                carrying.IgnoresGravity = false;
158                carrying.IgnoresCollisionResponse = false;
159            }
160
161            Vector pingPoint = adven.Position + (adven.FacingDirection == Direction.Left ? new Vector(-adven.Width, 0) : new Vector(adven.Width, 0));
162            List<GameObject> interactedObjects = GetObjectsAt(pingPoint);
163
164            GameObject sphere = new GameObject(1, 1);
165            sphere.Position = pingPoint;
166            sphere.Shape = Shape.Circle;
167            sphere.Color = new Color(100, 0, 100, 25);
168            Add(sphere, 1);
169
170            TimerAddons.Until(() => sphere.Width == 100.0, delegate { sphere.Width += 1; sphere.Height += 1; }, 0.01, sphere.Destroy);
171
172            foreach (GameObject item in interactedObjects)
173            {
174                var obj = item as InteractableObject;
175                obj?.InteractWith(adven);
176            }
177        }
178
179        private void Pickup(SimplePhysics.Object player, InteractableObject target)
180        {
181            var adven = player as Player;
182            if (adven != null && adven.Carrying == null)
183            {
184                adven.Carrying = target;
185                target.IgnoresGravity = true;
186                target.IgnoresCollisionResponse = true;
187                //Lentävän palikan nostaminen
188            }
189        }
190
191        private void SetGeneralKeys()
192        {
193            Keyboard.Listen(Key.R, ButtonState.Pressed, () => { ClearAll(); advenae = new List<Player>(); Begin(); }, "Lopeta peli");
194            Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
195
196            Keyboard.Listen(Key.X, ButtonState.Pressed, SplitOrMorph, "Splits or morphs the player", 2);
197            Keyboard.Listen(Key.RightShift, ButtonState.Pressed, SplitOrMorph, "Splits or morphs the player", 1);
198        }
199       
200        /// <summary>
201        /// Sotku
202        /// </summary>
203        /// <param name="playerNro">Sen pelaajan numero, joka haluaa toimia</param>
204        private void SplitOrMorph(int playerNro)
205        {
206            if (!advenae[playerNro - 1].IsVisible && advenae[1 - playerNro + 1].IsVisible)
207            {
208                Split(advenae[1 - playerNro + 1]);
209            }
210            else
211            {
212                Morph(advenae[1 - playerNro + 1]);
213            }
214        }
215
216        private void Morph(Player adven)
217        {
218            if (advenae.FindAll(o => o.IsVisible == true).Count != 2) return;
219
220            if (Vector.Distance(advenae[0].Position, advenae[1].Position) < adven.Width * 1.5)
221            {
222                Player destroyable = advenae.Find(o => o.PlayerNumber != adven.PlayerNumber);
223
224                destroyable.ControlKeys.ForEach(delegate (Key key)
225                {
226                    Keyboard.Disable(key);
227                });
228
229                destroyable.Destroy();
230            }
231
232            //TODO: Eeppinen hypäytys takaisin? Samalla voisi ajastimella tarkastaa jatkuvasti, ovatko pelaajat tarpeeksi lähellä toisiaan.
233            /*
234            Vector center = new Vector();
235
236            for (int i = 0; i < advenae.Count; i++)
237            {
238                center = (advenae[i].Position - center) * 0.5;
239            }
240            foreach (Player item in advenae)
241            {
242                item.Velocity = (center - item.Position) * 3.0;
243            }
244            morphing = true;
245            Timer.SingleShot(2.0, delegate { morphing = false; });
246            */
247        }
248
249        private void Split(Player adven)
250        {
251            if (advenae.FindAll(o => o.IsVisible == true).Count == 2) return;
252
253            Player advenNew = new Player(adven.Width, adven.Height);
254            switch (adven.PlayerNumber)
255            {
256                case 1:
257                    advenNew = CreatePlayer2(adven.Position + new Vector(adven.Width, 0), adven.Width, adven.Height);
258                    break;
259                case 2:
260                    advenNew = CreatePlayer1(adven.Position + new Vector(adven.Width, 0), adven.Width, adven.Height);
261                    break;
262            }
263
264            advenNew.Position = adven.Position + new Vector(adven.Width, 0);
265
266            if (Collisions(advenNew, Vector.Zero, true).Count > 0)
267            {
268                advenNew.Destroy();
269                return;
270            }
271
272            advenNew.ControlKeys.ForEach(delegate (Key key)
273            {
274                Keyboard.Enable(key);
275            });
276        }
277
278        private void Walk(Player pelaaja, double nopeus)
279        {
280            pelaaja.Walk(nopeus);
281        }
282
283        private void Jump(SimplePlatformCharacter player)
284        {
285            ((Player)player).Jump();
286        }
287
288        private void Crouch(Player player, bool crouch)
289        {
290            player.Crouch = crouch;
291        }
292    }
293}
Note: See TracBrowser for help on using the repository browser.