diff options
Diffstat (limited to 'src/LivingVillage.Desktop/VillageArt.fs')
| -rw-r--r-- | src/LivingVillage.Desktop/VillageArt.fs | 67 |
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) |
