Add initialRotation modifier to sprite effects

- SpriteEffectConfig·SpriteEffectAreaData에 initialRotation?: [최소, 최대] 추가 (도 단위)
- emitOne에서 범위 내 랜덤 각도를 뽑아 회전한 상태로 파티클을 spawn
- 버전 1.6.0으로 올림
This commit is contained in:
윤정민 2026-08-18 13:26:13 +09:00
parent 09cb2f09af
commit 8188d8d79e
9 changed files with 23 additions and 6 deletions

4
dist/index.d.mts vendored
View File

@ -215,6 +215,8 @@ interface SpriteEffectAreaData {
initialScale: [number, number]; initialScale: [number, number];
initialSpeed: [number, number]; initialSpeed: [number, number];
emitAngle?: [number, number]; emitAngle?: [number, number];
/** [최소, 최대] spawn 시 회전 각도 (도) */
initialRotation?: [number, number];
emitOffset?: { emitOffset?: {
x: number; x: number;
y: number; y: number;
@ -252,6 +254,8 @@ interface SpriteEffectConfig {
initialSpeed: [number, number]; initialSpeed: [number, number];
/** 방출 각도 범위 (도) */ /** 방출 각도 범위 (도) */
emitAngle?: [number, number]; emitAngle?: [number, number];
/** [최소, 최대] spawn 시 회전 각도 (도) - 파티클마다 이 범위에서 뽑아 그만큼 돌린 채로 나온다 */
initialRotation?: [number, number];
/** 영역 중심 대비 방출 오프셋 */ /** 영역 중심 대비 방출 오프셋 */
emitOffset?: Point; emitOffset?: Point;
/** 방출 범위 반경 */ /** 방출 범위 반경 */

4
dist/index.d.ts vendored
View File

@ -215,6 +215,8 @@ interface SpriteEffectAreaData {
initialScale: [number, number]; initialScale: [number, number];
initialSpeed: [number, number]; initialSpeed: [number, number];
emitAngle?: [number, number]; emitAngle?: [number, number];
/** [최소, 최대] spawn 시 회전 각도 (도) */
initialRotation?: [number, number];
emitOffset?: { emitOffset?: {
x: number; x: number;
y: number; y: number;
@ -252,6 +254,8 @@ interface SpriteEffectConfig {
initialSpeed: [number, number]; initialSpeed: [number, number];
/** 방출 각도 범위 (도) */ /** 방출 각도 범위 (도) */
emitAngle?: [number, number]; emitAngle?: [number, number];
/** [최소, 최대] spawn 시 회전 각도 (도) - 파티클마다 이 범위에서 뽑아 그만큼 돌린 채로 나온다 */
initialRotation?: [number, number];
/** 영역 중심 대비 방출 오프셋 */ /** 영역 중심 대비 방출 오프셋 */
emitOffset?: Point; emitOffset?: Point;
/** 방출 범위 반경 */ /** 방출 범위 반경 */

3
dist/index.js vendored
View File

@ -620,7 +620,8 @@ var SpriteEffectInstance = class {
particle.velocity.y = Math.sin(angleRad) * speed; particle.velocity.y = Math.sin(angleRad) * speed;
particle.initialScale = randomRange(config.initialScale[0], config.initialScale[1]); particle.initialScale = randomRange(config.initialScale[0], config.initialScale[1]);
particle.scale = particle.initialScale; particle.scale = particle.initialScale;
particle.rotation = 0; const rotationRange = config.initialRotation;
particle.rotation = rotationRange ? randomRange(rotationRange[0], rotationRange[1]) * Math.PI / 180 : 0;
particle.opacity = 1; particle.opacity = 1;
particle.lifetime = randomRange(config.lifetime[0], config.lifetime[1]); particle.lifetime = randomRange(config.lifetime[0], config.lifetime[1]);
particle.age = 0; particle.age = 0;

2
dist/index.js.map vendored

File diff suppressed because one or more lines are too long

3
dist/index.mjs vendored
View File

@ -559,7 +559,8 @@ var SpriteEffectInstance = class {
particle.velocity.y = Math.sin(angleRad) * speed; particle.velocity.y = Math.sin(angleRad) * speed;
particle.initialScale = randomRange(config.initialScale[0], config.initialScale[1]); particle.initialScale = randomRange(config.initialScale[0], config.initialScale[1]);
particle.scale = particle.initialScale; particle.scale = particle.initialScale;
particle.rotation = 0; const rotationRange = config.initialRotation;
particle.rotation = rotationRange ? randomRange(rotationRange[0], rotationRange[1]) * Math.PI / 180 : 0;
particle.opacity = 1; particle.opacity = 1;
particle.lifetime = randomRange(config.lifetime[0], config.lifetime[1]); particle.lifetime = randomRange(config.lifetime[0], config.lifetime[1]);
particle.age = 0; particle.age = 0;

2
dist/index.mjs.map vendored

File diff suppressed because one or more lines are too long

View File

@ -1,6 +1,6 @@
{ {
"name": "@baekryang/responsive-image-canvas", "name": "@baekryang/responsive-image-canvas",
"version": "1.5.5", "version": "1.6.0",
"publishConfig": { "publishConfig": {
"registry": "https://git.bnovalab.com/api/packages/baekryang/npm/" "registry": "https://git.bnovalab.com/api/packages/baekryang/npm/"
}, },

View File

@ -199,7 +199,10 @@ export class SpriteEffectInstance {
// 초기 속성 // 초기 속성
particle.initialScale = randomRange(config.initialScale[0], config.initialScale[1]); particle.initialScale = randomRange(config.initialScale[0], config.initialScale[1]);
particle.scale = particle.initialScale; particle.scale = particle.initialScale;
particle.rotation = 0; const rotationRange = config.initialRotation;
particle.rotation = rotationRange
? (randomRange(rotationRange[0], rotationRange[1]) * Math.PI) / 180
: 0;
particle.opacity = 1; particle.opacity = 1;
particle.lifetime = randomRange(config.lifetime[0], config.lifetime[1]); particle.lifetime = randomRange(config.lifetime[0], config.lifetime[1]);
particle.age = 0; particle.age = 0;

View File

@ -74,6 +74,8 @@ export interface SpriteEffectAreaData {
initialScale: [number, number]; initialScale: [number, number];
initialSpeed: [number, number]; initialSpeed: [number, number];
emitAngle?: [number, number]; emitAngle?: [number, number];
/** [최소, 최대] spawn 시 회전 각도 (도) */
initialRotation?: [number, number];
emitOffset?: { x: number; y: number }; emitOffset?: { x: number; y: number };
emitRadius?: number; emitRadius?: number;
overLifetime?: SpriteParticleOverLifetime; overLifetime?: SpriteParticleOverLifetime;
@ -109,6 +111,8 @@ export interface SpriteEffectConfig {
initialSpeed: [number, number]; initialSpeed: [number, number];
/** 방출 각도 범위 (도) */ /** 방출 각도 범위 (도) */
emitAngle?: [number, number]; emitAngle?: [number, number];
/** [최소, 최대] spawn 시 회전 각도 (도) - 파티클마다 이 범위에서 뽑아 그만큼 돌린 채로 나온다 */
initialRotation?: [number, number];
/** 영역 중심 대비 방출 오프셋 */ /** 영역 중심 대비 방출 오프셋 */
emitOffset?: Point; emitOffset?: Point;
/** 방출 범위 반경 */ /** 방출 범위 반경 */