@zakkster/lite-camera-pro 1.0.0
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/LICENSE +21 -0
- package/README.md +692 -0
- package/llms.txt +115 -0
- package/package.json +69 -0
- package/src/BoundsSystem.js +220 -0
- package/src/CameraSequence.js +513 -0
- package/src/CinematicCameraPro.js +894 -0
- package/src/DebugHUD.js +290 -0
- package/src/FollowMode.js +179 -0
- package/src/MultiTarget.js +125 -0
- package/src/ParallaxManager.js +199 -0
- package/src/ShakeEngine.js +286 -0
- package/src/ShakePresets.js +177 -0
- package/src/index.d.ts +228 -0
- package/src/index.js +33 -0
package/src/index.d.ts
ADDED
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @zakkster/lite-camera-pro — TypeScript Declarations
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
// ── Follow Modes ──
|
|
6
|
+
export declare const FollowMode: {
|
|
7
|
+
readonly SMOOTH: 0;
|
|
8
|
+
readonly LOCK: 1;
|
|
9
|
+
readonly PREDICTIVE: 2;
|
|
10
|
+
readonly CUT: 3;
|
|
11
|
+
readonly HYBRID: 4;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export declare const FOLLOW_STRATEGIES: ReadonlyArray<
|
|
15
|
+
(cam: CinematicCameraPro, dt: number, px: number, py: number, pvx: number, pvy: number) => void
|
|
16
|
+
>;
|
|
17
|
+
|
|
18
|
+
// ── Wrap Modes ──
|
|
19
|
+
export declare const WrapMode: {
|
|
20
|
+
readonly NONE: 0;
|
|
21
|
+
readonly REPEAT_X: 1;
|
|
22
|
+
readonly REPEAT_Y: 2;
|
|
23
|
+
readonly REPEAT_BOTH: 3;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
// ── Bounds Types ──
|
|
27
|
+
export declare const BoundsType: {
|
|
28
|
+
readonly HARD: 0;
|
|
29
|
+
readonly SOFT: 1;
|
|
30
|
+
readonly ELASTIC: 2;
|
|
31
|
+
readonly NONE: 3;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
// ── Shake Profile ──
|
|
35
|
+
export interface ShakeProfile {
|
|
36
|
+
trauma?: number;
|
|
37
|
+
freq?: number;
|
|
38
|
+
decay?: number;
|
|
39
|
+
maxOffset?: number;
|
|
40
|
+
maxAngle?: number;
|
|
41
|
+
dirX?: number;
|
|
42
|
+
dirY?: number;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// ── Shake Presets ──
|
|
46
|
+
export declare const EXPLOSION: Readonly<ShakeProfile>;
|
|
47
|
+
export declare const EARTHQUAKE: Readonly<ShakeProfile>;
|
|
48
|
+
export declare const RECOIL: Readonly<ShakeProfile>;
|
|
49
|
+
export declare const IMPACT: Readonly<ShakeProfile>;
|
|
50
|
+
export declare const LANDING: Readonly<ShakeProfile>;
|
|
51
|
+
export declare const DAMAGE: Readonly<ShakeProfile>;
|
|
52
|
+
export declare const RUMBLE: Readonly<ShakeProfile>;
|
|
53
|
+
export declare const HEAVY_IMPACT: Readonly<ShakeProfile>;
|
|
54
|
+
|
|
55
|
+
export declare function getPreset(name: string): ShakeProfile | null;
|
|
56
|
+
export declare function registerPreset(name: string, profile: ShakeProfile): void;
|
|
57
|
+
export declare function listPresets(): string[];
|
|
58
|
+
|
|
59
|
+
// ── Vec2 ──
|
|
60
|
+
export interface Vec2 {
|
|
61
|
+
x: number;
|
|
62
|
+
y: number;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// ── Debug HUD Config ──
|
|
66
|
+
export interface DebugHUDConfig {
|
|
67
|
+
show: {
|
|
68
|
+
position: boolean;
|
|
69
|
+
zoom: boolean;
|
|
70
|
+
mode: boolean;
|
|
71
|
+
shake: boolean;
|
|
72
|
+
sequence: boolean;
|
|
73
|
+
parallax: boolean;
|
|
74
|
+
bounds: boolean;
|
|
75
|
+
deadzone: boolean;
|
|
76
|
+
lookahead: boolean;
|
|
77
|
+
};
|
|
78
|
+
x: number;
|
|
79
|
+
y: number;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export declare function createDebugHUDConfig(): DebugHUDConfig;
|
|
83
|
+
export declare function drawDebugHUD(cam: CinematicCameraPro, ctx: CanvasRenderingContext2D, config?: DebugHUDConfig): void;
|
|
84
|
+
export declare function drawDebugWorld(cam: CinematicCameraPro, ctx: CanvasRenderingContext2D, config?: DebugHUDConfig): void;
|
|
85
|
+
|
|
86
|
+
// ── Camera Sequence ──
|
|
87
|
+
export interface CameraSequenceOptions {
|
|
88
|
+
loop?: boolean;
|
|
89
|
+
onComplete?: () => void;
|
|
90
|
+
blendOutTime?: number;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export interface StepOptions {
|
|
94
|
+
ease?: (t: number) => number;
|
|
95
|
+
at?: string | number;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export interface CameraSequence {
|
|
99
|
+
moveTo(x: number, y: number, duration: number, opts?: StepOptions): CameraSequence;
|
|
100
|
+
zoomTo(level: number, duration: number, opts?: StepOptions): CameraSequence;
|
|
101
|
+
moveAndZoom(x: number, y: number, level: number, duration: number, opts?: StepOptions): CameraSequence;
|
|
102
|
+
shake(profileOrName: string | ShakeProfile, intensity?: number, opts?: StepOptions): CameraSequence;
|
|
103
|
+
wait(duration: number, opts?: StepOptions): CameraSequence;
|
|
104
|
+
call(fn: () => void, opts?: StepOptions): CameraSequence;
|
|
105
|
+
play(): CameraSequence;
|
|
106
|
+
pause(): CameraSequence;
|
|
107
|
+
resume(): CameraSequence;
|
|
108
|
+
stop(): CameraSequence;
|
|
109
|
+
seek(timeMs: number): CameraSequence;
|
|
110
|
+
destroy(): void;
|
|
111
|
+
readonly duration: number;
|
|
112
|
+
readonly progress: number;
|
|
113
|
+
readonly playing: boolean;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export declare function createCameraSequence(cam: CinematicCameraPro, options?: CameraSequenceOptions): CameraSequence;
|
|
117
|
+
export declare function panTo(cam: CinematicCameraPro, x: number, y: number, duration: number, opts?: CameraSequenceOptions & StepOptions): CameraSequence;
|
|
118
|
+
export declare function dramaticZoom(cam: CinematicCameraPro, x: number, y: number, zoom: number, duration: number, opts?: CameraSequenceOptions & StepOptions): CameraSequence;
|
|
119
|
+
export declare function bossReveal(cam: CinematicCameraPro, x: number, y: number, totalMs?: number, opts?: CameraSequenceOptions): CameraSequence;
|
|
120
|
+
export declare function timedShake(cam: CinematicCameraPro, presetOrProfile: string | ShakeProfile, holdMs?: number, opts?: CameraSequenceOptions): CameraSequence;
|
|
121
|
+
|
|
122
|
+
// ── Multi-Target Options ──
|
|
123
|
+
export interface MultiTargetOptions {
|
|
124
|
+
paddingX?: number;
|
|
125
|
+
paddingY?: number;
|
|
126
|
+
padding?: number;
|
|
127
|
+
minZoom?: number;
|
|
128
|
+
maxZoom?: number;
|
|
129
|
+
zoomSpeed?: number;
|
|
130
|
+
followSpeed?: number;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// ── Bounds Config ──
|
|
134
|
+
export interface BoundsEdgesConfig {
|
|
135
|
+
left?: number;
|
|
136
|
+
right?: number;
|
|
137
|
+
top?: number;
|
|
138
|
+
bottom?: number;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// ── Main Camera Class ──
|
|
142
|
+
export declare class CinematicCameraPro {
|
|
143
|
+
constructor(viewW: number, viewH: number, worldW: number, worldH: number, seed?: number);
|
|
144
|
+
|
|
145
|
+
// ── Public state ──
|
|
146
|
+
readonly pos: Float32Array;
|
|
147
|
+
readonly target: Float32Array;
|
|
148
|
+
readonly look: Float32Array;
|
|
149
|
+
|
|
150
|
+
viewW: number;
|
|
151
|
+
viewH: number;
|
|
152
|
+
worldW: number;
|
|
153
|
+
worldH: number;
|
|
154
|
+
|
|
155
|
+
zoom: number;
|
|
156
|
+
minZoom: number;
|
|
157
|
+
maxZoom: number;
|
|
158
|
+
visibleW: number;
|
|
159
|
+
visibleH: number;
|
|
160
|
+
|
|
161
|
+
deadzoneX: number;
|
|
162
|
+
deadzoneY: number;
|
|
163
|
+
lookaheadDist: number;
|
|
164
|
+
lookaheadSpeed: number;
|
|
165
|
+
lerpSpeed: number;
|
|
166
|
+
|
|
167
|
+
mode: number;
|
|
168
|
+
predictTime: number;
|
|
169
|
+
hybridVerticalSnap: boolean;
|
|
170
|
+
|
|
171
|
+
debugConfig: DebugHUDConfig;
|
|
172
|
+
|
|
173
|
+
// ── Follow Mode ──
|
|
174
|
+
setMode(mode: number): this;
|
|
175
|
+
|
|
176
|
+
// ── Multi-Target ──
|
|
177
|
+
trackMultiple(targets: Vec2[], options?: MultiTargetOptions): this;
|
|
178
|
+
trackSingle(): this;
|
|
179
|
+
setTargetCount(count: number): this;
|
|
180
|
+
|
|
181
|
+
// ── Shake ──
|
|
182
|
+
addTrauma(amount: number): this;
|
|
183
|
+
shake(profile: ShakeProfile, intensity?: number): this;
|
|
184
|
+
shakePreset(name: string, intensity?: number): this;
|
|
185
|
+
clearShakes(): this;
|
|
186
|
+
|
|
187
|
+
// ── Sequences ──
|
|
188
|
+
createSequence(options?: CameraSequenceOptions): CameraSequence;
|
|
189
|
+
playSequence(seq: CameraSequence): this;
|
|
190
|
+
stopSequence(): this;
|
|
191
|
+
readonly sequencePlaying: boolean;
|
|
192
|
+
|
|
193
|
+
// ── Zoom ──
|
|
194
|
+
setZoom(level: number, duration?: number, ease?: (t: number) => number): this;
|
|
195
|
+
zoomAt(targetOrX: number | Vec2, yOrLevel: number, levelOrDur?: number, duration?: number, ease?: (t: number) => number): this;
|
|
196
|
+
|
|
197
|
+
// ── Coordinate Conversion ──
|
|
198
|
+
screenToWorld(sx: number, sy: number, out: Vec2): Vec2;
|
|
199
|
+
worldToScreen(wx: number, wy: number, out: Vec2): Vec2;
|
|
200
|
+
|
|
201
|
+
// ── Parallax ──
|
|
202
|
+
addParallaxLayer(id: string, speedX: number, speedY?: number, opts?: { offsetX?: number; offsetY?: number; wrap?: number }): this;
|
|
203
|
+
removeParallaxLayer(id: string): this;
|
|
204
|
+
applyParallax(id: string, ctx: CanvasRenderingContext2D): boolean;
|
|
205
|
+
|
|
206
|
+
// ── Bounds ──
|
|
207
|
+
setBoundsType(type: number): this;
|
|
208
|
+
setBoundsEdges(config: BoundsEdgesConfig): this;
|
|
209
|
+
setBoundsRect(x: number, y: number, w: number, h: number): this;
|
|
210
|
+
clearBoundsRect(): this;
|
|
211
|
+
|
|
212
|
+
// ── Core ──
|
|
213
|
+
update(dt: number, px: number, py: number, pvx?: number, pvy?: number): void;
|
|
214
|
+
apply(ctx: CanvasRenderingContext2D): void;
|
|
215
|
+
|
|
216
|
+
// ── Debug ──
|
|
217
|
+
debug(ctx: CanvasRenderingContext2D): void;
|
|
218
|
+
debugHUD(ctx: CanvasRenderingContext2D): void;
|
|
219
|
+
|
|
220
|
+
// ── Save / Load ──
|
|
221
|
+
getState(): { posX: number; posY: number; targetX: number; targetY: number; zoom: number; mode: number };
|
|
222
|
+
setState(snapshot: { posX?: number; posY?: number; targetX?: number; targetY?: number; zoom?: number; mode?: number }): this;
|
|
223
|
+
|
|
224
|
+
// ── Lifecycle ──
|
|
225
|
+
destroy(): void;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
export default CinematicCameraPro;
|
package/src/index.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @zakkster/lite-camera-pro
|
|
3
|
+
* Commercial cinematic camera system for Canvas2D games.
|
|
4
|
+
*
|
|
5
|
+
* Built on: lite-camera, lite-lerp, lite-ease, lite-random, lite-noise, lite-timeline
|
|
6
|
+
* Zero external dependencies outside the @zakkster ecosystem.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
// ── Core ──
|
|
10
|
+
export { CinematicCameraPro } from './CinematicCameraPro.js';
|
|
11
|
+
export { default } from './CinematicCameraPro.js';
|
|
12
|
+
|
|
13
|
+
// ── Follow Modes ──
|
|
14
|
+
export { FollowMode, FOLLOW_STRATEGIES } from './FollowMode.js';
|
|
15
|
+
|
|
16
|
+
// ── Multi-Target ──
|
|
17
|
+
export { updateMultiTarget } from './MultiTarget.js';
|
|
18
|
+
|
|
19
|
+
// ── Shake Engine ──
|
|
20
|
+
export { addShake, addTraumaSimple, updateShake, computeShake, clearShakes } from './ShakeEngine.js';
|
|
21
|
+
export { EXPLOSION, EARTHQUAKE, RECOIL, IMPACT, LANDING, DAMAGE, RUMBLE, HEAVY_IMPACT, getPreset, registerPreset, listPresets } from './ShakePresets.js';
|
|
22
|
+
|
|
23
|
+
// ── Sequences ──
|
|
24
|
+
export { createCameraSequence, panTo, dramaticZoom, bossReveal, timedShake } from './CameraSequence.js';
|
|
25
|
+
|
|
26
|
+
// ── Parallax ──
|
|
27
|
+
export { WrapMode, createParallaxState, addParallaxLayer, removeParallaxLayer, updateParallax, getLayerScroll, applyParallaxLayer } from './ParallaxManager.js';
|
|
28
|
+
|
|
29
|
+
// ── Bounds ──
|
|
30
|
+
export { BoundsType, createBoundsState, setBoundsAll, setBoundsEdges, setBoundsRect, clearBoundsRect, applyBounds } from './BoundsSystem.js';
|
|
31
|
+
|
|
32
|
+
// ── Debug HUD ──
|
|
33
|
+
export { createDebugHUDConfig, drawDebugHUD, drawDebugWorld } from './DebugHUD.js';
|