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

Revision 7976, 11.4 KB checked in by sieerinn, 3 years ago (diff)

Kyykkykuvat peliin asti

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