mirror of
https://github.com/unanmed/HumanBreak.git
synced 2025-02-28 17:37:07 +08:00
feat: 追逐战添加旋转、放缩镜头
This commit is contained in:
parent
0f6f0137f5
commit
2a9a666425
@ -4,21 +4,21 @@ import { logger } from '../common/logger';
|
||||
import { Transform } from './transform';
|
||||
import EventEmitter from 'eventemitter3';
|
||||
|
||||
interface CameraTranslate {
|
||||
export interface CameraTranslate {
|
||||
readonly type: 'translate';
|
||||
readonly from: Camera;
|
||||
x: number;
|
||||
y: number;
|
||||
}
|
||||
|
||||
interface CameraRotate {
|
||||
export interface CameraRotate {
|
||||
readonly type: 'rotate';
|
||||
readonly from: Camera;
|
||||
/** 旋转角,单位弧度 */
|
||||
angle: number;
|
||||
}
|
||||
|
||||
interface CameraScale {
|
||||
export interface CameraScale {
|
||||
readonly type: 'scale';
|
||||
readonly from: Camera;
|
||||
x: number;
|
||||
@ -160,8 +160,8 @@ export class Camera extends EventEmitter<CameraEvent> {
|
||||
addScale(): CameraScale {
|
||||
const item: CameraScale = {
|
||||
type: 'scale',
|
||||
x: 0,
|
||||
y: 0,
|
||||
x: 1,
|
||||
y: 1,
|
||||
from: this
|
||||
};
|
||||
this.operation.push(item);
|
||||
|
@ -1184,7 +1184,7 @@ export class Layer extends Container {
|
||||
const mat = transform.mat;
|
||||
const [a, b, , c, d, , e, f] = mat;
|
||||
ctx.setTransform(a, b, c, d, e, f);
|
||||
const max1 = Math.max(a, b, c, d) ** 2;
|
||||
const max1 = 1 / Math.min(a, b, c, d) ** 2;
|
||||
const max2 = Math.max(core._PX_, core._PY_) * 2;
|
||||
const r = (max1 * max2) ** 2;
|
||||
|
||||
|
@ -1,7 +1,20 @@
|
||||
import { Animation, bezier, hyper, linear, shake, sleep } from 'mutate-animate';
|
||||
import {
|
||||
Animation,
|
||||
bezier,
|
||||
hyper,
|
||||
linear,
|
||||
power,
|
||||
shake,
|
||||
sleep
|
||||
} from 'mutate-animate';
|
||||
import { Chase, ChaseData } from './chase';
|
||||
import { completeAchievement } from '../ui/achievement';
|
||||
import { Camera, CameraAnimation } from '@/core/render/camera';
|
||||
import {
|
||||
Camera,
|
||||
CameraAnimation,
|
||||
CameraRotate,
|
||||
CameraScale
|
||||
} from '@/core/render/camera';
|
||||
import { LayerGroup } from '@/core/render/preset/layer';
|
||||
import { MotaRenderer } from '@/core/render/render';
|
||||
import { Sprite } from '@/core/render/sprite';
|
||||
@ -126,15 +139,30 @@ export function initChase() {
|
||||
|
||||
const chase = new Chase(data, flags.chaseHard === 0);
|
||||
|
||||
const translate = camera.addTranslate();
|
||||
// 旋转在前,平移在后
|
||||
const translate1 = camera.addTranslate();
|
||||
const scale = camera.addScale();
|
||||
const rotate = camera.addRotate();
|
||||
const translate2 = camera.addTranslate();
|
||||
const translate = camera.addTranslate();
|
||||
|
||||
translate.x = 10;
|
||||
translate.y = 10;
|
||||
translate1.x = -7 * 32;
|
||||
translate1.y = -7 * 32;
|
||||
translate2.x = 7 * 32;
|
||||
translate2.y = 7 * 32;
|
||||
|
||||
translate.x = 10 * 32;
|
||||
translate.y = 10 * 32;
|
||||
|
||||
const inOut = hyper('sin', 'in-out');
|
||||
// MT16 摄像机动画
|
||||
animation16.translate(translate, 10, 10, 1, 0, linear());
|
||||
animation16.translate(translate, 0, 10, 1600, 0, hyper('sin', 'in'));
|
||||
// MT15 摄像机动画
|
||||
animation15.rotate(rotate, -Math.PI / 30, 4000, 0, inOut);
|
||||
animation15.rotate(rotate, 0, 3000, 5000, inOut);
|
||||
animation15.rotate(rotate, -Math.PI / 40, 1800, 11000, inOut);
|
||||
animation15.rotate(rotate, 0, 2000, 13000, inOut);
|
||||
animation15.translate(translate, 49, 0, 1, 0, linear());
|
||||
animation15.translate(translate, 45, 0, 2324, 0, hyper('sin', 'in'));
|
||||
animation15.translate(translate, 40, 0, 1992, 2324, hyper('sin', 'out'));
|
||||
@ -145,6 +173,8 @@ export function initChase() {
|
||||
animation15.translate(translate, 12, 0, 996, 12450, linear());
|
||||
animation15.translate(translate, 0, 0, 1470, 13446, hyper('sin', 'out'));
|
||||
// MT14 摄像机动画
|
||||
animation14.rotate(rotate, -Math.PI / 70, 1000, 0, inOut);
|
||||
animation14.rotate(rotate, 0, 4000, 2000, inOut);
|
||||
animation14.translate(translate, 113, 0, 1, 0, hyper('sin', 'in'));
|
||||
animation14.translate(translate, 109, 0, 1328, 0, hyper('sin', 'in'));
|
||||
animation14.translate(translate, 104, 0, 332, 1328, hyper('sin', 'out'));
|
||||
@ -158,11 +188,17 @@ export function initChase() {
|
||||
animation14.translate(translate, 0, 0, 9960, 24900, linear());
|
||||
|
||||
chase.on('end', () => {
|
||||
camera.transform.reset();
|
||||
camera.transform.translate(
|
||||
-translate.x * 32 - 7 * 32,
|
||||
-translate.y * 32 - 7 * 32
|
||||
);
|
||||
animation16.destroy();
|
||||
animation15.destroy();
|
||||
animation14.destroy();
|
||||
camera.destroy();
|
||||
back?.destroy();
|
||||
back = void 0;
|
||||
});
|
||||
|
||||
judgeFail1(chase, ani, camera);
|
||||
@ -170,6 +206,7 @@ export function initChase() {
|
||||
para1(chase);
|
||||
para2(chase);
|
||||
para3(chase, ani);
|
||||
processScale(chase, ani, scale, camera);
|
||||
|
||||
Mota.Plugin.require('chase_g').chaseInit1();
|
||||
|
||||
@ -184,6 +221,31 @@ export function initChase() {
|
||||
// .shake(1, 0);
|
||||
// }
|
||||
|
||||
function processScale(
|
||||
chase: Chase,
|
||||
ani: Animation,
|
||||
scale: CameraScale,
|
||||
camera: Camera
|
||||
) {
|
||||
chase.onceLoc(35, 3, 'MT15', () => {
|
||||
camera.applyScaleAnimation(scale, ani, 2200);
|
||||
ani.mode(linear()).time(1).scale(1.2);
|
||||
sleep(150).then(() => {
|
||||
ani.mode(hyper('sin', 'out')).time(2000).scale(1);
|
||||
});
|
||||
});
|
||||
chase.onFloorTime('MT14', 100, () => {
|
||||
camera.applyScaleAnimation(scale, ani, 30000);
|
||||
ani.mode(hyper('sin', 'in-out')).time(3000).scale(0.8);
|
||||
});
|
||||
chase.onceLoc(57, 10, 'MT14', () => {
|
||||
ani.mode(power(6, 'in')).time(200).scale(1.1);
|
||||
sleep(200).then(() => {
|
||||
ani.mode(hyper('sin', 'in-out')).time(3000).scale(1);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
async function wolfMove(chase: Chase) {
|
||||
core.moveBlock(23, 17, Array(6).fill('down'), 80);
|
||||
await sleep(550);
|
||||
@ -489,13 +551,16 @@ function para3(chase: Chase, ani: Animation) {
|
||||
}
|
||||
core.drawAnimate('explosion2', 61, 7);
|
||||
});
|
||||
const exploded: Set<number> = new Set();
|
||||
chase.on('step', (x, y) => {
|
||||
if (core.status.floorId !== 'MT14') return;
|
||||
if (exploded.has(x)) return;
|
||||
if (x > 20 && x < 49) {
|
||||
for (let ty = 3; ty <= 11; ty++) {
|
||||
core.setBlock(336, x + 4, ty);
|
||||
core.drawAnimate('explosion1', x + 4, ty);
|
||||
}
|
||||
exploded.add(x);
|
||||
}
|
||||
});
|
||||
chase.onceLoc(21, 7, 'MT14', async () => {
|
||||
|
Loading…
Reference in New Issue
Block a user