@amphore-dev/kinogrida 0.3.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 +202 -0
- package/dist/classes/ArcShape.d.ts +26 -0
- package/dist/classes/ArcShape.d.ts.map +1 -0
- package/dist/classes/ArcShape.js +299 -0
- package/dist/classes/ArcShape.js.map +1 -0
- package/dist/classes/BaseShape.d.ts +37 -0
- package/dist/classes/BaseShape.d.ts.map +1 -0
- package/dist/classes/BaseShape.js +146 -0
- package/dist/classes/BaseShape.js.map +1 -0
- package/dist/classes/Kinogrida.d.ts +32 -0
- package/dist/classes/Kinogrida.d.ts.map +1 -0
- package/dist/classes/Kinogrida.js +223 -0
- package/dist/classes/Kinogrida.js.map +1 -0
- package/dist/classes/SquareShape.d.ts +12 -0
- package/dist/classes/SquareShape.d.ts.map +1 -0
- package/dist/classes/SquareShape.js +125 -0
- package/dist/classes/SquareShape.js.map +1 -0
- package/dist/classes/index.d.ts +2 -0
- package/dist/classes/index.d.ts.map +1 -0
- package/dist/classes/index.js +2 -0
- package/dist/classes/index.js.map +1 -0
- package/dist/constants/CColors.d.ts +8 -0
- package/dist/constants/CColors.d.ts.map +1 -0
- package/dist/constants/CColors.js +70 -0
- package/dist/constants/CColors.js.map +1 -0
- package/dist/constants/CShapes.d.ts +7 -0
- package/dist/constants/CShapes.d.ts.map +1 -0
- package/dist/constants/CShapes.js +7 -0
- package/dist/constants/CShapes.js.map +1 -0
- package/dist/constants/index.d.ts +3 -0
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/constants/index.js +3 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/types/TGrid.d.ts +28 -0
- package/dist/types/TGrid.d.ts.map +1 -0
- package/dist/types/TGrid.js +2 -0
- package/dist/types/TGrid.js.map +1 -0
- package/dist/types/TKinogrida.d.ts +9 -0
- package/dist/types/TKinogrida.d.ts.map +1 -0
- package/dist/types/TKinogrida.js +2 -0
- package/dist/types/TKinogrida.js.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/UColors.d.ts +3 -0
- package/dist/utils/UColors.d.ts.map +1 -0
- package/dist/utils/UColors.js +12 -0
- package/dist/utils/UColors.js.map +1 -0
- package/dist/utils/UMath.d.ts +5 -0
- package/dist/utils/UMath.d.ts.map +1 -0
- package/dist/utils/UMath.js +15 -0
- package/dist/utils/UMath.js.map +1 -0
- package/dist/utils/UShapes.d.ts +2 -0
- package/dist/utils/UShapes.d.ts.map +1 -0
- package/dist/utils/UShapes.js +7 -0
- package/dist/utils/UShapes.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +77 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Amphore Dev
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
# 🎨 Kinogrida
|
|
2
|
+
|
|
3
|
+
**A TypeScript library for creating animated shape visualizations on HTML5 Canvas**
|
|
4
|
+
|
|
5
|
+
Kinogrida provides a powerful and flexible system for creating animated grid-based visualizations with dynamic shape movements, collision detection, and customizable visual effects.
|
|
6
|
+
|
|
7
|
+
## ✨ Features
|
|
8
|
+
|
|
9
|
+
- 🎯 **Grid-based Animation System** - Smooth movement between grid cells with pathfinding
|
|
10
|
+
- 🔒 **Collision Detection** - Smart path locking prevents overlapping movements
|
|
11
|
+
- 🎨 **Multiple Shape Types** - BaseShape, SquareShape, and ArcShape with extensible architecture
|
|
12
|
+
- 🌈 **Rich Color Palettes** - 8 pre-built themes (Rainbow, Pastel, Neon, Ocean, Sunset, Dark, Earth, Cyberpunk)
|
|
13
|
+
- 🔄 **Advanced Arc Animation** - Clockwise/counterclockwise rotation with configurable amplitude
|
|
14
|
+
- ⚡ **High Performance** - Optimized rendering with requestAnimationFrame
|
|
15
|
+
- 📱 **Responsive Design** - Auto-adapts to canvas resizing
|
|
16
|
+
- 🎛️ **Highly Customizable** - Extensive configuration options
|
|
17
|
+
|
|
18
|
+
## 🚀 Installation
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npm install @amphore-dev/kinogrida
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## 📖 Quick Start
|
|
25
|
+
|
|
26
|
+
```typescript
|
|
27
|
+
import { Kinogrida } from "@amphore-dev/kinogrida";
|
|
28
|
+
|
|
29
|
+
// Get your canvas element
|
|
30
|
+
const canvas = document.getElementById("myCanvas") as HTMLCanvasElement;
|
|
31
|
+
|
|
32
|
+
// Create and start the visualization
|
|
33
|
+
const kinogrida = new Kinogrida(canvas);
|
|
34
|
+
kinogrida.play();
|
|
35
|
+
|
|
36
|
+
// Stop when needed
|
|
37
|
+
// kinogrida.pause();
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## 🎨 Color Palettes
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
import {
|
|
44
|
+
CCOLORS_RAINBOW_PALETTE,
|
|
45
|
+
CCOLORS_PASTEL_PALETTE,
|
|
46
|
+
CCOLORS_NEON_PALETTE,
|
|
47
|
+
CCOLORS_OCEAN_PALETTE,
|
|
48
|
+
CCOLORS_SUNSET_PALETTE,
|
|
49
|
+
CCOLORS_DARK_PALETTE,
|
|
50
|
+
CCOLORS_EARTH_PALETTE,
|
|
51
|
+
CCOLORS_CYBERPUNK_PALETTE,
|
|
52
|
+
} from "@amphore-dev/kinogrida";
|
|
53
|
+
|
|
54
|
+
// Use any palette for your shapes
|
|
55
|
+
const colors = CCOLORS_CYBERPUNK_PALETTE;
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## 🔧 Advanced Usage
|
|
59
|
+
|
|
60
|
+
### Creating Custom Shapes
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
import {
|
|
64
|
+
BaseShape,
|
|
65
|
+
TGrid,
|
|
66
|
+
TGridConfig,
|
|
67
|
+
TShapeConfig,
|
|
68
|
+
} from "@amphore-dev/kinogrida";
|
|
69
|
+
|
|
70
|
+
export class CustomShape extends BaseShape {
|
|
71
|
+
public draw(context: CanvasRenderingContext2D, gridConfig: TGridConfig) {
|
|
72
|
+
// Your custom drawing logic
|
|
73
|
+
context.fillStyle = this.color;
|
|
74
|
+
const { cellSize, offsetX, offsetY } = gridConfig;
|
|
75
|
+
const x = offsetX + this.x * cellSize;
|
|
76
|
+
const y = offsetY + this.y * cellSize;
|
|
77
|
+
context.fillRect(x, y, cellSize, cellSize);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Grid Configuration
|
|
83
|
+
|
|
84
|
+
```typescript
|
|
85
|
+
const gridConfig = {
|
|
86
|
+
nbrColumns: 20, // Number of columns
|
|
87
|
+
nbrRows: 15, // Number of rows
|
|
88
|
+
gridMargin: 50, // Margin around grid
|
|
89
|
+
cellSize: 40, // Size of each cell (auto-calculated)
|
|
90
|
+
lineWidth: 2, // Stroke width for shapes
|
|
91
|
+
debug: false, // Show debug information
|
|
92
|
+
};
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Movement System
|
|
96
|
+
|
|
97
|
+
The library features an intelligent movement system:
|
|
98
|
+
|
|
99
|
+
- **Path Planning** - Calculates optimal routes between grid positions
|
|
100
|
+
- **Cell Locking** - Reserves path cells to prevent collisions
|
|
101
|
+
- **Smooth Animation** - Fluid transitions with configurable speed
|
|
102
|
+
- **Bounce-free Motion** - Uses distance-based positioning for precise arrival
|
|
103
|
+
|
|
104
|
+
## 🏗️ Architecture
|
|
105
|
+
|
|
106
|
+
### Core Classes
|
|
107
|
+
|
|
108
|
+
- **`Kinogrida`** - Main orchestrator class managing canvas and animation
|
|
109
|
+
- **`BaseShape`** - Abstract base class for all animated shapes
|
|
110
|
+
- **`SquareShape`** - Square implementation with optional rounded corners
|
|
111
|
+
- **`ArcShape`** - Curved arc implementation with rotation and directional control
|
|
112
|
+
|
|
113
|
+
### Movement Lifecycle
|
|
114
|
+
|
|
115
|
+
1. **Path Generation** - Calculate cells between start and target
|
|
116
|
+
2. **Collision Check** - Verify path is clear of obstacles
|
|
117
|
+
3. **Cell Locking** - Reserve path cells to prevent conflicts
|
|
118
|
+
4. **Animation Phase 1** - Move shape head to target
|
|
119
|
+
5. **Animation Phase 2** - Move shape tail to complete extension
|
|
120
|
+
6. **Cleanup** - Release locked cells and update grid state
|
|
121
|
+
|
|
122
|
+
## 🎭 Shape Types
|
|
123
|
+
|
|
124
|
+
### BaseShape (Abstract)
|
|
125
|
+
|
|
126
|
+
BaseShape provides core properties and methods for all shapes, including color management and movement logic.
|
|
127
|
+
|
|
128
|
+
```typescript
|
|
129
|
+
// Abstract base class with color and movement capabilities
|
|
130
|
+
const item = new BaseShape(grid, x, y, color);
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### SquareShape
|
|
134
|
+
|
|
135
|
+
SquareShape extends BaseShape to create squares with optional rounded corners.
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
// Configurable squares with optional rounding
|
|
139
|
+
const square = new SquareShape(grid, x, y, {
|
|
140
|
+
color: "blue",
|
|
141
|
+
radiusPercent: 25, // 0-100 percentage for rounded corners
|
|
142
|
+
});
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### ArcShape
|
|
146
|
+
|
|
147
|
+
ArcShape extends BaseShape to create dynamic curved arcs with advanced rotation capabilities.
|
|
148
|
+
|
|
149
|
+
```typescript
|
|
150
|
+
// Dynamic arcs with advanced rotation control
|
|
151
|
+
const arc = new ArcShape(grid, x, y, {
|
|
152
|
+
color: "red",
|
|
153
|
+
clockwise: true, // Rotation direction
|
|
154
|
+
rotationAmount: 0.25, // 0.25=quarter, 0.5=half, 0.75=three-quarter, 1.0=full rotation
|
|
155
|
+
});
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
#### ArcShape Rotation Options
|
|
159
|
+
|
|
160
|
+
- **`clockwise`** - `true` for clockwise, `false` for counterclockwise rotation
|
|
161
|
+
- **`rotationAmount`** - Amplitude of rotation:
|
|
162
|
+
- `0.25` - Quarter turn (90°)
|
|
163
|
+
- `0.5` - Half turn (180°)
|
|
164
|
+
- `0.75` - Three-quarter turn (270°)
|
|
165
|
+
- `1.0` - Full rotation (360°)
|
|
166
|
+
|
|
167
|
+
## 📚 Development
|
|
168
|
+
|
|
169
|
+
### Build & Test
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
# Development build with watch
|
|
173
|
+
npm run build:watch
|
|
174
|
+
|
|
175
|
+
# Run tests
|
|
176
|
+
npm test
|
|
177
|
+
|
|
178
|
+
# Run example
|
|
179
|
+
cd example && npm run dev
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### Project Structure
|
|
183
|
+
|
|
184
|
+
```
|
|
185
|
+
src/
|
|
186
|
+
├── classes/ # Core shape classes
|
|
187
|
+
├── constants/ # Color palettes and constants
|
|
188
|
+
├── types/ # TypeScript type definitions
|
|
189
|
+
└── utils/ # Utility functions
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## 🤝 Contributing
|
|
193
|
+
|
|
194
|
+
1. Fork the repository
|
|
195
|
+
2. Create your feature branch (`git checkout -b feature/amazing-feature`)
|
|
196
|
+
3. Commit your changes (`git commit -m 'Add some amazing feature'`)
|
|
197
|
+
4. Push to the branch (`git push origin feature/amazing-feature`)
|
|
198
|
+
5. Open a Pull Request
|
|
199
|
+
|
|
200
|
+
## 📄 License
|
|
201
|
+
|
|
202
|
+
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { TGrid, TGridConfig, TPosition, TShapeConfig } from "../types/TGrid.js";
|
|
2
|
+
import { BaseShape } from "./BaseShape.js";
|
|
3
|
+
export declare class ArcShape extends BaseShape {
|
|
4
|
+
protected progress: number;
|
|
5
|
+
protected tailProgress: number;
|
|
6
|
+
protected angleOffset: number;
|
|
7
|
+
protected arc: number;
|
|
8
|
+
protected clockwise: boolean;
|
|
9
|
+
protected rotationAmount: number;
|
|
10
|
+
private debugPath;
|
|
11
|
+
protected moveDuration: number;
|
|
12
|
+
constructor(grid: TGrid, x: number | undefined, y: number | undefined, options: TShapeConfig);
|
|
13
|
+
private genAngleOffset;
|
|
14
|
+
private calculateArcGeometry;
|
|
15
|
+
private drawArcElements;
|
|
16
|
+
drawArc(context: CanvasRenderingContext2D, gridConfig: TGridConfig): void;
|
|
17
|
+
draw(context: CanvasRenderingContext2D, gridConfig: TGridConfig): void;
|
|
18
|
+
private drawDebugPath;
|
|
19
|
+
private updateAnimationProgress;
|
|
20
|
+
protected onMoveComplete(grid: TGrid, newX: number, newY: number): void;
|
|
21
|
+
protected calculateNewTarget(grid: TGrid, gridConfig: TGridConfig): void;
|
|
22
|
+
genLockPath(grid: TGrid, gridConfig: TGridConfig): TPosition[] | false;
|
|
23
|
+
private isValidGridPosition;
|
|
24
|
+
private resetDebugPath;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=ArcShape.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ArcShape.d.ts","sourceRoot":"","sources":["../../src/classes/ArcShape.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAG3C,qBAAa,QAAS,SAAQ,SAAS;IACnC,SAAS,CAAC,QAAQ,SAAK;IACvB,SAAS,CAAC,YAAY,SAAK;IAC3B,SAAS,CAAC,WAAW,SAAK;IAC1B,SAAS,CAAC,GAAG,SAAK;IAClB,SAAS,CAAC,SAAS,UAAQ;IAC3B,SAAS,CAAC,cAAc,SAAQ;IAEhC,OAAO,CAAC,SAAS,CAQf;IAEF,SAAS,CAAC,YAAY,SAAQ;gBAE1B,IAAI,EAAE,KAAK,EACX,CAAC,EAAE,MAAM,YAAI,EACb,CAAC,EAAE,MAAM,YAAI,EACb,OAAO,EAAE,YAAY;IAYzB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,oBAAoB;IAmD5B,OAAO,CAAC,eAAe;IAgFhB,OAAO,CAAC,OAAO,EAAE,wBAAwB,EAAE,UAAU,EAAE,WAAW;IAkBlE,IAAI,CAAC,OAAO,EAAE,wBAAwB,EAAE,UAAU,EAAE,WAAW;IAOtE,OAAO,CAAC,aAAa;IAsCrB,OAAO,CAAC,uBAAuB;IA8C/B,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IASvE,SAAS,CAAC,kBAAkB,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,GAAG,IAAI;IA4DjE,WAAW,CACd,IAAI,EAAE,KAAK,EACX,UAAU,EAAE,WAAW,GACxB,SAAS,EAAE,GAAG,KAAK;IAwFtB,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,cAAc;CAOzB"}
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import { BaseShape } from "./BaseShape.js";
|
|
2
|
+
import { randomInt } from "../utils/UMath.js";
|
|
3
|
+
export class ArcShape extends BaseShape {
|
|
4
|
+
progress = 0;
|
|
5
|
+
tailProgress = 0;
|
|
6
|
+
angleOffset = 0;
|
|
7
|
+
arc = 2;
|
|
8
|
+
clockwise = true; // Sens de rotation : true = horaire, false = antihoraire
|
|
9
|
+
rotationAmount = 0.25; // Amplitude de rotation : 0.25 (quart), 0.5 (demi), 0.75 (trois quarts), 1.0 (complet)
|
|
10
|
+
debugPath = {
|
|
11
|
+
inner: [],
|
|
12
|
+
outer: [],
|
|
13
|
+
center: [],
|
|
14
|
+
};
|
|
15
|
+
moveDuration = 4000; // Duration of the move in milliseconds
|
|
16
|
+
constructor(grid, x = 0, y = 0, options) {
|
|
17
|
+
super(grid, x, y, options);
|
|
18
|
+
this.color = options.color;
|
|
19
|
+
this.angleOffset = this.genAngleOffset();
|
|
20
|
+
// Ajouter la possibilité de configurer le sens de rotation
|
|
21
|
+
this.clockwise = options.clockwise ?? true;
|
|
22
|
+
// Configurer l'amplitude de rotation (par défaut quart de tour)
|
|
23
|
+
this.rotationAmount = options.rotationAmount ?? 0.25;
|
|
24
|
+
// this.color = "green";
|
|
25
|
+
}
|
|
26
|
+
genAngleOffset() {
|
|
27
|
+
const possibleAngles = [0, 0.25, 0.5, 0.75];
|
|
28
|
+
return (possibleAngles[randomInt(0, possibleAngles.length - 1)] *
|
|
29
|
+
Math.PI *
|
|
30
|
+
2);
|
|
31
|
+
}
|
|
32
|
+
calculateArcGeometry(gridConfig, customAngleOffset, customArc) {
|
|
33
|
+
const { cellSize, offsetX, offsetY, lineWidth } = gridConfig;
|
|
34
|
+
const arc = customArc ?? this.arc;
|
|
35
|
+
const angleOffset = customAngleOffset ?? this.angleOffset;
|
|
36
|
+
const centerX = offsetX + this.x * cellSize + cellSize / 2;
|
|
37
|
+
const centerY = offsetY + this.y * cellSize + cellSize / 2;
|
|
38
|
+
const endAngle = angleOffset;
|
|
39
|
+
const initAngle = endAngle - Math.PI;
|
|
40
|
+
const rotationDirection = this.clockwise ? 1 : -1;
|
|
41
|
+
const rotationAngle = 2 * Math.PI * this.rotationAmount; // Convertir en radians
|
|
42
|
+
const startAngle = endAngle -
|
|
43
|
+
Math.PI +
|
|
44
|
+
rotationAngle * this.progress * rotationDirection;
|
|
45
|
+
const tailAngle = endAngle -
|
|
46
|
+
Math.PI +
|
|
47
|
+
rotationAngle * this.tailProgress * rotationDirection;
|
|
48
|
+
const arcRadius = cellSize * arc;
|
|
49
|
+
const arcCenterX = centerX + cellSize * arc * Math.cos(endAngle);
|
|
50
|
+
const arcCenterY = centerY + cellSize * arc * Math.sin(endAngle);
|
|
51
|
+
return {
|
|
52
|
+
centerX,
|
|
53
|
+
centerY,
|
|
54
|
+
endAngle,
|
|
55
|
+
initAngle,
|
|
56
|
+
startAngle,
|
|
57
|
+
tailAngle,
|
|
58
|
+
arcRadius,
|
|
59
|
+
arcCenterX,
|
|
60
|
+
arcCenterY,
|
|
61
|
+
cellSize,
|
|
62
|
+
lineWidth,
|
|
63
|
+
rotationDirection,
|
|
64
|
+
offsetX,
|
|
65
|
+
offsetY,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
drawArcElements(context, geometry, color, width) {
|
|
69
|
+
const { arcCenterX, arcCenterY, arcRadius, startAngle, tailAngle, initAngle, lineWidth, rotationDirection, } = geometry;
|
|
70
|
+
const halfWidth = width / 2;
|
|
71
|
+
context.lineWidth = lineWidth;
|
|
72
|
+
context.strokeStyle = color;
|
|
73
|
+
const startX = arcCenterX + arcRadius * Math.cos(startAngle);
|
|
74
|
+
const startY = arcCenterY + arcRadius * Math.sin(startAngle);
|
|
75
|
+
const endX = arcCenterX + arcRadius * Math.cos(tailAngle);
|
|
76
|
+
const endY = arcCenterY + arcRadius * Math.sin(tailAngle);
|
|
77
|
+
const rotationAngle = 2 * Math.PI * this.rotationAmount;
|
|
78
|
+
const arcStartAngle = initAngle + rotationAngle * this.tailProgress * rotationDirection;
|
|
79
|
+
const arcEndAngle = initAngle + rotationAngle * this.progress * rotationDirection;
|
|
80
|
+
// Start cap
|
|
81
|
+
context.beginPath();
|
|
82
|
+
context.arc(startX, startY, halfWidth, this.clockwise ? startAngle : startAngle - Math.PI, this.clockwise ? startAngle + Math.PI : startAngle);
|
|
83
|
+
context.stroke();
|
|
84
|
+
// End cap
|
|
85
|
+
context.beginPath();
|
|
86
|
+
context.arc(endX, endY, halfWidth, this.clockwise ? tailAngle - Math.PI : tailAngle, this.clockwise ? tailAngle : tailAngle - Math.PI);
|
|
87
|
+
context.stroke();
|
|
88
|
+
// Outer arc
|
|
89
|
+
context.beginPath();
|
|
90
|
+
context.arc(arcCenterX, arcCenterY, arcRadius + halfWidth, arcStartAngle, arcEndAngle, !this.clockwise);
|
|
91
|
+
context.stroke();
|
|
92
|
+
// Inner arc
|
|
93
|
+
context.beginPath();
|
|
94
|
+
context.arc(arcCenterX, arcCenterY, arcRadius - halfWidth, arcStartAngle, arcEndAngle, !this.clockwise);
|
|
95
|
+
context.stroke();
|
|
96
|
+
}
|
|
97
|
+
drawArc(context, gridConfig) {
|
|
98
|
+
const geometry = this.calculateArcGeometry(gridConfig);
|
|
99
|
+
const baseSize = gridConfig.cellSize * 0.8;
|
|
100
|
+
context.lineCap = "round";
|
|
101
|
+
this.drawArcElements(context, geometry, this.color, baseSize);
|
|
102
|
+
this.drawArcElements(context, geometry, "white", baseSize - geometry.lineWidth * 4);
|
|
103
|
+
this.updateAnimationProgress(geometry);
|
|
104
|
+
}
|
|
105
|
+
draw(context, gridConfig) {
|
|
106
|
+
this.drawArc(context, gridConfig);
|
|
107
|
+
if (gridConfig.debug) {
|
|
108
|
+
this.drawDebugPath(context);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
drawDebugPath(context) {
|
|
112
|
+
if (!this.debugPath || !this.isMoving)
|
|
113
|
+
return;
|
|
114
|
+
context.lineWidth = 1;
|
|
115
|
+
context.strokeStyle = "red";
|
|
116
|
+
context.beginPath();
|
|
117
|
+
this.debugPath.center.forEach((pos, index) => {
|
|
118
|
+
if (index === 0) {
|
|
119
|
+
context.moveTo(pos.x, pos.y);
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
context.lineTo(pos.x, pos.y);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
context.stroke();
|
|
126
|
+
context.strokeStyle = "blue";
|
|
127
|
+
context.beginPath();
|
|
128
|
+
this.debugPath.inner.forEach((pos, index) => {
|
|
129
|
+
if (index === 0) {
|
|
130
|
+
context.moveTo(pos.x, pos.y);
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
context.lineTo(pos.x, pos.y);
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
context.stroke();
|
|
137
|
+
context.strokeStyle = "green";
|
|
138
|
+
context.beginPath();
|
|
139
|
+
this.debugPath.outer.forEach((pos, index) => {
|
|
140
|
+
if (index === 0) {
|
|
141
|
+
context.moveTo(pos.x, pos.y);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
context.lineTo(pos.x, pos.y);
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
context.stroke();
|
|
148
|
+
}
|
|
149
|
+
updateAnimationProgress(geometry) {
|
|
150
|
+
if (!this.isMoving)
|
|
151
|
+
return;
|
|
152
|
+
const { arcCenterX, arcCenterY, arcRadius, endAngle, cellSize } = geometry;
|
|
153
|
+
if (!this.hasReachedTarget &&
|
|
154
|
+
(this.progress >= 1 || this.progress + this.speed >= 1)) {
|
|
155
|
+
this.progress = 1;
|
|
156
|
+
this.hasReachedTarget = true;
|
|
157
|
+
}
|
|
158
|
+
else if (this.tailProgress >= 1 ||
|
|
159
|
+
(this.tailProgress + this.speed >= 1 && this.hasReachedTarget)) {
|
|
160
|
+
this.tailProgress = 1;
|
|
161
|
+
// Calculer la position finale en tenant compte de la direction de rotation
|
|
162
|
+
const rotationDirection = this.clockwise ? 1 : -1;
|
|
163
|
+
const rotationAngle = 2 * Math.PI * this.rotationAmount;
|
|
164
|
+
const finalAngle = endAngle - Math.PI + rotationAngle * rotationDirection;
|
|
165
|
+
const newX = Math.floor((arcCenterX +
|
|
166
|
+
arcRadius * Math.cos(finalAngle) -
|
|
167
|
+
geometry.offsetX) /
|
|
168
|
+
cellSize);
|
|
169
|
+
const newY = Math.floor((arcCenterY +
|
|
170
|
+
arcRadius * Math.sin(finalAngle) -
|
|
171
|
+
geometry.offsetY) /
|
|
172
|
+
cellSize);
|
|
173
|
+
this.onMoveComplete(this.grid, newX, newY);
|
|
174
|
+
}
|
|
175
|
+
else if (this.progress < 1) {
|
|
176
|
+
this.progress += this.speed;
|
|
177
|
+
}
|
|
178
|
+
else if (this.progress >= 1 && this.tailProgress < 1) {
|
|
179
|
+
this.tailProgress += this.speed;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
onMoveComplete(grid, newX, newY) {
|
|
183
|
+
super.onMoveComplete(grid, newX, newY);
|
|
184
|
+
this.progress = 0;
|
|
185
|
+
this.tailProgress = 0;
|
|
186
|
+
this.isMoving = false;
|
|
187
|
+
this.hasReachedTarget = true;
|
|
188
|
+
this.hasTailReachedTarget = true;
|
|
189
|
+
}
|
|
190
|
+
calculateNewTarget(grid, gridConfig) {
|
|
191
|
+
if (this.isMoving) {
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
const { nbrColumns, nbrRows } = gridConfig;
|
|
195
|
+
const newOffset = this.genAngleOffset();
|
|
196
|
+
const newArc = randomInt(1, Math.min(nbrColumns, nbrRows) / 2 - 1);
|
|
197
|
+
// Générer aléatoirement le sens de rotation dès le début
|
|
198
|
+
const newClockwise = Math.random() > 0.5;
|
|
199
|
+
// Générer aléatoirement l'amplitude de rotation
|
|
200
|
+
const rotationAmounts = [0.25, 0.5, 0.75]; // quart, demi, trois quarts, complet
|
|
201
|
+
const newRotationAmount = rotationAmounts[randomInt(0, rotationAmounts.length - 1)];
|
|
202
|
+
// Utiliser calculateArcGeometry avec les nouveaux paramètres
|
|
203
|
+
const { arcCenterX, arcCenterY, arcRadius, endAngle, cellSize } = this.calculateArcGeometry(gridConfig, newOffset, newArc);
|
|
204
|
+
// Calculer la position finale en tenant compte de la direction de rotation
|
|
205
|
+
const rotationDirection = newClockwise ? 1 : -1;
|
|
206
|
+
const rotationAngle = 2 * Math.PI * newRotationAmount;
|
|
207
|
+
const finalAngle = endAngle - Math.PI + rotationAngle * rotationDirection;
|
|
208
|
+
const endX = Math.floor((arcCenterX +
|
|
209
|
+
arcRadius * Math.cos(finalAngle) -
|
|
210
|
+
gridConfig.offsetX) /
|
|
211
|
+
cellSize);
|
|
212
|
+
const endY = Math.floor((arcCenterY +
|
|
213
|
+
arcRadius * Math.sin(finalAngle) -
|
|
214
|
+
gridConfig.offsetY) /
|
|
215
|
+
cellSize);
|
|
216
|
+
if (endX >= 0 &&
|
|
217
|
+
endX < nbrColumns &&
|
|
218
|
+
endY >= 0 &&
|
|
219
|
+
endY < nbrRows &&
|
|
220
|
+
grid[endY][endX] === null &&
|
|
221
|
+
(endX !== this.x || endY !== this.y)) {
|
|
222
|
+
this.arc = newArc;
|
|
223
|
+
this.angleOffset = newOffset;
|
|
224
|
+
this.clockwise = newClockwise;
|
|
225
|
+
this.rotationAmount = newRotationAmount;
|
|
226
|
+
const frames = (this.moveDuration / 1000) * 60;
|
|
227
|
+
const speed = 1 / frames; // toujours en %
|
|
228
|
+
this.speed = speed;
|
|
229
|
+
this.moveTo(grid, gridConfig, endX, endY);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
genLockPath(grid, gridConfig) {
|
|
233
|
+
const path = [];
|
|
234
|
+
const pathKeys = new Set();
|
|
235
|
+
const geometry = this.calculateArcGeometry(gridConfig);
|
|
236
|
+
const { arcCenterX, arcCenterY, arcRadius, endAngle, rotationDirection, offsetX, offsetY, cellSize, } = geometry;
|
|
237
|
+
const width = gridConfig.cellSize;
|
|
238
|
+
const halfWidth = width * 0.5 - gridConfig.lineWidth * 0.51;
|
|
239
|
+
const steps = Math.max(10, this.arc * this.arc * (this.rotationAmount * 8));
|
|
240
|
+
const addPoint = (worldX, worldY) => {
|
|
241
|
+
const gridX = Math.floor((worldX - offsetX) / cellSize);
|
|
242
|
+
const gridY = Math.floor((worldY - offsetY) / cellSize);
|
|
243
|
+
if (!this.isValidGridPosition(gridX, gridY, grid)) {
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
246
|
+
const key = `${gridX}:${gridY}`;
|
|
247
|
+
if (pathKeys.has(key)) {
|
|
248
|
+
return true;
|
|
249
|
+
}
|
|
250
|
+
pathKeys.add(key);
|
|
251
|
+
path.push({ x: gridX, y: gridY });
|
|
252
|
+
return true;
|
|
253
|
+
};
|
|
254
|
+
if (gridConfig.debug)
|
|
255
|
+
this.resetDebugPath();
|
|
256
|
+
for (let i = 0; i <= steps; i++) {
|
|
257
|
+
const progress = i / steps;
|
|
258
|
+
const rotationAngle = 2 * Math.PI * this.rotationAmount;
|
|
259
|
+
const angle = endAngle -
|
|
260
|
+
Math.PI +
|
|
261
|
+
rotationAngle * progress * rotationDirection;
|
|
262
|
+
const centerX = arcCenterX + arcRadius * Math.cos(angle);
|
|
263
|
+
const centerY = arcCenterY + arcRadius * Math.sin(angle);
|
|
264
|
+
if (gridConfig.debug)
|
|
265
|
+
this.debugPath.center.push({ x: centerX, y: centerY });
|
|
266
|
+
const innerRadius = Math.max(0.001, arcRadius - halfWidth);
|
|
267
|
+
const innerX = arcCenterX + innerRadius * Math.cos(angle);
|
|
268
|
+
const innerY = arcCenterY + innerRadius * Math.sin(angle);
|
|
269
|
+
if (gridConfig.debug)
|
|
270
|
+
this.debugPath.inner.push({ x: innerX, y: innerY });
|
|
271
|
+
const outerRadius = arcRadius + halfWidth;
|
|
272
|
+
const outerX = arcCenterX + outerRadius * Math.cos(angle);
|
|
273
|
+
const outerY = arcCenterY + outerRadius * Math.sin(angle);
|
|
274
|
+
if (gridConfig.debug)
|
|
275
|
+
this.debugPath.outer.push({ x: outerX, y: outerY });
|
|
276
|
+
const checkCenter = addPoint(centerX, centerY);
|
|
277
|
+
const checkInner = addPoint(innerX, innerY);
|
|
278
|
+
const checkOuter = addPoint(outerX, outerY);
|
|
279
|
+
if (!checkCenter || !checkInner || !checkOuter) {
|
|
280
|
+
// Si l'une des positions n'est pas valide, arrêter de générer le chemin
|
|
281
|
+
if (gridConfig.debug)
|
|
282
|
+
this.resetDebugPath();
|
|
283
|
+
return false;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
return path;
|
|
287
|
+
}
|
|
288
|
+
isValidGridPosition(x, y, grid) {
|
|
289
|
+
return y >= 0 && y < grid.length && x >= 0 && x < grid[0].length;
|
|
290
|
+
}
|
|
291
|
+
resetDebugPath() {
|
|
292
|
+
this.debugPath = {
|
|
293
|
+
inner: [],
|
|
294
|
+
outer: [],
|
|
295
|
+
center: [],
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
//# sourceMappingURL=ArcShape.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ArcShape.js","sourceRoot":"","sources":["../../src/classes/ArcShape.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { TGrid, TGridConfig, TPosition, TShapeConfig } from "../types/TGrid.js";
|
|
2
|
+
export declare class BaseShape {
|
|
3
|
+
protected grid: TGrid;
|
|
4
|
+
protected x: number;
|
|
5
|
+
protected y: number;
|
|
6
|
+
protected speed: number;
|
|
7
|
+
protected lastMoveTime: number;
|
|
8
|
+
protected moveDuration: number;
|
|
9
|
+
protected minBounceTime: number;
|
|
10
|
+
protected maxBounceTime: number;
|
|
11
|
+
protected moveDebounce: number;
|
|
12
|
+
protected canMove: boolean;
|
|
13
|
+
protected isMoving: boolean;
|
|
14
|
+
protected tailX: number;
|
|
15
|
+
protected tailY: number;
|
|
16
|
+
protected originalX: number;
|
|
17
|
+
protected originalY: number;
|
|
18
|
+
protected targetX: number;
|
|
19
|
+
protected targetY: number;
|
|
20
|
+
protected hasReachedTarget: boolean;
|
|
21
|
+
protected hasTailReachedTarget: boolean;
|
|
22
|
+
protected color: string;
|
|
23
|
+
protected lockedCells: TPosition[];
|
|
24
|
+
constructor(grid: TGrid, x: number | undefined, y: number | undefined, options: TShapeConfig);
|
|
25
|
+
moveTo(grid: TGrid, gridConfig: TGridConfig, x: number, y: number): void;
|
|
26
|
+
genLockPath(grid: TGrid, gridConfig: TGridConfig, targetX: number, targetY: number): TPosition[] | false;
|
|
27
|
+
lockGridCells(grid: TGrid, cells: TPosition[], applyLocks?: boolean): boolean;
|
|
28
|
+
protected getLineCells(_x0: number, _y0: number, _x1: number, _y1: number): TPosition[];
|
|
29
|
+
update(grid: TGrid, gridConfig: TGridConfig, context: CanvasRenderingContext2D): void;
|
|
30
|
+
protected calculateNewTarget(_grid: TGrid, _gridConfig: TGridConfig): void;
|
|
31
|
+
protected updatePosition(_grid: TGrid): void;
|
|
32
|
+
protected onMoveComplete(grid: TGrid, newX: number, newY: number): void;
|
|
33
|
+
unlockGridCells(grid: TGrid): void;
|
|
34
|
+
draw(_context: CanvasRenderingContext2D, _gridConfig: TGridConfig): void;
|
|
35
|
+
drawLockedCells(context: CanvasRenderingContext2D, gridConfig: TGridConfig): void;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=BaseShape.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseShape.d.ts","sourceRoot":"","sources":["../../src/classes/BaseShape.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAI/E,qBAAa,SAAS;IAClB,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC;IACtB,SAAS,CAAC,CAAC,EAAE,MAAM,CAAK;IACxB,SAAS,CAAC,CAAC,EAAE,MAAM,CAAK;IACxB,SAAS,CAAC,KAAK,EAAE,MAAM,CAAS;IAEhC,SAAS,CAAC,YAAY,EAAE,MAAM,CAAc;IAC5C,SAAS,CAAC,YAAY,EAAE,MAAM,CAAQ;IACtC,SAAS,CAAC,aAAa,EAAE,MAAM,CAAK;IACpC,SAAS,CAAC,aAAa,EAAE,MAAM,CAAM;IACrC,SAAS,CAAC,YAAY,EAAE,MAAM,CAC4B;IAE1D,SAAS,CAAC,OAAO,EAAE,OAAO,CAAQ;IAClC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAS;IACpC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAK;IAC5B,SAAS,CAAC,KAAK,EAAE,MAAM,CAAK;IAC5B,SAAS,CAAC,SAAS,EAAE,MAAM,CAAK;IAChC,SAAS,CAAC,SAAS,EAAE,MAAM,CAAK;IAChC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAK;IAC9B,SAAS,CAAC,OAAO,EAAE,MAAM,CAAK;IAC9B,SAAS,CAAC,gBAAgB,EAAE,OAAO,CAAS;IAC5C,SAAS,CAAC,oBAAoB,EAAE,OAAO,CAAS;IAEhD,SAAS,CAAC,KAAK,EAAE,MAAM,CAAW;IAElC,SAAS,CAAC,WAAW,EAAE,SAAS,EAAE,CAAM;gBAGpC,IAAI,EAAE,KAAK,EACX,CAAC,EAAE,MAAM,YAAI,EACb,CAAC,EAAE,MAAM,YAAI,EACb,OAAO,EAAE,YAAY;IAclB,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM;IAwBjE,WAAW,CACd,IAAI,EAAE,KAAK,EACX,UAAU,EAAE,WAAW,EACvB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GAChB,SAAS,EAAE,GAAG,KAAK;IAUf,aAAa,CAChB,IAAI,EAAE,KAAK,EACX,KAAK,EAAE,SAAS,EAAE,EAClB,UAAU,GAAE,OAAc,GAC3B,OAAO;IA0BV,SAAS,CAAC,YAAY,CAClB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,GACZ,SAAS,EAAE;IAMP,MAAM,CACT,IAAI,EAAE,KAAK,EACX,UAAU,EAAE,WAAW,EACvB,OAAO,EAAE,wBAAwB,GAClC,IAAI;IAUP,SAAS,CAAC,kBAAkB,CACxB,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,WAAW,GACzB,IAAI;IAEP,SAAS,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAE5C,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAwBhE,eAAe,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI;IASlC,IAAI,CAAC,QAAQ,EAAE,wBAAwB,EAAE,WAAW,EAAE,WAAW;IAEjE,eAAe,CAClB,OAAO,EAAE,wBAAwB,EACjC,UAAU,EAAE,WAAW;CA4B9B"}
|