@maoyugames/phaser-framework 1.0.3 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.js +53 -34
- package/dist/index.js +6 -0
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -1218,7 +1218,13 @@ async function runVerify(target, opts = {}) {
|
|
|
1218
1218
|
const { server, port } = await serveDist(distDir);
|
|
1219
1219
|
const url = `http://127.0.0.1:${port}/`;
|
|
1220
1220
|
console.log(pc6.cyan(pc6.bold(`\u25B6 [verify] \u65E0\u5934\u6D4F\u89C8\u5668\u6253\u5F00 ${platform} \u4EA7\u7269`)));
|
|
1221
|
-
const launchArgs = [
|
|
1221
|
+
const launchArgs = [
|
|
1222
|
+
"--no-sandbox",
|
|
1223
|
+
"--use-gl=angle",
|
|
1224
|
+
"--use-angle=swiftshader",
|
|
1225
|
+
"--enable-unsafe-swiftshader",
|
|
1226
|
+
"--ignore-gpu-blocklist"
|
|
1227
|
+
];
|
|
1222
1228
|
let browser;
|
|
1223
1229
|
try {
|
|
1224
1230
|
browser = await pw.chromium.launch({ channel: "chrome", headless: true, args: launchArgs });
|
|
@@ -1235,7 +1241,11 @@ async function runVerify(target, opts = {}) {
|
|
|
1235
1241
|
const errors = [];
|
|
1236
1242
|
let rendered = false;
|
|
1237
1243
|
let distinctColors = 0;
|
|
1244
|
+
let canvasInView = false;
|
|
1238
1245
|
let canvasInfo = null;
|
|
1246
|
+
const outDir = join(ctx.root, ".pf-verify");
|
|
1247
|
+
mkdirSync(outDir, { recursive: true });
|
|
1248
|
+
const shot = join(outDir, `${platform}.png`);
|
|
1239
1249
|
try {
|
|
1240
1250
|
const page = await browser.newPage({ viewport });
|
|
1241
1251
|
page.on("pageerror", (e) => errors.push("PAGEERROR: " + e.message));
|
|
@@ -1245,41 +1255,47 @@ async function runVerify(target, opts = {}) {
|
|
|
1245
1255
|
await page.goto(url, { waitUntil: "load", timeout: 3e4 });
|
|
1246
1256
|
for (let i = 0; i < 20; i++) {
|
|
1247
1257
|
await page.waitForTimeout(1e3);
|
|
1248
|
-
const
|
|
1258
|
+
const buf = await page.screenshot({ type: "png" }).catch(() => null);
|
|
1259
|
+
if (buf) writeFileSync(shot, buf);
|
|
1260
|
+
if (buf) {
|
|
1261
|
+
const dataUrl = "data:image/png;base64," + buf.toString("base64");
|
|
1262
|
+
distinctColors = await page.evaluate(async (u) => {
|
|
1263
|
+
const img = new Image();
|
|
1264
|
+
img.src = u;
|
|
1265
|
+
await img.decode();
|
|
1266
|
+
const cv = document.createElement("canvas");
|
|
1267
|
+
cv.width = img.width;
|
|
1268
|
+
cv.height = img.height;
|
|
1269
|
+
const cx = cv.getContext("2d");
|
|
1270
|
+
if (!cx) return 0;
|
|
1271
|
+
cx.drawImage(img, 0, 0);
|
|
1272
|
+
const data = cx.getImageData(0, 0, cv.width, cv.height).data;
|
|
1273
|
+
const colors = /* @__PURE__ */ new Set();
|
|
1274
|
+
const total = cv.width * cv.height;
|
|
1275
|
+
const step = Math.max(1, Math.floor(total / 5e3));
|
|
1276
|
+
for (let k = 0; k < total && colors.size < 40; k += step) {
|
|
1277
|
+
const o = k * 4;
|
|
1278
|
+
colors.add(`${data[o]},${data[o + 1]},${data[o + 2]}`);
|
|
1279
|
+
}
|
|
1280
|
+
return colors.size;
|
|
1281
|
+
}, dataUrl).catch(() => 0);
|
|
1282
|
+
}
|
|
1283
|
+
const vis = await page.evaluate(() => {
|
|
1249
1284
|
const c = document.querySelector("canvas");
|
|
1250
|
-
if (!c) return {
|
|
1251
|
-
const
|
|
1252
|
-
|
|
1253
|
-
const
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
for (let k = 0; k < total && colors.size < 40; k += step) {
|
|
1260
|
-
const o = k * 4;
|
|
1261
|
-
colors.add(`${data[o]},${data[o + 1]},${data[o + 2]}`);
|
|
1262
|
-
}
|
|
1263
|
-
return { ok: true, distinct: colors.size, w, h };
|
|
1264
|
-
}).catch(() => ({ ok: false, distinct: 0, w: 0, h: 0 }));
|
|
1265
|
-
canvasInfo = stat.w ? { w: stat.w, h: stat.h } : canvasInfo;
|
|
1266
|
-
distinctColors = stat.distinct;
|
|
1267
|
-
if (stat.ok && stat.distinct > 3) {
|
|
1285
|
+
if (!c) return { has: false, inView: false, w: 0, h: 0 };
|
|
1286
|
+
const r = c.getBoundingClientRect();
|
|
1287
|
+
const st = getComputedStyle(c);
|
|
1288
|
+
const inView = r.bottom > 0 && r.right > 0 && r.top < innerHeight && r.left < innerWidth && r.width > 1 && r.height > 1 && st.display !== "none" && st.visibility !== "hidden" && Number(st.opacity) > 0;
|
|
1289
|
+
return { has: true, inView, w: Math.round(r.width), h: Math.round(r.height) };
|
|
1290
|
+
}).catch(() => ({ has: false, inView: false, w: 0, h: 0 }));
|
|
1291
|
+
canvasInfo = vis.has ? { w: vis.w, h: vis.h } : canvasInfo;
|
|
1292
|
+
canvasInView = vis.inView;
|
|
1293
|
+
if (distinctColors > 3 && canvasInView) {
|
|
1268
1294
|
rendered = true;
|
|
1269
1295
|
break;
|
|
1270
1296
|
}
|
|
1271
1297
|
}
|
|
1272
|
-
|
|
1273
|
-
const c = document.querySelector("canvas");
|
|
1274
|
-
return c ? c.toDataURL("image/png") : "";
|
|
1275
|
-
}).catch(() => "");
|
|
1276
|
-
if (durl) {
|
|
1277
|
-
const outDir = join(ctx.root, ".pf-verify");
|
|
1278
|
-
mkdirSync(outDir, { recursive: true });
|
|
1279
|
-
const shot = join(outDir, `${platform}.png`);
|
|
1280
|
-
writeFileSync(shot, Buffer.from(durl.split(",")[1], "base64"));
|
|
1281
|
-
console.log(pc6.gray(` \u622A\u56FE:${shot}`));
|
|
1282
|
-
}
|
|
1298
|
+
console.log(pc6.gray(` \u622A\u56FE(\u5C4F\u5E55\u5B9E\u62CD):${shot}`));
|
|
1283
1299
|
} catch (e) {
|
|
1284
1300
|
errors.push("VERIFY: " + e.message);
|
|
1285
1301
|
} finally {
|
|
@@ -1289,7 +1305,9 @@ async function runVerify(target, opts = {}) {
|
|
|
1289
1305
|
const ok = errors.length === 0 && rendered;
|
|
1290
1306
|
console.log("");
|
|
1291
1307
|
console.log(pc6.bold("\u25B6 [verify] \u7ED3\u679C"));
|
|
1292
|
-
console.log(
|
|
1308
|
+
console.log(
|
|
1309
|
+
` canvas:${canvasInfo ? `${canvasInfo.w}\xD7${canvasInfo.h}` : "\u65E0"};\u5728\u89C6\u53E3\u5185:${canvasInView ? "\u662F" : "\u5426"};\u5C4F\u5E55\u989C\u8272\u6570:${distinctColors}(>3 \u89C6\u4E3A\u5DF2\u6E32\u67D3)`
|
|
1310
|
+
);
|
|
1293
1311
|
if (errors.length) {
|
|
1294
1312
|
console.log(pc6.red(` \u63A7\u5236\u53F0/\u9875\u9762\u9519\u8BEF(${errors.length}):`));
|
|
1295
1313
|
errors.slice(0, 12).forEach((e) => console.log(pc6.red(" " + e)));
|
|
@@ -1298,10 +1316,11 @@ async function runVerify(target, opts = {}) {
|
|
|
1298
1316
|
}
|
|
1299
1317
|
if (ok) {
|
|
1300
1318
|
console.log(pc6.green(pc6.bold(`
|
|
1301
|
-
\u2713 [verify] ${platform} \u5B9E\u8DD1\u901A\u8FC7(\u6E32\u67D3\u6B63\u5E38\u3001\u65E0\u8FD0\u884C\u671F\u9519\u8BEF)`)));
|
|
1319
|
+
\u2713 [verify] ${platform} \u5B9E\u8DD1\u901A\u8FC7(\u5C4F\u5E55\u6E32\u67D3\u6B63\u5E38\u3001\u65E0\u8FD0\u884C\u671F\u9519\u8BEF)`)));
|
|
1302
1320
|
} else {
|
|
1321
|
+
const reason = errors.length ? "\u5B58\u5728\u8FD0\u884C\u671F\u9519\u8BEF" : !canvasInView ? "canvas \u4E0D\u5728\u89C6\u53E3\u5185(\u88AB\u5E03\u5C40\u63A8\u51FA\u5C4F\u5E55/\u9690\u85CF \u2192 \u7528\u6237\u770B\u5230\u9ED1\u5C4F)" : "\u5C4F\u5E55\u753B\u9762\u672A\u6E32\u67D3\u51FA\u5185\u5BB9(\u7591\u4F3C\u5D29\u6E83/\u9ED1\u5C4F)";
|
|
1303
1322
|
console.log(pc6.red(pc6.bold(`
|
|
1304
|
-
\u2717 [verify] ${platform} \u672A\u901A\u8FC7:${
|
|
1323
|
+
\u2717 [verify] ${platform} \u672A\u901A\u8FC7:${reason}`)));
|
|
1305
1324
|
}
|
|
1306
1325
|
return ok;
|
|
1307
1326
|
}
|
package/dist/index.js
CHANGED
|
@@ -2948,6 +2948,12 @@ async function startGame(opts) {
|
|
|
2948
2948
|
function createPhaserGameInstance(config, scenes) {
|
|
2949
2949
|
const gameConfig = {
|
|
2950
2950
|
type: Phaser4.AUTO,
|
|
2951
|
+
// 关键:把 canvas 挂进各平台外壳的 #game-root(外壳已为它写好布局/居中 CSS)。
|
|
2952
|
+
// 不设 parent 时 Phaser 把 canvas 追加到 document.body —— 而外壳里 #game-root 占满
|
|
2953
|
+
// 100% 高度,canvas 作为其后的块级兄弟会被挤到视口外,再被 body 的 overflow:hidden
|
|
2954
|
+
// 裁掉 → 屏幕全黑(但 canvas 后备缓冲其实已渲染,故 toDataURL/getImageData 读不出问题)。
|
|
2955
|
+
// wechat 无 DOM(weapp-adapter),'game-root' 不存在时 Phaser 自动回退,安全。
|
|
2956
|
+
parent: "game-root",
|
|
2951
2957
|
// 透明背景占位;业务场景自行绘制背景
|
|
2952
2958
|
backgroundColor: "#1f2937",
|
|
2953
2959
|
scale: {
|