Beispiel #1
0
        public Map(Golf game, TileSet tileSet, MapLayer layer1, MapLayer layer2, int columns, int rows, Vector2 start, Side startStartSide, int startLayer, Vector2 end, Side endEndSide, int endLayer, List <Player> players, int currentPlayer, Procedure <Map> endLevel)
        {
            Game       = game;
            EndLevel   = endLevel;
            ColorTween = new Tween(new TimeSpan(0, 0, 0, 1), 0.0f, 0.8f, true);
            //TileSet = tileSet;
            Layer1           = layer1;
            Layer2           = layer2;
            Columns          = columns;
            Start            = start;
            StartSide        = startStartSide;
            StartLayer       = startLayer;
            StartWorldCenter =
                new Vector2(Math.Max(Start.X, 0) * TileSet.TileWidth,
                            Math.Max(Start.Y, 0) * TileSet.TileHeight) + WorldHelpers.GetStartOffset(StartSide);
            End            = end;
            EndSide        = endEndSide;
            EndLayer       = endLayer;
            EndWorldCenter =
                new Vector2(Math.Max(End.X, 0) * TileSet.TileWidth,
                            Math.Max(End.Y, 0) * TileSet.TileHeight) + WorldHelpers.GetEndOffset(EndSide);

            Players       = players;
            CurrentPlayer = currentPlayer;
            Rows          = rows;

            Camera = new Camera2D();
            if (!Players.Any())
            {
                return;
            }
            foreach (var p in Players)
            {
                p.Node              = new Node(new Vector2(Math.Max(Start.X, 0) * tileSet.TileWidth, Math.Max(Start.Y, 0) * tileSet.TileHeight) + WorldHelpers.GetStartOffset(StartSide), 2.5f, 1, Vector2.Zero, Vector2.Zero, startLayer);
                p.LastTile          = GetPlayerTile(p);
                p.PreviousTile      = p.LastTile;
                p.Layer             = startLayer;
                p.Node.OnCollision += PlayBounce;
                p.State             = PlayerState.Finished;
                p.Par = -1;
            }
            Camera.Focus = Game.Center - Players[CurrentPlayer].Position;
            Players[CurrentPlayer].Start();
        }
