vimp-engine 0.33.1 → 0.33.2
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/core/Cargo.toml
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[package]
|
|
2
2
|
name = "vimp-engine-core"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.19.0"
|
|
4
4
|
edition = "2024"
|
|
5
5
|
description = "VIMP — движковый каркас симуляции (физика, карта, снапшот-фрейминг, интерполяция/предикт/raycast-примитивы, нав-утилиты). Без wasm-bindgen — обёртки для WASM-ABI собирает game-crate."
|
|
6
6
|
license = "MIT"
|
package/package.json
CHANGED
|
@@ -36,6 +36,12 @@ export default class CanvasManagerView {
|
|
|
36
36
|
// уже несёт и смещение, и масштаб последнего updateCoords, а
|
|
37
37
|
// getBoundingClientRect закрывает случай, когда CSS растянул полотно
|
|
38
38
|
// не один к одному с его буфером.
|
|
39
|
+
//
|
|
40
|
+
// Единицы — `renderer.screen`, а не пиксели буфера полотна: трансформ
|
|
41
|
+
// сцены живёт именно в них, а `canvas.width` умножен на `resolution`
|
|
42
|
+
// рендерера. Сегодня она равна единице, и числа совпадают, но стоит
|
|
43
|
+
// включить resolution/autoDensity — и указатель промахнётся ровно во
|
|
44
|
+
// столько же раз (та же причина, что у updateCoords ниже)
|
|
39
45
|
toWorld(id, clientX, clientY) {
|
|
40
46
|
const app = this._apps[id];
|
|
41
47
|
|
|
@@ -49,8 +55,9 @@ export default class CanvasManagerView {
|
|
|
49
55
|
return null;
|
|
50
56
|
}
|
|
51
57
|
|
|
52
|
-
const
|
|
53
|
-
const
|
|
58
|
+
const screen = app.renderer.screen;
|
|
59
|
+
const px = ((clientX - rect.left) * screen.width) / rect.width;
|
|
60
|
+
const py = ((clientY - rect.top) * screen.height) / rect.height;
|
|
54
61
|
const { position, scale } = app.stage;
|
|
55
62
|
|
|
56
63
|
if (!scale.x || !scale.y) {
|
|
@@ -63,15 +70,30 @@ export default class CanvasManagerView {
|
|
|
63
70
|
};
|
|
64
71
|
}
|
|
65
72
|
|
|
66
|
-
//
|
|
73
|
+
// Вычисляет координаты для отображения и двигает сцену.
|
|
74
|
+
//
|
|
75
|
+
// Размер берётся у `renderer.screen`, а не у `canvas`: сцену двигают в
|
|
76
|
+
// ЕЁ единицах, а буфер полотна умножен на `resolution` рендерера.
|
|
77
|
+
// Совпадают они только пока resolution равен единице, и промах здесь
|
|
78
|
+
// тихий — он не ломает картинку, а уводит центр камеры, который по
|
|
79
|
+
// трансформу сцены восстанавливают части игры (проекция высоты 2.5D в
|
|
80
|
+
// `vimp-tanks`).
|
|
81
|
+
//
|
|
82
|
+
// Отрисовки здесь НЕТ. Полотно рисует тикер — `TickerPlugin` держит
|
|
83
|
+
// `app.render` на `Ticker.shared` с приоритетом LOW, то есть после
|
|
84
|
+
// `renderTick` движка, когда кадр применён целиком. Собственный
|
|
85
|
+
// `app.render()` означал бы отрисовку на КАЖДЫЙ кадр камеры (за тик их
|
|
86
|
+
// два и больше: сперва камера дискретного кадра, следом предсказанная),
|
|
87
|
+
// то есть два-три полных обхода сцены на один видимый кадр — и, что
|
|
88
|
+
// хуже, промежуточные состояния кадра, на которых части считают своё
|
|
89
|
+
// `onRender`.
|
|
67
90
|
updateCoords({ id, coords, scale }) {
|
|
68
91
|
const app = this._apps[id];
|
|
69
|
-
const { width, height } = app.
|
|
92
|
+
const { width, height } = app.renderer.screen;
|
|
70
93
|
const x = width / 2 - coords.x * scale;
|
|
71
94
|
const y = height / 2 - coords.y * scale;
|
|
72
95
|
|
|
73
96
|
app.stage.position.set(x, y);
|
|
74
97
|
app.stage.scale.set(scale);
|
|
75
|
-
app.render();
|
|
76
98
|
}
|
|
77
99
|
}
|