Skip to content

Commit 650fcfd

Browse files
Feat: Support parallel animation for setAnimation command; Fix: potential runtime error caused by undefined parameters reported by review bot
1 parent 07a61d1 commit 650fcfd

File tree

6 files changed

+53
-15
lines changed

6 files changed

+53
-15
lines changed
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
changeBg:WebGalEnter.webp -next;
2+
changeFigure:stand.webp -id=figure01 -transform={"position":{"x":1000,"y":720}};
3+
;演示setAnimation平行执行
4+
setAnimation:shockwaveIn -target=figure01 -next
5+
setAnimation:move-front-and-back -target=figure01 -parallel
6+
;演示通过-continue接续执行两个常规setTransform正常运作、不被打断
7+
setTransform:{"position":{"x":-1000}} -duration=5000 -target=figure01 -continue
8+
setTransform:{"position":{"x":1000}} -duration=5000 -target=figure01
9+
;演示setTransform平行执行
10+
setTransform:{"position":{"x":-1000},"scale":{"x":0.5},"contrast":0.5} -duration=5000 -target=figure01 -ease=easeOut -next -keep
11+
wait:2000
12+
setTransform:{"position":{"y":0},"scale":{"y":0.5},"saturation":0} -duration=5000 -target=figure01 -ease=linear -parallel -continue
13+
setTransform:{"position":{"y":-720},"scale":{"y":1},"saturation":1} -duration=5000 -target=figure01 -ease=linear -next
14+
setTransform:{"position":{"x":1000},"scale":{"x":1},"contrast":1} -duration=5000 -target=figure01 -ease=easeIn -parallel;
15+
;演示参数解耦改动后setTempAnimation普通运作是否正常
16+
setTempAnimation:[{"duration":0}, {"duration":500,"position":{"x":-1000}}, {"duration":500,"position":{"y":720},"scale":{"y":0.5},"saturation":0}, {"duration":500,"position":{"x":-1000, "y":720}}, {"duration":500}, {"duration":500,"position":{"x":-1000},"scale":{"x":0.5},"contrast":0.5}] -target=figure01
17+
setTempAnimation:[{"duration":0}, {"duration":500,"position":{"x":1000}}, {"duration":500,"position":{"y":720}}, {"duration":500,"position":{"x":1000, "y":720}}, {"duration":500}, {"duration":500,"position":{"x":1000}}] -target=figure01
18+
;演示参数解耦改动后setTransform的-writeDefault参数是否运作正常
19+
setTransform:{} -writeDefault -target=figure01 -duration=500
20+
setTransform:{"position":{"x":1000,"y":720}} -target=figure01 -next;
21+
setAnimation:shockwaveOut -target=figure01 -parallel
22+
;演示setTempAnimation平行执行
23+
setTempAnimation:[{"duration":0},{"position":{"x":-1000},"scale":{"x":0.5},"contrast":0.5,"duration":5000,"ease":"easeOut"},{"position":{"x":-1000},"scale":{"x":0.5},"contrast":0.5,"duration":2000},{"position":{"x":600},"scale":{"x":1},"contrast":1,"duration":5000,"ease":"easeIn"},{"duration":2000}] -target=figure01 -next;
24+
setTempAnimation:[{"duration":2000},{"position":{"y":0},"scale":{"y":0.5},"saturation":0,"duration":5000,"ease":"linear"},{"position":{"y":-720},"scale":{"y":1},"saturation":1,"duration":5000,"ease":"linear"},{"duration":2000}] -target=figure01 -parallel -continue;
25+
;演示并行执行多条终止时间点不一致的setTransform
26+
setTransform:{"position":{"x":-1000}} -duration=5000 -next -target=figure01;
27+
setTransform:{"position":{"y":0}} -duration=3000 -parallel -target=figure01;
28+
setTransform:{"position":{"x":1000}} -duration=3000 -next -target=figure01;
29+
setTransform:{"position":{"y":-720}} -duration=5000 -parallel -target=figure01;
30+
changeBg: -next;
31+
changeFigure: -id=figure01

