@guinetik/gcanvas 1.0.2 → 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/gcanvas.es.js +25656 -0
- package/dist/gcanvas.es.min.js +1 -0
- package/dist/gcanvas.umd.js +1 -0
- package/dist/gcanvas.umd.min.js +1 -0
- package/package.json +23 -6
- package/src/game/objects/index.js +1 -0
- package/src/game/objects/spritesheet.js +260 -0
- package/src/game/ui/theme.js +6 -0
- package/src/io/keys.js +9 -1
- package/src/math/boolean.js +481 -0
- package/src/math/index.js +1 -0
- package/.github/workflows/release.yaml +0 -70
- package/.jshintrc +0 -4
- package/.vscode/settings.json +0 -22
- package/CLAUDE.md +0 -310
- package/blackhole.jpg +0 -0
- package/demo.png +0 -0
- package/demos/CNAME +0 -1
- package/demos/animations.html +0 -31
- package/demos/basic.html +0 -38
- package/demos/baskara.html +0 -31
- package/demos/bezier.html +0 -35
- package/demos/beziersignature.html +0 -29
- package/demos/blackhole.html +0 -28
- package/demos/blob.html +0 -35
- package/demos/coordinates.html +0 -698
- package/demos/cube3d.html +0 -23
- package/demos/demos.css +0 -303
- package/demos/dino.html +0 -42
- package/demos/easing.html +0 -28
- package/demos/events.html +0 -195
- package/demos/fluent.html +0 -647
- package/demos/fluid-simple.html +0 -22
- package/demos/fluid.html +0 -37
- package/demos/fractals.html +0 -36
- package/demos/gameobjects.html +0 -626
- package/demos/genart.html +0 -26
- package/demos/gendream.html +0 -26
- package/demos/group.html +0 -36
- package/demos/home.html +0 -587
- package/demos/index.html +0 -376
- package/demos/isometric.html +0 -34
- package/demos/js/animations.js +0 -452
- package/demos/js/basic.js +0 -204
- package/demos/js/baskara.js +0 -751
- package/demos/js/bezier.js +0 -692
- package/demos/js/beziersignature.js +0 -241
- package/demos/js/blackhole/accretiondisk.obj.js +0 -379
- package/demos/js/blackhole/blackhole.obj.js +0 -318
- package/demos/js/blackhole/index.js +0 -409
- package/demos/js/blackhole/particle.js +0 -56
- package/demos/js/blackhole/starfield.obj.js +0 -218
- package/demos/js/blob.js +0 -2276
- package/demos/js/coordinates.js +0 -840
- package/demos/js/cube3d.js +0 -789
- package/demos/js/dino.js +0 -1420
- package/demos/js/easing.js +0 -477
- package/demos/js/fluent.js +0 -183
- package/demos/js/fluid-simple.js +0 -253
- package/demos/js/fluid.js +0 -527
- package/demos/js/fractals.js +0 -931
- package/demos/js/fractalworker.js +0 -93
- package/demos/js/gameobjects.js +0 -176
- package/demos/js/genart.js +0 -268
- package/demos/js/gendream.js +0 -209
- package/demos/js/group.js +0 -140
- package/demos/js/info-toggle.js +0 -25
- package/demos/js/isometric.js +0 -863
- package/demos/js/kerr.js +0 -1556
- package/demos/js/lavalamp.js +0 -590
- package/demos/js/layout.js +0 -354
- package/demos/js/mondrian.js +0 -285
- package/demos/js/opacity.js +0 -275
- package/demos/js/painter.js +0 -484
- package/demos/js/particles-showcase.js +0 -514
- package/demos/js/particles.js +0 -299
- package/demos/js/patterns.js +0 -397
- package/demos/js/penrose/artifact.js +0 -69
- package/demos/js/penrose/blackhole.js +0 -121
- package/demos/js/penrose/constants.js +0 -73
- package/demos/js/penrose/game.js +0 -943
- package/demos/js/penrose/lore.js +0 -278
- package/demos/js/penrose/penrosescene.js +0 -892
- package/demos/js/penrose/ship.js +0 -216
- package/demos/js/penrose/sounds.js +0 -211
- package/demos/js/penrose/voidparticle.js +0 -55
- package/demos/js/penrose/voidscene.js +0 -258
- package/demos/js/penrose/voidship.js +0 -144
- package/demos/js/penrose/wormhole.js +0 -46
- package/demos/js/pipeline.js +0 -555
- package/demos/js/plane3d.js +0 -256
- package/demos/js/platformer.js +0 -1579
- package/demos/js/scene.js +0 -304
- package/demos/js/scenes.js +0 -320
- package/demos/js/schrodinger.js +0 -410
- package/demos/js/schwarzschild.js +0 -1023
- package/demos/js/shapes.js +0 -628
- package/demos/js/space/alien.js +0 -171
- package/demos/js/space/boom.js +0 -98
- package/demos/js/space/boss.js +0 -353
- package/demos/js/space/buff.js +0 -73
- package/demos/js/space/bullet.js +0 -102
- package/demos/js/space/constants.js +0 -85
- package/demos/js/space/game.js +0 -1884
- package/demos/js/space/hud.js +0 -112
- package/demos/js/space/laserbeam.js +0 -179
- package/demos/js/space/lightning.js +0 -277
- package/demos/js/space/minion.js +0 -192
- package/demos/js/space/missile.js +0 -212
- package/demos/js/space/player.js +0 -430
- package/demos/js/space/powerup.js +0 -90
- package/demos/js/space/starfield.js +0 -58
- package/demos/js/space/starpower.js +0 -90
- package/demos/js/spacetime.js +0 -559
- package/demos/js/sphere3d.js +0 -229
- package/demos/js/sprite.js +0 -473
- package/demos/js/svgtween.js +0 -204
- package/demos/js/tde/accretiondisk.js +0 -471
- package/demos/js/tde/blackhole.js +0 -219
- package/demos/js/tde/blackholescene.js +0 -209
- package/demos/js/tde/config.js +0 -59
- package/demos/js/tde/index.js +0 -820
- package/demos/js/tde/jets.js +0 -290
- package/demos/js/tde/lensedstarfield.js +0 -154
- package/demos/js/tde/tdestar.js +0 -297
- package/demos/js/tde/tidalstream.js +0 -372
- package/demos/js/tde_old/blackhole.obj.js +0 -354
- package/demos/js/tde_old/debris.obj.js +0 -791
- package/demos/js/tde_old/flare.obj.js +0 -239
- package/demos/js/tde_old/index.js +0 -448
- package/demos/js/tde_old/star.obj.js +0 -812
- package/demos/js/tiles.js +0 -312
- package/demos/js/tweendemo.js +0 -79
- package/demos/js/visibility.js +0 -102
- package/demos/kerr.html +0 -28
- package/demos/lavalamp.html +0 -27
- package/demos/layouts.html +0 -37
- package/demos/logo.svg +0 -4
- package/demos/loop.html +0 -84
- package/demos/mondrian.html +0 -32
- package/demos/og_image.png +0 -0
- package/demos/opacity.html +0 -36
- package/demos/painter.html +0 -39
- package/demos/particles-showcase.html +0 -28
- package/demos/particles.html +0 -24
- package/demos/patterns.html +0 -33
- package/demos/penrose-game.html +0 -31
- package/demos/pipeline.html +0 -737
- package/demos/plane3d.html +0 -24
- package/demos/platformer.html +0 -43
- package/demos/scene.html +0 -33
- package/demos/scenes.html +0 -96
- package/demos/schrodinger.html +0 -27
- package/demos/schwarzschild.html +0 -27
- package/demos/shapes.html +0 -16
- package/demos/space.html +0 -85
- package/demos/spacetime.html +0 -27
- package/demos/sphere3d.html +0 -24
- package/demos/sprite.html +0 -18
- package/demos/svgtween.html +0 -29
- package/demos/tde.html +0 -28
- package/demos/tiles.html +0 -28
- package/demos/transforms.html +0 -400
- package/demos/tween.html +0 -45
- package/demos/visibility.html +0 -33
- package/docs/README.md +0 -230
- package/docs/api/FluidSystem.md +0 -173
- package/docs/concepts/architecture-overview.md +0 -204
- package/docs/concepts/coordinate-system.md +0 -384
- package/docs/concepts/lifecycle.md +0 -255
- package/docs/concepts/rendering-pipeline.md +0 -279
- package/docs/concepts/shapes-vs-gameobjects.md +0 -187
- package/docs/concepts/tde-zorder.md +0 -106
- package/docs/concepts/two-layer-architecture.md +0 -229
- package/docs/fluid-dynamics.md +0 -99
- package/docs/getting-started/first-game.md +0 -354
- package/docs/getting-started/hello-world.md +0 -269
- package/docs/getting-started/installation.md +0 -175
- package/docs/modules/collision/README.md +0 -453
- package/docs/modules/fluent/README.md +0 -1075
- package/docs/modules/game/README.md +0 -303
- package/docs/modules/isometric-camera.md +0 -210
- package/docs/modules/isometric.md +0 -275
- package/docs/modules/painter/README.md +0 -328
- package/docs/modules/particle/README.md +0 -559
- package/docs/modules/shapes/README.md +0 -221
- package/docs/modules/shapes/base/euclidian.md +0 -123
- package/docs/modules/shapes/base/geometry2d.md +0 -204
- package/docs/modules/shapes/base/renderable.md +0 -215
- package/docs/modules/shapes/base/shape.md +0 -262
- package/docs/modules/shapes/base/transformable.md +0 -243
- package/docs/modules/shapes/hierarchy.md +0 -218
- package/docs/modules/state/README.md +0 -577
- package/docs/modules/util/README.md +0 -99
- package/docs/modules/util/camera3d.md +0 -412
- package/docs/modules/util/scene3d.md +0 -395
- package/index.html +0 -17
- package/jsdoc.json +0 -50
- package/scripts/build-demo.js +0 -69
- package/scripts/bundle4llm.js +0 -276
- package/scripts/clearconsole.js +0 -48
- package/test/math/orbital.test.js +0 -61
- package/test/math/tensor.test.js +0 -114
- package/test/particle/emitter.test.js +0 -204
- package/test/particle/particle-system.test.js +0 -310
- package/test/particle/particle.test.js +0 -116
- package/test/particle/updaters.test.js +0 -386
- package/test/setup.js +0 -120
- package/test/shapes/euclidian.test.js +0 -44
- package/test/shapes/geometry.test.js +0 -86
- package/test/shapes/group.test.js +0 -86
- package/test/shapes/rectangle.test.js +0 -64
- package/test/shapes/transform.test.js +0 -379
- package/test/util/camera3d.test.js +0 -428
- package/test/util/scene3d.test.js +0 -352
- package/vite.config.js +0 -50
- package/vitest.config.js +0 -13
package/package.json
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@guinetik/gcanvas",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "
|
|
5
|
-
"main": "
|
|
3
|
+
"version": "1.0.4",
|
|
4
|
+
"description": "A batteries-included 2D canvas framework for games and generative art",
|
|
5
|
+
"main": "dist/gcanvas.es.js",
|
|
6
6
|
"types": "types/index.d.ts",
|
|
7
7
|
"type": "module",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist",
|
|
10
|
+
"src",
|
|
11
|
+
"types"
|
|
12
|
+
],
|
|
8
13
|
"scripts": {
|
|
9
14
|
"dev": "vite",
|
|
10
15
|
"build": "vite build && npm run minify",
|
|
@@ -27,7 +32,19 @@
|
|
|
27
32
|
"keywords": [
|
|
28
33
|
"canvas",
|
|
29
34
|
"html5",
|
|
30
|
-
"
|
|
35
|
+
"game-framework",
|
|
36
|
+
"2d-graphics",
|
|
37
|
+
"generative-art",
|
|
38
|
+
"creative-coding",
|
|
39
|
+
"genuary",
|
|
40
|
+
"game-development",
|
|
41
|
+
"animation",
|
|
42
|
+
"sprites",
|
|
43
|
+
"particles",
|
|
44
|
+
"tweening",
|
|
45
|
+
"fluent-api",
|
|
46
|
+
"ui-components",
|
|
47
|
+
"zero-dependencies"
|
|
31
48
|
],
|
|
32
49
|
"author": "guinetik",
|
|
33
50
|
"license": "ISC",
|
|
@@ -40,14 +57,14 @@
|
|
|
40
57
|
"bugs": {
|
|
41
58
|
"url": "https://github.com/guinetik/gcanvas/issues"
|
|
42
59
|
},
|
|
43
|
-
"homepage": "https://
|
|
60
|
+
"homepage": "https://gcanvas.guinetik.com",
|
|
44
61
|
"devDependencies": {
|
|
45
62
|
"@testing-library/jest-dom": "^6.6.3",
|
|
46
63
|
"better-docs": "^2.7.3",
|
|
47
64
|
"gh-pages": "^6.3.0",
|
|
48
65
|
"jsdoc": "^4.0.4",
|
|
49
66
|
"jsdom": "^26.1.0",
|
|
50
|
-
"terser": "^5.
|
|
67
|
+
"terser": "^5.44.1",
|
|
51
68
|
"vite": "^6.2.5",
|
|
52
69
|
"vitest": "^3.1.1"
|
|
53
70
|
},
|
|
@@ -53,5 +53,6 @@ export { PlatformerScene } from "./platformer-scene.js";
|
|
|
53
53
|
export * from "./layoutscene.js";
|
|
54
54
|
// Specialized GameObjects
|
|
55
55
|
export { Sprite } from "./sprite.js";
|
|
56
|
+
export { SpriteSheet } from "./spritesheet.js";
|
|
56
57
|
export { Text } from "./text.js";
|
|
57
58
|
export { ImageGo } from "./imagego.js";
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import { Sprite } from './sprite.js';
|
|
2
|
+
import { ImageShape } from '../../shapes/image.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* SpriteSheet - A Sprite that loads frames from a spritesheet image
|
|
6
|
+
*
|
|
7
|
+
* Extends Sprite to support loading animation frames from a single
|
|
8
|
+
* spritesheet image arranged in a grid layout.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* // Create from a spritesheet with known dimensions
|
|
12
|
+
* const runner = new SpriteSheet(game, {
|
|
13
|
+
* src: './runner.png',
|
|
14
|
+
* frameWidth: 64,
|
|
15
|
+
* frameHeight: 64,
|
|
16
|
+
* columns: 8,
|
|
17
|
+
* rows: 4,
|
|
18
|
+
* frameCount: 30, // Optional: if less than columns * rows
|
|
19
|
+
* frameRate: 12,
|
|
20
|
+
* loop: true,
|
|
21
|
+
* autoPlay: true,
|
|
22
|
+
* });
|
|
23
|
+
*
|
|
24
|
+
* // Wait for load before using
|
|
25
|
+
* await runner.load();
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* // Or use the static factory method
|
|
29
|
+
* const runner = await SpriteSheet.create(game, {
|
|
30
|
+
* src: './runner.png',
|
|
31
|
+
* frameWidth: 64,
|
|
32
|
+
* frameHeight: 64,
|
|
33
|
+
* columns: 8,
|
|
34
|
+
* rows: 4,
|
|
35
|
+
* });
|
|
36
|
+
*/
|
|
37
|
+
export class SpriteSheet extends Sprite {
|
|
38
|
+
/**
|
|
39
|
+
* Creates a new SpriteSheet
|
|
40
|
+
* @param {Game} game - The game instance
|
|
41
|
+
* @param {Object} options - Configuration options
|
|
42
|
+
* @param {string} options.src - URL/path to the spritesheet image
|
|
43
|
+
* @param {number} options.frameWidth - Width of each frame in pixels
|
|
44
|
+
* @param {number} options.frameHeight - Height of each frame in pixels
|
|
45
|
+
* @param {number} options.columns - Number of columns in the spritesheet
|
|
46
|
+
* @param {number} options.rows - Number of rows in the spritesheet
|
|
47
|
+
* @param {number} [options.frameCount] - Total frames (defaults to columns * rows)
|
|
48
|
+
* @param {number} [options.startFrame=0] - First frame index to use
|
|
49
|
+
* @param {number} [options.frameRate=12] - Frames per second
|
|
50
|
+
* @param {boolean} [options.loop=true] - Whether to loop the animation
|
|
51
|
+
* @param {boolean} [options.autoPlay=false] - Whether to start playing automatically
|
|
52
|
+
* @param {boolean} [options.smoothing=false] - Image smoothing (false for pixel art)
|
|
53
|
+
*/
|
|
54
|
+
constructor(game, options = {}) {
|
|
55
|
+
super(game, {
|
|
56
|
+
frameRate: options.frameRate || 12,
|
|
57
|
+
loop: options.loop !== undefined ? options.loop : true,
|
|
58
|
+
autoPlay: false, // Don't autoplay until loaded
|
|
59
|
+
...options,
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
// Spritesheet config
|
|
63
|
+
this._src = options.src;
|
|
64
|
+
this._frameWidth = options.frameWidth;
|
|
65
|
+
this._frameHeight = options.frameHeight;
|
|
66
|
+
this._columns = options.columns;
|
|
67
|
+
this._rows = options.rows;
|
|
68
|
+
this._frameCount = options.frameCount || (options.columns * options.rows);
|
|
69
|
+
this._startFrame = options.startFrame || 0;
|
|
70
|
+
this._smoothing = options.smoothing !== undefined ? options.smoothing : false;
|
|
71
|
+
this._autoPlayAfterLoad = options.autoPlay || false;
|
|
72
|
+
|
|
73
|
+
// Loading state
|
|
74
|
+
this._loaded = false;
|
|
75
|
+
this._loading = false;
|
|
76
|
+
this._image = null;
|
|
77
|
+
this._frameCanvases = []; // Pre-rendered frame canvases
|
|
78
|
+
|
|
79
|
+
// Set dimensions
|
|
80
|
+
this.width = this._frameWidth;
|
|
81
|
+
this.height = this._frameHeight;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Static factory method that creates and loads a SpriteSheet
|
|
86
|
+
* @param {Game} game - The game instance
|
|
87
|
+
* @param {Object} options - Configuration options (same as constructor)
|
|
88
|
+
* @returns {Promise<SpriteSheet>} Loaded SpriteSheet instance
|
|
89
|
+
*/
|
|
90
|
+
static async create(game, options) {
|
|
91
|
+
const sheet = new SpriteSheet(game, options);
|
|
92
|
+
await sheet.load();
|
|
93
|
+
return sheet;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Loads the spritesheet image and creates frame shapes
|
|
98
|
+
* @returns {Promise<SpriteSheet>} This instance for chaining
|
|
99
|
+
*/
|
|
100
|
+
async load() {
|
|
101
|
+
if (this._loaded || this._loading) {
|
|
102
|
+
return this;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
this._loading = true;
|
|
106
|
+
|
|
107
|
+
try {
|
|
108
|
+
// Load the image
|
|
109
|
+
this._image = await this._loadImage(this._src);
|
|
110
|
+
|
|
111
|
+
// Slice into frames
|
|
112
|
+
await this._sliceFrames();
|
|
113
|
+
|
|
114
|
+
this._loaded = true;
|
|
115
|
+
this._loading = false;
|
|
116
|
+
|
|
117
|
+
// Start playing if autoPlay was requested
|
|
118
|
+
if (this._autoPlayAfterLoad) {
|
|
119
|
+
this.play();
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
return this;
|
|
123
|
+
} catch (error) {
|
|
124
|
+
this._loading = false;
|
|
125
|
+
console.error('SpriteSheet.load failed:', error);
|
|
126
|
+
throw error;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Loads an image from a URL
|
|
132
|
+
* @private
|
|
133
|
+
* @param {string} src - Image URL
|
|
134
|
+
* @returns {Promise<HTMLImageElement>}
|
|
135
|
+
*/
|
|
136
|
+
_loadImage(src) {
|
|
137
|
+
return new Promise((resolve, reject) => {
|
|
138
|
+
const img = new Image();
|
|
139
|
+
img.onload = () => resolve(img);
|
|
140
|
+
img.onerror = (e) => reject(new Error(`Failed to load image: ${src}`));
|
|
141
|
+
img.src = src;
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Slices the spritesheet into individual frame canvases
|
|
147
|
+
* @private
|
|
148
|
+
*/
|
|
149
|
+
async _sliceFrames() {
|
|
150
|
+
const { _image: img, _frameWidth: fw, _frameHeight: fh, _columns: cols } = this;
|
|
151
|
+
|
|
152
|
+
// Clear existing frames
|
|
153
|
+
this.clearFrames();
|
|
154
|
+
this._frameCanvases = [];
|
|
155
|
+
|
|
156
|
+
// Create a canvas for each frame
|
|
157
|
+
for (let i = this._startFrame; i < this._startFrame + this._frameCount; i++) {
|
|
158
|
+
const col = i % cols;
|
|
159
|
+
const row = Math.floor(i / cols);
|
|
160
|
+
const sx = col * fw;
|
|
161
|
+
const sy = row * fh;
|
|
162
|
+
|
|
163
|
+
// Create offscreen canvas for this frame
|
|
164
|
+
const frameCanvas = document.createElement('canvas');
|
|
165
|
+
frameCanvas.width = fw;
|
|
166
|
+
frameCanvas.height = fh;
|
|
167
|
+
const ctx = frameCanvas.getContext('2d');
|
|
168
|
+
ctx.imageSmoothingEnabled = this._smoothing;
|
|
169
|
+
|
|
170
|
+
// Draw the frame portion
|
|
171
|
+
ctx.drawImage(img, sx, sy, fw, fh, 0, 0, fw, fh);
|
|
172
|
+
|
|
173
|
+
// Store the canvas
|
|
174
|
+
this._frameCanvases.push(frameCanvas);
|
|
175
|
+
|
|
176
|
+
// Create ImageShape from the canvas and add as frame
|
|
177
|
+
const frameShape = new ImageShape(frameCanvas, {
|
|
178
|
+
width: fw,
|
|
179
|
+
height: fh,
|
|
180
|
+
anchor: 'center',
|
|
181
|
+
smoothing: this._smoothing,
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
this.addFrame(frameShape);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Gets whether the spritesheet is loaded
|
|
190
|
+
* @returns {boolean}
|
|
191
|
+
*/
|
|
192
|
+
get loaded() {
|
|
193
|
+
return this._loaded;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Gets whether the spritesheet is currently loading
|
|
198
|
+
* @returns {boolean}
|
|
199
|
+
*/
|
|
200
|
+
get loading() {
|
|
201
|
+
return this._loading;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Gets the frame width
|
|
206
|
+
* @returns {number}
|
|
207
|
+
*/
|
|
208
|
+
get frameWidth() {
|
|
209
|
+
return this._frameWidth;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Gets the frame height
|
|
214
|
+
* @returns {number}
|
|
215
|
+
*/
|
|
216
|
+
get frameHeight() {
|
|
217
|
+
return this._frameHeight;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Gets the number of columns in the spritesheet
|
|
222
|
+
* @returns {number}
|
|
223
|
+
*/
|
|
224
|
+
get columns() {
|
|
225
|
+
return this._columns;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Gets the number of rows in the spritesheet
|
|
230
|
+
* @returns {number}
|
|
231
|
+
*/
|
|
232
|
+
get rows() {
|
|
233
|
+
return this._rows;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Override update to skip if not loaded
|
|
238
|
+
* @param {number} dt - Delta time
|
|
239
|
+
*/
|
|
240
|
+
update(dt) {
|
|
241
|
+
if (!this._loaded) return;
|
|
242
|
+
super.update(dt);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Override draw to skip if not loaded
|
|
247
|
+
*/
|
|
248
|
+
draw() {
|
|
249
|
+
if (!this._loaded) return;
|
|
250
|
+
super.draw();
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Creates a string representation
|
|
255
|
+
* @returns {string}
|
|
256
|
+
*/
|
|
257
|
+
toString() {
|
|
258
|
+
return `[SpriteSheet src="${this._src}" frames=${this._frameCount} loaded=${this._loaded}]`;
|
|
259
|
+
}
|
|
260
|
+
}
|
package/src/game/ui/theme.js
CHANGED
package/src/io/keys.js
CHANGED
|
@@ -32,6 +32,10 @@ export class Keys {
|
|
|
32
32
|
static D = "D";
|
|
33
33
|
static Q = "Q";
|
|
34
34
|
static E = "E";
|
|
35
|
+
static R = "R";
|
|
36
|
+
static F = "F";
|
|
37
|
+
static Z = "Z";
|
|
38
|
+
static C = "C";
|
|
35
39
|
static UP = "UP";
|
|
36
40
|
static DOWN = "DOWN";
|
|
37
41
|
static LEFT = "LEFT";
|
|
@@ -46,13 +50,17 @@ export class Keys {
|
|
|
46
50
|
* Customize this list as needed for your game.
|
|
47
51
|
*/
|
|
48
52
|
static _codeMap = {
|
|
49
|
-
// WASD + QE
|
|
53
|
+
// WASD + QE + RFZC
|
|
50
54
|
KeyW: Keys.W,
|
|
51
55
|
KeyA: Keys.A,
|
|
52
56
|
KeyS: Keys.S,
|
|
53
57
|
KeyD: Keys.D,
|
|
54
58
|
KeyQ: Keys.Q,
|
|
55
59
|
KeyE: Keys.E,
|
|
60
|
+
KeyR: Keys.R,
|
|
61
|
+
KeyF: Keys.F,
|
|
62
|
+
KeyZ: Keys.Z,
|
|
63
|
+
KeyC: Keys.C,
|
|
56
64
|
|
|
57
65
|
// Arrows
|
|
58
66
|
ArrowUp: Keys.UP,
|