HumanBreak/src/core/render/renderer/props.ts
2025-02-24 20:27:35 +08:00

256 lines
8.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { RenderFunction, RenderItem, RenderItemPosition } from '../item';
import { Transform } from '../transform';
import {
FloorLayer,
ILayerGroupRenderExtends,
ILayerRenderExtends
} from '../preset/layer';
import type { EnemyCollection } from '@/game/enemy/damage';
import {
BezierParams,
CircleParams,
EllipseParams,
ILineProperty,
LineParams,
QuadParams,
RectRCircleParams,
RectREllipseParams
} from '../preset/graphics';
import { ElementAnchor, ElementLocator, ElementScale } from '../utils';
import { CustomContainerRenderFn } from '../container';
export interface CustomProps {
_item: (props: BaseProps) => RenderItem;
}
export interface BaseProps {
/** 元素的横坐标 */
x?: number;
/** 元素的纵坐标 */
y?: number;
/** 元素的横向锚点位置 */
anchorX?: number;
/** 元素的纵向锚点位置 */
anchorY?: number;
/** 元素的纵深,值越大越靠上 */
zIndex?: number;
/** 元素的宽度 */
width?: number;
/** 元素的高度 */
height?: number;
/** 元素的滤镜 */
filter?: string;
/** 是否启用高清画布 */
hd?: boolean;
/** 是否启用抗锯齿 */
anti?: boolean;
/** 是否不启用抗锯齿,优先级大于 anti主要用于像素图片渲染 */
noanti?: boolean;
/** 元素是否隐藏,可以用于一些画面效果,也可以用于调试 */
hidden?: boolean;
/** 元素的变换矩阵 */
transform?: Transform;
/** 元素的定位模式static 表示常规定位absolute 定位模式下元素位置始终处于左上角 */
type?: RenderItemPosition;
/** 是否启用缓存,用处较少,主要用于一些默认不启用缓存的元素的特殊优化 */
cache?: boolean;
/** 是否不启用缓存,优先级大于 cache用处较少主要用于一些特殊优化 */
nocache?: boolean;
/** 是否启用变换矩阵下穿,下穿模式下,当前元素会使用由父元素传递过来的变换矩阵,而非元素自身的 */
fall?: boolean;
/** 这个元素的唯一标识符,不可重复 */
id?: string;
/** 这个元素的不透明度 */
alpha?: number;
/** 这个元素与已渲染内容的混合模式,默认为 source-over */
composite?: GlobalCompositeOperation;
/** 鼠标放在这个元素上时的光标样式 */
cursor?: string;
/**
* 定位属性,可以填 `[横坐标纵坐标宽度高度x锚点y锚点]`
* 对于横坐标与纵坐标、宽度与高度、x锚点与y锚点两两一组要么都填要么都不填
* 是 x, y, width, height, anchorX, anchorY 的简写属性
*/
loc?: ElementLocator;
/** 锚点属性,可以填 `[x锚点y锚点]`,是 anchorX, anchorY 的简写属性 */
anc?: ElementAnchor;
/** 放缩属性,可以填 `[x比例y比例]`,是 transform 的简写属性之一 */
scale?: ElementScale;
/** 旋转属性,单位弧度,是 transform 的简写属性之一 */
rotate?: number;
/** 这个元素是否不会触发任何交互事件cursor 属性也会无效),当执行到此元素时,会下穿至下一个元素 */
noevent?: boolean;
}
export interface SpriteProps extends BaseProps {
render?: RenderFunction;
}
export interface ContainerProps extends BaseProps {}
export interface ConatinerCustomProps extends ContainerProps {
render?: CustomContainerRenderFn;
}
export interface GL2Props extends BaseProps {}
export interface ShaderProps extends BaseProps {}
export interface TextProps extends BaseProps {
text?: string;
fillStyle?: CanvasStyle;
strokeStyle?: CanvasStyle;
font?: string;
strokeWidth?: number;
}
export interface ImageProps extends BaseProps {
image: CanvasImageSource;
}
export interface CommentProps extends BaseProps {
text?: string;
}
export interface LayerGroupProps extends BaseProps {
cellSize?: number;
blockSize?: number;
floorId?: FloorIds;
bindThisFloor?: boolean;
camera?: Transform;
ex?: readonly ILayerGroupRenderExtends[];
layers?: readonly FloorLayer[];
}
export interface LayerProps extends BaseProps {
layer?: FloorLayer;
mapWidth?: number;
mapHeight?: number;
cellSize?: number;
background?: AllNumbers;
floorImage?: FloorAnimate[];
ex?: readonly ILayerRenderExtends[];
}
export interface AnimateProps extends BaseProps {}
export interface DamageProps extends BaseProps {
mapWidth?: number;
mapHeight?: number;
cellSize?: number;
enemy?: EnemyCollection;
font?: string;
strokeStyle?: CanvasStyle;
strokeWidth?: number;
}
export interface GraphicPropsBase extends BaseProps, Partial<ILineProperty> {
/** 是否填充,若填写 {@link stroke},那么表现为先填充后描边 */
fill?: boolean;
/** 是否描边,若填写 {@link fill},那么表现为先填充后描边 */
stroke?: boolean;
/** 是否先描边后填充,优先级最高,若设置,则 {@link fill} 与 {@link stroke} 无效。 */
strokeAndFill?: boolean;
/** 填充原则,比如 `nonzero` 表示非零环绕原则,默认为奇偶环绕原则 `evenodd` */
fillRule?: CanvasFillRule;
/** 填充样式 */
fillStyle?: CanvasStyle;
/** 描边样式 */
strokeStyle?: CanvasStyle;
/** 在交互时,是否只检查交互位置只在描边上,对 fill, stroke, strokeAndFill 均有效 */
actionStroke?: boolean;
}
export interface RectProps extends GraphicPropsBase {}
export interface CirclesProps extends GraphicPropsBase {
radius?: number;
start?: number;
end?: number;
/**
* 圆属性参数,可以填 `[半径,起始角度,终止角度]`,是 radius, start, end 的简写,
* 其中半径可选,后两项要么都填,要么都不填
*/
circle?: CircleParams;
}
export interface EllipseProps extends GraphicPropsBase {
radiusX?: number;
radiusY?: number;
start?: number;
end?: number;
/**
* 椭圆属性参数,可以填 `[x半径y半径起始角度终止角度]`,是 radiusX, radiusY, start, end 的简写,
* 其中前两项和后两项要么都填,要么都不填
*/
ellipse?: EllipseParams;
}
export interface LineProps extends GraphicPropsBase {
x1?: number;
y1?: number;
x2?: number;
y2?: number;
/** 直线属性参数,可以填 `[x1, y1, x2, y2]`,都是必填 */
line?: LineParams;
}
export interface BezierProps extends GraphicPropsBase {
sx?: number;
sy?: number;
cp1x?: number;
cp1y?: number;
cp2x?: number;
cp2y?: number;
ex?: number;
ey?: number;
/** 三次贝塞尔曲线参数,可以填 `[sx, sy, cp1x, cp1y, cp2x, cp2y, ex, ey]`,都是必填 */
curve?: BezierParams;
}
export interface QuadraticProps extends GraphicPropsBase {
sx?: number;
sy?: number;
cpx?: number;
cpy?: number;
ex?: number;
ey?: number;
/** 二次贝塞尔曲线参数,可以填 `[sx, sy, cpx, cpy, ex, ey]`,都是必填 */
curve?: QuadParams;
}
export interface PathProps extends GraphicPropsBase {
path?: Path2D;
}
export interface RectRProps extends GraphicPropsBase {
/**
* 圆形圆角参数,可以填 `[r1, r2, r3, r4]`,后三项可选。填写不同数量下的表现:
* - 1个每个角都是 `r1` 半径的圆
* - 2个左上和右下是 `r1` 半径的圆,右上和左下是 `r2` 半径的圆
* - 3个左上是 `r1` 半径的圆,右上和左下是 `r2` 半径的圆,右下是 `r3` 半径的圆
* - 4个左上、右上、左下、右下 分别是 `r1, r2, r3, r4` 半径的圆
*/
circle?: RectRCircleParams;
/**
* 椭圆圆角参数,可以填 `[rx1, ry1, rx2, ry2, rx3, ry3, rx4, ry4]`
* 两两一组,后三组可选,填写不同数量下的表现:
* - 1组每个角都是 `[rx1, ry1]` 半径的椭圆
* - 2组左上和右下是 `[rx1, ry1]` 半径的椭圆,右上和左下是 `[rx2, ry2]` 半径的椭圆
* - 3组左上是 `[rx1, ry1]` 半径的椭圆,右上和左下是 `[rx2, ey2]` 半径的椭圆,右下是 `[rx3, ry3]` 半径的椭圆
* - 4组左上、右上、左下、右下 分别是 `[rx1, ry1], [rx2, ry2], [rx3, ry3], [rx4, ry4]` 半径的椭圆
*/
ellipse?: RectREllipseParams;
}
export interface IconProps extends BaseProps {
icon: AllNumbers;
frame?: number;
animate?: boolean;
}
export interface WinskinProps extends BaseProps {
image: ImageIds;
borderSize?: number;
}