laya3实现俯视角45度游戏抛射炮弹、箭矢抛物线轨迹

laya3实现俯视角45度游戏抛射炮弹、箭矢抛物线轨迹_第1张图片

const { regClass, property } = Laya;
import Sprite = Laya.Sprite;
import Event = Laya.Event;

@regClass()
export class ShellTestScript extends Laya.Script {
    @property({ type: Number, caption: "水平移动速度", default: 0.2 })
    public moveSpeed: number = 0.2;

    @property({ type: Number, caption: "重力加速度", default: 0.0001 })
    public g: number = 0.0001;

    @property({ type: Boolean, caption: "是否固定加速度, true将保持g不变计算初速度,false则根据初速度反向计算加速度", default: false })
    public isFixG: boolean = false;

    @property({ type: Number, caption: "竖直方向初速度, 保证初速度不变可使得弧线高度不变", default: 1 })
    public v0: number = 1;

    createShell(): Sprite {
        let spr = new Sprite();
        spr.graphics.drawCircle(0, 0, 20, "#eeeeee", "#dddddd", 2);
        return spr;
    }

    //鼠标点击后执行。与交互相关的还有onMouseDown等十多个函数,具体请参阅文档。
    onMouseClick(e: Event): void {
        let shell = this.createShell();
        this.owner.addChild(shell);
        shell.pos(Laya.stage.width * .5, Laya.stage.height * .5);

        let dir = new Laya.Point(e.stageX - shell.x, e.stageY - shell.y);
        // 移动到目标点的时间, 毫秒
        let time = dir.distance(0, 0) / this.moveSpeed;

        if (this.isFixG) {
            // 根据重力加速度计算出初始垂直向上的速度, 米/秒
            this.v0 = this.g * time * .5;
        } else {
            // 根据初速度计算出加速度
            this.g = this.v0 * 2 / time;
        }

        dir.normalize();

        Laya.timer.frameLoop(1, shell, this.onLoop, [shell, dir, new Laya.Point(0, -1), {
            v0: this.v0
        }, this.moveSpeed, this.g]);
        Laya.timer.once(time, shell, shell.destroy);
    }

    private onLoop(shell: Sprite, dir: { x: number, y: number }, normalDir: { x: number, y: number }, obj: { v0: number }, moveSpeed: number, g: number): void {
        let delta = Laya.timer.delta;
        let deltaX = (dir.x * moveSpeed + obj.v0 * normalDir.x) * delta;
        let deltaY = (dir.y * moveSpeed + obj.v0 * normalDir.y) * delta;

        shell.x += deltaX;
        shell.y += deltaY;

        obj.v0 -= g * delta;
    }
}

你可能感兴趣的:(游戏,layabox)