packages/webgal/src/Core/Modules/animationFunctions.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ export function getAnimationObject(animationName: string, target: string, durati
3333
let newEffect;
3434

3535
if (!writeDefault && targetSetEffect && targetSetEffect.transform) {
36-
const targetScale = pickBy(targetSetEffect.transform.scale, (source, key)=> unionScaleKeys.has(key))
37-
const targetPosition = pickBy(targetSetEffect.transform.position, (source, key)=> unionPositionKeys.has(key))
36+
const targetScale = pickBy(targetSetEffect.transform.scale || {}, (source, key)=> unionScaleKeys.has(key))
37+
const targetPosition = pickBy(targetSetEffect.transform.position || {}, (source, key)=> unionPositionKeys.has(key))
3838
const originalTransform = { ...pickBy(targetSetEffect.transform, (source, key)=> unionKeys.has(key))};
3939
originalTransform.scale = targetScale
4040
originalTransform.position = targetPosition

packages/webgal/src/Core/controller/stage/pixi/PixiController.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@ export default class PixiStage {
7373
if (!source) return;
7474
const targetScale = target.scale;
7575
const targetPosition = target.position;
76-
if (target.scale) Object.assign(targetScale!, omitBy(source.scale,isUndefined));
77-
if (target.position) Object.assign(targetPosition!, omitBy(source.position,isUndefined));
76+
if (target.scale) Object.assign(targetScale!, omitBy(source.scale || {},isUndefined));
77+
if (target.position) Object.assign(targetPosition!, omitBy(source.position || {},isUndefined));
7878
Object.assign(target, omitBy(source,isUndefined));
7979
target.scale = targetScale;
8080
target.position = targetPosition;

packages/webgal/src/Core/controller/stage/pixi/animations/generateTransformAnimationObj.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ export function generateTransformAnimationObj(
3232
animationObj.unshift(effectWithDuration);
3333
}
3434
else {
35-
const targetScale = pickBy(targetEffect!.transform!.scale, (source, key)=> has(applyFrame.scale, key))
36-
const targetPosition = pickBy(targetEffect!.transform!.position, (source, key)=> has(applyFrame.position, key))
37-
const effectWithDuration = { ...pickBy(targetEffect!.transform!, (source, key)=> has(applyFrame, key) ), duration: 0, ease };
35+
const targetScale = pickBy(targetEffect.transform?.scale || {}, (source, key)=> has(applyFrame.scale, key))
36+
const targetPosition = pickBy(targetEffect.transform?.position || {}, (source, key)=> has(applyFrame.position, key))
37+
const effectWithDuration = { ...pickBy(targetEffect.transform || {}, (source, key)=> has(applyFrame, key) ), duration: 0, ease };
3838
effectWithDuration.scale = targetScale
3939
effectWithDuration.position = targetPosition
4040
animationObj.unshift(effectWithDuration);

packages/webgal/src/Core/gameScripts/setAnimation.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,12 @@ export const setAnimation = (sentence: ISentence): IPerform => {
2020
target = target !== '' ? target : 'default_id';
2121
const writeDefault = getBooleanArgByKey(sentence, 'writeDefault') ?? false;
2222
const keep = getBooleanArgByKey(sentence, 'keep') ?? false;
23+
const parallel = getBooleanArgByKey(sentence, 'parallel') ?? false;
2324

2425
const key = `${target}-${animationName}-${animationDuration}`;
2526
const performInitName = `animation-${target}`;
2627

27-
WebGAL.gameplay.performController.unmountPerform(performInitName, true);
28+
if (!parallel) WebGAL.gameplay.performController.unmountPerform(performInitName, true);
2829

2930
let stopFunction;
3031
setTimeout(() => {
@@ -56,5 +57,6 @@ export const setAnimation = (sentence: ISentence): IPerform => {
5657
blockingNext: () => false,
5758
blockingAuto: () => !keep,
5859
stopTimeout: undefined, // 暂时不用,后面会交给自动清除
60+
isParallel: parallel,
5961
};
6062
};

packages/webgal/src/store/stageReducer.ts

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -124,13 +124,18 @@ const stageSlice = createSlice({
124124
const effectIndex = state.effects.findIndex((e) => e.target === target);
125125
if (effectIndex >= 0) {
126126
// Update the existing effect
127-
const targetScale = state.effects[effectIndex]!.transform!.scale;
128-
const targetPosition = state.effects[effectIndex]!.transform!.position;
129-
if (transform!.scale) Object.assign(targetScale!, omitBy(transform!.scale,isUndefined));
130-
if (transform!.position) Object.assign(targetPosition!, omitBy(transform!.position,isUndefined));
131-
Object.assign(state.effects[effectIndex]!.transform!, omitBy(transform,isUndefined))
132-
state.effects[effectIndex].transform!.scale = targetScale;
133-
state.effects[effectIndex].transform!.position = targetPosition;
127+
if (!state.effects[effectIndex].transform) {
128+
state.effects[effectIndex].transform = transform;
129+
}
130+
else if (transform){
131+
const targetScale = state.effects[effectIndex].transform.scale || {};
132+
const targetPosition = state.effects[effectIndex].transform.position || {};
133+
if (transform.scale) Object.assign(targetScale, omitBy(transform.scale,isUndefined));
134+
if (transform.position) Object.assign(targetPosition, omitBy(transform.position,isUndefined));
135+
Object.assign(state.effects[effectIndex].transform, omitBy(transform,isUndefined))
136+
state.effects[effectIndex].transform.scale = targetScale;
137+
state.effects[effectIndex].transform.position = targetPosition;
138+
}
134139
} else {
135140
// Add a new effect
136141
state.effects.push({

0 commit comments

Comments
 (0)