Beispiel #1
0
        protected override void Draw(GameTime gameTime)
        {
            var deltaTime = (float)gameTime.ElapsedGameTime.TotalSeconds;

            frameCounter.Update(deltaTime);
            var fps = string.Format("FPS:{0}", frameCounter.AverageFramesPerSecond);

            //GraphicsDevice.Clear(Color.Black);
            for (int i = 0; i < pendingTilePool.Count; i++)
            {
                tilePool.Add(pendingTilePool[i]);
            }
            pendingTilePool.Clear();

            startX = (int)Floor(worldPos.X - numTilesX / 2.0f);
            endX   = (int)Ceiling(worldPos.X + numTilesX / 2.0f);
            startY = (int)Floor(worldPos.Y - numTilesY / 2.0f);
            endY   = (int)Ceiling(worldPos.Y + numTilesY / 2.0f);

            screenCenter = new Vector2(windowWidth / 2, windowHeight / 2);

            offset = worldPos * (float)World.tileSize - screenCenter;

            batch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend);

            for (int y = startY; y <= endY; y++)
            {
                for (int x = startX; x <= endX; x++)
                {
                    Texture2D tile = world.GetTex(x, y);

                    var screenPos = new Vector2(x, y) * World.tileSize - offset;
                    if (OnScreen(screenPos, World.tileSize, World.tileSize))
                    {
                        batch.Draw(tile, new Vector2(screenPos.X, screenPos.Y), null, Color.White, 0, Vector2.Zero, 1f, SpriteEffects.None, 1.0f);
                    }
                }
            }



            foreach (var npc in world.npcs)
            {
                var screenPos = npc.pos * World.tileSize - offset;
                if (OnScreen(screenPos, CharSprites.CHAR_SIZE, CharSprites.CHAR_SIZE))
                {
                    npc.Draw(screenPos);
                }
            }

            foreach (var resource in world.resources)
            {
                var screenPos = resource.pos * World.tileSize - offset;
                if (OnScreen(screenPos, resource.width, resource.height))
                {
                    resource.Draw(screenPos);
                }
            }

            foreach (var resource in world.deadResources)
            {
                var screenPos = resource.pos * World.tileSize - offset;
                if (OnScreen(screenPos, resource.width, resource.height))
                {
                    resource.Draw(screenPos);
                }
            }

            var playerScreenPos = player.pos * World.tileSize - offset;

            player.Draw(playerScreenPos);

            if (state == GameState.DIALOGUE)
            {
                Dialogue.Draw();
            }

            batch.DrawString(mainFont, fps, new Vector2(0, 40), Color.Yellow);
#if DEBUG
            batch.DrawString(mainFont, "x:" + (int)worldPos.X + "," + (int)worldPos.Y + "  sprited:" + npcSprited, Vector2.Zero, Color.Yellow);
#endif
            batch.End();
            base.Draw(gameTime);
        }
Beispiel #2
0
        protected override void Update(GameTime gameTime)
        {
            base.Update(gameTime);

            var keyState = Keyboard.GetState();
            var padState = GamePad.GetState(PlayerIndex.One);
            var command  = GameCommand.NONE;

            if (keyState.IsKeyDown(Keys.Escape))
            {
                Exit();
            }

            if (state == GameState.DIALOGUE)
            {
                if (IsNewAction(Action.UP))
                {
                    Dialogue.DecRow();
                }
                else if (IsNewAction(Action.DOWN))
                {
                    Dialogue.IncRow();
                }
                else if (IsNewAction(Action.LEFT))
                {
                    Dialogue.DecColumn();
                }
                else if (IsNewAction(Action.RIGHT))
                {
                    Dialogue.IncColumn();
                }
                else if (IsNewAction(Action.BACK))
                {
                    command = GameCommand.BACK;
                }
                else if (IsNewAction(Action.MAIN))
                {
                    Dialogue.MoveItem();
                }
                else if (IsNewAction(Action.CONFIRM))
                {
                    if (Dialogue.Accept())
                    {
                        command = GameCommand.BACK;
                    }
                }
            }
            else
            {
                if (IsNewAction(Action.USE_ITEM))
                {
                    var(closestResource, minDist) =
                        world.resources.ClosestTo(player);

                    if (minDist < actionDist + (closestResource.width / 2 / World.tileSize) && closestResource != null)
                    {
                        if (!player.chopping)
                        {
                            player.Chop(closestResource);
                        }
                    }
                }

                var tile = world.GetTile(player.pos);

                float moveDistance = 0.0f;
                if (tile == World.TerrainTile.WATER)
                {
                    moveDistance = 0.015f;
                }
                else
                {
                    moveDistance = 0.05f;
                }

                Vector2 movement = Vector2.Zero;

                var gamePadCap = GamePad.GetCapabilities(PlayerIndex.One);
                if (gamePadCap.IsConnected)
                {
                    if (gamePadCap.HasLeftXThumbStick)
                    {
                        movement += new Vector2(padState.ThumbSticks.Left.X * moveDistance, 0);
                    }
                    if (gamePadCap.HasLeftYThumbStick)
                    {
                        movement -= new Vector2(0, padState.ThumbSticks.Left.Y * moveDistance);
                    }
                }


                if (keyState.IsKeyDown(Keys.Right))
                {
                    movement += new Vector2(moveDistance, 0);
                }
                if (keyState.IsKeyDown(Keys.Left))
                {
                    movement -= new Vector2(moveDistance, 0);
                }
                if (keyState.IsKeyDown(Keys.Up))
                {
                    movement -= new Vector2(0, moveDistance);
                }
                if (keyState.IsKeyDown(Keys.Down))
                {
                    movement += new Vector2(0, moveDistance);
                }



                if (movement.Length() > moveDistance)
                {
                    movement = Vector2.Normalize(movement) * moveDistance;
                }


                player.pos += movement;
                player.Update(gameTime);

                float xDiff = worldPos.X - player.pos.X;
                float yDiff = worldPos.Y - player.pos.Y;

                float threshold = 1.5f;
                if (xDiff > threshold)
                {
                    worldPos.X += movement.X;
                }
                else if (xDiff < -threshold)
                {
                    worldPos.X += movement.X;
                }

                if (yDiff > threshold)
                {
                    worldPos.Y += movement.Y;
                }
                else if (yDiff < -threshold)
                {
                    worldPos.Y += movement.Y;
                }

                foreach (var npc in world.npcs)
                {
                    npc.Update(gameTime, player, Content);
                }
                float closestNPCDist;
                (closestNPC, closestNPCDist) =
                    world.npcs.ClosestTo(player);


                if (IsNewAction(Action.MAIN) && closestNPCDist < actionDist)
                {
                    command = GameCommand.TALK;
                }
            }
            AdvanceState(command);
            if (IsNewButtonPress(Buttons.X))
            {
                renderFancyTiles = !renderFancyTiles;
            }


            lastPadState = padState;
            lastKeyState = keyState;
        }