summaryrefslogtreecommitdiff
path: root/src/LivingVillage.Desktop/VillageArt.fs
diff options
context:
space:
mode:
Diffstat (limited to 'src/LivingVillage.Desktop/VillageArt.fs')
-rw-r--r--src/LivingVillage.Desktop/VillageArt.fs67
1 files changed, 63 insertions, 4 deletions
diff --git a/src/LivingVillage.Desktop/VillageArt.fs b/src/LivingVillage.Desktop/VillageArt.fs
index 11a6d71..51e17e0 100644
--- a/src/LivingVillage.Desktop/VillageArt.fs
+++ b/src/LivingVillage.Desktop/VillageArt.fs
@@ -643,10 +643,8 @@ module VillageArt =
| Some cc0 -> drawCc0Tile spriteBatch cc0 tint (cc0GroundRect position) (position.X * Sim.tilePixels - int camera.X) (position.Y * Sim.tilePixels - int camera.Y)
| None -> draw position GrassSprite
- let tx0 = max 0 (int camera.X / Sim.tilePixels)
- let ty0 = max 0 (int camera.Y / Sim.tilePixels)
- let tx1 = min (Sim.mapWidthTiles - 1) ((int camera.X + viewportWidth) / Sim.tilePixels + 1)
- let ty1 = min (Sim.mapHeightTiles - 1) ((int camera.Y + viewportHeight) / Sim.tilePixels + 1)
+ let tx0, ty0, tx1, ty1 =
+ MapGen.visibleTileRange Sim.mapWidthTiles Sim.mapHeightTiles (int camera.X) (int camera.Y) viewportWidth viewportHeight
for y in ty0 .. ty1 do
for x in tx0 .. tx1 do
drawBaseTile (tilePosition x y)
@@ -724,6 +722,67 @@ module VillageArt =
| House -> draw (offsetTile (worldTile plan prop.Position) 0 -3) smokeSprite
| _ -> ()
+ /// P20 证据用:把整张 MapGen 地图等比缩放到视口内绘制,返回绘制的瓦片数。
+ /// 仅用于 `LV_MAPGEN_SHOT` 整图取证,不参与正常游戏循环。
+ let drawMapFitted
+ (spriteBatch: SpriteBatch)
+ (textures: ArtTextures)
+ (viewportWidth: int)
+ (viewportHeight: int)
+ (map: MapGen.Result)
+ (tint: XnaColor) : int =
+ let scale =
+ min (float32 viewportWidth / float32 (max 1 (map.Width * Sim.tilePixels)))
+ (float32 viewportHeight / float32 (max 1 (map.Height * Sim.tilePixels)))
+ let cell = max 1 (int (float32 Sim.tilePixels * scale))
+ let offsetX = (viewportWidth - map.Width * cell) / 2
+ let offsetY = (viewportHeight - map.Height * cell) / 2
+ let spriteOf code =
+ match code with
+ | 1 -> WaterSprite
+ | 2
+ | 3 -> StonePathSprite
+ | _ -> GrassSprite
+ for y in 0 .. map.Height - 1 do
+ for x in 0 .. map.Width - 1 do
+ let code = map.Tiles.[y * map.Width + x]
+ spriteBatch.Draw(textures.TileAtlas, XnaRectangle(offsetX + x * cell, offsetY + y * cell, cell, cell), tileSourceRectangle (spriteOf code), tint)
+ map.Width * map.Height
+
+ /// P20 证据用:按相机做视口裁剪,只绘制可见瓦片(1:1 像素),返回实际绘制数。
+ let drawMapViewport
+ (spriteBatch: SpriteBatch)
+ (textures: ArtTextures)
+ (camera: XnaVector2)
+ (viewportWidth: int)
+ (viewportHeight: int)
+ (map: MapGen.Result)
+ (tick: int64)
+ (tint: XnaColor) : int =
+ let x0, y0, x1, y1 =
+ MapGen.visibleTileRange map.Width map.Height (int camera.X) (int camera.Y) viewportWidth viewportHeight
+ let spriteOf (x: int) (y: int) code =
+ match code with
+ | 1 ->
+ match waterFrameTickAt tick x y with
+ | 0 -> WaterSprite
+ | 1 -> WaterSpriteB
+ | _ -> WaterSpriteC
+ | 2
+ | 3 -> StonePathSprite
+ | _ -> GrassSprite
+ let mutable drawn = 0
+ for y in y0 .. y1 do
+ for x in x0 .. x1 do
+ let code = map.Tiles.[y * map.Width + x]
+ spriteBatch.Draw(
+ textures.TileAtlas,
+ XnaRectangle(x * Sim.tilePixels - int camera.X, y * Sim.tilePixels - int camera.Y, Sim.tilePixels, Sim.tilePixels),
+ tileSourceRectangle (spriteOf x y code),
+ tint)
+ drawn <- drawn + 1
+ drawn
+
let drawCharacter
(spriteBatch: SpriteBatch)
(textures: ArtTextures)