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

Revision 7977, 11.5 KB checked in by sieerinn, 3 years ago (diff)

Luolakenttää viimeistelty ja lisätty sininen goomba2 joka ei putoile alas

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