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

Revision 7832, 11.1 KB checked in by sieerinn, 3 years ago (diff)

SimplePlatformCharacterien? kuva kääntyy ympäri vasemmalle kävellessä, Goomballa on myös kuva ja ne aktivoituu vasta lähelle mentäessä

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