Complete Cocos Creator port with level bundles, themes, and tooling.
Adds level prefabs, theme assets, audio, extensions, and deployment scripts for the Unity WebGL migration. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
82
tools/generate-vehicle-direction-textures.py
Normal file
82
tools/generate-vehicle-direction-textures.py
Normal file
@@ -0,0 +1,82 @@
|
||||
#!/usr/bin/env python3
|
||||
"""从载具 F/B 贴图生成四向 N/E/S/W 资源(E/W 为 F/B 水平镜像,N/S 复制 B/F)。"""
|
||||
from __future__ import annotations
|
||||
|
||||
import shutil
|
||||
import subprocess
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
TEX = ROOT / "assets" / "resources" / "textures"
|
||||
|
||||
# theme folder -> ship 文件名前缀(不含 _F/_B)
|
||||
THEMES: dict[str, str] = {
|
||||
"silu": "siluShip",
|
||||
"sanxing": "sanxingShip",
|
||||
"snow": "snowShip",
|
||||
"chinese": "chineseShip",
|
||||
"numMan": "numManShip",
|
||||
"redArmy": "redArmyShip",
|
||||
}
|
||||
|
||||
|
||||
def flip_horizontal(src: Path, dst: Path) -> None:
|
||||
dst.parent.mkdir(parents=True, exist_ok=True)
|
||||
try:
|
||||
subprocess.run(
|
||||
["sips", "-f", "horizontal", str(src), "--out", str(dst)],
|
||||
check=True,
|
||||
capture_output=True,
|
||||
)
|
||||
except (subprocess.CalledProcessError, FileNotFoundError):
|
||||
try:
|
||||
from PIL import Image
|
||||
Image.open(src).transpose(Image.FLIP_LEFT_RIGHT).save(dst)
|
||||
except ImportError as e:
|
||||
raise SystemExit(
|
||||
"需要 macOS sips 或 pip install Pillow 才能生成 E/W 镜像贴图"
|
||||
) from e
|
||||
|
||||
|
||||
def copy_meta(src_meta: Path, dst_meta: Path) -> None:
|
||||
if src_meta.is_file():
|
||||
shutil.copy2(src_meta, dst_meta)
|
||||
|
||||
|
||||
def generate_for_theme(folder: str, prefix: str) -> None:
|
||||
base = TEX / folder
|
||||
f_png = base / f"{prefix}_F.png"
|
||||
b_png = base / f"{prefix}_B.png"
|
||||
if not f_png.is_file() or not b_png.is_file():
|
||||
print(f" skip {folder}: missing {prefix}_F/_B")
|
||||
return
|
||||
|
||||
n_png = base / f"{prefix}_N.png"
|
||||
s_png = base / f"{prefix}_S.png"
|
||||
e_png = base / f"{prefix}_E.png"
|
||||
w_png = base / f"{prefix}_W.png"
|
||||
|
||||
shutil.copy2(b_png, n_png)
|
||||
shutil.copy2(f_png, s_png)
|
||||
flip_horizontal(f_png, e_png)
|
||||
flip_horizontal(b_png, w_png)
|
||||
|
||||
copy_meta(b_png.with_suffix(".png.meta"), n_png.with_suffix(".png.meta"))
|
||||
copy_meta(f_png.with_suffix(".png.meta"), s_png.with_suffix(".png.meta"))
|
||||
copy_meta(f_png.with_suffix(".png.meta"), e_png.with_suffix(".png.meta"))
|
||||
copy_meta(b_png.with_suffix(".png.meta"), w_png.with_suffix(".png.meta"))
|
||||
|
||||
print(f" ok {folder}: {prefix}_{{N,E,S,W}}.png")
|
||||
|
||||
|
||||
def main() -> int:
|
||||
print(f"textures root: {TEX}")
|
||||
for folder, prefix in THEMES.items():
|
||||
generate_for_theme(folder, prefix)
|
||||
print("done — 请在 Creator 中刷新 assets/resources/textures")
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
Reference in New Issue
Block a user