UNPKG

flamingo-ui

Version:

火烈鸟UI组件库

263 lines (262 loc) 8.19 kB
var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var stdin_exports = {}; __export(stdin_exports, { default: () => stdin_default }); module.exports = __toCommonJS(stdin_exports); var import_PinBall_sfc = require("./PinBall-sfc.css"); var import_vue = require("vue"); var import_matter_js = __toESM(require("matter-js")); var import_vue2 = require("vue"); const __vue_sfc__ = { __name: "PinBall", props: { // 自定义:传入的字符串 customWidth: { type: Number, default: 375 } }, emits: ["updateStrength"], setup(__props, { expose, emit }) { const props = __props; const engineNow = (0, import_vue.ref)(null); (0, import_vue.onMounted)(() => { set(); const Engine = import_matter_js.default.Engine; const Render = import_matter_js.default.Render; const Bodies = import_matter_js.default.Bodies; const Composite = import_matter_js.default.Composite; const Runner = import_matter_js.default.Runner; let engine = Engine.create(); engineNow.value = engine; engine.world.gravity.y = 1.2; let render = Render.create({ element: document.getElementById("container"), // 绑定页面元素 engine, // 绑定引擎 options: { pixelRatio: 1, // 设置像素比 这个关系到性能 auto: true, background: "black", width: props.customWidth, height: 550 * (props.customWidth / 375), wireframes: false, showDebug: false, hasBounds: true } }); Render.lookAt(render, { min: { x: 0, y: 0 }, max: { x: 375, y: 550 } }); import_matter_js.default.Events.on(engine, "collisionStart", function(event) { const pairs = event.pairs; pairs.forEach((pair) => { if (pair.bodyB.id == 3) { console.log( `${(pair.bodyA.position.x / document.body.clientWidth).toFixed(2) * 100}%` ); } }); }); Composite.add(engine.world, createAll()); Render.run(render); var runner = Runner.create(); Runner.run(runner, engine); }); (0, import_vue.onBeforeUnmount)(() => { clearInterval(time.value); }); const gan = (0, import_vue.ref)(null); const tag = (0, import_vue.ref)(3); const time = (0, import_vue.ref)(null); const boxA = (0, import_vue.ref)(null); const strength = (0, import_vue.ref)(0); const createAll = () => { let stack = import_matter_js.default.Composites.stack(30, 200, 6, 3, 30, 100, function(x, y) { return import_matter_js.default.Bodies.circle(x, y, 5, { isStatic: true, slop: 0, //粘性 restitution: 0.2, // 设置弹力 render: { fillStyle: "orange" } }); }); let dian = import_matter_js.default.Bodies.circle(300, 320, 6, { isStatic: true, render: { fillStyle: "white" }, collisionFilter: { group: -1 } }); let dianB = import_matter_js.default.Bodies.circle(340, 330, 1, { isStatic: true, render: { fillStyle: "white", visible: false } }); boxA.value = import_matter_js.default.Bodies.circle(375 - 20, 298, 10, { isSleeping: true, id: 2, density: 0.8, // 密度 friction: 0.1, frictionAir: 1e-3, frictionStatic: 0.1, restitution: 0.4, // 设置弹力 mass: 1, slop: 0, render: { fillStyle: "white" } }); gan.value = import_matter_js.default.Bodies.rectangle(328, 320, 100, 20, { isSleeping: true, id: 1, mass: 9, render: { fillStyle: "orange" }, collisionFilter: { group: -1 } }); let ban = import_matter_js.default.Bodies.rectangle(270, 550 - 400 / 2, 2, 400, { isStatic: true, slop: 0, render: { fillStyle: "red" } }); let banB = import_matter_js.default.Bodies.rectangle(-1, 550 / 2, 1, 550, { isStatic: true, slop: 0, render: { fillStyle: "red" } }); let banC = import_matter_js.default.Bodies.rectangle(375 / 2, -1, 375, 1, { isStatic: true, render: { fillStyle: "red" } }); let rotateConstraint = import_matter_js.default.Constraint.create({ bodyA: dian, bodyB: gan.value, length: 0, pointB: { x: -30, y: 0 }, render: { visible: false } }); let ground = import_matter_js.default.Bodies.rectangle(375 / 2, 550 - 10 / 2, 375, 10, { isStatic: true, id: 3, render: { fillStyle: "orange" } }); return [ ban, banB, boxA.value, gan.value, dianB, rotateConstraint, stack, dian, ground, banC ]; }; const set = () => { time.value = setInterval(() => { if (strength.value > 100) tag.value = -3; if (strength.value < 0) tag.value = 3; emit("updateStrength", strength.value += tag.value); }, 50); }; const tan = () => { clearInterval(time.value); boxA.value.isSleeping = false; import_matter_js.default.Body.applyForce(gan.value, gan.value.position, { x: 0, y: -0.2 * (strength.value / 100) - 0.33 }); }; const reset = () => { import_matter_js.default.Composite.clear(engineNow.value.world, false); import_matter_js.default.Composite.add(engineNow.value.world, createAll()); clearInterval(time.value); strength.value = 0; emit("updateStrength", 0); set(); }; expose({ reset, tan }); const __returned__ = { props, emit, engineNow, gan, tag, time, boxA, strength, createAll, set, tan, reset, onMounted: import_vue.onMounted, onBeforeUnmount: import_vue.onBeforeUnmount, reactive: import_vue.reactive, ref: import_vue.ref, inject: import_vue.inject, get Matter() { return import_matter_js.default; } }; Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true }); return __returned__; } }; const _hoisted_1 = { class: "fmg-pin-ball", id: "container" }; function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) { return (0, import_vue2.openBlock)(), (0, import_vue2.createElementBlock)("div", _hoisted_1); } __vue_sfc__.render = __vue_render__; var stdin_default = __vue_sfc__;