2020-06-15 10:42:06 +08:00
|
|
|
|
///<reference path="./Collider.ts" />
|
2020-07-23 09:10:27 +08:00
|
|
|
|
module es {
|
|
|
|
|
|
export class BoxCollider extends Collider {
|
2020-08-24 09:06:25 +08:00
|
|
|
|
public hollowShape: egret.Shape = new egret.Shape();
|
|
|
|
|
|
public polygonShape: egret.Shape = new egret.Shape();
|
|
|
|
|
|
public pixelShape1: egret.Shape = new egret.Shape();
|
|
|
|
|
|
public pixelShape2: egret.Shape = new egret.Shape();
|
2020-07-28 16:25:20 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 零参数构造函数要求RenderableComponent在实体上,这样碰撞器可以在实体被添加到场景时调整自身的大小。
|
|
|
|
|
|
*/
|
2020-08-27 18:48:20 +08:00
|
|
|
|
constructor(x?: number, y?: number, width?: number, height?: number) {
|
2020-07-28 16:25:20 +08:00
|
|
|
|
super();
|
|
|
|
|
|
|
2020-08-27 18:48:20 +08:00
|
|
|
|
if (x == undefined && y == undefined){
|
|
|
|
|
|
if (width == undefined && height == undefined){
|
|
|
|
|
|
// 我们在这里插入一个1x1框作为占位符,直到碰撞器在下一阵被添加到实体并可以获得更精确的自动调整大小数据
|
|
|
|
|
|
this.shape = new Box(1, 1);
|
|
|
|
|
|
this._colliderRequiresAutoSizing = true;
|
|
|
|
|
|
}else if (width != undefined && height != undefined){
|
|
|
|
|
|
x = -width / 2;
|
|
|
|
|
|
y = -height / 2;
|
|
|
|
|
|
this._localOffset = new Vector2(x + width / 2, y + height / 2);
|
|
|
|
|
|
this.shape = new Box(width, height);
|
|
|
|
|
|
}
|
|
|
|
|
|
}else if (x != undefined && y != undefined && width != undefined && height != undefined){
|
|
|
|
|
|
this._localOffset = new Vector2(x + width / 2, y + height / 2);
|
|
|
|
|
|
this.shape = new Box(width, height);
|
|
|
|
|
|
}
|
2020-07-28 16:25:20 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public get width() {
|
2020-07-23 09:10:27 +08:00
|
|
|
|
return (this.shape as Box).width;
|
|
|
|
|
|
}
|
2020-06-15 10:42:06 +08:00
|
|
|
|
|
2020-07-28 16:25:20 +08:00
|
|
|
|
public set width(value: number) {
|
2020-07-23 09:10:27 +08:00
|
|
|
|
this.setWidth(value);
|
|
|
|
|
|
}
|
2020-06-15 10:42:06 +08:00
|
|
|
|
|
2020-07-28 16:25:20 +08:00
|
|
|
|
public get height() {
|
2020-07-23 09:10:27 +08:00
|
|
|
|
return (this.shape as Box).height;
|
2020-06-15 10:42:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2020-07-28 16:25:20 +08:00
|
|
|
|
public set height(value: number) {
|
2020-07-23 09:10:27 +08:00
|
|
|
|
this.setHeight(value);
|
|
|
|
|
|
}
|
2020-06-15 20:08:21 +08:00
|
|
|
|
|
2020-07-23 09:10:27 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 设置BoxCollider的大小
|
|
|
|
|
|
* @param width
|
|
|
|
|
|
* @param height
|
|
|
|
|
|
*/
|
2020-07-28 16:25:20 +08:00
|
|
|
|
public setSize(width: number, height: number) {
|
2020-07-23 09:10:27 +08:00
|
|
|
|
this._colliderRequiresAutoSizing = false;
|
|
|
|
|
|
let box = this.shape as Box;
|
2020-07-28 16:25:20 +08:00
|
|
|
|
if (width != box.width || height != box.height) {
|
2020-07-23 09:10:27 +08:00
|
|
|
|
// 更新框,改变边界,如果我们需要更新物理系统中的边界
|
|
|
|
|
|
box.updateBox(width, height);
|
|
|
|
|
|
if (this.entity && this._isParentEntityAddedToScene)
|
|
|
|
|
|
Physics.updateCollider(this);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return this;
|
2020-06-15 20:08:21 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2020-07-23 09:10:27 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 设置BoxCollider的宽度
|
|
|
|
|
|
* @param width
|
|
|
|
|
|
*/
|
2020-07-28 16:25:20 +08:00
|
|
|
|
public setWidth(width: number): BoxCollider {
|
2020-07-23 09:10:27 +08:00
|
|
|
|
this._colliderRequiresAutoSizing = false;
|
|
|
|
|
|
let box = this.shape as Box;
|
2020-07-28 16:25:20 +08:00
|
|
|
|
if (width != box.width) {
|
2020-07-23 09:10:27 +08:00
|
|
|
|
// 更新框,改变边界,如果我们需要更新物理系统中的边界
|
|
|
|
|
|
box.updateBox(width, box.height);
|
|
|
|
|
|
if (this.entity && this._isParentEntityAddedToScene)
|
|
|
|
|
|
Physics.updateCollider(this);
|
|
|
|
|
|
}
|
2020-06-15 20:08:21 +08:00
|
|
|
|
|
2020-07-23 09:10:27 +08:00
|
|
|
|
return this;
|
|
|
|
|
|
}
|
2020-06-16 11:22:37 +08:00
|
|
|
|
|
2020-07-23 09:10:27 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 设置BoxCollider的高度
|
|
|
|
|
|
* @param height
|
|
|
|
|
|
*/
|
2020-07-28 16:25:20 +08:00
|
|
|
|
public setHeight(height: number) {
|
2020-07-23 09:10:27 +08:00
|
|
|
|
this._colliderRequiresAutoSizing = false;
|
|
|
|
|
|
let box = this.shape as Box;
|
2020-07-28 16:25:20 +08:00
|
|
|
|
if (height != box.height) {
|
2020-07-23 09:10:27 +08:00
|
|
|
|
// 更新框,改变边界,如果我们需要更新物理系统中的边界
|
|
|
|
|
|
box.updateBox(box.width, height);
|
|
|
|
|
|
if (this.entity && this._isParentEntityAddedToScene)
|
|
|
|
|
|
Physics.updateCollider(this);
|
|
|
|
|
|
}
|
2020-06-16 11:22:37 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2020-08-28 18:04:50 +08:00
|
|
|
|
public debugRender(camera: Camera) {
|
2020-08-25 14:21:37 +08:00
|
|
|
|
let poly = this.shape as Polygon;
|
2020-08-24 09:06:25 +08:00
|
|
|
|
if (!this.hollowShape.parent)
|
|
|
|
|
|
this.debugDisplayObject.addChild(this.hollowShape);
|
|
|
|
|
|
|
|
|
|
|
|
if (!this.polygonShape.parent)
|
|
|
|
|
|
this.debugDisplayObject.addChild(this.polygonShape);
|
|
|
|
|
|
|
|
|
|
|
|
if (!this.pixelShape1.parent)
|
|
|
|
|
|
this.debugDisplayObject.addChild(this.pixelShape1);
|
|
|
|
|
|
|
|
|
|
|
|
if (!this.pixelShape2.parent)
|
|
|
|
|
|
this.debugDisplayObject.addChild(this.pixelShape2);
|
|
|
|
|
|
|
2020-08-27 18:48:20 +08:00
|
|
|
|
this.hollowShape.graphics.clear();
|
|
|
|
|
|
this.hollowShape.graphics.beginFill(Colors.colliderBounds, 0);
|
|
|
|
|
|
this.hollowShape.graphics.lineStyle(Size.lineSizeMultiplier, Colors.colliderBounds);
|
2020-08-28 18:04:50 +08:00
|
|
|
|
this.hollowShape.graphics.drawRect(this.bounds.x - camera.bounds.x, this.bounds.y - camera.bounds.y, this.bounds.width, this.bounds.height);
|
2020-08-27 18:48:20 +08:00
|
|
|
|
this.hollowShape.graphics.endFill();
|
2020-08-25 14:21:37 +08:00
|
|
|
|
|
|
|
|
|
|
this.polygonShape.graphics.clear();
|
|
|
|
|
|
if (poly.points.length >= 2){
|
|
|
|
|
|
this.polygonShape.graphics.beginFill(Colors.colliderEdge, 0);
|
|
|
|
|
|
this.polygonShape.graphics.lineStyle(Size.lineSizeMultiplier, Colors.colliderEdge);
|
2020-08-26 19:56:48 +08:00
|
|
|
|
for (let i = 0; i < poly.points.length; i ++){
|
|
|
|
|
|
if (i == 0){
|
2020-08-28 18:04:50 +08:00
|
|
|
|
this.polygonShape.graphics.moveTo(poly.position.x + poly.points[i].x - camera.bounds.x, poly.position.y + poly.points[i].y - camera.bounds.y);
|
2020-08-25 16:19:56 +08:00
|
|
|
|
}else{
|
2020-08-28 18:04:50 +08:00
|
|
|
|
this.polygonShape.graphics.lineTo(poly.position.x + poly.points[i].x - camera.bounds.x, poly.position.y + poly.points[i].y - camera.bounds.y);
|
2020-08-25 16:19:56 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-08-28 18:04:50 +08:00
|
|
|
|
this.polygonShape.graphics.lineTo(poly.position.x + poly.points[poly.points.length - 1].x - camera.bounds.x, poly.position.y + poly.points[0].y - camera.bounds.y);
|
2020-08-25 14:21:37 +08:00
|
|
|
|
this.polygonShape.graphics.endFill();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
this.pixelShape1.graphics.clear();
|
|
|
|
|
|
this.pixelShape1.graphics.beginFill(Colors.colliderPosition, 0);
|
|
|
|
|
|
this.pixelShape1.graphics.lineStyle(4 * Size.lineSizeMultiplier, Colors.colliderPosition);
|
2020-08-28 18:04:50 +08:00
|
|
|
|
this.pixelShape1.graphics.moveTo(this.entity.transform.position.x - camera.bounds.x, this.entity.transform.position.y - camera.bounds.y);
|
|
|
|
|
|
this.pixelShape1.graphics.lineTo(this.entity.transform.position.x - camera.bounds.x, this.entity.transform.position.y - camera.bounds.y);
|
2020-08-25 14:21:37 +08:00
|
|
|
|
this.pixelShape1.graphics.endFill();
|
|
|
|
|
|
|
|
|
|
|
|
this.pixelShape2.graphics.clear();
|
|
|
|
|
|
this.pixelShape2.graphics.beginFill(Colors.colliderCenter, 0);
|
|
|
|
|
|
this.pixelShape2.graphics.lineStyle(2 * Size.lineSizeMultiplier, Colors.colliderCenter);
|
2020-08-28 18:04:50 +08:00
|
|
|
|
this.pixelShape2.graphics.moveTo(this.entity.transform.position.x + this.shape.center.x - camera.bounds.x,
|
|
|
|
|
|
this.entity.transform.position.y + this.shape.center.y - camera.bounds.y);
|
|
|
|
|
|
this.pixelShape2.graphics.lineTo(this.entity.transform.position.x + this.shape.center.x - camera.bounds.x,
|
|
|
|
|
|
this.entity.transform.position.y + this.shape.center.y - camera.bounds.y);
|
2020-08-25 14:21:37 +08:00
|
|
|
|
this.pixelShape2.graphics.endFill();
|
2020-08-24 09:06:25 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2020-07-28 16:25:20 +08:00
|
|
|
|
public toString() {
|
2020-07-23 09:10:27 +08:00
|
|
|
|
return `[BoxCollider: bounds: ${this.bounds}]`;
|
|
|
|
|
|
}
|
2020-06-16 11:22:37 +08:00
|
|
|
|
}
|
2020-07-23 09:10:27 +08:00
|
|
|
|
}
|