Skip to content

Commit 2da15e9

Browse files
Merge pull request #692 from OpenWebGAL/dev
4.5.13
2 parents 87ef152 + ca05444 commit 2da15e9

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+748
-224
lines changed

dev-docs/演出调用说明.md

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,37 @@
22

33
第一步,语句调用器 `runScript.ts` 根据语句类型执行一个语句,语句会返回一个IPerform对象,并将当前语句的演出写入到场景状态。
44

5-
第二步,语句调用器 `runScript.ts` 会设定一个自动的计时器,用于结束并卸载对象。
6-
75
```typescript
6+
/**
7+
* 描述演出的接口,主要用于控制演出,而不是执行(在演出开始时被调用演出的执行器返回)
8+
* @interface IPerform
9+
*/
810
export interface IPerform {
9-
performName: string,// 演出名称,用于在后面手动清除演出,如果没有标识,则代表不是保持演出,给予一个随机字符串
10-
duration: number, // 持续时间,单位为ms,持续时间到后强制设置该演出为“已经结束”状态
11-
isOver: boolean, //演出是否已经结束
12-
isHoldOn: boolean, //演出是不是一个保持类型的演出
13-
stopFunction: Function, // 卸载演出的函数,这个函数不一定要真的卸载演出,只是在演出结束时会默认调用。
14-
blockingNext: Function // 演出是否阻塞游戏流程继续(一个函数,返回 boolean类型的结果,判断要不要阻塞)
15-
blockingAuto: Function //演出是否阻塞自动模式(一个函数,返回 boolean类型的结果,判断要不要阻塞)
11+
// 演出名称,用于在后面手动清除演出,如果没有标识,则代表不是保持演出,给予一个随机字符串
12+
performName: string;
13+
// 持续时间,单位为ms,持续时间到后自动回收演出
14+
duration: number;
15+
// 演出是不是一个保持类型的演出
16+
isHoldOn: boolean;
17+
// 卸载演出的函数
18+
stopFunction: () => void;
19+
// 演出是否阻塞游戏流程继续(一个函数,返回 boolean类型的结果,判断要不要阻塞)
20+
blockingNext: () => boolean;
21+
// 演出是否阻塞自动模式(一个函数,返回 boolean类型的结果,判断要不要阻塞)
22+
blockingAuto: () => boolean;
23+
// 自动回收使用的 Timeout,一般在调用演出的函数里不设置,演出管理器获取到 IPerofrm 后会根据 duration 自动设置
24+
stopTimeout: undefined | ReturnType<typeof setTimeout>;
25+
// 演出结束后转到下一句
26+
goNextWhenOver?: boolean;
27+
// 对于延迟触发的演出,使用 Promise
28+
arrangePerformPromise?: Promise<IPerform>;
29+
// 跳过由 nextSentence 函数引发的演出回收
30+
skipNextCollect?: boolean;
1631
}
1732
```
1833

34+
第二步,语句调用器 `runScript.ts` 会设定一个自动的计时器,用于结束并卸载对象。
35+
1936
第三步,在演出时间抵达时,卸载演出(语句调用器会在指定时间自动卸载),直到演出列表里没有演出(保持演出则不会卸载)
2037

2138
**注意:`isOver``true` 时,不会阻塞auto和next,这时候不检查 `blockingNext``blockingAuto`**

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
},
2424
"private": true,
2525
"engines": {
26-
"node": "18"
26+
"node": ">=18"
2727
},
2828
"packageManager": "[email protected]"
2929
}

packages/webgal/index.html

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@
7171
</div>
7272
<div style="position: absolute;
7373
bottom: 1em;
74+
color:#999;
75+
font-size: 75%;
7476
display: flex;
7577
justify-content: center;
7678
width: 100%;
@@ -80,10 +82,6 @@
8082
Powered by <a href="https://github.com/OpenWebGAL/WebGAL"
8183
onclick="jump(event, 'https://github.com/OpenWebGAL/WebGAL')">WebGAL</a> Framework
8284
</div>
83-
<div>
84-
Made with ❤ by <a href="https://github.com/OpenWebGAL"
85-
onclick="jump(event, 'https://github.com/OpenWebGAL')">OpenWebGAL</a>
86-
</div>
8785
</div>
8886
</div>
8987
</div>

packages/webgal/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "webgal-engine",
3-
"version": "4.5.12",
3+
"version": "4.5.13",
44
"scripts": {
55
"dev": "vite --host --port 3000",
66
"build": "cross-env NODE_ENV=production tsc && vite build --base=./",
@@ -50,6 +50,7 @@
5050
"prettier": "^2.6.2",
5151
"rollup-plugin-visualizer": "^5.6.0",
5252
"typescript": "^4.5.4",
53+
"unplugin-info": "^1.2.2",
5354
"vite": "^4.5.5"
5455
}
5556
}

packages/webgal/public/game/scene/demo_zh_cn.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ WebGAL:新版本添加了特性:获取用户输入,你要尝试一下吗?
3030
choose:尝试一下:userInput|算了吧:toNextPart;
3131

