add # 新增背景图的优化

This commit is contained in:
2026-10-20 10:39:49 +08:00
parent 54164aeb9c
commit 2761be6c3f
20 changed files with 1644 additions and 102 deletions
Binary file not shown.
@@ -0,0 +1,16 @@
{
"schema": 1,
"canvas": [3072, 1872],
"anchor": "full_canvas_bottom_center",
"buildings": [
{"name": "房屋", "sprite": "decorate_default_2.png", "rect": [1675.75, 158.36, 572.14, 630.64], "layer": "background", "basis": "prefab parent and image transforms"},
{"name": "矿洞", "sprite": "decorate_default_3.png", "rect": [1385.61, 256.06, 282.88, 282.88], "layer": "background", "basis": "prefab geometry and inferred runtime origin"},
{"name": "主题入口", "sprite": "decorate_default_4.png", "rect": [860.44, 423.68, 294.97, 249.07], "layer": "background", "basis": "prefab geometry and inferred runtime origin"},
{"name": "摊位", "sprite": "decorate_default_5.png", "rect": [514.20, 553.27, 298.97, 288.52], "layer": "background", "basis": "approved screenshot inverse projection"},
{"name": "狗窝", "sprite": "decorate_default_6.png", "rect": [277.95, 762.35, 305.25, 206.98], "layer": "background", "basis": "approved screenshot inverse projection"},
{"name": "码头", "sprite": "decorate_default_7.png", "rect": [1074.51, 1019.51, 355.42, 397.24], "layer": "foreground", "basis": "approved screenshot inverse projection"},
{"name": "邮箱", "sprite": "decorate_default_8.png", "rect": [790.18, 576.27, 104.54, 140.08], "layer": "background", "basis": "approved screenshot inverse projection"},
{"name": "加工坊标牌", "sprite": "decorate_default_9.png", "rect": [2347.77, 756.08, 269.70, 269.70], "layer": "background", "basis": "approved screenshot inverse projection"},
{"name": "稻草人标牌", "sprite": "decorate_default_10.png", "rect": [1120.51, 300.30, 238.34, 238.34], "layer": "background", "basis": "approved screenshot inverse projection"}
]
}
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -25,7 +25,7 @@ class RenderOptions:
if self.format not in ("AUTO", "WEBP", "JPEG", "PNG"):
raise ValueError("Unsupported output format")
if self.theme not in ("default", "spring", "summer", "autumn",
"winter"):
"winter", "bee"):
raise ValueError("Unsupported theme")
@classmethod
+12
View File
@@ -65,6 +65,7 @@ class FarmRenderer:
canvas = self._base(scene, options)
self._plants(canvas, scene, options)
self._pests(canvas, scene, options)
self._decorations(canvas, options, "foreground")
self._panel(canvas, scene, options, avatar)
composed = perf_counter()
content = canvas.encode(codec, options.quality, options.method)
@@ -101,6 +102,7 @@ class FarmRenderer:
f"decorate_{options.theme}_1.jpg", size,
)
canvas = Canvas(background)
self._decorations(canvas, options, "background")
soil_size = tuple(max(1, s(n)) for n in (
self.assets.metadata["soil_size"]
))
@@ -121,6 +123,16 @@ class FarmRenderer:
self.assets.cache.put(key, canvas.image, size[0] * size[1] * 4)
return canvas.copy()
def _decorations(self, canvas, options, layer):
s = lambda n: self._scale(n, options)
for item in self.assets.metadata["decorations"][options.theme]:
if item["layer"] != layer:
continue
image = self.assets.image(
item["sprite"], tuple(max(1, s(n)) for n in item["size"]),
)
canvas.paste(image, tuple(s(n) for n in item["position"]))
def _plants(self, canvas, scene, options):
s = lambda n: self._scale(n, options)
soil_w, soil_h = self.assets.metadata["soil_size"]
+18
View File
@@ -0,0 +1,18 @@
"""按北京时间选择四季主题;蜂巢主题只供显式离线预览。"""
from datetime import datetime, timedelta, timezone
from farm_core.domain import integer
BEIJING = timezone(timedelta(hours=8))
def season_for(now: int) -> str:
month = datetime.fromtimestamp(integer(now), BEIJING).month
if 3 <= month <= 5:
return "spring"
if 6 <= month <= 8:
return "summer"
if 9 <= month <= 11:
return "autumn"
return "winter"