Files
esengine/source/src/ECS/Components/TiledMapMover.ts
2020-11-20 14:07:34 +08:00

131 lines
5.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// module es {
// /**
// * 用来存放来自移动调用的所有冲突信息
// */
// export class CollisionState {
// public right: boolean;
// public left: boolean;
// public above: boolean;
// public below: boolean;
// public becameGroundedThisFrame: boolean;
// public wasGroundedLastFrame: boolean;
// public isGroundedOnOnewayPlatform: boolean;
// public slopAngle: number;
// public get hasCollision(): boolean {
// return this.below || this.right || this.left || this.above;
// }
// public _movementRemainderX: SubpixelNumber;
// public _movementRemainderY: SubpixelNumber;
// public reset() {
// this.becameGroundedThisFrame = this.isGroundedOnOnewayPlatform = this.right = this.left = this.above = this.below = false;
// this.slopAngle = 0;
// }
// public toString() {
// return `[CollisionState] r: ${this.right}, l: ${this.left}, a: ${this.above}, b: ${this.below}, angle: ${this.slopAngle}, wasGroundedLastFrame: ${this.wasGroundedLastFrame}, becameGroundedThisFrame: ${this.becameGroundedThisFrame}`;
// }
// }
// /**
// * TiledMapMover是在基于重力的平铺地图中移动对象的助手。
// * 它要求它所在的实体有一个BoxCollider。BoxCollider将与colliderHorizontal/VerticalInset用于所有碰撞检测。
// *
// * 一种方法是通过将你的Transform向下移动1个像素并调用CollisionState.clearLastGroundTile来跳过平台。
// */
// export class TiledMapMover extends Component {
// /**
// * 在垂直移动时BoxCollider将根据水平面上的嵌入缩小
// */
// public colliderHorizontalInset = 2;
// /**
// * 垂直平面上的嵌入在水平移动时BoxCollider将根据该嵌入缩小
// */
// public colliderVerticalInset = 6;
// /**
// * 临时存储
// */
// public _boxColliderBounds: Rectangle;
// constructor() {
// super();
// }
// /**
// * 测试碰撞,然后移动实体
// * @param motion
// * @param boxColliderBounds
// * @param collisionState
// */
// public testCollisions(motion: Vector2, boxColliderBounds: Rectangle, collisionState: CollisionState) {
// this._boxColliderBounds = boxColliderBounds;
// // 保存我们当前的接地状态我们将用于wasGroundedLastFrame和becameGroundedThisFrame
// collisionState.wasGroundedLastFrame = collisionState.below;
// // 重置碰撞状态
// collisionState.reset();
// // 获取圆角值用于我们的实际检测
// let motionX = motion.x;
// let motionY = motion.y;
// // 首先,检查水平方向中的移动
// if (motionX != 0){
// let direction = motionX > 0 ? Edge.right : Edge.left;
// let sweptBounds = this.collisionRectForSide(direction, motionX);
// let collisionResponse: number = 0;
// if (this.testMapCollision(sweptBounds, direction, collisionState, collisionResponse)){
// motion.x = collisionResponse - RectangleExt.getSide(boxColliderBounds, direction);
// collisionState.left = direction == Edge.left;
// collisionState.right = direction == Edge.right;
// collisionState._movementRemainderX.reset();
// }else{
// collisionState.left = false;
// collisionState.right = false;
// }
// }
// }
// public testMapCollision(collisionRect: Rectangle, direction: Edge, collisionState: CollisionState, collisionResponse: number){
// let side = EdgeExt.oppositeEdge(direction);
// let perpindicularPosition = EdgeExt.isVertical(side) ? collisionRect.center.x : collisionRect.center.y;
// let leadingPosition = RectangleExt.getSide(collisionRect, direction);
// let shouldTestSlopes = EdgeExt.isVertical(side);
// }
// /**
// * 获取展开以考虑运动的给定边的碰撞矩形
// * @param side
// * @param motion
// */
// public collisionRectForSide(side: Edge, motion: number){
// let bounds: Rectangle;
// // 对于水平碰撞检查我们只使用一个条块作为边界。Vertical得到矩形的一半就可以正确地向上推
// // 当相交的斜率,忽略以进行水平移动。
// if (EdgeExt.isHorizontal(side)){
// bounds = RectangleExt.getRectEdgePortion(this._boxColliderBounds, side);
// }else {
// bounds = RectangleExt.getHalfRect(this._boxColliderBounds, side);
// }
// // 我们水平收缩用于垂直移动,垂直收缩用于水平移动
// if (EdgeExt.isVertical(side)){
// RectangleExt.contract(bounds, this.colliderHorizontalInset, 0);
// }else {
// RectangleExt.contract(bounds, 0, this.colliderVerticalInset);
// }
// // 最后在移动方向上扩展边
// RectangleExt.expandSide(bounds, side, motion);
// return bounds;
// }
// }
// }