3232
label:userInput;
33-
getUserInput:name -title=如何称呼你 -buttonText=确认;
33+
getUserInput:name -title=如何称呼你 -buttonText=确认 -defaultValue=WebGALPlayer;
3434
WebGAL:很高兴遇见你,{name}!
3535
jumpLabel:toNextPart;
3636

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
{
22
"name":"Default Template",
3-
"webgal-version":"4.5.12"
3+
"webgal-version":"4.5.13"
44
}

packages/webgal/src/App.tsx

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,23 @@
1-
import Title from '@/UI/Title/Title';
2-
import Logo from '@/UI/Logo/Logo';
3-
import { useEffect } from 'react';
4-
import { initializeScript } from './Core/initializeScript';
5-
import Menu from '@/UI/Menu/Menu';
61
import { Stage } from '@/Stage/Stage';
7-
import { BottomControlPanel } from '@/UI/BottomControlPanel/BottomControlPanel';
82
import { Backlog } from '@/UI/Backlog/Backlog';
9-
import { Extra } from '@/UI/Extra/Extra';
3+
import { BottomControlPanel } from '@/UI/BottomControlPanel/BottomControlPanel';
104
import { BottomControlPanelFilm } from '@/UI/BottomControlPanel/BottomControlPanelFilm';
11-
import GlobalDialog from '@/UI/GlobalDialog/GlobalDialog';
125
import DevPanel from '@/UI/DevPanel/DevPanel';
13-
import Translation from '@/UI/Translation/Translation';
6+
import { Extra } from '@/UI/Extra/Extra';
7+
import GlobalDialog from '@/UI/GlobalDialog/GlobalDialog';
8+
import Logo from '@/UI/Logo/Logo';
9+
import Menu from '@/UI/Menu/Menu';
1410
import { PanicOverlay } from '@/UI/PanicOverlay/PanicOverlay';
15-
import { useFullScreen } from './hooks/useFullScreen';
11+
import Title from '@/UI/Title/Title';
12+
import Translation from '@/UI/Translation/Translation';
13+
import { useEffect } from 'react';
14+
import { initializeScript } from './Core/initializeScript';
1615

