From 1b8624041b7d216f08ca985fd9a27b388afbca9d Mon Sep 17 00:00:00 2001 From: unanmed <1319491857@qq.com> Date: Tue, 16 Sep 2025 17:50:44 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=99=B4=E5=A4=A9=E5=A4=A9=E6=B0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client-modules/src/render/index.tsx | 1 + .../src/render/weather/index.ts | 4 +- .../src/render/weather/presets/cloud.ts | 54 +++++++++--------- .../src/render/weather/presets/sun.ts | 51 +++++++++++++++-- packages/legacy-common/src/resource.ts | 5 +- public/project/data.js | 1 + public/project/{materials => images}/sun.png | Bin src/types/source/data.d.ts | 1 + 8 files changed, 81 insertions(+), 36 deletions(-) rename public/project/{materials => images}/sun.png (100%) diff --git a/packages-user/client-modules/src/render/index.tsx b/packages-user/client-modules/src/render/index.tsx index 2ea5fa4..5d26e15 100644 --- a/packages-user/client-modules/src/render/index.tsx +++ b/packages-user/client-modules/src/render/index.tsx @@ -56,5 +56,6 @@ export * from './ui'; export * from './utils'; export * from './weather'; export * from './renderer'; +export * from './scene'; export * from './shared'; export * from './use'; diff --git a/packages-user/client-modules/src/render/weather/index.ts b/packages-user/client-modules/src/render/weather/index.ts index 8d68878..2dd7416 100644 --- a/packages-user/client-modules/src/render/weather/index.ts +++ b/packages-user/client-modules/src/render/weather/index.ts @@ -1,11 +1,11 @@ import { WeatherController } from './controller'; -import { CloudWeather, RainWeather } from './presets'; +import { CloudWeather, RainWeather, SunWeather } from './presets'; export function createWeather() { WeatherController.register('cloud', CloudWeather); WeatherController.register('rain', RainWeather); + WeatherController.register('sun', SunWeather); // WeatherController.register('snow', SnowWeather); - // WeatherController.register('sun', SunWeather); } export * from './presets'; diff --git a/packages-user/client-modules/src/render/weather/presets/cloud.ts b/packages-user/client-modules/src/render/weather/presets/cloud.ts index 61a8eba..1aa2b98 100644 --- a/packages-user/client-modules/src/render/weather/presets/cloud.ts +++ b/packages-user/client-modules/src/render/weather/presets/cloud.ts @@ -17,7 +17,7 @@ export class CloudWeather extends Weather { /** 云层图像 */ private image: HTMLImageElement | null = null; /** 上一次执行速度变换的时刻 */ - private lastDvTime = 0; + private lastTick = 0; private drawCloud(canvas: MotaOffscreenCanvas2D) { const ctx = canvas.ctx; @@ -38,31 +38,33 @@ export class CloudWeather extends Weather { tick(time: number): void { if (!this.element || !this.image) return; this.element.update(); - if (time - this.lastDvTime > 50) { - this.lastDvTime = time; - const dvx = ((Math.random() - 0.5) * this.level) / 20; - const dvy = ((Math.random() - 0.5) * this.level) / 20; - if (Math.sign(dvx) === Math.sign(this.vx)) { - const ratio = Math.sqrt( - (this.maxSpeed - Math.abs(this.vx)) / this.maxSpeed - ); - const value = Math.abs(dvx) * ratio; - this.vx += value * Math.sign(dvx); - } else { - this.vx += dvx; - } - if (Math.sign(dvy) === Math.sign(this.vy)) { - const ratio = Math.sqrt( - (this.maxSpeed - Math.abs(this.vy)) / this.maxSpeed - ); - const value = Math.abs(dvy) * ratio; - this.vy += value * Math.sign(dvy); - } else { - this.vy += dvy; - } + const dt = time - this.lastTick; + this.lastTick = time; + if (dt > 100) return; + const dvx = (Math.random() - 0.5) * this.level * 10; + const dvy = (Math.random() - 0.5) * this.level * 10; + const addx = (dvx * dt) / 1000; + const addy = (dvy * dt) / 1000; + if (Math.sign(addx) === Math.sign(this.vx)) { + const ratio = Math.sqrt( + (this.maxSpeed - Math.abs(this.vx)) / this.maxSpeed + ); + const value = Math.abs(addx) * ratio; + this.vx += value * Math.sign(addx); + } else { + this.vx += addx; } - this.cx += this.vx; - this.cy += this.vy; + if (Math.sign(addy) === Math.sign(this.vy)) { + const ratio = Math.sqrt( + (this.maxSpeed - Math.abs(this.vy)) / this.maxSpeed + ); + const value = Math.abs(addy) * ratio; + this.vy += value * Math.sign(addy); + } else { + this.vy += addy; + } + this.cx += (this.vx * dt) / 1000; + this.cy += (this.vy * dt) / 1000; this.cx %= this.image.width; this.cy %= this.image.height; } @@ -70,7 +72,7 @@ export class CloudWeather extends Weather { createElement(level: number): Sprite { const element = new Sprite('static', true); element.setRenderFn(canvas => this.drawCloud(canvas)); - this.maxSpeed = Math.sqrt(level) * 5; + this.maxSpeed = Math.sqrt(level) * 100; this.vx = ((Math.random() - 0.5) * this.maxSpeed) / 2; this.vy = ((Math.random() - 0.5) * this.maxSpeed) / 2; this.alpha = Math.sqrt(level) / 10; diff --git a/packages-user/client-modules/src/render/weather/presets/sun.ts b/packages-user/client-modules/src/render/weather/presets/sun.ts index 752d670..34bc81b 100644 --- a/packages-user/client-modules/src/render/weather/presets/sun.ts +++ b/packages-user/client-modules/src/render/weather/presets/sun.ts @@ -1,16 +1,55 @@ -import { Sprite } from '@motajs/render-core'; +import { MotaOffscreenCanvas2D, Sprite } from '@motajs/render-core'; import { Weather } from '../weather'; +import { clamp } from 'lodash-es'; export class SunWeather extends Weather { + /** 阳光图片 */ + private image: HTMLImageElement | null = null; + /** 阳光图片的不透明度 */ + private alpha: number = 0; + /** 阳光的最大不透明度 */ + private maxAlpha: number = 0; + /** 阳光的最小不透明度 */ + private minAlpha: number = 0; + /** 不透明度变化率 */ + private va: number = 0; + /** 上一帧的时刻 */ + private lastTick: number = 0; + + drawSun(canvas: MotaOffscreenCanvas2D) { + if (!this.image) return; + const ctx = canvas.ctx; + ctx.globalAlpha = this.alpha; + ctx.drawImage(this.image, 0, 0, canvas.width, canvas.height); + } + tick(timestamp: number): void { - throw new Error('Method not implemented.'); + this.element?.update(); + const dt = timestamp - this.lastTick; + this.lastTick = timestamp; + if (dt > 100) return; + const aa = (Math.random() - 0.5) * this.level; + this.va += (aa * dt) / 1000; + this.va = clamp(this.va, 0.1); + this.alpha += (this.va * dt) / 1000; + if (this.alpha < this.minAlpha) { + this.va = Math.abs(this.va); + this.alpha = this.minAlpha; + } else if (this.alpha > this.maxAlpha) { + this.va = -Math.abs(this.va); + this.alpha = this.maxAlpha; + } } createElement(level: number): Sprite { - throw new Error('Method not implemented.'); + const element = new Sprite('static', true); + element.setRenderFn(canvas => this.drawSun(canvas)); + this.maxAlpha = level / 10; + this.minAlpha = level / 20; + this.alpha = (this.maxAlpha + this.minAlpha) / 2; + this.image = core.material.images.images['sun.png']; + return element; } - onDestroy(): void { - throw new Error('Method not implemented.'); - } + onDestroy(): void {} } diff --git a/packages/legacy-common/src/resource.ts b/packages/legacy-common/src/resource.ts index 8681431..e5f46f2 100644 --- a/packages/legacy-common/src/resource.ts +++ b/packages/legacy-common/src/resource.ts @@ -108,6 +108,7 @@ export class ImageResource extends Resource { img.src = this.resolveURI(); this.resource = img; return new Promise(res => { + img.loading = 'eager'; img.addEventListener('load', () => { this.loaded = true; img.setAttribute('_width', img.width.toString()); @@ -575,7 +576,7 @@ export function loadDefaultResource() { ] = res.resource; }); }); - const weathers: (keyof Weather)[] = ['fog', 'sun']; + const weathers: (keyof Weather)[] = ['fog']; weathers.forEach(v => { const res = LoadTask.add('material', `material/${v}.png`); res.once('load', res => { @@ -618,7 +619,7 @@ export async function loadCompressedResource() { HTMLImageElement >[]; materialImages.push('keyboard'); - const weathers: (keyof Weather)[] = ['fog', 'sun']; + const weathers: (keyof Weather)[] = ['fog']; Object.entries(list).forEach(v => { const [uri, list] = v; diff --git a/public/project/data.js b/public/project/data.js index 2a24e45..97307d1 100644 --- a/public/project/data.js +++ b/public/project/data.js @@ -150,6 +150,7 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "skill7.png", "skill8.png", "skill9.png", + "sun.png", "tower7.webp", "winskin.png", "winskin2.png", diff --git a/public/project/materials/sun.png b/public/project/images/sun.png similarity index 100% rename from public/project/materials/sun.png rename to public/project/images/sun.png diff --git a/src/types/source/data.d.ts b/src/types/source/data.d.ts index de5b1a5..ff4acae 100644 --- a/src/types/source/data.d.ts +++ b/src/types/source/data.d.ts @@ -138,6 +138,7 @@ type ImageIds = | 'skill7.png' | 'skill8.png' | 'skill9.png' + | 'sun.png' | 'tower7.webp' | 'winskin.png' | 'winskin2.png'