flamingo-ui
Version:
火烈鸟UI组件库
234 lines (233 loc) • 6.12 kB
JavaScript
import "./PinBall-sfc.css";
import { onMounted, onBeforeUnmount, reactive, ref, inject } from "vue";
import Matter from "matter-js";
const __vue_sfc__ = {
__name: "PinBall",
props: {
// 自定义:传入的字符串
customWidth: {
type: Number,
default: 375
}
},
emits: ["updateStrength"],
setup(__props, { expose, emit }) {
const props = __props;
const engineNow = ref(null);
onMounted(() => {
set();
const Engine = Matter.Engine;
const Render = Matter.Render;
const Bodies = Matter.Bodies;
const Composite = Matter.Composite;
const Runner = Matter.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
}
});
Matter.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);
});
onBeforeUnmount(() => {
clearInterval(time.value);
});
const gan = ref(null);
const tag = ref(3);
const time = ref(null);
const boxA = ref(null);
const strength = ref(0);
const createAll = () => {
let stack = Matter.Composites.stack(30, 200, 6, 3, 30, 100, function(x, y) {
return Matter.Bodies.circle(x, y, 5, {
isStatic: true,
slop: 0,
//粘性
restitution: 0.2,
// 设置弹力
render: {
fillStyle: "orange"
}
});
});
let dian = Matter.Bodies.circle(300, 320, 6, {
isStatic: true,
render: {
fillStyle: "white"
},
collisionFilter: {
group: -1
}
});
let dianB = Matter.Bodies.circle(340, 330, 1, {
isStatic: true,
render: {
fillStyle: "white",
visible: false
}
});
boxA.value = Matter.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 = Matter.Bodies.rectangle(328, 320, 100, 20, {
isSleeping: true,
id: 1,
mass: 9,
render: {
fillStyle: "orange"
},
collisionFilter: {
group: -1
}
});
let ban = Matter.Bodies.rectangle(270, 550 - 400 / 2, 2, 400, {
isStatic: true,
slop: 0,
render: {
fillStyle: "red"
}
});
let banB = Matter.Bodies.rectangle(-1, 550 / 2, 1, 550, {
isStatic: true,
slop: 0,
render: {
fillStyle: "red"
}
});
let banC = Matter.Bodies.rectangle(375 / 2, -1, 375, 1, {
isStatic: true,
render: {
fillStyle: "red"
}
});
let rotateConstraint = Matter.Constraint.create({
bodyA: dian,
bodyB: gan.value,
length: 0,
pointB: {
x: -30,
y: 0
},
render: {
visible: false
}
});
let ground = Matter.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;
Matter.Body.applyForce(gan.value, gan.value.position, {
x: 0,
y: -0.2 * (strength.value / 100) - 0.33
});
};
const reset = () => {
Matter.Composite.clear(engineNow.value.world, false);
Matter.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, onBeforeUnmount, reactive, ref, inject, get Matter() {
return Matter;
} };
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
return __returned__;
}
};
import { openBlock as _openBlock, createElementBlock as _createElementBlock } from "vue";
const _hoisted_1 = {
class: "fmg-pin-ball",
id: "container"
};
function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
return _openBlock(), _createElementBlock("div", _hoisted_1);
}
__vue_sfc__.render = __vue_render__;
var stdin_default = __vue_sfc__;
export {
stdin_default as default
};