npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@richlox/core

v0.33.0

Published

@richlox/core ===============

Downloads

41

Readme

@richlox/core

Richlox Engine 核心库

安装

npm install @richlox/core

or

yarn add @richlox/core

使用说明

  • Actor - Component
    • Actor - 场景内最小单位
    • Component - 挂载在 Actor 上的功能组件
    import { AActor, CSphere } from '@richlox/core';

    /**
     * 继承 Actor
     */
    export class ACustomActor extends AActor {
        /**
         * 异步初始化方法
         * 创建 Component,初始化 Actor
         * 注册输入事件
         * 开启或关闭 tick (默认开启)
         */
        async initialize(): Promise<void> {
            await super.initialize();
            // 创建球体组件
            this.createComponent(CSphere);
            // 不执行 tick
            this.tickable = false;
            // 为 Actor 注册输入事件,注册后才能接收输入
            this.registerInput();
            // your code here
            // this.position =
            // this.rotation =
            // this.scale =
        }

        /**
         * Actor 添加到场景中以后执行
         */
        async beginPlay(): Promise<void> {
            await super.beginPlay();
            // your code here
        }

        /**
         * 每帧执行
         */
        tick(deltaTime: number): void {
            super.tick(deltaTime);
            // your code here
        }

        /**
         * Actor 销毁后执行
         */
        endPlay(reason: EDisposeReason): void {
            super.endPlay(reason);
        }

        /**
         * 输入事件
         * onMouseClick(event: MouseEvent): void;
         * onMouseDoubleClick(event: MouseEvent): void;
         * onMouseMouseWheel(event: WheelEvent): void;
         * onKeyDown(event: KeyboardEvent): void;
         * onKeyPress(event: KeyboardEvent): void;
         * onKeyUp(event: KeyboardEvent): void;
         */
    }

    import { CComponent } from '@richlox/core';

    /**
     * 继承 Component
     **/
    export class CCustomComponent extends CComponent {
        /**
         * 生命周期
         * async beforeInitialize(): Promise<void>;
         * async initialize(): Promise<void>;
         * async afterInitialize(): Promise<void>;
         * async beginPlay(): Promise<void>;
         * tick(deltaTime: number): void;
         * endPlay(reason: EDisposeReason): void;
         **/

        /**
         * 输入事件
         * onMouseClick(event: MouseEvent): void;
         * onMouseDoubleClick(event: MouseEvent): void;
         * onMouseMouseWheel(event: WheelEvent): void;
         * onKeyDown(event: KeyboardEvent): void;
         * onKeyPress(event: KeyboardEvent): void;
         * onKeyUp(event: KeyboardEvent): void;
         */

        async beginPlay(): Promise<void> {
            await super.beginPlay();
            // your code here
        }
    }

    import { CComponent, editable, expose } from '@richlox/core';

    /**
     * 创建一个让其所挂载 Actor 不停旋转的 component
     **/
    @expose('Rotation')
    export class CRotationComponent extends CComponent {
        @editable(Number) speed: number = 1;

        tick(deltaSecond: number): void {
            super.tick(deltaSecond);
            this.owner.rotation.x += this.speed * 0.01;
            this.owner.rotation.y += this.speed * 0.01;
            this.owner.rotation.z += this.speed * 0.01;
        }
    }
  • GWorld - 游戏世界

    /**
     * GWorld 中的接口方法
     **/

    /**
     * 在当前激活场景中生成 Actor
     *
     * @template T Actor 子类类型
     * @param {IInitializer<T>} c Actor 构造器
     * @param {...ConstructorParameters<IInitializer<T>>} constructorArgs 构造参数
     * @returns {Promise<InstanceType<IInitializer<T>>>} Actor
     * @memberof IWorld
     */
    spawnActor<T extends AActor>(
        c: IInitializer<T>,
        ...constructorArgs: ConstructorParameters<IInitializer<T>>
    ): Promise<InstanceType<IInitializer<T>>>;

    /**
     * 查找场景中符合特定类型所有 Actor
     *
     * @template T Actor 子类类型
     * @param {IInitializer<T>} c Actor 子类构造器
     * @param {Array<InstanceType<IInitializer<T>>>} actors 结果
     * @memberof RLScene
     */
    findActorsByClass<T extends AActor>(
        c: IInitializer<T>,
        actors: Array<InstanceType<IInitializer<T>>>
    ): void;

    /**
     * 射线检测,返回第一个结果
     *
     * @param {FVector3} start 起点
     * @param {FVector3} direction 方向
     * @returns {(IHitResult | undefined)} 第一个检测结果
     * @memberof IWorld
     */
    lineTrace(start: FVector3, direction: FVector3): IHitResult | undefined;

    /**
     * 射线检测,返回所有结果
     *
     * @param {FVector3} start 起点
     * @param {FVector3} direction 方向
     * @returns {IHitResult[]} 所有检测结果
     * @memberof IWorld
     */
    multiLineTrace(start: FVector3, direction: FVector3): IHitResult[];

    /**
     * 鼠标位置的射线检测,返回第一个结果
     *
     * @param {Camera} camera 当前摄像机
     * @param {FVector2} mousePosition 鼠标位置
     * @returns {(IHitResult | undefined)} 第一个检测结果
     * @memberof IWorld
     */
    mouseLineTrace(camera: Camera, mousePosition: FVector2): IHitResult | undefined;

    /**
     * 鼠标位置的射线检测,返回所有结果
     *
     * @param {Camera} camera 当前摄像机
     * @param {FVector2} mousePosition 鼠标位置
     * @returns {IHitResult[]} 所有检测结果
     * @memberof IWorld
     */
    multiMouseLineTrace(camera: Camera, mousePosition: FVector2): IHitResult[];

    /**
     * 获取鼠标在当前 canvas 中的位置
     *
     * @param {MouseEvent} event
     * @returns {FVector2}
     * @memberof IWorld
     */
    getMousePosition(event: MouseEvent): FVector2;

    import { GWorld } from '@richlox/core';

    /**
     * 动态创建 Actor
     * 在 beginPaly 或 beginPaly 以后可以动态创建新 Actor
     */
    const customActor = await GWorld.spawnActor(ACustomActor);
  • 路径

    • /Game - 项目目录下的 contents 目录
    • /Script - 项目目录下的 source 目录
    • /###{plugin name} - 插件目录(/###myPlugin,插件myPlugin的所在目录)
    • /###{plugin name}/Game - 插件目录下的 contents 目录
    • /###{plugin name}/Script - 插件目录下的 source 目录
    • 类路径
      • /Script/actor/custom-actor.ts#?class=ACustomActor
  • 加载资源


    import { FContext, FLoader } from '@richlox/core';

    /**
     * 加载器
     * RLTexture            贴图
     * RLSpriteMaterial     材质
     * RLStandardMaterial   材质
     * RLGeometry           几何体
     * RLStaticMesh         静态网格
     * RLSkeletonMesh       骨骼网格
     * RLAnimationAsset     动画
     * RLAudio              音频
     * RLClass              类
     */
    const loader = FContext.get(FLoader);
    /**
     * 加载贴图
     * 加载 contents/textures 目录下的 myTexture.rltex
     */
    const texture = await loader.loadObject<RLTexture>('/Game/textures/myTexture.tex.rltex');
    /**
     * 加载材质
     * 加载 contents/materials 目录下的 myMaterial.rlmat
     */
    const material = await loader.loadObject<RLMaterial>('/Game/materials/myMaterial.mat.rlmat');
    /**
     * 加载类
     * 加载 source/actor/custom-actor.ts 里导出的 ACustomActor
     */
    const customActorClass = await loader.loadObject<RLClass<AActor>>('/Script/actor/custom-actor.ts#?class=ACustomActor');
    /**
     * 动态生成 actor
     */
    const customActor = await GWorld.spawnActor(customActorClass.ctor);