@guinetik/gcanvas 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/.github/workflows/release.yaml +70 -0
- package/.jshintrc +4 -0
- package/.vscode/settings.json +22 -0
- package/CLAUDE.md +310 -0
- package/blackhole.jpg +0 -0
- package/demo.png +0 -0
- package/demos/CNAME +1 -0
- package/demos/animations.html +31 -0
- package/demos/basic.html +38 -0
- package/demos/baskara.html +31 -0
- package/demos/bezier.html +35 -0
- package/demos/beziersignature.html +29 -0
- package/demos/blackhole.html +28 -0
- package/demos/blob.html +35 -0
- package/demos/demos.css +289 -0
- package/demos/easing.html +28 -0
- package/demos/events.html +195 -0
- package/demos/fluent.html +647 -0
- package/demos/fractals.html +36 -0
- package/demos/genart.html +26 -0
- package/demos/gendream.html +26 -0
- package/demos/group.html +36 -0
- package/demos/home.html +587 -0
- package/demos/index.html +364 -0
- package/demos/isometric.html +34 -0
- package/demos/js/animations.js +452 -0
- package/demos/js/basic.js +204 -0
- package/demos/js/baskara.js +751 -0
- package/demos/js/bezier.js +692 -0
- package/demos/js/beziersignature.js +241 -0
- package/demos/js/blackhole/accretiondisk.obj.js +379 -0
- package/demos/js/blackhole/blackhole.obj.js +318 -0
- package/demos/js/blackhole/index.js +409 -0
- package/demos/js/blackhole/particle.js +56 -0
- package/demos/js/blackhole/starfield.obj.js +218 -0
- package/demos/js/blob.js +2263 -0
- package/demos/js/easing.js +477 -0
- package/demos/js/fluent.js +183 -0
- package/demos/js/fractals.js +931 -0
- package/demos/js/fractalworker.js +93 -0
- package/demos/js/genart.js +268 -0
- package/demos/js/gendream.js +209 -0
- package/demos/js/group.js +140 -0
- package/demos/js/info-toggle.js +25 -0
- package/demos/js/isometric.js +863 -0
- package/demos/js/kerr.js +1556 -0
- package/demos/js/lavalamp.js +590 -0
- package/demos/js/layout.js +354 -0
- package/demos/js/mondrian.js +285 -0
- package/demos/js/opacity.js +275 -0
- package/demos/js/painter.js +484 -0
- package/demos/js/particles-showcase.js +514 -0
- package/demos/js/particles.js +299 -0
- package/demos/js/patterns.js +397 -0
- package/demos/js/penrose/artifact.js +69 -0
- package/demos/js/penrose/blackhole.js +121 -0
- package/demos/js/penrose/constants.js +73 -0
- package/demos/js/penrose/game.js +943 -0
- package/demos/js/penrose/lore.js +278 -0
- package/demos/js/penrose/penrosescene.js +892 -0
- package/demos/js/penrose/ship.js +216 -0
- package/demos/js/penrose/sounds.js +211 -0
- package/demos/js/penrose/voidparticle.js +55 -0
- package/demos/js/penrose/voidscene.js +258 -0
- package/demos/js/penrose/voidship.js +144 -0
- package/demos/js/penrose/wormhole.js +46 -0
- package/demos/js/pipeline.js +555 -0
- package/demos/js/scene.js +304 -0
- package/demos/js/scenes.js +320 -0
- package/demos/js/schrodinger.js +410 -0
- package/demos/js/schwarzschild.js +1023 -0
- package/demos/js/shapes.js +628 -0
- package/demos/js/space/alien.js +171 -0
- package/demos/js/space/boom.js +98 -0
- package/demos/js/space/boss.js +353 -0
- package/demos/js/space/buff.js +73 -0
- package/demos/js/space/bullet.js +102 -0
- package/demos/js/space/constants.js +85 -0
- package/demos/js/space/game.js +1884 -0
- package/demos/js/space/hud.js +112 -0
- package/demos/js/space/laserbeam.js +179 -0
- package/demos/js/space/lightning.js +277 -0
- package/demos/js/space/minion.js +192 -0
- package/demos/js/space/missile.js +212 -0
- package/demos/js/space/player.js +430 -0
- package/demos/js/space/powerup.js +90 -0
- package/demos/js/space/starfield.js +58 -0
- package/demos/js/space/starpower.js +90 -0
- package/demos/js/spacetime.js +559 -0
- package/demos/js/svgtween.js +204 -0
- package/demos/js/tde/accretiondisk.js +418 -0
- package/demos/js/tde/blackhole.js +219 -0
- package/demos/js/tde/blackholescene.js +209 -0
- package/demos/js/tde/config.js +59 -0
- package/demos/js/tde/index.js +695 -0
- package/demos/js/tde/jets.js +290 -0
- package/demos/js/tde/lensedstarfield.js +147 -0
- package/demos/js/tde/tdestar.js +317 -0
- package/demos/js/tde/tidalstream.js +356 -0
- package/demos/js/tde_old/blackhole.obj.js +354 -0
- package/demos/js/tde_old/debris.obj.js +791 -0
- package/demos/js/tde_old/flare.obj.js +239 -0
- package/demos/js/tde_old/index.js +448 -0
- package/demos/js/tde_old/star.obj.js +812 -0
- package/demos/js/tiles.js +312 -0
- package/demos/js/tweendemo.js +79 -0
- package/demos/js/visibility.js +102 -0
- package/demos/kerr.html +28 -0
- package/demos/lavalamp.html +27 -0
- package/demos/layouts.html +37 -0
- package/demos/logo.svg +4 -0
- package/demos/loop.html +84 -0
- package/demos/mondrian.html +32 -0
- package/demos/og_image.png +0 -0
- package/demos/opacity.html +36 -0
- package/demos/painter.html +39 -0
- package/demos/particles-showcase.html +28 -0
- package/demos/particles.html +24 -0
- package/demos/patterns.html +33 -0
- package/demos/penrose-game.html +31 -0
- package/demos/pipeline.html +737 -0
- package/demos/scene.html +33 -0
- package/demos/scenes.html +96 -0
- package/demos/schrodinger.html +27 -0
- package/demos/schwarzschild.html +27 -0
- package/demos/shapes.html +16 -0
- package/demos/space.html +85 -0
- package/demos/spacetime.html +27 -0
- package/demos/svgtween.html +29 -0
- package/demos/tde.html +28 -0
- package/demos/tiles.html +28 -0
- package/demos/transforms.html +400 -0
- package/demos/tween.html +45 -0
- package/demos/visibility.html +33 -0
- package/disk_example.png +0 -0
- package/docs/README.md +222 -0
- package/docs/concepts/architecture-overview.md +204 -0
- package/docs/concepts/lifecycle.md +255 -0
- package/docs/concepts/rendering-pipeline.md +279 -0
- package/docs/concepts/tde-zorder.md +106 -0
- package/docs/concepts/two-layer-architecture.md +229 -0
- package/docs/getting-started/first-game.md +354 -0
- package/docs/getting-started/hello-world.md +269 -0
- package/docs/getting-started/installation.md +157 -0
- package/docs/modules/collision/README.md +453 -0
- package/docs/modules/fluent/README.md +1075 -0
- package/docs/modules/game/README.md +303 -0
- package/docs/modules/isometric-camera.md +210 -0
- package/docs/modules/isometric.md +275 -0
- package/docs/modules/painter/README.md +328 -0
- package/docs/modules/particle/README.md +559 -0
- package/docs/modules/shapes/README.md +221 -0
- package/docs/modules/shapes/base/euclidian.md +123 -0
- package/docs/modules/shapes/base/geometry2d.md +204 -0
- package/docs/modules/shapes/base/renderable.md +215 -0
- package/docs/modules/shapes/base/shape.md +262 -0
- package/docs/modules/shapes/base/transformable.md +243 -0
- package/docs/modules/shapes/hierarchy.md +218 -0
- package/docs/modules/state/README.md +577 -0
- package/docs/modules/util/README.md +99 -0
- package/docs/modules/util/camera3d.md +412 -0
- package/docs/modules/util/scene3d.md +395 -0
- package/index.html +17 -0
- package/jsdoc.json +50 -0
- package/package.json +55 -0
- package/readme.md +599 -0
- package/scripts/build-demo.js +69 -0
- package/scripts/bundle4llm.js +276 -0
- package/scripts/clearconsole.js +48 -0
- package/src/collision/collision-system.js +332 -0
- package/src/collision/collision.js +303 -0
- package/src/collision/index.js +10 -0
- package/src/fluent/fluent-game.js +430 -0
- package/src/fluent/fluent-go.js +1060 -0
- package/src/fluent/fluent-layer.js +152 -0
- package/src/fluent/fluent-scene.js +291 -0
- package/src/fluent/index.js +98 -0
- package/src/fluent/sketch.js +380 -0
- package/src/game/game.js +467 -0
- package/src/game/index.js +49 -0
- package/src/game/objects/go.js +220 -0
- package/src/game/objects/imagego.js +30 -0
- package/src/game/objects/index.js +54 -0
- package/src/game/objects/isometric-scene.js +260 -0
- package/src/game/objects/layoutscene.js +549 -0
- package/src/game/objects/scene.js +175 -0
- package/src/game/objects/scene3d.js +118 -0
- package/src/game/objects/text.js +221 -0
- package/src/game/objects/wrapper.js +232 -0
- package/src/game/pipeline.js +243 -0
- package/src/game/ui/button.js +396 -0
- package/src/game/ui/cursor.js +93 -0
- package/src/game/ui/fps.js +91 -0
- package/src/game/ui/index.js +5 -0
- package/src/game/ui/togglebutton.js +93 -0
- package/src/game/ui/tooltip.js +249 -0
- package/src/index.js +25 -0
- package/src/io/events.js +20 -0
- package/src/io/index.js +86 -0
- package/src/io/input.js +70 -0
- package/src/io/keys.js +152 -0
- package/src/io/mouse.js +61 -0
- package/src/io/touch.js +39 -0
- package/src/logger/debugtab.js +138 -0
- package/src/logger/index.js +3 -0
- package/src/logger/loggable.js +47 -0
- package/src/logger/logger.js +113 -0
- package/src/math/complex.js +37 -0
- package/src/math/constants.js +1 -0
- package/src/math/fractal.js +1271 -0
- package/src/math/gr.js +201 -0
- package/src/math/heat.js +202 -0
- package/src/math/index.js +12 -0
- package/src/math/noise.js +433 -0
- package/src/math/orbital.js +191 -0
- package/src/math/patterns.js +1339 -0
- package/src/math/penrose.js +259 -0
- package/src/math/quantum.js +115 -0
- package/src/math/random.js +195 -0
- package/src/math/tensor.js +1009 -0
- package/src/mixins/anchor.js +131 -0
- package/src/mixins/draggable.js +72 -0
- package/src/mixins/index.js +2 -0
- package/src/motion/bezier.js +132 -0
- package/src/motion/bounce.js +58 -0
- package/src/motion/easing.js +349 -0
- package/src/motion/float.js +130 -0
- package/src/motion/follow.js +125 -0
- package/src/motion/hop.js +52 -0
- package/src/motion/index.js +82 -0
- package/src/motion/motion.js +1124 -0
- package/src/motion/orbit.js +49 -0
- package/src/motion/oscillate.js +39 -0
- package/src/motion/parabolic.js +141 -0
- package/src/motion/patrol.js +147 -0
- package/src/motion/pendulum.js +48 -0
- package/src/motion/pulse.js +88 -0
- package/src/motion/shake.js +83 -0
- package/src/motion/spiral.js +144 -0
- package/src/motion/spring.js +150 -0
- package/src/motion/swing.js +47 -0
- package/src/motion/tween.js +92 -0
- package/src/motion/tweenetik.js +139 -0
- package/src/motion/waypoint.js +210 -0
- package/src/painter/index.js +8 -0
- package/src/painter/painter.colors.js +331 -0
- package/src/painter/painter.effects.js +230 -0
- package/src/painter/painter.img.js +229 -0
- package/src/painter/painter.js +295 -0
- package/src/painter/painter.lines.js +189 -0
- package/src/painter/painter.opacity.js +41 -0
- package/src/painter/painter.shapes.js +277 -0
- package/src/painter/painter.text.js +273 -0
- package/src/particle/emitter.js +124 -0
- package/src/particle/index.js +11 -0
- package/src/particle/particle-system.js +322 -0
- package/src/particle/particle.js +71 -0
- package/src/particle/updaters.js +170 -0
- package/src/shapes/arc.js +43 -0
- package/src/shapes/arrow.js +33 -0
- package/src/shapes/bezier.js +42 -0
- package/src/shapes/circle.js +62 -0
- package/src/shapes/clouds.js +56 -0
- package/src/shapes/cone.js +219 -0
- package/src/shapes/cross.js +70 -0
- package/src/shapes/cube.js +244 -0
- package/src/shapes/cylinder.js +254 -0
- package/src/shapes/diamond.js +48 -0
- package/src/shapes/euclidian.js +111 -0
- package/src/shapes/figure.js +115 -0
- package/src/shapes/geometry.js +220 -0
- package/src/shapes/group.js +375 -0
- package/src/shapes/heart.js +42 -0
- package/src/shapes/hexagon.js +26 -0
- package/src/shapes/image.js +192 -0
- package/src/shapes/index.js +111 -0
- package/src/shapes/line.js +29 -0
- package/src/shapes/pattern.js +90 -0
- package/src/shapes/pin.js +44 -0
- package/src/shapes/poly.js +31 -0
- package/src/shapes/prism.js +226 -0
- package/src/shapes/rect.js +35 -0
- package/src/shapes/renderable.js +333 -0
- package/src/shapes/ring.js +26 -0
- package/src/shapes/roundrect.js +95 -0
- package/src/shapes/shape.js +117 -0
- package/src/shapes/slice.js +26 -0
- package/src/shapes/sphere.js +314 -0
- package/src/shapes/sphere3d.js +537 -0
- package/src/shapes/square.js +15 -0
- package/src/shapes/star.js +99 -0
- package/src/shapes/svg.js +408 -0
- package/src/shapes/text.js +553 -0
- package/src/shapes/traceable.js +83 -0
- package/src/shapes/transform.js +357 -0
- package/src/shapes/transformable.js +172 -0
- package/src/shapes/triangle.js +26 -0
- package/src/sound/index.js +17 -0
- package/src/sound/sound.js +473 -0
- package/src/sound/synth.analyzer.js +149 -0
- package/src/sound/synth.effects.js +207 -0
- package/src/sound/synth.envelope.js +59 -0
- package/src/sound/synth.js +229 -0
- package/src/sound/synth.musical.js +160 -0
- package/src/sound/synth.noise.js +85 -0
- package/src/sound/synth.oscillators.js +293 -0
- package/src/state/index.js +10 -0
- package/src/state/state-machine.js +371 -0
- package/src/util/camera3d.js +438 -0
- package/src/util/index.js +6 -0
- package/src/util/isometric-camera.js +235 -0
- package/src/util/layout.js +317 -0
- package/src/util/position.js +147 -0
- package/src/util/tasks.js +47 -0
- package/src/util/zindex.js +287 -0
- package/src/webgl/index.js +9 -0
- package/src/webgl/shaders/sphere-shaders.js +994 -0
- package/src/webgl/webgl-renderer.js +388 -0
- package/tde.png +0 -0
- package/test/math/orbital.test.js +61 -0
- package/test/math/tensor.test.js +114 -0
- package/test/particle/emitter.test.js +204 -0
- package/test/particle/particle-system.test.js +310 -0
- package/test/particle/particle.test.js +116 -0
- package/test/particle/updaters.test.js +386 -0
- package/test/setup.js +120 -0
- package/test/shapes/euclidian.test.js +44 -0
- package/test/shapes/geometry.test.js +86 -0
- package/test/shapes/group.test.js +86 -0
- package/test/shapes/rectangle.test.js +64 -0
- package/test/shapes/transform.test.js +379 -0
- package/test/util/camera3d.test.js +428 -0
- package/test/util/scene3d.test.js +352 -0
- package/types/collision.d.ts +249 -0
- package/types/common.d.ts +155 -0
- package/types/game.d.ts +497 -0
- package/types/index.d.ts +309 -0
- package/types/io.d.ts +188 -0
- package/types/logger.d.ts +127 -0
- package/types/math.d.ts +268 -0
- package/types/mixins.d.ts +92 -0
- package/types/motion.d.ts +678 -0
- package/types/painter.d.ts +378 -0
- package/types/shapes.d.ts +864 -0
- package/types/sound.d.ts +672 -0
- package/types/state.d.ts +251 -0
- package/types/util.d.ts +253 -0
- package/vite.config.js +50 -0
- package/vitest.config.js +13 -0
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Game,
|
|
3
|
+
Rectangle,
|
|
4
|
+
Scene,
|
|
5
|
+
ShapeGOFactory,
|
|
6
|
+
GameObject,
|
|
7
|
+
FPSCounter,
|
|
8
|
+
Tween,
|
|
9
|
+
Motion,
|
|
10
|
+
Easing,
|
|
11
|
+
Square,
|
|
12
|
+
} from "../../src/index";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* BouncingSquare - A GameObject that contains a square shape that bounces around within boundaries
|
|
16
|
+
*
|
|
17
|
+
* @extends GameObject
|
|
18
|
+
*/
|
|
19
|
+
class BouncingSquare extends GameObject {
|
|
20
|
+
/**
|
|
21
|
+
* Create a new BouncingSquare
|
|
22
|
+
*
|
|
23
|
+
* @param {Game} game - Reference to the game instance
|
|
24
|
+
* @param {Object} options - Configuration options
|
|
25
|
+
*/
|
|
26
|
+
constructor(game, options = {}) {
|
|
27
|
+
super(game, options);
|
|
28
|
+
|
|
29
|
+
// Square size (side length)
|
|
30
|
+
this.size = options.size || 50;
|
|
31
|
+
|
|
32
|
+
// Create the square shape
|
|
33
|
+
this.square = new Square(this.size, {
|
|
34
|
+
color: options.color || "#0f0",
|
|
35
|
+
debug: options.debug || false,
|
|
36
|
+
debugColor: options.debugColor || "#fff",
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
// Set initial position
|
|
40
|
+
this.x = options.x || 0;
|
|
41
|
+
this.y = options.y || 0;
|
|
42
|
+
|
|
43
|
+
// Set velocity
|
|
44
|
+
this.vx = options.vx !== undefined ? options.vx : Math.random() * 300 - 150;
|
|
45
|
+
this.vy = options.vy !== undefined ? options.vy : Math.random() * 300 - 150;
|
|
46
|
+
|
|
47
|
+
// Ensure velocity is never zero to prevent squares from stopping
|
|
48
|
+
if (Math.abs(this.vx) < 20) this.vx = this.vx < 0 ? -20 : 20;
|
|
49
|
+
if (Math.abs(this.vy) < 20) this.vy = this.vy < 0 ? -20 : 20;
|
|
50
|
+
|
|
51
|
+
// Set opacity if specified
|
|
52
|
+
if (options.opacity !== undefined) {
|
|
53
|
+
this.opacity = options.opacity;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Store references to the scene for bounds checking
|
|
57
|
+
this.scene = options.scene;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Update the square's position and handle bouncing off boundaries
|
|
62
|
+
*
|
|
63
|
+
* @param {number} dt - Delta time in seconds
|
|
64
|
+
*/
|
|
65
|
+
update(dt) {
|
|
66
|
+
// Move the square
|
|
67
|
+
this.x += this.vx * dt;
|
|
68
|
+
this.y += this.vy * dt;
|
|
69
|
+
|
|
70
|
+
if (!this.scene) return super.update(dt);
|
|
71
|
+
|
|
72
|
+
// Get the scene boundaries
|
|
73
|
+
const halfSceneWidth = this.scene.width / 2;
|
|
74
|
+
const halfSceneHeight = this.scene.height / 2;
|
|
75
|
+
|
|
76
|
+
// Calculate half size for collision detection
|
|
77
|
+
const halfSize = this.size / 2;
|
|
78
|
+
|
|
79
|
+
// Check left/right boundaries
|
|
80
|
+
if (this.x - halfSize < -halfSceneWidth) {
|
|
81
|
+
this.x = -halfSceneWidth + halfSize;
|
|
82
|
+
this.vx = Math.abs(this.vx); // ensure positive velocity
|
|
83
|
+
} else if (this.x + halfSize > halfSceneWidth) {
|
|
84
|
+
this.x = halfSceneWidth - halfSize;
|
|
85
|
+
this.vx = -Math.abs(this.vx); // ensure negative velocity
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Check top/bottom boundaries
|
|
89
|
+
if (this.y - halfSize < -halfSceneHeight) {
|
|
90
|
+
this.y = -halfSceneHeight + halfSize;
|
|
91
|
+
this.vy = Math.abs(this.vy); // ensure positive velocity
|
|
92
|
+
} else if (this.y + halfSize > halfSceneHeight) {
|
|
93
|
+
this.y = halfSceneHeight - halfSize;
|
|
94
|
+
this.vy = -Math.abs(this.vy); // ensure negative velocity
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Ensure velocities never drop too low
|
|
98
|
+
if (Math.abs(this.vx) < 20) this.vx = this.vx < 0 ? -20 : 20;
|
|
99
|
+
if (Math.abs(this.vy) < 20) this.vy = this.vy < 0 ? -20 : 20;
|
|
100
|
+
|
|
101
|
+
// Call the parent update to handle standard GameObject behavior
|
|
102
|
+
super.update(dt);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Draw the square
|
|
107
|
+
*/
|
|
108
|
+
draw() {
|
|
109
|
+
super.draw();
|
|
110
|
+
this.square.render();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* OpacityDemo - Demo showcasing multiple squares with varying opacity levels
|
|
116
|
+
* bouncing around the screen with a fading effect applied to the entire scene.
|
|
117
|
+
*/
|
|
118
|
+
export class OpacityDemo extends Scene {
|
|
119
|
+
/**
|
|
120
|
+
* Create a new OpacityDemo
|
|
121
|
+
*
|
|
122
|
+
* @param {Game} game - Reference to the game instance
|
|
123
|
+
* @param {Object} options - Configuration options
|
|
124
|
+
*/
|
|
125
|
+
constructor(game, options = {}) {
|
|
126
|
+
super(game, options);
|
|
127
|
+
// Define the margin to keep squares within
|
|
128
|
+
this.MARGIN = 0;
|
|
129
|
+
// Store all squares
|
|
130
|
+
this.squares = [];
|
|
131
|
+
// Initialize opacity animation timer
|
|
132
|
+
this.elapsed = 0;
|
|
133
|
+
// Create multiple squares
|
|
134
|
+
const count = options.count || 20; // Reasonable default
|
|
135
|
+
|
|
136
|
+
for (let i = 0; i < count; i++) {
|
|
137
|
+
// Create square with random properties
|
|
138
|
+
const square = this.createRandomSquare(game, i);
|
|
139
|
+
// Add it to the scene
|
|
140
|
+
this.add(square);
|
|
141
|
+
// Store a reference
|
|
142
|
+
this.squares.push(square);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Create a square with random properties
|
|
148
|
+
*
|
|
149
|
+
* @param {Game} game - Reference to the game instance
|
|
150
|
+
* @param {number} index - Index for naming
|
|
151
|
+
* @returns {BouncingSquare} The created square
|
|
152
|
+
*/
|
|
153
|
+
createRandomSquare(game, index) {
|
|
154
|
+
// Random size between 30 and 70
|
|
155
|
+
const size = 30 + Math.random() * 40;
|
|
156
|
+
|
|
157
|
+
// Initialize scene dimensions for initial positioning
|
|
158
|
+
const sceneWidth = game.width - this.MARGIN * 2;
|
|
159
|
+
const sceneHeight = game.height - this.MARGIN * 2;
|
|
160
|
+
|
|
161
|
+
// Random position within scene bounds (80% of max to avoid edge cases)
|
|
162
|
+
const x = (Math.random() * sceneWidth - sceneWidth / 2) * 0.8;
|
|
163
|
+
const y = (Math.random() * sceneHeight - sceneHeight / 2) * 0.8;
|
|
164
|
+
|
|
165
|
+
// Random velocity (ensure it's not too slow)
|
|
166
|
+
const vx = (Math.random() < 0.5 ? -1 : 1) * (50 + Math.random() * 150);
|
|
167
|
+
const vy = (Math.random() < 0.5 ? -1 : 1) * (50 + Math.random() * 150);
|
|
168
|
+
|
|
169
|
+
// Random color
|
|
170
|
+
const hue = Math.floor(Math.random() * 360);
|
|
171
|
+
const color = `hsl(${hue}, 80%, 50%)`;
|
|
172
|
+
|
|
173
|
+
// Random opacity between 0.3 and 1
|
|
174
|
+
const opacity = 0.3 + Math.random() * 0.6;
|
|
175
|
+
|
|
176
|
+
// Create the square with these properties
|
|
177
|
+
return new BouncingSquare(game, {
|
|
178
|
+
size,
|
|
179
|
+
x,
|
|
180
|
+
y,
|
|
181
|
+
vx,
|
|
182
|
+
vy,
|
|
183
|
+
color,
|
|
184
|
+
opacity,
|
|
185
|
+
name: `square_${index}`,
|
|
186
|
+
debug: true,
|
|
187
|
+
debugColor: "white",
|
|
188
|
+
scene: this,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
#prevWidth = 0;
|
|
193
|
+
#prevHeight = 0;
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Update the scene and all squares
|
|
197
|
+
*
|
|
198
|
+
* @param {number} dt - Delta time in seconds
|
|
199
|
+
*/
|
|
200
|
+
update(dt) {
|
|
201
|
+
// Update scene dimensions based on game dimensions (full screen)
|
|
202
|
+
if (this.width !== this.game.width) {
|
|
203
|
+
this.width = this.game.width;
|
|
204
|
+
this.x = this.game.width / 2;
|
|
205
|
+
}
|
|
206
|
+
if (this.height !== this.game.height) {
|
|
207
|
+
this.height = this.game.height;
|
|
208
|
+
this.y = this.game.height / 2;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// Animate the scene's opacity
|
|
212
|
+
this.elapsed += dt;
|
|
213
|
+
|
|
214
|
+
// Use Motion.pulse to animate opacity between 0 and 1
|
|
215
|
+
const result = Motion.pulse(
|
|
216
|
+
0,
|
|
217
|
+
1, // max
|
|
218
|
+
this.elapsed, // elapsed time
|
|
219
|
+
10, // duration in seconds
|
|
220
|
+
true, // loop
|
|
221
|
+
true, // yoyo
|
|
222
|
+
Easing.easeInOutSine // easing function
|
|
223
|
+
);
|
|
224
|
+
|
|
225
|
+
// Apply the result to the scene's opacity
|
|
226
|
+
this.opacity = result.value;
|
|
227
|
+
//console.log(this.opacity);
|
|
228
|
+
|
|
229
|
+
// Call parent update which will update all children
|
|
230
|
+
super.update(dt);
|
|
231
|
+
if (this.#prevWidth !== this.width || this.#prevHeight !== this.height) {
|
|
232
|
+
this.markBoundsDirty();
|
|
233
|
+
}
|
|
234
|
+
this.#prevWidth = this.width;
|
|
235
|
+
this.#prevHeight = this.height;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
render() {
|
|
239
|
+
this.logger.log("Scene opacity", this.opacity);
|
|
240
|
+
super.render();
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* MyGame - Main game class for the opacity demo
|
|
246
|
+
*/
|
|
247
|
+
export class MyGame extends Game {
|
|
248
|
+
/**
|
|
249
|
+
* Create a new game instance
|
|
250
|
+
*
|
|
251
|
+
* @param {HTMLCanvasElement} canvas - The canvas element to render to
|
|
252
|
+
*/
|
|
253
|
+
constructor(canvas) {
|
|
254
|
+
super(canvas);
|
|
255
|
+
this.backgroundColor = "black";
|
|
256
|
+
this.enableFluidSize();
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Initialize the game
|
|
261
|
+
*/
|
|
262
|
+
init() {
|
|
263
|
+
super.init();
|
|
264
|
+
|
|
265
|
+
// Create the opacity demo with 20 squares
|
|
266
|
+
this.pipeline.add(new OpacityDemo(this, { count: 100, debug: true }));
|
|
267
|
+
this.fpsCounter = new FPSCounter(this, {
|
|
268
|
+
color: "#00FF00",
|
|
269
|
+
//debug: true,
|
|
270
|
+
anchor: "bottom-right",
|
|
271
|
+
});
|
|
272
|
+
// Add FPS counter
|
|
273
|
+
this.pipeline.add(this.fpsCounter);
|
|
274
|
+
}
|
|
275
|
+
}
|