mirror of
https://github.com/unanmed/HumanBreak.git
synced 2025-04-25 00:23:25 +08:00
Compare commits
2 Commits
6f10ac3d81
...
69da048438
Author | SHA1 | Date | |
---|---|---|---|
69da048438 | |||
ed229e1601 |
@ -2853,11 +2853,7 @@ control.prototype.getMappedName = function (name) {
|
|||||||
////// 更改天气效果 //////
|
////// 更改天气效果 //////
|
||||||
control.prototype.setWeather = function (type, level) {
|
control.prototype.setWeather = function (type, level) {
|
||||||
// Deprecated. Use WeatherController API instead.
|
// Deprecated. Use WeatherController API instead.
|
||||||
Mota.r(() => {
|
// Fallback see src/module/fallback/weather.ts
|
||||||
const controller = Mota.require('module', 'Weather').controller;
|
|
||||||
controller.clearWeather();
|
|
||||||
if (type !== null && type !== void 0) controller.activate(type, level);
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
////// 注册一个天气 //////
|
////// 注册一个天气 //////
|
||||||
|
@ -75,7 +75,6 @@ import './render/index';
|
|||||||
import * as RenderUtils from './render/utils';
|
import * as RenderUtils from './render/utils';
|
||||||
import '@/module';
|
import '@/module';
|
||||||
import { MotaOffscreenCanvas2D } from './fx/canvas2d';
|
import { MotaOffscreenCanvas2D } from './fx/canvas2d';
|
||||||
import { TextboxStore } from './render/index';
|
|
||||||
|
|
||||||
// ----- 类注册
|
// ----- 类注册
|
||||||
Mota.register('class', 'CustomToolbar', CustomToolbar);
|
Mota.register('class', 'CustomToolbar', CustomToolbar);
|
||||||
@ -157,8 +156,7 @@ Mota.register('module', 'Render', {
|
|||||||
LayerGroupFloorBinder,
|
LayerGroupFloorBinder,
|
||||||
Camera,
|
Camera,
|
||||||
MotaOffscreenCanvas2D,
|
MotaOffscreenCanvas2D,
|
||||||
Utils: RenderUtils,
|
Utils: RenderUtils
|
||||||
TextboxStore
|
|
||||||
});
|
});
|
||||||
Mota.register('module', 'Action', {
|
Mota.register('module', 'Action', {
|
||||||
HeroKeyMover
|
HeroKeyMover
|
||||||
|
14
src/core/render/index.ts
Normal file
14
src/core/render/index.ts
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
export * from './preset';
|
||||||
|
export * from './renderer';
|
||||||
|
export * from './adapter';
|
||||||
|
export * from './cache';
|
||||||
|
export * from './camera';
|
||||||
|
export * from './container';
|
||||||
|
export * from './frame';
|
||||||
|
export * from './gl2';
|
||||||
|
export * from './item';
|
||||||
|
export * from './render';
|
||||||
|
export * from './shader';
|
||||||
|
export * from './sprite';
|
||||||
|
export * from './transform';
|
||||||
|
export * from './utils';
|
@ -388,7 +388,7 @@ export abstract class RenderItem<E extends ERenderItemEvent = ERenderItemEvent>
|
|||||||
/**
|
/**
|
||||||
* 渲染函数
|
* 渲染函数
|
||||||
* @param canvas 渲染至的画布
|
* @param canvas 渲染至的画布
|
||||||
* @param transform 当前变换矩阵的,渲染时已经进行变换处理,不需要对画布再次进行变换处理
|
* @param transform 当前变换矩阵的,渲染时已经进行变换处理,不需要对画布再次进行变换处理。
|
||||||
* 此参数可用于自己对元素进行变换处理,也会用于对子元素的处理。
|
* 此参数可用于自己对元素进行变换处理,也会用于对子元素的处理。
|
||||||
* 例如对于`absolute`类型的元素,同时有对视角改变的需求,就可以通过此参数进行变换。
|
* 例如对于`absolute`类型的元素,同时有对视角改变的需求,就可以通过此参数进行变换。
|
||||||
* 样板内置的`Layer`及`Damage`元素就是通过此方式实现的
|
* 样板内置的`Layer`及`Damage`元素就是通过此方式实现的
|
||||||
|
@ -38,7 +38,6 @@ import type * as Animation from 'mutate-animate';
|
|||||||
import type * as RenderUtils from '@/core/render/utils';
|
import type * as RenderUtils from '@/core/render/utils';
|
||||||
import type { WeatherController } from '@/module/weather/weather';
|
import type { WeatherController } from '@/module/weather/weather';
|
||||||
import type { MotaOffscreenCanvas2D } from '@/core/fx/canvas2d';
|
import type { MotaOffscreenCanvas2D } from '@/core/fx/canvas2d';
|
||||||
import type { TextboxStore } from '@/core/render';
|
|
||||||
|
|
||||||
interface ClassInterface {
|
interface ClassInterface {
|
||||||
// 渲染进程与游戏进程通用
|
// 渲染进程与游戏进程通用
|
||||||
@ -115,7 +114,6 @@ interface ModuleInterface {
|
|||||||
Camera: typeof Camera;
|
Camera: typeof Camera;
|
||||||
MotaOffscreenCanvas2D: typeof MotaOffscreenCanvas2D;
|
MotaOffscreenCanvas2D: typeof MotaOffscreenCanvas2D;
|
||||||
Utils: typeof RenderUtils;
|
Utils: typeof RenderUtils;
|
||||||
TextboxStore: typeof TextboxStore;
|
|
||||||
};
|
};
|
||||||
State: {
|
State: {
|
||||||
ItemState: typeof ItemState;
|
ItemState: typeof ItemState;
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
import { Patch } from '@/common/patch';
|
import { Patch } from '@/common/patch';
|
||||||
import { patchAudio } from './audio';
|
import { patchAudio } from './audio';
|
||||||
|
import { patchWeather } from './weather';
|
||||||
patchAudio();
|
|
||||||
|
|
||||||
export function patchAll() {
|
export function patchAll() {
|
||||||
|
patchAudio();
|
||||||
|
patchWeather();
|
||||||
const loading = Mota.require('var', 'loading');
|
const loading = Mota.require('var', 'loading');
|
||||||
loading.once('coreInit', () => {
|
loading.once('coreInit', () => {
|
||||||
Patch.patchAll();
|
Patch.patchAll();
|
||||||
|
21
src/module/fallback/weather.ts
Normal file
21
src/module/fallback/weather.ts
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
import { Patch, PatchClass } from '@/common/patch';
|
||||||
|
import { WeatherController } from '../weather';
|
||||||
|
import { isNil } from 'lodash-es';
|
||||||
|
|
||||||
|
export function patchWeather() {
|
||||||
|
const patch = new Patch(PatchClass.Control);
|
||||||
|
let nowWeather: string = '';
|
||||||
|
let nowLevel: number = 0;
|
||||||
|
|
||||||
|
patch.add('setWeather', (type, level) => {
|
||||||
|
const weather = WeatherController.get('main');
|
||||||
|
if (!weather) return;
|
||||||
|
if (type === nowWeather && level === nowLevel) return;
|
||||||
|
weather.clearWeather();
|
||||||
|
if (!isNil(type)) {
|
||||||
|
weather.activate(type, level);
|
||||||
|
nowWeather = type;
|
||||||
|
nowLevel = level ?? 5;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
@ -1,19 +1,21 @@
|
|||||||
import { soundPlayer } from './audio';
|
import { soundPlayer } from './audio';
|
||||||
import { patchAll } from './fallback';
|
import { patchAll } from './fallback';
|
||||||
import { controller } from './weather';
|
import { create } from './render';
|
||||||
import { RainWeather } from './weather/rain';
|
import { RainWeather } from './weather/rain';
|
||||||
import { WeatherController } from './weather/weather';
|
import { WeatherController } from './weather/weather';
|
||||||
|
|
||||||
patchAll();
|
patchAll();
|
||||||
Mota.register('module', 'Weather', {
|
Mota.register('module', 'Weather', {
|
||||||
controller,
|
|
||||||
WeatherController,
|
WeatherController,
|
||||||
RainWeather
|
RainWeather
|
||||||
});
|
});
|
||||||
Mota.register('module', 'Audio', { soundPlayer });
|
Mota.register('module', 'Audio', {
|
||||||
|
soundPlayer
|
||||||
|
});
|
||||||
|
Mota.require('var', 'loading').once('coreInit', create);
|
||||||
|
|
||||||
export * from './weather';
|
export * from './weather';
|
||||||
export * from './audio';
|
export * from './audio';
|
||||||
export * from './loader';
|
export * from './loader';
|
||||||
export * from './fallback';
|
export * from './fallback';
|
||||||
export * from './ui';
|
export * from './render';
|
||||||
|
@ -1,26 +1,25 @@
|
|||||||
import { FloorItemDetail } from '@/plugin/fx/itemDetail';
|
import { FloorItemDetail } from '@/plugin/fx/itemDetail';
|
||||||
import { FloorDamageExtends } from './preset/damage';
|
import { FloorDamageExtends, LayerGroup } from '@/core/render';
|
||||||
import { LayerDoorAnimate } from './preset/floor';
|
import { LayerDoorAnimate } from '@/core/render';
|
||||||
import { HeroRenderer } from './preset/hero';
|
import { HeroRenderer } from '@/core/render';
|
||||||
import { MotaRenderer } from './render';
|
import { MotaRenderer } from '@/core/render';
|
||||||
import { LayerShadowExtends } from '../fx/shadow';
|
import { LayerShadowExtends } from '@/core/fx/shadow';
|
||||||
import { LayerGroupFilter } from '@/plugin/fx/gameCanvas';
|
import { LayerGroupFilter } from '@/plugin/fx/gameCanvas';
|
||||||
import { LayerGroupAnimate } from './preset/animate';
|
import { LayerGroupAnimate } from '@/core/render';
|
||||||
import { LayerGroupPortal } from '@/plugin/fx/portal';
|
import { LayerGroupPortal } from '@/plugin/fx/portal';
|
||||||
import { LayerGroupHalo } from '@/plugin/fx/halo';
|
import { LayerGroupHalo } from '@/plugin/fx/halo';
|
||||||
import { FloorViewport } from './preset/viewport';
|
import { FloorViewport } from '@/core/render';
|
||||||
import { PopText } from '@/plugin/fx/pop';
|
import { PopText } from '@/plugin/fx/pop';
|
||||||
import { FloorChange } from '@/plugin/fallback';
|
import { FloorChange } from '@/plugin/fallback';
|
||||||
import { createApp } from './renderer';
|
import { createApp } from '@/core/render';
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent, onMounted, ref } from 'vue';
|
||||||
import { Textbox } from '../../module/ui/components';
|
import { Textbox } from './components';
|
||||||
import { ILayerGroupRenderExtends, ILayerRenderExtends } from './preset';
|
import { ILayerGroupRenderExtends, ILayerRenderExtends } from '@/core/render';
|
||||||
import { Props } from './utils';
|
import { Props } from '@/core/render';
|
||||||
|
import { WeatherController } from '../weather';
|
||||||
|
|
||||||
let main: MotaRenderer;
|
export function create() {
|
||||||
|
const main = new MotaRenderer();
|
||||||
Mota.require('var', 'loading').once('coreInit', () => {
|
|
||||||
main = new MotaRenderer();
|
|
||||||
|
|
||||||
const App = defineComponent(_props => {
|
const App = defineComponent(_props => {
|
||||||
const layerGroupExtends: ILayerGroupRenderExtends[] = [
|
const layerGroupExtends: ILayerGroupRenderExtends[] = [
|
||||||
@ -57,9 +56,16 @@ Mota.require('var', 'loading').once('coreInit', () => {
|
|||||||
lineHeight: 6
|
lineHeight: 6
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const map = ref<LayerGroup>();
|
||||||
|
const weather = new WeatherController('main');
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
weather.bind(map.value);
|
||||||
|
});
|
||||||
|
|
||||||
return () => (
|
return () => (
|
||||||
<container id="map-draw" {...mapDrawProps}>
|
<container id="map-draw" {...mapDrawProps}>
|
||||||
<layer-group id="layer-main" ex={layerGroupExtends}>
|
<layer-group id="layer-main" ex={layerGroupExtends} ref={map}>
|
||||||
<layer layer="bg" zIndex={10}></layer>
|
<layer layer="bg" zIndex={10}></layer>
|
||||||
<layer layer="bg2" zIndex={20}></layer>
|
<layer layer="bg2" zIndex={20}></layer>
|
||||||
<layer layer="event" zIndex={30} ex={eventExtends}></layer>
|
<layer layer="event" zIndex={30} ex={eventExtends}></layer>
|
||||||
@ -75,28 +81,16 @@ Mota.require('var', 'loading').once('coreInit', () => {
|
|||||||
|
|
||||||
main.hide();
|
main.hide();
|
||||||
createApp(App).mount(main);
|
createApp(App).mount(main);
|
||||||
// render(<Com></Com>, main);
|
|
||||||
|
Mota.require('var', 'hook').on('reset', () => {
|
||||||
|
main.show();
|
||||||
|
});
|
||||||
|
|
||||||
|
Mota.require('var', 'hook').on('restart', () => {
|
||||||
|
main.hide();
|
||||||
|
});
|
||||||
|
|
||||||
console.log(main);
|
console.log(main);
|
||||||
});
|
}
|
||||||
|
|
||||||
Mota.require('var', 'hook').on('reset', () => {
|
export * from './components';
|
||||||
main.show();
|
|
||||||
});
|
|
||||||
|
|
||||||
Mota.require('var', 'hook').on('restart', () => {
|
|
||||||
main.hide();
|
|
||||||
});
|
|
||||||
|
|
||||||
export * from './preset';
|
|
||||||
export * from './renderer';
|
|
||||||
export * from './adapter';
|
|
||||||
export * from './cache';
|
|
||||||
export * from './camera';
|
|
||||||
export * from './container';
|
|
||||||
export * from './gl2';
|
|
||||||
export * from './item';
|
|
||||||
export * from './render';
|
|
||||||
export * from './shader';
|
|
||||||
export * from './sprite';
|
|
||||||
export * from './transform';
|
|
@ -1 +0,0 @@
|
|||||||
export * from './components';
|
|
@ -1,3 +1,11 @@
|
|||||||
|
import { RainWeather } from './rain';
|
||||||
|
import { SnowWeather } from './snow';
|
||||||
|
import { SunWeather } from './sun';
|
||||||
import { WeatherController } from './weather';
|
import { WeatherController } from './weather';
|
||||||
|
|
||||||
export const controller = new WeatherController();
|
WeatherController.register('rain', RainWeather);
|
||||||
|
WeatherController.register('sun', SunWeather);
|
||||||
|
WeatherController.register('snow', SnowWeather);
|
||||||
|
|
||||||
|
export * from './weather';
|
||||||
|
export * from './rain';
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { Shader, ShaderProgram } from '@/core/render/shader';
|
import { Shader, ShaderProgram } from '@/core/render/shader';
|
||||||
import { IWeather, WeatherController } from './weather';
|
import { IWeather } from './weather';
|
||||||
import { MotaRenderer } from '@/core/render/render';
|
import { MotaRenderer } from '@/core/render/render';
|
||||||
import { Container } from '@/core/render/container';
|
import { Container } from '@/core/render/container';
|
||||||
import { IShaderUniform, UniformType } from '@/core/render/gl2';
|
import { IShaderUniform, UniformType } from '@/core/render/gl2';
|
||||||
@ -78,13 +78,18 @@ void main() {
|
|||||||
/** 雨滴顶点坐标 */
|
/** 雨滴顶点坐标 */
|
||||||
const vertex = new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]);
|
const vertex = new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]);
|
||||||
|
|
||||||
Mota.require('var', 'loading').once('coreInit', () => {
|
export class RainWeather implements IWeather {
|
||||||
|
readonly shader: RainShader;
|
||||||
|
readonly program: ShaderProgram;
|
||||||
|
|
||||||
|
private progress: IShaderUniform<UniformType.Uniform1f> | null = null;
|
||||||
|
|
||||||
|
constructor(readonly level: number = 5) {
|
||||||
const shader = new RainShader();
|
const shader = new RainShader();
|
||||||
const gl = shader.gl;
|
const gl = shader.gl;
|
||||||
shader.size(480, 480);
|
shader.size(480, 480);
|
||||||
shader.setHD(true);
|
shader.setHD(true);
|
||||||
shader.setZIndex(100);
|
shader.setZIndex(100);
|
||||||
RainWeather.shader = shader;
|
|
||||||
const program = shader.createProgram(ShaderProgram);
|
const program = shader.createProgram(ShaderProgram);
|
||||||
program.fs(rainFs);
|
program.fs(rainFs);
|
||||||
program.vs(rainVs);
|
program.vs(rainVs);
|
||||||
@ -95,7 +100,6 @@ Mota.require('var', 'loading').once('coreInit', () => {
|
|||||||
program.defineUniform('u_progress', shader.UNIFORM_1f);
|
program.defineUniform('u_progress', shader.UNIFORM_1f);
|
||||||
program.defineUniform('u_color', shader.UNIFORM_4f);
|
program.defineUniform('u_color', shader.UNIFORM_4f);
|
||||||
program.mode(shader.DRAW_ARRAYS_INSTANCED);
|
program.mode(shader.DRAW_ARRAYS_INSTANCED);
|
||||||
RainShader.rainProgram = program;
|
|
||||||
shader.useProgram(program);
|
shader.useProgram(program);
|
||||||
|
|
||||||
if (pos) {
|
if (pos) {
|
||||||
@ -103,42 +107,37 @@ Mota.require('var', 'loading').once('coreInit', () => {
|
|||||||
pos.pointer(2, gl.FLOAT, false, 0, 0);
|
pos.pointer(2, gl.FLOAT, false, 0, 0);
|
||||||
pos.enable();
|
pos.enable();
|
||||||
}
|
}
|
||||||
});
|
this.shader = shader;
|
||||||
|
this.program = program;
|
||||||
export class RainWeather implements IWeather {
|
}
|
||||||
static id: string = 'rain';
|
|
||||||
|
|
||||||
static shader: RainShader;
|
|
||||||
|
|
||||||
private progress: IShaderUniform<UniformType.Uniform1f> | null = null;
|
|
||||||
|
|
||||||
constructor(readonly level: number = 5) {}
|
|
||||||
|
|
||||||
activate(): void {
|
activate(): void {
|
||||||
const render = MotaRenderer.get('render-main');
|
const render = MotaRenderer.get('render-main');
|
||||||
const draw = render?.getElementById('map-draw') as Container;
|
const draw = render?.getElementById('map-draw') as Container;
|
||||||
if (!draw) return;
|
if (!draw) return;
|
||||||
const shader = RainWeather.shader;
|
const shader = this.shader;
|
||||||
shader.append(draw);
|
shader.append(draw);
|
||||||
|
|
||||||
const gl = shader.gl;
|
const gl = shader.gl;
|
||||||
const program = RainShader.rainProgram;
|
const program = this.program;
|
||||||
program.paramArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, 100 * this.level);
|
program.paramArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, 100 * this.level);
|
||||||
|
|
||||||
this.progress = program.getUniform<UniformType.Uniform1f>('u_progress');
|
this.progress = program.getUniform<UniformType.Uniform1f>('u_progress');
|
||||||
|
shader.useProgram(program);
|
||||||
shader.generateRainPath(
|
shader.generateRainPath(
|
||||||
this.level * 100,
|
this.level * 100,
|
||||||
(((Math.random() - 0.5) * Math.PI) / 30) * this.level,
|
(((Math.random() - 0.5) * Math.PI) / 30) * this.level,
|
||||||
(Math.PI / 180) * (12 - this.level)
|
(Math.PI / 180) * (12 - this.level),
|
||||||
|
program
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
frame(): void {
|
frame(): void {
|
||||||
RainWeather.shader.update(RainWeather.shader);
|
this.shader.update(this.shader);
|
||||||
const time = 5000 - 400 * this.level;
|
const time = 5000 - 400 * this.level;
|
||||||
const progress = (Date.now() % time) / time;
|
const progress = (Date.now() % time) / time;
|
||||||
|
|
||||||
RainWeather.shader.useProgram(RainShader.rainProgram);
|
this.shader.useProgram(this.program);
|
||||||
this.progress?.set(progress);
|
this.progress?.set(progress);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -147,25 +146,23 @@ export class RainWeather implements IWeather {
|
|||||||
const draw = render?.getElementById('map-draw') as Container;
|
const draw = render?.getElementById('map-draw') as Container;
|
||||||
const layer = draw.children;
|
const layer = draw.children;
|
||||||
if (!layer || !draw) return;
|
if (!layer || !draw) return;
|
||||||
const shader = RainWeather.shader;
|
const shader = this.shader;
|
||||||
draw.appendChild(...layer);
|
draw.appendChild(...layer);
|
||||||
shader.remove();
|
shader.remove();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
WeatherController.register(RainWeather);
|
|
||||||
|
|
||||||
class RainShader extends Shader {
|
class RainShader extends Shader {
|
||||||
static rainProgram: ShaderProgram;
|
|
||||||
static backProgram: ShaderProgram;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 生成雨滴
|
* 生成雨滴
|
||||||
* @param num 雨滴数量
|
* @param num 雨滴数量
|
||||||
*/
|
*/
|
||||||
generateRainPath(num: number, angle: number, deviation: number) {
|
generateRainPath(
|
||||||
const program = RainShader.rainProgram;
|
num: number,
|
||||||
RainWeather.shader.useProgram(program);
|
angle: number,
|
||||||
|
deviation: number,
|
||||||
|
program: ShaderProgram
|
||||||
|
) {
|
||||||
const aOffset = program.getAttribArray('a_offset');
|
const aOffset = program.getAttribArray('a_offset');
|
||||||
const aData = program.getAttribArray('a_data');
|
const aData = program.getAttribArray('a_data');
|
||||||
const color = program.getUniform<UniformType.Uniform4f>('u_color');
|
const color = program.getUniform<UniformType.Uniform4f>('u_color');
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { Shader, ShaderProgram } from '@/core/render/shader';
|
import { Shader, ShaderProgram } from '@/core/render/shader';
|
||||||
import { IWeather, WeatherController } from './weather';
|
import { IWeather } from './weather';
|
||||||
import { MotaRenderer } from '@/core/render/render';
|
import { MotaRenderer } from '@/core/render/render';
|
||||||
import { Container } from '@/core/render/container';
|
import { Container } from '@/core/render/container';
|
||||||
import { GL2Program, IShaderUniform, UniformType } from '@/core/render/gl2';
|
import { GL2Program, IShaderUniform, UniformType } from '@/core/render/gl2';
|
||||||
@ -174,8 +174,6 @@ export class SnowWeather implements IWeather {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
WeatherController.register(SnowWeather);
|
|
||||||
|
|
||||||
class SnowShader extends Shader {
|
class SnowShader extends Shader {
|
||||||
static snowProgram: ShaderProgram;
|
static snowProgram: ShaderProgram;
|
||||||
static backProgram: ShaderProgram;
|
static backProgram: ShaderProgram;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { IWeather, WeatherController } from './weather';
|
import { IWeather } from './weather';
|
||||||
|
|
||||||
export class SunWeather implements IWeather {
|
export class SunWeather implements IWeather {
|
||||||
static id: string = 'sun';
|
static id: string = 'sun';
|
||||||
@ -9,5 +9,3 @@ export class SunWeather implements IWeather {
|
|||||||
|
|
||||||
deactivate(): void {}
|
deactivate(): void {}
|
||||||
}
|
}
|
||||||
|
|
||||||
WeatherController.register(SunWeather);
|
|
||||||
|
@ -1,11 +1,12 @@
|
|||||||
import { logger } from '@/core/common/logger';
|
import { logger } from '@/core/common/logger';
|
||||||
|
import { RenderItem } from '@/core/render';
|
||||||
import { Ticker } from 'mutate-animate';
|
import { Ticker } from 'mutate-animate';
|
||||||
|
|
||||||
export interface IWeather {
|
export interface IWeather {
|
||||||
/**
|
/**
|
||||||
* 初始化天气,当天气被添加时会被立刻调用
|
* 初始化天气,当天气被添加时会被立刻调用
|
||||||
*/
|
*/
|
||||||
activate(): void;
|
activate(item: RenderItem): void;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 每帧执行的函数
|
* 每帧执行的函数
|
||||||
@ -15,21 +16,25 @@ export interface IWeather {
|
|||||||
/**
|
/**
|
||||||
* 摧毁这个天气,当天气被删除时会执行
|
* 摧毁这个天气,当天气被删除时会执行
|
||||||
*/
|
*/
|
||||||
deactivate(): void;
|
deactivate(item: RenderItem): void;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Weather<T extends IWeather = IWeather> {
|
type Weather = new (level?: number) => IWeather;
|
||||||
id: string;
|
|
||||||
new (level?: number): T;
|
|
||||||
}
|
|
||||||
|
|
||||||
export class WeatherController {
|
export class WeatherController {
|
||||||
static list: Map<string, Weather> = new Map();
|
static list: Map<string, Weather> = new Map();
|
||||||
|
static map: Map<string, WeatherController> = new Map();
|
||||||
|
|
||||||
/** 当前的所有天气 */
|
/** 当前的所有天气 */
|
||||||
active: Set<IWeather> = new Set();
|
active: Set<IWeather> = new Set();
|
||||||
ticker: Ticker = new Ticker();
|
ticker: Ticker = new Ticker();
|
||||||
|
|
||||||
|
private binded?: RenderItem;
|
||||||
|
|
||||||
|
constructor(public readonly id: string) {
|
||||||
|
WeatherController.map.set(id, this);
|
||||||
|
}
|
||||||
|
|
||||||
private tick = () => {
|
private tick = () => {
|
||||||
this.active.forEach(v => {
|
this.active.forEach(v => {
|
||||||
v.frame();
|
v.frame();
|
||||||
@ -40,9 +45,11 @@ export class WeatherController {
|
|||||||
* 清空所有天气
|
* 清空所有天气
|
||||||
*/
|
*/
|
||||||
clearWeather() {
|
clearWeather() {
|
||||||
|
if (this.binded) {
|
||||||
this.active.forEach(v => {
|
this.active.forEach(v => {
|
||||||
v.deactivate();
|
v.deactivate(this.binded!);
|
||||||
});
|
});
|
||||||
|
}
|
||||||
this.active.clear();
|
this.active.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -50,7 +57,7 @@ export class WeatherController {
|
|||||||
* 获取一个天气
|
* 获取一个天气
|
||||||
* @param weather 要获取的天气
|
* @param weather 要获取的天气
|
||||||
*/
|
*/
|
||||||
getWeather<T extends IWeather>(weather: Weather<T>): T | null {
|
getWeather<T extends IWeather = IWeather>(weather: Weather): T | null {
|
||||||
return ([...this.active].find(v => v instanceof weather) as T) ?? null;
|
return ([...this.active].find(v => v instanceof weather) as T) ?? null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -68,7 +75,9 @@ export class WeatherController {
|
|||||||
}
|
}
|
||||||
const weather = new Weather(level);
|
const weather = new Weather(level);
|
||||||
this.active.add(weather);
|
this.active.add(weather);
|
||||||
weather.activate();
|
if (this.binded) {
|
||||||
|
weather.activate(this.binded);
|
||||||
|
}
|
||||||
if (!this.ticker.funcs.has(this.tick)) {
|
if (!this.ticker.funcs.has(this.tick)) {
|
||||||
this.ticker.add(this.tick);
|
this.ticker.add(this.tick);
|
||||||
}
|
}
|
||||||
@ -84,10 +93,37 @@ export class WeatherController {
|
|||||||
if (this.active.size === 0) {
|
if (this.active.size === 0) {
|
||||||
this.ticker.remove(this.tick);
|
this.ticker.remove(this.tick);
|
||||||
}
|
}
|
||||||
weather.deactivate();
|
if (this.binded) {
|
||||||
|
weather.deactivate(this.binded);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static register(weather: Weather) {
|
/**
|
||||||
this.list.set(weather.id, weather);
|
* 将这个天气控制器绑定至一个渲染元素上
|
||||||
|
* @param item 要绑定的元素,不填表示取消绑定
|
||||||
|
*/
|
||||||
|
bind(item?: RenderItem) {
|
||||||
|
if (this.binded) {
|
||||||
|
this.active.forEach(v => v.deactivate(this.binded!));
|
||||||
|
}
|
||||||
|
this.binded = item;
|
||||||
|
if (item) {
|
||||||
|
this.active.forEach(v => v.activate(item));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 摧毁这个天气控制器
|
||||||
|
*/
|
||||||
|
destroy() {
|
||||||
|
WeatherController.map.delete(this.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
static get(id: string) {
|
||||||
|
return this.map.get(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
static register(id: string, weather: Weather) {
|
||||||
|
this.list.set(id, weather);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,8 +20,8 @@ import {
|
|||||||
} from './towerBossProjectile';
|
} from './towerBossProjectile';
|
||||||
import { IStateDamageable } from '@/game/state/interface';
|
import { IStateDamageable } from '@/game/state/interface';
|
||||||
import { HeroRenderer } from '@/core/render/preset/hero';
|
import { HeroRenderer } from '@/core/render/preset/hero';
|
||||||
import { controller } from '@/module/weather';
|
|
||||||
import { Pop } from '../fx/pop';
|
import { Pop } from '../fx/pop';
|
||||||
|
import { WeatherController } from '@/module';
|
||||||
|
|
||||||
Mota.require('var', 'loading').once('coreInit', () => {
|
Mota.require('var', 'loading').once('coreInit', () => {
|
||||||
const shader = new Shader();
|
const shader = new Shader();
|
||||||
@ -401,7 +401,8 @@ export class TowerBoss extends BarrageBoss {
|
|||||||
this.skill4Time = 5;
|
this.skill4Time = 5;
|
||||||
this.skill5Time = 3;
|
this.skill5Time = 3;
|
||||||
core.playBgm('towerBoss2.opus');
|
core.playBgm('towerBoss2.opus');
|
||||||
controller.activate('rain', 6);
|
const weather = WeatherController.get('main');
|
||||||
|
weather?.activate('rain', 6);
|
||||||
}
|
}
|
||||||
|
|
||||||
releaseSkill4() {
|
releaseSkill4() {
|
||||||
|
Loading…
Reference in New Issue
Block a user