fruta 0.0.3 → 0.1.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 +367 -26
- package/dist/animation/anim.d.ts +13 -0
- package/dist/animation/animate.d.ts +101 -0
- package/dist/audio/audio.d.ts +29 -0
- package/dist/fruta.d.ts +302 -0
- package/dist/fruta.js +19 -0
- package/dist/frutaGl.d.ts +277 -0
- package/dist/game/behaviors.d.ts +38 -0
- package/dist/game/charts.d.ts +127 -0
- package/dist/game/play.d.ts +4 -0
- package/dist/game/project.d.ts +54 -0
- package/dist/input/gamepad.d.ts +38 -0
- package/dist/math/math.d.ts +37 -0
- package/dist/math/pathfind.d.ts +7 -0
- package/dist/math/physics.d.ts +38 -0
- package/dist/math/pool.d.ts +11 -0
- package/dist/math/spatial.d.ts +10 -0
- package/dist/render/create/FontCreator.d.ts +16 -0
- package/dist/render/create/SaveRestore.d.ts +5 -0
- package/dist/render/create/ShapeCreator.d.ts +49 -0
- package/dist/render/create/canvasTarget.d.ts +5 -0
- package/dist/render/shaders.d.ts +29 -0
- package/dist/render/webgl.d.ts +67 -0
- package/dist/renderer.d.ts +42 -0
- package/dist/types.d.ts +9 -0
- package/dist/utils/logStyle.d.ts +1 -0
- package/dist/world/camera.d.ts +24 -0
- package/dist/world/entities.d.ts +45 -0
- package/dist/world/particles.d.ts +42 -0
- package/dist/world/tilemap.d.ts +44 -0
- package/dist/world/timers.d.ts +11 -0
- package/package.json +35 -35
- package/DOCUMENTATION.MD +0 -874
- package/dist/main.js +0 -1
- package/index.html +0 -9
- package/settings.json +0 -6
- package/src/core/create/_fontCreator.js +0 -11
- package/src/core/create/_saveOrRestore.js +0 -22
- package/src/core/create/_shapeCreator.js +0 -20
- package/src/core/create/fontCreatorMixin.js +0 -167
- package/src/core/create/shapeCreatorMixin.js +0 -656
- package/src/core/fruta.js +0 -22
- package/src/core/game/game.js +0 -30
- package/src/core/game/scene.js +0 -29
- package/src/core/game/tick.js +0 -42
- package/src/core/utils/logStyle.js +0 -8
- package/src/core/utils/utils.js +0 -0
- package/src/methods/constants.js +0 -0
- package/src/methods/creator/_scene.js +0 -0
- package/src/methods/creator/creator.js +0 -0
- package/webpack.config.js +0 -47
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import { WebGLBatch, type Uniforms } from './render/webgl';
|
|
2
|
+
import { type ShaderName } from './render/shaders';
|
|
3
|
+
import { type Entity, type EntitySpec } from './world/entities';
|
|
4
|
+
import { Tilemap, type TilemapConfig } from './world/tilemap';
|
|
5
|
+
import * as M from './math/math';
|
|
6
|
+
import { World, type WorldOptions } from './math/physics';
|
|
7
|
+
import { type BurstOptions, type EmitterOptions, type Emitter } from './world/particles';
|
|
8
|
+
import { type TimerHandle } from './world/timers';
|
|
9
|
+
import { type PlayOptions, type Sound, type BeepOptions } from './audio/audio';
|
|
10
|
+
import { Tween, Timeline, type EaseFn, type EaseName } from './animation/animate';
|
|
11
|
+
import { Anim, type AnimState } from './animation/anim';
|
|
12
|
+
import { GamepadController, type GamepadConfig } from './input/gamepad';
|
|
13
|
+
export interface GLScene {
|
|
14
|
+
enter?(): void;
|
|
15
|
+
update?(dt: number, time: number): void;
|
|
16
|
+
leave?(): void;
|
|
17
|
+
}
|
|
18
|
+
export interface GLTweenOptions {
|
|
19
|
+
to: Record<string, number | string>;
|
|
20
|
+
duration: number;
|
|
21
|
+
ease?: EaseName | EaseFn;
|
|
22
|
+
delay?: number;
|
|
23
|
+
repeat?: number;
|
|
24
|
+
yoyo?: boolean;
|
|
25
|
+
onUpdate?: (target: Record<string, number>, progress: number) => void;
|
|
26
|
+
onComplete?: () => void;
|
|
27
|
+
}
|
|
28
|
+
export interface FrutaGLConfig {
|
|
29
|
+
width?: number;
|
|
30
|
+
height?: number;
|
|
31
|
+
canvas?: HTMLCanvasElement | string;
|
|
32
|
+
background?: string;
|
|
33
|
+
mount?: HTMLElement | string;
|
|
34
|
+
}
|
|
35
|
+
export interface GLGradient {
|
|
36
|
+
readonly _grad: true;
|
|
37
|
+
kind: 'linear' | 'radial';
|
|
38
|
+
stops: Array<[number, string]>;
|
|
39
|
+
angle: number;
|
|
40
|
+
key: string;
|
|
41
|
+
}
|
|
42
|
+
export type GLFill = string | GLGradient;
|
|
43
|
+
export interface GLRect {
|
|
44
|
+
x: number;
|
|
45
|
+
y: number;
|
|
46
|
+
w: number;
|
|
47
|
+
h: number;
|
|
48
|
+
fill?: GLFill;
|
|
49
|
+
rotation?: number;
|
|
50
|
+
alpha?: number;
|
|
51
|
+
}
|
|
52
|
+
export interface GLCircle {
|
|
53
|
+
x: number;
|
|
54
|
+
y: number;
|
|
55
|
+
r: number;
|
|
56
|
+
fill?: GLFill;
|
|
57
|
+
alpha?: number;
|
|
58
|
+
}
|
|
59
|
+
export interface GLPolygon {
|
|
60
|
+
points: Array<{
|
|
61
|
+
x: number;
|
|
62
|
+
y: number;
|
|
63
|
+
}>;
|
|
64
|
+
fill?: GLFill;
|
|
65
|
+
alpha?: number;
|
|
66
|
+
}
|
|
67
|
+
export interface GLSprite {
|
|
68
|
+
x: number;
|
|
69
|
+
y: number;
|
|
70
|
+
w?: number;
|
|
71
|
+
h?: number;
|
|
72
|
+
rotation?: number;
|
|
73
|
+
alpha?: number;
|
|
74
|
+
flipX?: boolean;
|
|
75
|
+
frame?: number;
|
|
76
|
+
frameW?: number;
|
|
77
|
+
frameH?: number;
|
|
78
|
+
cols?: number;
|
|
79
|
+
}
|
|
80
|
+
export interface GLTransform {
|
|
81
|
+
x?: number;
|
|
82
|
+
y?: number;
|
|
83
|
+
rotate?: number;
|
|
84
|
+
scale?: number | {
|
|
85
|
+
x: number;
|
|
86
|
+
y: number;
|
|
87
|
+
};
|
|
88
|
+
alpha?: number;
|
|
89
|
+
}
|
|
90
|
+
export interface GLEllipse {
|
|
91
|
+
x: number;
|
|
92
|
+
y: number;
|
|
93
|
+
rx: number;
|
|
94
|
+
ry: number;
|
|
95
|
+
rotation?: number;
|
|
96
|
+
fill?: GLFill;
|
|
97
|
+
alpha?: number;
|
|
98
|
+
}
|
|
99
|
+
export interface GLLine {
|
|
100
|
+
x1: number;
|
|
101
|
+
y1: number;
|
|
102
|
+
x2: number;
|
|
103
|
+
y2: number;
|
|
104
|
+
stroke?: string;
|
|
105
|
+
strokeWidth?: number;
|
|
106
|
+
alpha?: number;
|
|
107
|
+
}
|
|
108
|
+
export interface GLText {
|
|
109
|
+
x: number;
|
|
110
|
+
y: number;
|
|
111
|
+
fill?: string;
|
|
112
|
+
size?: number;
|
|
113
|
+
font?: string;
|
|
114
|
+
weight?: string;
|
|
115
|
+
align?: 'left' | 'center' | 'right';
|
|
116
|
+
alpha?: number;
|
|
117
|
+
}
|
|
118
|
+
export type Point = {
|
|
119
|
+
x: number;
|
|
120
|
+
y: number;
|
|
121
|
+
};
|
|
122
|
+
export type GLLoopFn = (dt: number, time: number) => void;
|
|
123
|
+
export declare class GLCamera {
|
|
124
|
+
private readonly gl;
|
|
125
|
+
x: number;
|
|
126
|
+
y: number;
|
|
127
|
+
zoom: number;
|
|
128
|
+
constructor(gl: FrutaGL);
|
|
129
|
+
follow(target: {
|
|
130
|
+
x: number;
|
|
131
|
+
y: number;
|
|
132
|
+
}, smooth?: number): void;
|
|
133
|
+
clamp(minX: number, minY: number, maxX: number, maxY: number): void;
|
|
134
|
+
begin(): void;
|
|
135
|
+
end(): void;
|
|
136
|
+
screenToWorld(px: number, py: number): Point;
|
|
137
|
+
}
|
|
138
|
+
export declare class FrutaGL {
|
|
139
|
+
readonly canvas: HTMLCanvasElement;
|
|
140
|
+
readonly batch: WebGLBatch;
|
|
141
|
+
private bg;
|
|
142
|
+
private stack;
|
|
143
|
+
private m;
|
|
144
|
+
private alpha;
|
|
145
|
+
private readonly circleTex;
|
|
146
|
+
private readonly colorCache;
|
|
147
|
+
private readonly normCtx;
|
|
148
|
+
private readonly warned;
|
|
149
|
+
readonly camera: GLCamera;
|
|
150
|
+
private entities;
|
|
151
|
+
private readonly particles;
|
|
152
|
+
private readonly timers;
|
|
153
|
+
private readonly audio;
|
|
154
|
+
private anims;
|
|
155
|
+
private gamepads;
|
|
156
|
+
private scenes;
|
|
157
|
+
private currentScene;
|
|
158
|
+
private currentSceneName;
|
|
159
|
+
private transition;
|
|
160
|
+
private debugOn;
|
|
161
|
+
private fps;
|
|
162
|
+
private readonly watched;
|
|
163
|
+
private postFX;
|
|
164
|
+
private postSrc;
|
|
165
|
+
private postUniforms;
|
|
166
|
+
private readonly textCanvas;
|
|
167
|
+
private readonly textCtx;
|
|
168
|
+
private readonly textCache;
|
|
169
|
+
private textSeq;
|
|
170
|
+
private static readonly TEXT_CACHE_MAX;
|
|
171
|
+
private readonly gradCanvas;
|
|
172
|
+
private readonly gradCtx;
|
|
173
|
+
private readonly gradCache;
|
|
174
|
+
private gradSeq;
|
|
175
|
+
private userLoop;
|
|
176
|
+
private rafId;
|
|
177
|
+
private lastTime;
|
|
178
|
+
time: number;
|
|
179
|
+
timeScale: number;
|
|
180
|
+
private _mouse;
|
|
181
|
+
private _down;
|
|
182
|
+
private keys;
|
|
183
|
+
private keyHandlers;
|
|
184
|
+
private pressHandlers;
|
|
185
|
+
private clickHandlers;
|
|
186
|
+
private moveHandlers;
|
|
187
|
+
private readonly scrollKeys;
|
|
188
|
+
private readonly onKeyDown;
|
|
189
|
+
private readonly onKeyUp;
|
|
190
|
+
private readonly onPointerMove;
|
|
191
|
+
private readonly onPointerDown;
|
|
192
|
+
private readonly onPointerUp;
|
|
193
|
+
private readonly onClickEv;
|
|
194
|
+
constructor(config?: FrutaGLConfig);
|
|
195
|
+
mount(parent?: HTMLElement): this;
|
|
196
|
+
addImage(name: string, source: TexImageSource): this;
|
|
197
|
+
load(assets: Record<string, string>): Promise<void>;
|
|
198
|
+
background(color?: string): this;
|
|
199
|
+
clear(): this;
|
|
200
|
+
rect(o: GLRect): this;
|
|
201
|
+
circle(o: GLCircle): this;
|
|
202
|
+
ellipse(o: GLEllipse): this;
|
|
203
|
+
polygon(o: GLPolygon): this;
|
|
204
|
+
linearGradient(stops: Array<[number, string]> | string[], angle?: number): GLGradient;
|
|
205
|
+
radialGradient(stops: Array<[number, string]> | string[]): GLGradient;
|
|
206
|
+
private makeGradient;
|
|
207
|
+
private fillShape;
|
|
208
|
+
private gradientTexture;
|
|
209
|
+
private tp;
|
|
210
|
+
line(o: GLLine): this;
|
|
211
|
+
text(content: string, o: GLText): this;
|
|
212
|
+
sprite(name: string, o: GLSprite): this;
|
|
213
|
+
push(t?: GLTransform): this;
|
|
214
|
+
pop(): this;
|
|
215
|
+
private corners;
|
|
216
|
+
loop(fn: GLLoopFn): this;
|
|
217
|
+
private startEngine;
|
|
218
|
+
stop(): this;
|
|
219
|
+
add(spec: EntitySpec): Entity;
|
|
220
|
+
drawEntities(): this;
|
|
221
|
+
get all(): Entity[];
|
|
222
|
+
tilemap(config: TilemapConfig): Tilemap;
|
|
223
|
+
gamepad(config?: GamepadConfig): GamepadController;
|
|
224
|
+
hits(a: M.Shape, b: M.Shape): boolean;
|
|
225
|
+
inside(p: M.Vec, s: M.Shape): boolean;
|
|
226
|
+
solve(a: {
|
|
227
|
+
x: number;
|
|
228
|
+
y: number;
|
|
229
|
+
w: number;
|
|
230
|
+
h: number;
|
|
231
|
+
vx?: number;
|
|
232
|
+
vy?: number;
|
|
233
|
+
onGround?: boolean;
|
|
234
|
+
}, b: M.Rect): 'x' | 'y' | null;
|
|
235
|
+
physics(opts?: WorldOptions): World;
|
|
236
|
+
overlap<A extends M.Shape, B extends M.Shape>(a: A | A[], b: B | B[], onHit?: (a: A, b: B) => void): this;
|
|
237
|
+
burst(opts: BurstOptions): this;
|
|
238
|
+
emit(opts: EmitterOptions): Emitter;
|
|
239
|
+
drawParticles(): this;
|
|
240
|
+
after(seconds: number, fn: () => void): TimerHandle;
|
|
241
|
+
every(seconds: number, fn: () => void): TimerHandle;
|
|
242
|
+
store(key: string, value: unknown): this;
|
|
243
|
+
stored<T>(key: string, fallback: T): T;
|
|
244
|
+
play(name: string, opts?: PlayOptions): Sound;
|
|
245
|
+
beep(opts?: BeepOptions): this;
|
|
246
|
+
volume(v: number): this;
|
|
247
|
+
mute(on?: boolean): this;
|
|
248
|
+
loadAudio(assets: Record<string, string>): Promise<void>;
|
|
249
|
+
scene(name: string, def: GLScene): this;
|
|
250
|
+
start(name: string, fadeSeconds?: number): this;
|
|
251
|
+
private swapScene;
|
|
252
|
+
tween<T extends object>(target: T, opts: GLTweenOptions): Tween;
|
|
253
|
+
stagger<T extends object>(targets: T[], opts: GLTweenOptions & {
|
|
254
|
+
each?: number;
|
|
255
|
+
}): Tween[];
|
|
256
|
+
timeline(): Timeline;
|
|
257
|
+
anim(states: Record<string, AnimState>): Anim;
|
|
258
|
+
private buildTween;
|
|
259
|
+
private normalizeColor;
|
|
260
|
+
debug(on?: boolean): this;
|
|
261
|
+
watch(label: string, value: unknown): this;
|
|
262
|
+
private drawDebug;
|
|
263
|
+
shader(frag: string): {
|
|
264
|
+
draw: (uniforms?: Record<string, number | [number, number]>) => void;
|
|
265
|
+
};
|
|
266
|
+
effect(name: ShaderName | string | null, uniforms?: Uniforms): this;
|
|
267
|
+
get mouse(): Point;
|
|
268
|
+
get mouseDown(): boolean;
|
|
269
|
+
keyDown(key: string): boolean;
|
|
270
|
+
onKey(key: string, fn: () => void): this;
|
|
271
|
+
onPress(fn: (p: Point) => void): this;
|
|
272
|
+
onClick(fn: (p: Point) => void): this;
|
|
273
|
+
onMove(fn: (p: Point) => void): this;
|
|
274
|
+
destroy(): void;
|
|
275
|
+
private setMouse;
|
|
276
|
+
private parse;
|
|
277
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { BehaviorSpec } from './project';
|
|
2
|
+
export interface PlayEntity {
|
|
3
|
+
x: number;
|
|
4
|
+
y: number;
|
|
5
|
+
vx: number;
|
|
6
|
+
vy: number;
|
|
7
|
+
onGround: boolean;
|
|
8
|
+
alive: boolean;
|
|
9
|
+
r?: number;
|
|
10
|
+
w?: number;
|
|
11
|
+
h?: number;
|
|
12
|
+
rotation?: number;
|
|
13
|
+
tag?: string;
|
|
14
|
+
id?: string;
|
|
15
|
+
remove(): void;
|
|
16
|
+
[key: string]: unknown;
|
|
17
|
+
}
|
|
18
|
+
export interface PlayContext {
|
|
19
|
+
app: {
|
|
20
|
+
keyDown(key: string): boolean;
|
|
21
|
+
mouse: {
|
|
22
|
+
x: number;
|
|
23
|
+
y: number;
|
|
24
|
+
};
|
|
25
|
+
mouseDown: boolean;
|
|
26
|
+
};
|
|
27
|
+
map?: {
|
|
28
|
+
move(body: unknown, dt: number): void;
|
|
29
|
+
};
|
|
30
|
+
find(idOrTag: string): PlayEntity | undefined;
|
|
31
|
+
width: number;
|
|
32
|
+
height: number;
|
|
33
|
+
}
|
|
34
|
+
export type BehaviorFn = (e: PlayEntity, dt: number, time: number, ctx: PlayContext) => void;
|
|
35
|
+
export type BehaviorFactory = (params: Record<string, unknown>) => BehaviorFn;
|
|
36
|
+
export declare const BEHAVIORS: Record<string, BehaviorFactory>;
|
|
37
|
+
export declare const behaviorNames: () => string[];
|
|
38
|
+
export declare function resolveBehavior(spec: BehaviorSpec, scripts?: Record<string, BehaviorFn>): BehaviorFn | null;
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
export interface ChartSurface {
|
|
2
|
+
canvas: {
|
|
3
|
+
width: number;
|
|
4
|
+
height: number;
|
|
5
|
+
};
|
|
6
|
+
rect(o: {
|
|
7
|
+
x: number;
|
|
8
|
+
y: number;
|
|
9
|
+
w: number;
|
|
10
|
+
h: number;
|
|
11
|
+
fill?: string;
|
|
12
|
+
stroke?: string;
|
|
13
|
+
strokeWidth?: number;
|
|
14
|
+
radius?: number;
|
|
15
|
+
}): unknown;
|
|
16
|
+
circle(o: {
|
|
17
|
+
x: number;
|
|
18
|
+
y: number;
|
|
19
|
+
r: number;
|
|
20
|
+
fill?: string;
|
|
21
|
+
stroke?: string;
|
|
22
|
+
strokeWidth?: number;
|
|
23
|
+
}): unknown;
|
|
24
|
+
line(o: {
|
|
25
|
+
x1: number;
|
|
26
|
+
y1: number;
|
|
27
|
+
x2: number;
|
|
28
|
+
y2: number;
|
|
29
|
+
stroke?: string;
|
|
30
|
+
strokeWidth?: number;
|
|
31
|
+
}): unknown;
|
|
32
|
+
text(content: string, o: {
|
|
33
|
+
x: number;
|
|
34
|
+
y: number;
|
|
35
|
+
fill?: string;
|
|
36
|
+
size?: number;
|
|
37
|
+
align?: CanvasTextAlign;
|
|
38
|
+
baseline?: CanvasTextBaseline;
|
|
39
|
+
}): unknown;
|
|
40
|
+
polygon(o: {
|
|
41
|
+
points: {
|
|
42
|
+
x: number;
|
|
43
|
+
y: number;
|
|
44
|
+
}[];
|
|
45
|
+
fill?: string;
|
|
46
|
+
stroke?: string;
|
|
47
|
+
strokeWidth?: number;
|
|
48
|
+
close?: boolean;
|
|
49
|
+
}): unknown;
|
|
50
|
+
}
|
|
51
|
+
export type ChartDatum = {
|
|
52
|
+
label?: string;
|
|
53
|
+
value: number;
|
|
54
|
+
color?: string;
|
|
55
|
+
};
|
|
56
|
+
export type Series = {
|
|
57
|
+
name?: string;
|
|
58
|
+
color?: string;
|
|
59
|
+
data: number[];
|
|
60
|
+
};
|
|
61
|
+
export type RadarSeries = {
|
|
62
|
+
name?: string;
|
|
63
|
+
color?: string;
|
|
64
|
+
values: number[];
|
|
65
|
+
};
|
|
66
|
+
interface Box {
|
|
67
|
+
x?: number;
|
|
68
|
+
y?: number;
|
|
69
|
+
w?: number;
|
|
70
|
+
h?: number;
|
|
71
|
+
}
|
|
72
|
+
export interface LegendOptions {
|
|
73
|
+
items: {
|
|
74
|
+
label: string;
|
|
75
|
+
color: string;
|
|
76
|
+
}[];
|
|
77
|
+
x: number;
|
|
78
|
+
y: number;
|
|
79
|
+
size?: number;
|
|
80
|
+
}
|
|
81
|
+
export declare function legend(s: ChartSurface, o: LegendOptions): void;
|
|
82
|
+
export interface BarOptions extends Box {
|
|
83
|
+
data: number[] | ChartDatum[];
|
|
84
|
+
max?: number;
|
|
85
|
+
colors?: string[];
|
|
86
|
+
showValues?: boolean;
|
|
87
|
+
progress?: number;
|
|
88
|
+
}
|
|
89
|
+
export declare function barChart(s: ChartSurface, o: BarOptions): void;
|
|
90
|
+
export interface LineChartOptions extends Box {
|
|
91
|
+
series?: Series[];
|
|
92
|
+
data?: number[];
|
|
93
|
+
min?: number;
|
|
94
|
+
max?: number;
|
|
95
|
+
grid?: boolean;
|
|
96
|
+
points?: boolean;
|
|
97
|
+
legend?: boolean;
|
|
98
|
+
colors?: string[];
|
|
99
|
+
progress?: number;
|
|
100
|
+
}
|
|
101
|
+
export declare function lineChart(s: ChartSurface, o: LineChartOptions): void;
|
|
102
|
+
export interface PieOptions {
|
|
103
|
+
data: number[] | ChartDatum[];
|
|
104
|
+
x?: number;
|
|
105
|
+
y?: number;
|
|
106
|
+
r?: number;
|
|
107
|
+
donut?: number;
|
|
108
|
+
colors?: string[];
|
|
109
|
+
legend?: boolean;
|
|
110
|
+
progress?: number;
|
|
111
|
+
}
|
|
112
|
+
export declare function pieChart(s: ChartSurface, o: PieOptions): void;
|
|
113
|
+
export interface RadarOptions {
|
|
114
|
+
axes: string[];
|
|
115
|
+
values?: number[];
|
|
116
|
+
series?: RadarSeries[];
|
|
117
|
+
x?: number;
|
|
118
|
+
y?: number;
|
|
119
|
+
r?: number;
|
|
120
|
+
max?: number;
|
|
121
|
+
rings?: number;
|
|
122
|
+
colors?: string[];
|
|
123
|
+
legend?: boolean;
|
|
124
|
+
progress?: number;
|
|
125
|
+
}
|
|
126
|
+
export declare function radar(s: ChartSurface, o: RadarOptions): void;
|
|
127
|
+
export {};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import Fruta from '../fruta';
|
|
2
|
+
import type { GameProject } from './project';
|
|
3
|
+
import { type BehaviorFn } from './behaviors';
|
|
4
|
+
export declare function playProject(el: HTMLElement | string, project: GameProject, scripts?: Record<string, BehaviorFn>): ReturnType<typeof Fruta>;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export interface GameProject {
|
|
2
|
+
meta: {
|
|
3
|
+
name: string;
|
|
4
|
+
width: number;
|
|
5
|
+
height: number;
|
|
6
|
+
background?: string;
|
|
7
|
+
};
|
|
8
|
+
assets?: {
|
|
9
|
+
sprites?: Record<string, string>;
|
|
10
|
+
sounds?: Record<string, string>;
|
|
11
|
+
};
|
|
12
|
+
scenes: GameScene[];
|
|
13
|
+
start?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface GameScene {
|
|
16
|
+
name: string;
|
|
17
|
+
background?: string;
|
|
18
|
+
tilemap?: {
|
|
19
|
+
size: number;
|
|
20
|
+
data: string[];
|
|
21
|
+
tiles: Record<string, {
|
|
22
|
+
solid?: boolean;
|
|
23
|
+
color?: string;
|
|
24
|
+
}>;
|
|
25
|
+
};
|
|
26
|
+
camera?: {
|
|
27
|
+
follow: string;
|
|
28
|
+
clamp?: boolean;
|
|
29
|
+
};
|
|
30
|
+
entities: GameEntity[];
|
|
31
|
+
}
|
|
32
|
+
export interface GameEntity {
|
|
33
|
+
id?: string;
|
|
34
|
+
tag?: string;
|
|
35
|
+
x: number;
|
|
36
|
+
y: number;
|
|
37
|
+
shape?: 'rect' | 'circle';
|
|
38
|
+
w?: number;
|
|
39
|
+
h?: number;
|
|
40
|
+
r?: number;
|
|
41
|
+
color?: string;
|
|
42
|
+
sprite?: string;
|
|
43
|
+
rotation?: number;
|
|
44
|
+
vx?: number;
|
|
45
|
+
vy?: number;
|
|
46
|
+
behaviors?: BehaviorSpec[];
|
|
47
|
+
props?: Record<string, unknown>;
|
|
48
|
+
}
|
|
49
|
+
export type BehaviorSpec = string | ({
|
|
50
|
+
type: string;
|
|
51
|
+
} & Record<string, unknown>);
|
|
52
|
+
export declare const saveProject: (p: GameProject) => string;
|
|
53
|
+
export declare const loadProject: (json: string) => GameProject;
|
|
54
|
+
export declare function validateProject(p: GameProject, extraBehaviors?: string[]): string[];
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export interface GamepadConfig {
|
|
2
|
+
index?: number;
|
|
3
|
+
deadzone?: number;
|
|
4
|
+
buttons?: Record<string, string | number>;
|
|
5
|
+
axes?: {
|
|
6
|
+
leftX?: number;
|
|
7
|
+
leftY?: number;
|
|
8
|
+
rightX?: number;
|
|
9
|
+
rightY?: number;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export declare class GamepadController {
|
|
13
|
+
private readonly config;
|
|
14
|
+
private prev;
|
|
15
|
+
private curr;
|
|
16
|
+
private pad;
|
|
17
|
+
private liveIndex;
|
|
18
|
+
private readonly onConnect;
|
|
19
|
+
private readonly onDisconnect;
|
|
20
|
+
constructor(config: GamepadConfig);
|
|
21
|
+
update(): void;
|
|
22
|
+
dispose(): void;
|
|
23
|
+
private indexOf;
|
|
24
|
+
get connected(): boolean;
|
|
25
|
+
get mapping(): string;
|
|
26
|
+
down(name: string): boolean;
|
|
27
|
+
pressed(name: string): boolean;
|
|
28
|
+
released(name: string): boolean;
|
|
29
|
+
value(name: string): number;
|
|
30
|
+
axis(name: string): number;
|
|
31
|
+
stick(side: 'left' | 'right'): {
|
|
32
|
+
x: number;
|
|
33
|
+
y: number;
|
|
34
|
+
};
|
|
35
|
+
allPressed(): string[];
|
|
36
|
+
pressedIndices(): number[];
|
|
37
|
+
axes(): number[];
|
|
38
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export interface Rect {
|
|
2
|
+
x: number;
|
|
3
|
+
y: number;
|
|
4
|
+
w: number;
|
|
5
|
+
h: number;
|
|
6
|
+
}
|
|
7
|
+
export interface Circle {
|
|
8
|
+
x: number;
|
|
9
|
+
y: number;
|
|
10
|
+
r: number;
|
|
11
|
+
}
|
|
12
|
+
export type Shape = Rect | Circle;
|
|
13
|
+
export interface Vec {
|
|
14
|
+
x: number;
|
|
15
|
+
y: number;
|
|
16
|
+
}
|
|
17
|
+
export declare const lerp: (a: number, b: number, t: number) => number;
|
|
18
|
+
export declare const clamp: (v: number, min: number, max: number) => number;
|
|
19
|
+
export declare const map: (v: number, inMin: number, inMax: number, outMin: number, outMax: number) => number;
|
|
20
|
+
export declare const dist: (ax: number, ay: number, bx: number, by: number) => number;
|
|
21
|
+
export declare const angle: (ax: number, ay: number, bx: number, by: number) => number;
|
|
22
|
+
export declare const rand: (min: number, max: number) => number;
|
|
23
|
+
export declare const randInt: (min: number, max: number) => number;
|
|
24
|
+
export declare const pick: <T>(arr: T[]) => T;
|
|
25
|
+
export declare const hits: (a: Shape, b: Shape) => boolean;
|
|
26
|
+
export declare const inside: (p: Vec, s: Shape) => boolean;
|
|
27
|
+
export declare const resolve: (a: Rect, b: Rect) => Vec | null;
|
|
28
|
+
export declare const cubicBezier: (p0: Vec, p1: Vec, p2: Vec, p3: Vec, t: number) => Vec;
|
|
29
|
+
export declare const bezierPath: (p0: Vec, p1: Vec, p2: Vec, p3: Vec, steps?: number) => Vec[];
|
|
30
|
+
export interface Hex {
|
|
31
|
+
q: number;
|
|
32
|
+
r: number;
|
|
33
|
+
}
|
|
34
|
+
export declare const hexToPixel: (q: number, r: number, size: number) => Vec;
|
|
35
|
+
export declare const hexRound: (q: number, r: number) => Hex;
|
|
36
|
+
export declare const pixelToHex: (x: number, y: number, size: number) => Hex;
|
|
37
|
+
export declare const hexNeighbors: (q: number, r: number) => Hex[];
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export interface Body {
|
|
2
|
+
x: number;
|
|
3
|
+
y: number;
|
|
4
|
+
w?: number;
|
|
5
|
+
h?: number;
|
|
6
|
+
r?: number;
|
|
7
|
+
vx: number;
|
|
8
|
+
vy: number;
|
|
9
|
+
mass: number;
|
|
10
|
+
restitution: number;
|
|
11
|
+
friction: number;
|
|
12
|
+
onGround?: boolean;
|
|
13
|
+
tag?: string;
|
|
14
|
+
[k: string]: unknown;
|
|
15
|
+
}
|
|
16
|
+
export interface WorldOptions {
|
|
17
|
+
gravity?: number;
|
|
18
|
+
iterations?: number;
|
|
19
|
+
damping?: number;
|
|
20
|
+
}
|
|
21
|
+
export declare class World {
|
|
22
|
+
bodies: Body[];
|
|
23
|
+
gravity: number;
|
|
24
|
+
iterations: number;
|
|
25
|
+
damping: number;
|
|
26
|
+
constructor(opts?: WorldOptions);
|
|
27
|
+
add<T extends {
|
|
28
|
+
x: number;
|
|
29
|
+
y: number;
|
|
30
|
+
}>(obj: T, opts?: Partial<Body>): T & Body;
|
|
31
|
+
box(x: number, y: number, w: number, h: number, opts?: Partial<Body>): Body;
|
|
32
|
+
circle(x: number, y: number, r: number, opts?: Partial<Body>): Body;
|
|
33
|
+
static(x: number, y: number, w: number, h: number, opts?: Partial<Body>): Body;
|
|
34
|
+
remove(b: Body): void;
|
|
35
|
+
step(dt: number): void;
|
|
36
|
+
private solveVelocity;
|
|
37
|
+
private correct;
|
|
38
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare class SpatialHash<T> {
|
|
2
|
+
private cellSize;
|
|
3
|
+
private cells;
|
|
4
|
+
private used;
|
|
5
|
+
constructor(cellSize: number);
|
|
6
|
+
private key;
|
|
7
|
+
clear(): void;
|
|
8
|
+
insert(x: number, y: number, item: T): void;
|
|
9
|
+
query(x: number, y: number, r: number, out: T[]): T[];
|
|
10
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import CanvasTarget from './canvasTarget';
|
|
2
|
+
export default class FontCreator extends CanvasTarget {
|
|
3
|
+
loadFont(family: string, source: string, descriptors?: FontFaceDescriptors): this;
|
|
4
|
+
fontRenderingType(value: string): this;
|
|
5
|
+
fontFill(message: string, x: number, y: number, maxWidth?: number): this;
|
|
6
|
+
fontStrokeText(text: string, x: number, y: number, maxWidth?: number): this;
|
|
7
|
+
fontStyle(style: string): this;
|
|
8
|
+
fontAlign(style: CanvasTextAlign): this;
|
|
9
|
+
fontDirection(style: CanvasDirection): this;
|
|
10
|
+
fontBaseline(style: CanvasTextBaseline): this;
|
|
11
|
+
fontVariantCaps(style: CanvasFontVariantCaps): this;
|
|
12
|
+
fontKerning(style: CanvasFontKerning): this;
|
|
13
|
+
fontWordSpacing(style: string): this;
|
|
14
|
+
fontS(style: CanvasFontStretch): this;
|
|
15
|
+
fontMeasure(text: string): TextMetrics;
|
|
16
|
+
}
|