1716
function App() {
1817
useEffect(() => {
1918
initializeScript();
2019
}, []);
2120

22-
useFullScreen();
23-
2421
// Provider用于对各组件提供状态
2522
return (
2623
<div className="App">

packages/webgal/src/Core/controller/gamePlay/scriptExecutor.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,9 @@ export const scriptExecutor = () => {
5050
}
5151
return;
5252
}
53-
const currentScript: ISentence =
54-
WebGAL.sceneManager.sceneData.currentScene.sentenceList[WebGAL.sceneManager.sceneData.currentSentenceId];
53+
const currentScript: ISentence = cloneDeep(
54+
WebGAL.sceneManager.sceneData.currentScene.sentenceList[WebGAL.sceneManager.sceneData.currentSentenceId],
55+
);
5556

5657
const interpolationOneItem = (content: string): string => {
5758
let retContent = content;

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

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -563,7 +563,7 @@ export default class PixiStage {
563563
const targetHeight = originalHeight * targetScale;
564564
thisFigureContainer.setBaseY(this.stageHeight / 2);
565565
if (targetHeight < this.stageHeight) {
566-
thisFigureContainer.setBaseY(this.stageHeight / 2 + this.stageHeight - targetHeight / 2);
566+
thisFigureContainer.setBaseY(this.stageHeight / 2 + (this.stageHeight - targetHeight) / 2);
567567
}
568568
if (presetPosition === 'center') {
569569
thisFigureContainer.setBaseX(this.stageWidth / 2);
@@ -627,8 +627,9 @@ export default class PixiStage {
627627
}
628628
// 挂载
629629
this.figureContainer.addChild(thisFigureContainer);
630+
const figureUuid = uuid();
630631
this.figureObjects.push({
631-
uuid: uuid(),
632+
uuid: figureUuid,
632633
key: key,
633634
pixiContainer: thisFigureContainer,
634635
sourceUrl: jsonPath,
@@ -639,7 +640,7 @@ export default class PixiStage {
639640
const instance = this;
640641

641642
const setup = (stage: PixiStage) => {
642-
if (thisFigureContainer) {
643+
if (thisFigureContainer && this.getStageObjByUuid(figureUuid)) {
643644
(async function () {
644645
let overrideBounds: [number, number, number, number] = [0, 0, 0, 0];
645646
const mot = webgalStore.getState().stage.live2dMotion.find((e) => e.target === key);
@@ -662,22 +663,29 @@ export default class PixiStage {
662663
models.forEach((model) => {
663664
const scaleX = stageWidth / model.width;
664665
const scaleY = stageHeight / model.height;
665-
const targetScale = Math.min(scaleX, scaleY) * 1.5;
666+
const targetScale = Math.min(scaleX, scaleY);
666667
const targetWidth = model.width * targetScale;
667-
// const targetHeight = model.height * targetScale;
668-
669-
model.scale.set(targetScale);
668+
const targetHeight = model.height * targetScale;
669+
model.scale.x = targetScale;
670+
model.scale.y = targetScale;
670671
model.anchor.set(0.5);
671-
model.position.x = stageWidth / 2;
672-
model.position.y = stageHeight / 1.2;
672+
model.position.x = 0;
673+
model.position.y = stageHeight / 2;
673674

674-
if (pos === 'left') {
675-
model.position.x = targetWidth / 2;
675+
let baseY = stageHeight / 2;
676+
if (targetHeight < stageHeight) {
677+
baseY = stageHeight / 2 + (stageHeight - targetHeight) / 2;
676678
}
677-
if (pos === 'right') {
678-
model.position.x = stageWidth - targetWidth / 2;
679+
thisFigureContainer.setBaseY(baseY);
680+
if (pos === 'center') {
681+
thisFigureContainer.setBaseX(stageWidth / 2);
682+
} else if (pos === 'left') {
683+
thisFigureContainer.setBaseX(targetWidth / 2);
684+
} else if (pos === 'right') {
685+
thisFigureContainer.setBaseX(stageWidth - targetWidth / 2);
679686
}
680687

688+
thisFigureContainer.pivot.set(0, stageHeight / 2);
681689
let motionToSet = motion;
682690
let animation_index = 0;
683691
let priority_number = 3;

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

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {
1515
getRadiusAlphaFilter,
1616
setRadiusAlphaFilter,
1717
} from '@/Core/controller/stage/pixi/shaders/RadiusAlphaFilter';
18+
import { AdjustmentFilter } from 'pixi-filters';
1819

1920
export class WebGALPixiContainer extends PIXI.Container {
2021
public containerFilters = new Map<string, PIXI.Filter>();
@@ -115,6 +116,82 @@ export class WebGALPixiContainer extends PIXI.Container {
115116
}
116117
}
117118

119+
/**
120+
* adjustment filter
121+
* @public
122+
*/
123+
public getOrCreateAdjustmentFilter(): AdjustmentFilter {
124+
const filterFromMap = this.containerFilters.get('adjustment');
125+
if (filterFromMap) {
126+
return filterFromMap as AdjustmentFilter;
127+
} else {
128+
const adjustment = new AdjustmentFilter();
129+
this.addFilter(adjustment);
130+
this.containerFilters.set('adjustment', adjustment);
131+
return adjustment;
132+
}
133+
}
134+
135+
public isAdjustmentFilterExist(): boolean {
136+
return this.containerFilters.has('adjustment');
137+
}
138+
139+
public get brightness(): number {
140+
return this.getOrCreateAdjustmentFilter().brightness;
141+
}
142+
public set brightness(value: number) {
143+
if (value === 1 && !this.isAdjustmentFilterExist()) return;
144+
this.getOrCreateAdjustmentFilter().brightness = value;
145+
}
146+
147+
public get contrast(): number {
148+
return this.getOrCreateAdjustmentFilter().contrast;
149+
}
150+
public set contrast(value: number) {
151+
if (value === 1 && !this.isAdjustmentFilterExist()) return;
152+
this.getOrCreateAdjustmentFilter().contrast = value;
153+
}
154+
155+
public get saturation(): number {
156+
return this.getOrCreateAdjustmentFilter().saturation;
157+
}
158+
public set saturation(value: number) {
159+
if (value === 1 && !this.isAdjustmentFilterExist()) return;
160+
this.getOrCreateAdjustmentFilter().saturation = value;
161+
}
162+
163+
public get gamma(): number {
164+
return this.getOrCreateAdjustmentFilter().gamma;
165+
}
166+
public set gamma(value: number) {
167+
if (value === 1 && !this.isAdjustmentFilterExist()) return;
168+
this.getOrCreateAdjustmentFilter().gamma = value;
169+
}
170+
171+
public get colorRed(): number {
172+
return this.getOrCreateAdjustmentFilter().red * 255.0;
173+
}
174+
public set colorRed(value: number) {
175+
if (value === 255 && !this.isAdjustmentFilterExist()) return;
176+
this.getOrCreateAdjustmentFilter().red = value / 255.0;
177+
}
178+
179+
public get colorGreen(): number {
180+
return this.getOrCreateAdjustmentFilter().green * 255.0;
181+
}
182+
public set colorGreen(value: number) {
183+
if (value === 255 && !this.isAdjustmentFilterExist()) return;
184+
this.getOrCreateAdjustmentFilter().green = value / 255.0;
185+
}
186+
187+
public get colorBlue(): number {
188+
return this.getOrCreateAdjustmentFilter().blue * 255.0;
189+
}
190+
public set colorBlue(value: number) {
191+
if (value === 255 && !this.isAdjustmentFilterExist()) return;
192+
this.getOrCreateAdjustmentFilter().blue = value / 255.0;
193+
}
194+
118195
/**
119196
* old film filter
120197
* @public

0 commit comments

Comments
 (0)