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); }
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; }