common-game
Advanced tools
Comparing version 0.0.46 to 0.0.47
{ | ||
"name": "common-game", | ||
"version": "0.0.46", | ||
"version": "0.0.47", | ||
"description": "", | ||
@@ -5,0 +5,0 @@ "main": "common-game.js", |
@@ -115,2 +115,30 @@ import * as PIXI from "@tbminiapp/pixi-miniprogram-engine"; | ||
} | ||
lineSprite(ops) { | ||
let line = new PIXI.Graphics(); | ||
line.lineStyle(ops.lineW || 4, ops.color || 0xFFFFFF, ops.alpha || 0); | ||
ops.points.forEach((point, idx) => { | ||
if (idx == 0) { | ||
line.moveTo(point.x, point.y); | ||
} else { | ||
line.lineTo(point.x, point.y); | ||
} | ||
}) | ||
line.lineTo(ops.points[0].x, ops.points[0].y); | ||
line.endFill(); | ||
return line; | ||
} | ||
polygonSprite(ops) { | ||
let polygon = new PIXI.Graphics(); | ||
polygon.lineStyle(ops.lineW || 4, ops.color || 0xFFFFFF, ops.alpha || 0);//边框 | ||
// 填充 | ||
if (ops.bgColor) { | ||
polygon.beginFill(ops.bgColor || 0x3500FA, ops.bgAlpha || 0); | ||
} | ||
polygon.drawPolygon(ops.points); | ||
polygon.endFill(); | ||
return polygon; | ||
} | ||
// 全局点击事件 | ||
@@ -117,0 +145,0 @@ bindFullEvent(callback) { |
66
utils.js
@@ -153,3 +153,69 @@ import Quadtree from './libs/quadtree';//四叉树 | ||
return arr.sort(() => Math.random() - 0.5); | ||
}, | ||
dotV2: function (v1, v2) {//两个向量的点积 | ||
return v1.x * v2.x + v1.y * v2.y; | ||
}, | ||
calcProj: function (axis, polyArr) {//计算polyArr在轴线axis上的投影,polyArr是一系列点坐标的集合,数组表示 | ||
var v = { | ||
"x": polyArr[0].x, | ||
"y": polyArr[0].y | ||
}; | ||
var d, min, max; | ||
min = max = this.dotV2(axis, v); //计算投影轴与第一个坐标点的点积 | ||
for (var i = 1; i < polyArr.length; i++) { | ||
v.x = polyArr[i].x; | ||
v.y = polyArr[i].y; | ||
d = this.dotV2(axis, v); //计算v到投影轴的距离,遍历出最小和最大区间 | ||
min = (d < min) ? d : min; | ||
max = (d > max) ? d : max; | ||
} | ||
return [min, max]; | ||
}, | ||
segDist: function (min1, max1, min2, max2) {//计算同一个轴上线段的距离s1(min1,max1),s2(min2,max2),如果距离小于0则表示两线段有相交; | ||
if (min1 < min2) { | ||
return min2 - max1; | ||
} else { | ||
return min1 - max2; | ||
} | ||
}, | ||
//判断两个多边形是否相交碰撞,p1,p2用于保存多边形点的数组 | ||
isCollide: function (p1, p2) { | ||
//定义法向量 | ||
var e = { | ||
"x": 0, | ||
"y": 0 | ||
}; | ||
var p = p1, | ||
idx = 0, | ||
len1 = p1.length, | ||
len2 = p2.length, | ||
px, py; //p缓存形状p1的数据 | ||
for (var i = 0, len = len1 + len2; i < len - 2; i++) //遍历所有坐标点,i+=2代表xy轴两个坐标点 | ||
{ | ||
idx = i; | ||
//计算两个多边形每条边 | ||
if (i >= len1) { //当p1遍历完毕后,p缓存形状p2的数据,从新遍历 | ||
p = p2; | ||
idx = (i - len1); //len2 | ||
} | ||
if (i === p.length - 1) { //p包含的点数据组成的最后一个坐标点 | ||
px = p[0].x - p[idx].x; //首尾的x轴相连 | ||
py = p[0].y - p[idx].y; //首尾的y轴相连 | ||
} else { | ||
px = p[idx + 1].x - p[idx].x; //递增的x轴相连 | ||
py = p[idx + 1].y - p[idx].y; //递减的y轴相连 | ||
} | ||
//得到边的法向量【垂直相交】,即投影轴 | ||
e.x = -py; | ||
e.y = px; | ||
//计算两个多边形在法向量上的投影 | ||
var pp1 = this.calcProj(e, p1); //涵盖到投影轴的最小值与最大值 | ||
var pp2 = this.calcProj(e, p2); | ||
//计算两个线段在法向量上距离,如果大于0则可以退出,表示无相交 | ||
if (this.segDist(pp1[0], pp1[1], pp2[0], pp2[1]) > 0) { | ||
return false; | ||
} | ||
} | ||
return true; | ||
} | ||
}) |
1948903
35203