From deabd101549e4ff0bb5793d0131c4229f561d5fd Mon Sep 17 00:00:00 2001 From: unanmed <1319491857@qq.com> Date: Sun, 17 Nov 2024 19:33:52 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=AC=AC=E4=BA=8C=E9=98=B6=E6=AE=B5bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/plugin/boss/towerBoss.ts | 50 +++++++----- src/plugin/boss/towerBossProjectile.ts | 103 +++++++++++++++---------- src/plugin/fx/pointShader.ts | 1 + 3 files changed, 97 insertions(+), 57 deletions(-) diff --git a/src/plugin/boss/towerBoss.ts b/src/plugin/boss/towerBoss.ts index 0a22854..2934241 100644 --- a/src/plugin/boss/towerBoss.ts +++ b/src/plugin/boss/towerBoss.ts @@ -20,6 +20,7 @@ import { ThunderProjectile } from './towerBossProjectile'; import { IStateDamageable } from '@/game/state/interface'; +import { HeroRenderer } from '@/core/render/preset/hero'; Mota.require('var', 'loading').once('coreInit', () => { const shader = new Shader(); @@ -136,24 +137,32 @@ export class TowerBoss extends BarrageBoss { this.state = core.status.hero; } + private moveTick = (x: number, y: number) => { + this.hitbox.setPosition(x * 32 + 2, y * 32 + 2); + }; + override start() { super.start(); - requestAnimationFrame(() => { - this.group.remove(); - this.group.append(TowerBoss.shader); - TowerBoss.shader.append(this.mapDraw); - this.healthBar.append(this.group); - this.word.append(this.group); - this.main.append(this.group); - ArrowProjectile.init(); - PortalProjectile.init(); - ThunderProjectile.init(); - AttackProjectile.init(); + this.group.remove(); + this.group.append(TowerBoss.shader); + TowerBoss.shader.append(this.mapDraw); + this.healthBar.append(this.group); + this.word.append(this.group); + this.main.append(this.group); - TowerBoss.effect.start(); - TowerBoss.effect.use(); - }); + const event = this.group.getLayer('event'); + const hero = event?.getExtends('floor-hero') as HeroRenderer; + hero?.on('moveTick', this.moveTick); + + ArrowProjectile.init(); + PortalProjectile.init(); + ThunderProjectile.init(); + ThunderBallProjectile.init(); + AttackProjectile.init(); + + TowerBoss.effect.start(); + TowerBoss.effect.use(); } override end() { @@ -164,9 +173,14 @@ export class TowerBoss extends BarrageBoss { this.word.remove(); this.main.remove(); + const event = this.group.getLayer('event'); + const hero = event?.getExtends('floor-hero') as HeroRenderer; + hero?.off('moveTick', this.moveTick); + ArrowProjectile.end(); PortalProjectile.end(); ThunderProjectile.end(); + ThunderBallProjectile.end(); AttackProjectile.end(); TowerBoss.effect.end(); @@ -211,12 +225,12 @@ export class TowerBoss extends BarrageBoss { * @param last 持续时长 * @param damage 造成的伤害 */ - addAttackCircle(damage: number, n: number) { + addAttackCircle(_: number, n: number) { const s = 13 - n * 2; const nx = Math.floor(Math.random() * s + n + 1); const ny = Math.floor(Math.random() * s + n + 1); const proj = this.createProjectile(AttackProjectile, nx * 32, ny * 32); - proj.damage = damage; + proj.damage = 250 + Math.floor(Math.random() * 500); } ai(time: number, frame: number): void { @@ -277,7 +291,7 @@ export class TowerBoss extends BarrageBoss { } if (time > 1500) { - this.changeStage(TowerBossStage.Stage1, time); + this.changeStage(TowerBossStage.Dialogue1, time); this.attackTime = 2; this.skill1Time = 1; this.skill2Time = 1; @@ -747,7 +761,7 @@ class HealthBar extends RenderItem { this.trans.time(2000).mode(power(3, 'out')).transition('hp', value); this.delegateTicker(() => { this.update(); - }, 800); + }, 2500); } /** diff --git a/src/plugin/boss/towerBossProjectile.ts b/src/plugin/boss/towerBossProjectile.ts index 79090e2..d87afc4 100644 --- a/src/plugin/boss/towerBossProjectile.ts +++ b/src/plugin/boss/towerBossProjectile.ts @@ -440,12 +440,14 @@ export class ThunderProjectile extends Projectile { private sounded: boolean = false; private effect?: PointEffect; - private effectId?: number; + private effectId1?: number; + private effectId2?: number; static init() { this.cache = new MotaOffscreenCanvas2D(); this.cache.setHD(true); this.cache.withGameScale(true); + this.cache.size(480, 480); } static end() { @@ -458,11 +460,20 @@ export class ThunderProjectile extends Projectile { */ createEffect(effect: PointEffect) { this.effect = effect; - this.effectId = effect.addEffect( + this.effectId1 = effect.addEffect( PointEffectType.CircleBrightness, Date.now() + 1000, - 400, - [this.bx * 32 + 32, this.by * 32 + 32, 128, 32] + 600, + [this.bx * 32 + 16, this.by * 32 + 16, 128, 32], + [1, 0, 0, 0] + ); + this.effectId2 = effect.addEffect( + PointEffectType.CircleWarp, + Date.now() + 1000, + 600, + [this.bx * 32 + 16, this.by * 32 + 16, 240 + this.power * 32, 32], + [0.1, 6, 0.8, 0], + [0, Math.PI, 0, 0] ); } @@ -499,7 +510,7 @@ export class ThunderProjectile extends Projectile { } ai(boss: TowerBoss, time: number, frame: number): void { - if (time > 1000) { + if (time > 500) { if (!this.sounded) { core.playSound('thunder.mp3'); this.sounded = true; @@ -513,8 +524,8 @@ export class ThunderProjectile extends Projectile { render(canvas: MotaOffscreenCanvas2D, transform: Transform): void { const ctx = canvas.ctx; if (this.time < 1000) { - const before = ctx.fillStyle; ctx.fillStyle = '#fff'; + ctx.globalAlpha = 0.6; for (let dx = -1; dx < 2; dx++) { for (let dy = -1; dy < 2; dy++) { const x = (this.bx + dx) * 32 + 2; @@ -522,42 +533,41 @@ export class ThunderProjectile extends Projectile { ctx.fillRect(x, y, 28, 28); } } - ctx.fillStyle = before; } else { if (!this.cached) this.cacheThunder(); if (!ThunderProjectile.cache) return; - const x = this.bx * 32; - const before = ctx.globalAlpha; const progress = (this.time - 1000) / 1000; - if (progress < 0.4) { - const effect = this.effect; - const id = this.effectId; - if (!effect || isNil(id)) return; - const effectRatio = ArrowProjectile.dangerEasing!( - progress * 2.5 + const effect = this.effect; + const id = this.effectId1; + if (!effect || isNil(id)) return; + if (progress < 0.6) { + const x = this.bx * 32 + 16; + const y = this.by * 32 + 16; + effect.setEffect( + id, + [x, y, 32 + progress * 256, 32], + [(0.6 - progress) / 0.6, 0, 0, 0] ); - effect.setEffect(id, void 0, [effectRatio, 0, 0, 0]); } if (progress < 0.5) { ctx.globalAlpha = 1; } else { ctx.globalAlpha = 1 - (progress - 0.5) * 2; } - ctx.drawImage(ThunderProjectile.cache.canvas, x - 60, 0); - ctx.globalAlpha = before; + ctx.drawImage(ThunderProjectile.cache.canvas, 0, 0, 480, 480); } } private cacheThunder() { const cache = ThunderProjectile.cache; if (!cache) return; - const bottom = this.by * 32 + 32; - cache.size(120, bottom); + this.cached = true; + cache.clear(); const ctx = cache.ctx; ctx.beginPath(); for (let i = 0; i < this.power; i++) { - let x = this.bx * 32; - let y = this.by * 32; + let x = this.bx * 32 + 16; + let y = this.by * 32 + 16; ctx.moveTo(x, y); while (y > 0) { x += Math.floor(Math.random() * 30 - 15); @@ -565,10 +575,11 @@ export class ThunderProjectile extends Projectile { ctx.lineTo(x, y); } } - ctx.shadowBlur = 3; + ctx.shadowBlur = 5; ctx.shadowColor = '#62c8f4'; ctx.lineWidth = 2; ctx.globalAlpha = 0.6; + ctx.strokeStyle = '#fff'; ctx.stroke(); } } @@ -596,23 +607,23 @@ export class ThunderBallProjectile extends Projectile { this.horizontal = new MotaOffscreenCanvas2D(); this.vertical = new MotaOffscreenCanvas2D(); const hor = this.horizontal; - hor.size(480 - 64, 32); + hor.size(480, 32); hor.setHD(true); hor.withGameScale(true); const ctxHor = hor.ctx; ctxHor.fillStyle = '#fff'; ctxHor.globalAlpha = 0.6; - for (let i = 0; i < 13; i++) { + for (let i = 0; i < 15; i++) { ctxHor.fillRect(i * 32 + 2, 2, 28, 28); } const ver = this.vertical; - ver.size(480 - 64, 32); + ver.size(32, 480); ver.setHD(true); ver.withGameScale(true); const ctxVer = ver.ctx; ctxVer.fillStyle = '#fff'; ctxVer.globalAlpha = 0.6; - for (let i = 0; i < 13; i++) { + for (let i = 0; i < 15; i++) { ctxVer.fillRect(2, i * 32 + 2, 28, 28); } } @@ -732,8 +743,8 @@ export class ThunderBallProjectile extends Projectile { const height = (432 - cy) * begin; left = cx - 16; right = cx + 16; - bottom = cy + 16; - top = cy + 16 + height; + bottom = cy + 16 + height; + top = cy + 16; break; } } @@ -769,27 +780,41 @@ export class ThunderBallProjectile extends Projectile { } } } + const ratio = devicePixelRatio * core.domStyle.scale; const w = right - left; const h = bottom - top; + const fw = w * ratio; + const fh = h * ratio; + const fl = left * ratio; + const ft = top * ratio; + const cell = 32 * ratio; const hor = ThunderBallProjectile.horizontal!.canvas; const ver = ThunderBallProjectile.vertical!.canvas; - switch (this.direction) { - case ProjectileDirection.BottomToTop: - case ProjectileDirection.TopToBottom: { - ctx.drawImage(hor, 0, top, 32, h, left, top, w, h); - break; - } - case ProjectileDirection.LeftToRight: - case ProjectileDirection.RightToLeft: { - ctx.drawImage(ver, left, 0, w, 32, left, top, w, h); + ctx.save(); + ctx.globalAlpha = 1; + if (w > 0 && h > 0) { + switch (this.direction) { + case ProjectileDirection.BottomToTop: + case ProjectileDirection.TopToBottom: { + ctx.drawImage(ver, 0, ft, cell, fh, left, top, w, h); + break; + } + case ProjectileDirection.LeftToRight: + case ProjectileDirection.RightToLeft: { + ctx.drawImage(hor, fl, 0, fw, cell, left, top, w, h); + break; + } } } ctx.fillStyle = '#fff'; + ctx.shadowBlur = 8; + ctx.shadowColor = '#62c8f4'; ctx.globalAlpha = 0.9; ctx.beginPath(); - const radius = 9 + Math.floor(Math.random() * 8 - 4); + const radius = 7 + Math.floor(Math.random() * 2); ctx.arc(this.x, this.y, radius, 0, Math.PI * 2); ctx.fill(); + ctx.restore(); } } diff --git a/src/plugin/fx/pointShader.ts b/src/plugin/fx/pointShader.ts index a2cb45e..792f2be 100644 --- a/src/plugin/fx/pointShader.ts +++ b/src/plugin/fx/pointShader.ts @@ -427,6 +427,7 @@ export class PointEffect { case PointEffectType.CircleContrast: case PointEffectType.CircleSaturate: case PointEffectType.CircleHue: + case PointEffectType.CircleBrightness: case PointEffectType.CircleWarpTangetial: { transformXY(index); transformed[index + 6] *= scale;