@eva/react-eva
Version:
React EVA是一个让开发同学能够在React技术体系下,利用EVA JS的游戏研发能力,开发动画、游戏类场景的框架。它可以让开发同学用熟悉的JSX和Hooks语法编写动画、游戏场景的代码。
253 lines (210 loc) • 6.28 kB
TypeScript
import {
RefObject,
HTMLAttributes,
ReactNode,
ReactText,
ForwardRefExoticComponent,
RefAttributes
} from 'react';
import {RESOURCE_TYPE, GameObject, Game, Component, System, Transform} from '@eva/eva.js';
import {Render} from '@eva/plugin-renderer-render';
import {Text} from '@eva/plugin-renderer-text';
import {Event} from '@eva/plugin-renderer-event';
type Vector = {
x: number;
y: number;
};
type Size = {
width: number;
height: number;
};
type Pos = {
left: number;
right: number;
top: number;
bottom: number;
}
type EVARect = Vector & Size & Pos;
interface ClassType<T> extends Function { new (...args: any[]): T; }
type ParamType<T extends Component> = Parameters<T['init']>[0];
export type ResourceIdentify = string;
export type ResourceItem<T> = {
type: T;
url: string;
};
export interface ResourceSchema extends EVA.ResourceSchema {
[name: string]: any
}
type ResourceKey = keyof ResourceSchema;
interface ResourceData<T extends ResourceKey> {
name?: string;
type: T;
src: ResourceSchema[T];
preload?: boolean;
}
interface EvaInstance {
rootElement: HTMLDivElement;
canvasElement: HTMLCanvasElement;
backgroundElement: HTMLDivElement;
hudElement: HTMLDivElement;
gameInstance: Game;
scene: GameObject[];
systems: System[];
listeningProps: any[];
currentScene: GameObject;
currentSceneSize: Size;
fromDOMRect(rect: DOMRect): EVARect;
toDOMRect(rect: EVARect): DOMRect;
}
type PreloadCallback = (e: {progress: number}) => void;
type PreloadResourceList = ResourceData<any>[];
interface PreloadResourceMap {
[name: string]: ResourceData<ResourceKey> | ResourceIdentify
}
interface PreloadParams {
preloadResources?: PreloadResourceList | PreloadResourceMap;
preloadTimeout?: number;
onPreloadStart?: (cb: PreloadCallback) => void;
onPreloadProgress?: (cb: PreloadCallback) => void;
onPreloadLoaded?: (cb: PreloadCallback) => void;
onPreloadComplete?: (e: PreloadCallback) => void;
onPreloadError?: (e: PreloadCallback) => void;
}
interface Preload {
resources: {
[name: string]: ResourceIdentify;
}
onStart(fn: PreloadCallback): Preload;
onProgress(fn: PreloadCallback): Preload;
onLoaded(fn: PreloadCallback): Preload;
onComplete(fn: PreloadCallback): Preload;
onStart(fn: PreloadCallback): Preload;
onError(fn: PreloadCallback): Preload;
}
interface TransformParams {
x?: number;
y?: number;
width?: number;
height?: number;
anchorX?: number;
anchorY?: number;
originX?: number;
originY?: number;
scaleX?: number;
scaleY?: number;
rotationX?: number;
rotationY?: number;
}
type TextParams = Parameters<Text['init']>[0];
type TextStyleParams = TextParams['style'];
interface RenderParams {
visible?: boolean;
alpha?: number;
zIndex?: number;
sortableChildren?: boolean;
}
interface EventParams {
onClick?: () => void;
onTap?: () => void;
onTouchstart?: () => void;
onTouchmove?: () => void;
onTouchend?: () => void;
}
interface EvaRef extends HTMLDivElement {
gameInstance: Game;
}
interface EvaProps extends EVA.EvaProps {
width?: number | string;
height?: number | string;
systems?: System[];
listeningProps?: any[];
frameRate?: number;
autoStart?: boolean;
perventScroll?: boolean;
transparent?: boolean;
HiRes?: boolean;
LowRes?: boolean;
}
type EvaChildren = scene | hud | bg | JSX.Element;
interface eva extends HTMLAttributes<HTMLDivElement>, EvaProps {
ref?: RefObject<EvaRef>;
children?: EvaChildren | EvaChildren[];
[name: string]: any;
}
interface SceneProps {
design?: number;
}
type SceneChildren = gameobject | JSX.Element;
interface scene extends SceneProps {
ref?: RefObject<GameObject>;
children?: SceneChildren | SceneChildren[];
}
type HudChildren = ReactNode;
interface hud extends HTMLAttributes<HTMLDivElement> {
ref?: RefObject<HTMLDivElement>;
children?: HudChildren | HudChildren[];
}
type BgChildren = ReactNode;
interface bg extends HTMLAttributes<HTMLDivElement> {
ref?: RefObject<HTMLDivElement>;
children?: BgChildren | BgChildren[];
}
export interface GameObjectProps extends TransformParams, TextStyleParams, RenderParams, EventParams, EVA.ListeningProps {
name?: string;
components?: Component[];
}
type GameObjectChildren = gameobject | ReactText | JSX.Element;
interface gameobject extends GameObjectProps {
ref?: RefObject<GameObject>;
children?: GameObjectChildren | GameObjectChildren[];
[name: string]: any;
}
/** common */
export {RESOURCE_TYPE as ResourceType};
export function addSystem(system: System | ((props?: any) => System)): void;
export function addListeningProps<T extends Component>(filter: string[] | RegExp | ((key: string) => boolean), componentClass: ClassType<T>): void;
export interface EVAComponentProps extends TransformParams, TextStyleParams, RenderParams, EventParams, EVA.ListeningProps {
name?: string;
components?: Component[];
children?: gameobject | gameobject[] | ReactText | ReactText[] | JSX.Element | JSX.Element[];
[name: string]: any;
}
export declare class EvaRefObject implements EVA.EvaRefObject {
constructor(ref: RefObject<GameObject>);
gameobject: GameObject;
Transform: Transform;
Event?: Event;
Text?: Text;
Render?: Render;
[name: string]: Component | GameObject | ((...params: any[]) => any);
}
/** hooks */
export function useEva(): EvaInstance;
export function usePreload(): Preload;
export function useResource<T extends ResourceKey>(data: ResourceData<T>): ResourceIdentify;
export function useComponent<T extends Component>(componentClass: ClassType<T>, params?: ParamType<T>): T;
export function useComponents(...components: Component[]): Component[];
/** components */
interface EvaComponentProps extends EvaProps, PreloadParams {
ref?: RefObject<EvaInstance>;
children?: EvaChildren | EvaChildren[];
[name: string]: any;
}
export function Eva(props: EvaComponentProps): JSX.Element;
declare global {
namespace EVA {
interface ResourceSchema {}
interface EvaRefObject {}
interface EvaProps {}
interface ListeningProps {}
}
namespace JSX {
interface IntrinsicElements {
eva: eva;
scene: scene;
gameobject: gameobject;
hud: hud;
background: bg;
}
}
}