Exemple #1
0
        public override void Update(GameTime gameTime)
        {
            if (!IsLoading)
            {
                // Defined with respect to current mouse position.
                Coord2D mouseIsoFlatCoord = World.MousePositionToIsoFlatCoord(MainGame);
                Coord2D mouseIsoCoord     = World.MousePositionToIsoCoord(MainGame, Altitude);

                // User input actions.
                if (Peripherals.KeyTapped(Keys.Q) && MainGame.IsActive)
                {
                    var i = (int)Authorization + 1;
                    if (i >= Enum.GetNames(typeof(Authorization)).Length)
                    {
                        i = 0;
                    }
                    Authorization = (Authorization)(i);
                }

                if (Peripherals.KeyTapped(Keys.L) && MainGame.IsActive)
                {
                    $"Altitude = {Altitude}".Log();
                    mouseIsoCoord.ToString().Log();
                }

                if (Authorization == Authorization.Builder)
                {
                    if (Peripherals.LeftButtonPressed() && MainGame.IsActive)
                    {
                        BuildWorldObject(mouseIsoFlatCoord, mouseIsoCoord);
                    }

                    if (Peripherals.RightButtonPressed() && MainGame.IsActive)
                    {
                        RemoveWorldObject(mouseIsoFlatCoord, mouseIsoCoord);
                    }
                }

                // Ghost marker management.
                if (Authorization == Authorization.Builder)
                {
                    GhostMarker.Altitude = Altitude;
                    GhostMarker.Coords   = mouseIsoCoord;
                }
                else if (Authorization == Authorization.None)
                {
                    // Top down look.
                    for (int i = 30; i > -30; i--)
                    {
                        var targetedCoord = World.GetIsoCoord(mouseIsoFlatCoord, i);
                        if (LayerMap.ContainsKey(new Coord3D(targetedCoord, i)) && !(LayerMap[new Coord3D(targetedCoord, i)] is Deco))
                        {
                            Altitude             = i;
                            GhostMarker.Altitude = Altitude;
                            break;
                        }
                    }
                    GhostMarker.Coords = World.MousePositionToIsoCoord(MainGame, Altitude);
                }

                // Test
                GhostMarker.Position = World.IsoFlatCoordToWorldPosition(mouseIsoFlatCoord);

                if (LayerMap.ContainsKey(new Coord3D(mouseIsoCoord, Altitude)) || Authorization == Authorization.None)
                {
                    GhostMarker.DrawDefaultMarker = true;
                }
                else if (Authorization == Authorization.Builder)
                {
                    GhostMarker.DrawDefaultMarker = false;
                }

                if (LayerMap.ContainsKey(new Coord3D(mouseIsoCoord, Altitude)))
                {
                    GhostMarker.DrawPriority = 1;
                }
                else if (Authorization == Authorization.Builder)
                {
                    GhostMarker.DrawPriority = 0;
                }
                else if (Authorization == Authorization.None)
                {
                    // If !LayerMap[Altitude].OccupiedCoords.Contains(mouseIsoCoord), we are in empty space
                    // and always draw last.
                    GhostMarker.DrawPriority = -1000;
                }

                GhostMarker.IsHidden = !MainGame.IsMouseOver;


                if (Authorization == Authorization.None)
                {
                    if (Peripherals.LeftButtonTapped())
                    {
                        ClickAnimation.Position     = GhostMarker.Position;
                        ClickAnimation.Coords       = GhostMarker.Coords;
                        ClickAnimation.Altitude     = GhostMarker.Altitude;
                        ClickAnimation.DrawPriority = GhostMarker.DrawPriority;
                        ClickAnimation.Animator.AnimationFinished = false;
                        ClickAnimation.Animator.Reconfigure(new AnimArgs(1, 7, 0.066f, AnimationState.Once));
                    }
                }
                ClickAnimation.Update(gameTime);

                // Player management.
                //Player.Altitude = 1;

                #region Pre Loop

                // Rearrange sprites into their correct altitude layer.
                //var altitudeList = LayerMap.Keys.ToList();
                //altitudeList.Sort();

                //foreach (var altitude in altitudeList)
                //{
                //    for (int i = 0; i < LayerMap[altitude].Count(); i++)
                //    {
                //        var sprite = LayerMap[altitude][i];
                //        if (sprite.Altitude != altitude)
                //        {
                //            LayerMap[altitude].Remove(sprite); i--;
                //            if (!LayerMap.ContainsKey(sprite.Altitude))
                //            {
                //                LayerMap.Add(sprite.Altitude, new SpriteList<Sprite>() { sprite });
                //            }
                //            else
                //            {
                //                if (!(sprite is IWorldObject))
                //                {
                //                    LayerMap[sprite.Altitude].Add(sprite);
                //                }
                //                else
                //                {
                //                    throw new NotImplementedException("Cube/Deco trying to move between layers, is this correct? Use AddCheck if so.");
                //                }
                //            }
                //        }
                //    }
                //}

                #endregion

                #region Main Loop

                Sort();
                foreach (var sprite in OrderedLayerMap)
                {
                    sprite.Update(gameTime);
                }

                #endregion
            }
        }