mirror of
https://github.com/photonstorm/phaser
synced 2024-11-30 08:31:01 +00:00
163 lines
No EOL
4 KiB
JavaScript
163 lines
No EOL
4 KiB
JavaScript
|
|
var game = new Phaser.Game(800, 600, Phaser.CANVAS, 'phaser-example', { preload: preload, create: create, update: update, render: render });
|
|
|
|
function preload() {
|
|
|
|
game.load.spritesheet('balls', 'assets/sprites/balls.png', 17, 17);
|
|
|
|
}
|
|
|
|
var handle1;
|
|
var handle2;
|
|
|
|
var line;
|
|
var polygon;
|
|
|
|
function create() {
|
|
|
|
game.stage.backgroundColor = '#124184';
|
|
|
|
handle1 = game.add.sprite(100, 150, 'balls', 0);
|
|
handle1.inputEnabled = true;
|
|
handle1.input.enableDrag(true);
|
|
|
|
handle2 = game.add.sprite(400, 200, 'balls', 0);
|
|
handle2.inputEnabled = true;
|
|
handle2.input.enableDrag(true);
|
|
|
|
line = new Phaser.Line(handle1.x, handle1.y, handle2.x, handle2.y);
|
|
|
|
polygon = new SAT.Polygon(new SAT.Vector(300, 300), [new SAT.Vector(0, 50), new SAT.Vector(100, 50), new SAT.Vector(100, 0), new SAT.Vector(150, 0), new SAT.Vector(150, 150), new SAT.Vector(100, 150), new SAT.Vector(100, 100), new SAT.Vector(0, 100), new SAT.Vector(0, 50)]);
|
|
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------
|
|
Returns an Object with the following properties:
|
|
intersects -Boolean indicating if an intersection exists.
|
|
start_inside -Boolean indicating if Point A is inside of the polygon.
|
|
end_inside -Boolean indicating if Point B is inside of the polygon.
|
|
intersections -Array of intersection Points along the polygon.
|
|
centroid -A Point indicating "center of mass" of the polygon.
|
|
|
|
"pArry" is an Array of Points.
|
|
----------------------------------------------------------------------------*/
|
|
|
|
function lineIntersectPoly(A, B, polygon) {
|
|
|
|
var An =1;
|
|
var Bn =1;
|
|
var C = {x: 0, y: 0};
|
|
var D = {x: 0, y: 0};
|
|
var i = {x: 0, y: 0};
|
|
var cx=0;
|
|
var cy=0;
|
|
var result = {};
|
|
|
|
var pa = [];
|
|
|
|
for (var pi = 0; pi < polygon.points.length; pi++)
|
|
{
|
|
pa.push({ x: polygon.points[pi].x + polygon.pos.x, y: polygon.points[pi].y + polygon.pos.y })
|
|
}
|
|
|
|
pa.push(pa[0]); //Create line from last Point to beginning Point
|
|
|
|
result.intersects = false;
|
|
result.intersections=[];
|
|
result.start_inside=false;
|
|
result.end_inside=false;
|
|
|
|
var n = pa.length-1;
|
|
|
|
while(n > -1){
|
|
|
|
C.x = pa[n].x;
|
|
C.y = pa[n].y;
|
|
|
|
if(n > 0){
|
|
|
|
cx+=C.x;
|
|
cy+=C.y;
|
|
|
|
D.x = pa[n-1].x || pa[0].x;
|
|
D.y = pa[n-1].y || pa[0].y;
|
|
|
|
i=Phaser.Line.intersectsPoints(A,B,C,D);
|
|
|
|
if(i != null){
|
|
result.intersections.push(i);
|
|
}
|
|
if(Phaser.Line.intersectsPoints(A,new Phaser.Point(C.x+D.x,A.y),C,D) != null){
|
|
An++;
|
|
}
|
|
if(Phaser.Line.intersectsPoints(B,new Phaser.Point(C.x+D.x,B.y),C,D) != null){
|
|
Bn++;
|
|
}
|
|
}
|
|
n--;
|
|
}
|
|
if(An % 2 == 0){
|
|
result.start_inside=true;
|
|
}
|
|
if(Bn % 2 == 0){
|
|
result.end_inside=true;
|
|
}
|
|
result.centroid=new Phaser.Point(cx/(pa.length-1),cy/(pa.length-1));
|
|
result.intersects = result.intersections.length > 0;
|
|
return result;
|
|
}
|
|
|
|
var c = 'rgb(255,255,255)';
|
|
var p = new Phaser.Point();
|
|
var result = {};
|
|
|
|
function update() {
|
|
|
|
line.fromSprite(handle1, handle2, true);
|
|
|
|
result = lineIntersectPoly(line.start, line.end, polygon);
|
|
|
|
handle1.frame = 0;
|
|
handle2.frame = 0;
|
|
|
|
if (result.intersects)
|
|
{
|
|
c = 'rgb(0,255,0)';
|
|
|
|
if (result.start_inside)
|
|
{
|
|
handle1.frame = 1;
|
|
}
|
|
|
|
if (result.end_inside)
|
|
{
|
|
handle2.frame = 1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
c = 'rgb(255,255,255)';
|
|
}
|
|
|
|
}
|
|
|
|
function render() {
|
|
|
|
game.debug.renderLine(line, c);
|
|
game.debug.renderLineInfo(line, 32, 32);
|
|
|
|
game.debug.renderPolygon(polygon);
|
|
|
|
if (result.intersects)
|
|
{
|
|
game.debug.renderText(result.intersects, 32, 100);
|
|
|
|
game.context.fillStyle = 'rgb(255,0,255)';
|
|
|
|
for (var i = 0; i < result.intersections.length; i++)
|
|
{
|
|
game.context.fillRect(result.intersections[i].x - 2, result.intersections[i].y - 2, 5, 5);
|
|
}
|
|
}
|
|
|
|
} |