Beispiel #2
0
        public void Update(GameTime gameTime, Map map)
        {
            try
            {
                if (State == PlayerState.Done)
                {
                    return;
                }
                if (WaterPosition != null)
                {
                    return;
                }

                LastPosistion = Node.WorldPosition - Node.Velocity * 5;
                if (Teleporting && TeleportDelay > TimeSpan.Zero)
                {
                    TeleportDelay -= gameTime.ElapsedGameTime;
                    return;
                }
                if ((State == PlayerState.Ready || State == PlayerState.Bounced) && Velocity.Length() > 0.01f)
                {
                    State    = State == PlayerState.Bounced ? PlayerState.Bounced : PlayerState.Started;
                    IdleTime = TimeSpan.Zero;
                }
                if ((State == PlayerState.Started || State == PlayerState.Bounced) && Velocity.Length() < 0.09f)
                {
                    IdleTime += gameTime.ElapsedGameTime;
                }
                else
                {
                    IdleTime = TimeSpan.Zero;
                }
                if (State == PlayerState.Started || State == PlayerState.Bounced)
                {
                    GolfBall.Update(gameTime);
                }
                if (IdleTime > new TimeSpan(0, 0, 0, 3))
                {
                    State    = PlayerState.Finished;
                    Velocity = Vector2.Zero;
                }
                if (State == PlayerState.Ready)
                {
                    Power.Update(gameTime.ElapsedGameTime);
                    return;
                }

                if (map.GetTile(this, 1) == 0 && map.GetTile(this, 2) == 0) //Out of map
                {
                    Node         = new Node(map.StartWorldCenter, 2.5f, 1, Vector2.Zero, Vector2.Zero, map.StartLayer);
                    State        = PlayerState.Finished;
                    PreviousTile = map.GetPlayerTile(this);
                    LastTile     = PreviousTile;
                }


                OnTile = map.GetTile(this, Layer);


                CurrentTile = map.GetPlayerTile(this);
                var tileToWorldTranslation = new Point(CurrentTile.X * map.TileSet.TileWidth, CurrentTile.Y * map.TileSet.TileWidth);
                var pointOnTile            = new Vector2(Node.WorldPosition.X - tileToWorldTranslation.X, Node.WorldPosition.Y - tileToWorldTranslation.Y);

                var walls = map.GetWalls(this);
                if (OnTile == 53 || OnTile == 54 || OnTile == 62 || OnTile == 63)
                {
                    walls =
                        walls.Union(
                            WorldHelpers.AddWallRails(
                                WorldHelpers.GetLineSpecialSegments(OnTile,
                                                                    new Point((int)(Node.WorldPosition.X - tileToWorldTranslation.X),
                                                                              (int)(Node.WorldPosition.Y - tileToWorldTranslation.Y))), Layer)).ToList();
                }
                Node.Update(gameTime);

                walls = map.GetWalls(this);
                if (OnTile == 53 || OnTile == 54 || OnTile == 62 || OnTile == 63)
                {
                    walls =
                        walls.Union(
                            WorldHelpers.AddWallRails(
                                WorldHelpers.GetLineSpecialSegments(OnTile,
                                                                    new Point((int)(Node.WorldPosition.X - tileToWorldTranslation.X),
                                                                              (int)(Node.WorldPosition.Y - tileToWorldTranslation.Y))), Layer)).ToList();
                }

                if (map.EndLayer == Layer && Vector2.Distance(map.EndWorldCenter, Node.WorldPosition) < 5 + Node.Radius)
                {
                    if (Node.Velocity.Length() < 3.5f)
                    {
                        Node  = new Node(map.StartWorldCenter, 2.5f, 1, Vector2.Zero, Vector2.Zero, map.StartLayer);
                        State = PlayerState.Done;
                        Game.Sounds.Hole.Play();
                    }
                }

                #region Elevations

                LastImidiateLayer = Layer;
                // Layer = WorldHelpers.LayerMod()
                if (LastTile != CurrentTile)
                {
                    BouncePlayed =
                        !(OnTile == 53 && !(pointOnTile.Y > 23) || OnTile == 54 && !(pointOnTile.Y > 72) ||
                          OnTile == 62 && !(pointOnTile.X > 72) || OnTile == 63 && !(pointOnTile.X < 23));
                    PreviousLayer = LastLayer;
                    LastLayer     = Layer;
                    //Need to test elevation vertical horizontal
                    if (Layer == 1 && map.GetElevation(LastTile) != Elevation.Flat)
                    {
                        if (WorldHelpers.IsTopLevel(map.Layer2.GetTile(CurrentTile.X, CurrentTile.Y)) &&
                            PreviousLayer != 2)
                        {
                            Layer = 2;
                        }
                    }
                    else if (Layer == 2 && map.GetElevation(CurrentTile) != Elevation.Flat)
                    {
                        Layer = 1;
                    }

                    PreviousTile = LastTile;
                    LastTile     = CurrentTile;
                }
                if (!BouncePlayed && (OnTile == 53 || OnTile == 54 || OnTile == 62 || OnTile == 63))
                {
                    switch (OnTile)
                    {
                    case 53:
                    {
                        if (pointOnTile.Y < 23)
                        {
                            BouncePlayed = true;
                            Game.Sounds.DropBounce.Play();
                        }
                        break;
                    }

                    case 54:
                    {
                        if (pointOnTile.Y > 72)
                        {
                            BouncePlayed = true;
                            Game.Sounds.DropBounce.Play();
                        }
                        break;
                    }

                    case 62:
                    {
                        if (pointOnTile.X > 72)
                        {
                            BouncePlayed = true;
                            Game.Sounds.DropBounce.Play();
                        }
                        break;
                    }

                    case 63:
                    {
                        if (pointOnTile.X < 23)
                        {
                            BouncePlayed = true;
                            Game.Sounds.DropBounce.Play();
                        }
                        break;
                    }
                    }
                }
                if (Layer == 1)
                {
                    Node.Acceleration += WorldHelpers.GetForce(map.Layer1.GetTile(CurrentTile.X, CurrentTile.Y),
                                                               pointOnTile);
                }


                #endregion

                Node.DetectCollisions(map.GetBouncers(this), walls, tileToWorldTranslation);
                Node.DetectCollisions(map.Players.Where(p => p.State != PlayerState.Done));
                if (
                    map.GetWater(this)
                    .Any(
                        r =>
                        r.Contains(pointOnTile)))
                {
                    WaterPosition            = Node.WorldPosition;
                    Sprites.Splash.OnFinish += SplashFinished;
                    Sprites.Splash.Animation = AnimationState.Play;
                    Game.Sounds.Splash.Play();
                }
                var ballTileRect = new Rectangle((int)(Node.WorldPosition.X - tileToWorldTranslation.X),
                                                 (int)(Node.WorldPosition.Y - tileToWorldTranslation.Y), (int)GolfBall.Width, (int)GolfBall.Height);
                var rects = map.GetTeleports(this);
                if (!Teleporting && rects.Any())
                {
                    var exits = rects.Where(r => r.Key.Intersects(ballTileRect)).SelectMany(r => r.Value).ToList();
                    if (exits.Any())
                    {
                        var v = Golf.Random.Next(exits.Count);
                        var r = exits[v];
                        //  r = new Rectangle(39, 46, 6, 10);
                        Teleport = new Rectangle(r.X + tileToWorldTranslation.X, r.Y + tileToWorldTranslation.Y,
                                                 r.Width,
                                                 r.Height);

                        Node.Velocity      = WorldHelpers.GetTeleporterVelocity(68, r.Center); //will need to get tile type
                        Node.WorldPosition = new Vector2(Teleport.Center.X, Teleport.Center.Y);
                        TeleportDelay      = new TimeSpan(0, 0, 0, 0, 500);
                        Teleporting        = true;
                        Game.Sounds.Bouncing.Play();
                    }
                }
                else
                {
                    Teleporting =
                        Teleport.Intersects(new Rectangle(ballTileRect.X + tileToWorldTranslation.X,
                                                          ballTileRect.Y + tileToWorldTranslation.Y, (int)GolfBall.Width, (int)GolfBall.Height));
                }
            }
            catch (Exception)
            {
                //Somthing bad happened reset
                Node =
                    new Node(
                        new Vector2(Math.Max(map.Start.X, 0) * map.TileSet.TileWidth,
                                    Math.Max(map.Start.Y, 0) * map.TileSet.TileHeight) +
                        WorldHelpers.GetStartOffset(map.StartSide), 2.5f, 1, Vector2.Zero, Vector2.Zero, map.StartLayer);
                State        = PlayerState.Finished;
                PreviousTile = map.GetPlayerTile(this);
                LastTile     = PreviousTile;
            }
        }