Coroutine 类型从IEnumerable为Iterator
This commit is contained in:
+1
-1
@@ -31,7 +31,7 @@
|
|||||||
data-content-width="640"
|
data-content-width="640"
|
||||||
data-content-height="1136"
|
data-content-height="1136"
|
||||||
data-multi-fingered="2"
|
data-multi-fingered="2"
|
||||||
data-show-fps="false" data-show-log="false"
|
data-show-fps="true" data-show-log="false"
|
||||||
data-show-fps-style="x:0,y:0,size:12,textColor:0xffffff,bgAlpha:0.9">
|
data-show-fps-style="x:0,y:0,size:12,textColor:0xffffff,bgAlpha:0.9">
|
||||||
</div>
|
</div>
|
||||||
<script>
|
<script>
|
||||||
|
|||||||
Vendored
+248
-175
@@ -208,7 +208,7 @@ declare module es {
|
|||||||
static registerGlobalManager(manager: es.GlobalManager): void;
|
static registerGlobalManager(manager: es.GlobalManager): void;
|
||||||
static unregisterGlobalManager(manager: es.GlobalManager): void;
|
static unregisterGlobalManager(manager: es.GlobalManager): void;
|
||||||
static getGlobalManager<T extends es.GlobalManager>(type: any): T;
|
static getGlobalManager<T extends es.GlobalManager>(type: any): T;
|
||||||
static startCoroutine(enumerator: IEnumerator): CoroutineImpl;
|
static startCoroutine(enumerator: Iterator<any>): CoroutineImpl;
|
||||||
static schedule(timeInSeconds: number, repeats: boolean, context: any, onTime: (timer: ITimer) => void): Timer;
|
static schedule(timeInSeconds: number, repeats: boolean, context: any, onTime: (timer: ITimer) => void): Timer;
|
||||||
onOrientationChanged(): void;
|
onOrientationChanged(): void;
|
||||||
draw(): Promise<void>;
|
draw(): Promise<void>;
|
||||||
@@ -580,6 +580,137 @@ declare module es {
|
|||||||
abstract reset(): any;
|
abstract reset(): any;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
declare module es {
|
||||||
|
class SceneComponent {
|
||||||
|
scene: Scene;
|
||||||
|
enabled: boolean;
|
||||||
|
updateOrder: number;
|
||||||
|
_enabled: boolean;
|
||||||
|
onEnabled(): void;
|
||||||
|
onDisabled(): void;
|
||||||
|
onRemovedFromScene(): void;
|
||||||
|
update(): void;
|
||||||
|
setEnabled(isEnabled: boolean): SceneComponent;
|
||||||
|
setUpdateOrder(updateOrder: number): this;
|
||||||
|
compareTo(other: SceneComponent): number;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
declare module es {
|
||||||
|
class CollisionState {
|
||||||
|
right: boolean;
|
||||||
|
left: boolean;
|
||||||
|
above: boolean;
|
||||||
|
below: boolean;
|
||||||
|
becameGroundedThisFrame: boolean;
|
||||||
|
wasGroundedLastFrame: boolean;
|
||||||
|
isGroundedOnOnewayPlatform: boolean;
|
||||||
|
slopAngle: number;
|
||||||
|
readonly hasCollision: boolean;
|
||||||
|
_movementRemainderX: SubpixelNumber;
|
||||||
|
_movementRemainderY: SubpixelNumber;
|
||||||
|
reset(): void;
|
||||||
|
toString(): string;
|
||||||
|
}
|
||||||
|
class TiledMapMover extends Component {
|
||||||
|
colliderHorizontalInset: number;
|
||||||
|
colliderVerticalInset: number;
|
||||||
|
_boxColliderBounds: Rectangle;
|
||||||
|
constructor();
|
||||||
|
testCollisions(motion: Vector2, boxColliderBounds: Rectangle, collisionState: CollisionState): void;
|
||||||
|
testMapCollision(collisionRect: Rectangle, direction: Edge, collisionState: CollisionState, collisionResponse: number): void;
|
||||||
|
collisionRectForSide(side: Edge, motion: number): Rectangle;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
declare module es {
|
||||||
|
interface ITriggerListener {
|
||||||
|
onTriggerEnter(other: Collider, local: Collider): any;
|
||||||
|
onTriggerExit(other: Collider, local: Collider): any;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
declare module es {
|
||||||
|
class Mover extends Component {
|
||||||
|
private _triggerHelper;
|
||||||
|
onAddedToEntity(): void;
|
||||||
|
calculateMovement(motion: Vector2, collisionResult: CollisionResult): boolean;
|
||||||
|
applyMovement(motion: Vector2): void;
|
||||||
|
move(motion: Vector2, collisionResult: CollisionResult): boolean;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
declare module es {
|
||||||
|
class ProjectileMover extends Component {
|
||||||
|
private _tempTriggerList;
|
||||||
|
private _collider;
|
||||||
|
onAddedToEntity(): void;
|
||||||
|
move(motion: Vector2): boolean;
|
||||||
|
private notifyTriggerListeners;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
declare module es {
|
||||||
|
abstract class Collider extends Component {
|
||||||
|
shape: Shape;
|
||||||
|
isTrigger: boolean;
|
||||||
|
physicsLayer: Ref<number>;
|
||||||
|
collidesWithLayers: Ref<number>;
|
||||||
|
shouldColliderScaleAndRotateWithTransform: boolean;
|
||||||
|
registeredPhysicsBounds: Rectangle;
|
||||||
|
_localOffsetLength: number;
|
||||||
|
_isPositionDirty: boolean;
|
||||||
|
_isRotationDirty: boolean;
|
||||||
|
protected _colliderRequiresAutoSizing: any;
|
||||||
|
protected _isParentEntityAddedToScene: any;
|
||||||
|
protected _isColliderRegistered: any;
|
||||||
|
readonly absolutePosition: Vector2;
|
||||||
|
readonly rotation: number;
|
||||||
|
readonly bounds: Rectangle;
|
||||||
|
protected _localOffset: Vector2;
|
||||||
|
localOffset: Vector2;
|
||||||
|
setLocalOffset(offset: Vector2): Collider;
|
||||||
|
setShouldColliderScaleAndRotateWithTransform(shouldColliderScaleAndRotationWithTransform: boolean): Collider;
|
||||||
|
onAddedToEntity(): void;
|
||||||
|
onRemovedFromEntity(): void;
|
||||||
|
onEntityTransformChanged(comp: transform.Component): void;
|
||||||
|
onEnabled(): void;
|
||||||
|
onDisabled(): void;
|
||||||
|
registerColliderWithPhysicsSystem(): void;
|
||||||
|
unregisterColliderWithPhysicsSystem(): void;
|
||||||
|
overlaps(other: Collider): boolean;
|
||||||
|
collidesWith(collider: Collider, motion: Vector2, result: CollisionResult): boolean;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
declare module es {
|
||||||
|
class BoxCollider extends Collider {
|
||||||
|
hollowShape: egret.Shape;
|
||||||
|
polygonShape: egret.Shape;
|
||||||
|
pixelShape1: egret.Shape;
|
||||||
|
pixelShape2: egret.Shape;
|
||||||
|
constructor(x?: number, y?: number, width?: number, height?: number);
|
||||||
|
width: number;
|
||||||
|
height: number;
|
||||||
|
setSize(width: number, height: number): this;
|
||||||
|
setWidth(width: number): BoxCollider;
|
||||||
|
setHeight(height: number): void;
|
||||||
|
debugRender(camera: Camera): void;
|
||||||
|
toString(): string;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
declare module es {
|
||||||
|
class CircleCollider extends Collider {
|
||||||
|
private rectShape;
|
||||||
|
private circleShape;
|
||||||
|
private pixelShape1;
|
||||||
|
private pixelShape2;
|
||||||
|
constructor(radius?: number);
|
||||||
|
radius: number;
|
||||||
|
setRadius(radius: number): CircleCollider;
|
||||||
|
debugRender(camera: Camera): void;
|
||||||
|
toString(): string;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
declare module es {
|
||||||
|
class PolygonCollider extends Collider {
|
||||||
|
constructor(points: Vector2[]);
|
||||||
|
}
|
||||||
|
}
|
||||||
declare module es {
|
declare module es {
|
||||||
abstract class RenderableComponent extends Component implements IRenderable {
|
abstract class RenderableComponent extends Component implements IRenderable {
|
||||||
displayObject: egret.DisplayObject;
|
displayObject: egret.DisplayObject;
|
||||||
@@ -613,18 +744,24 @@ declare module es {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
declare module es {
|
declare module es {
|
||||||
class SceneComponent {
|
class Mesh extends RenderableComponent {
|
||||||
scene: Scene;
|
displayObject: egret.Mesh;
|
||||||
enabled: boolean;
|
readonly bounds: Rectangle;
|
||||||
updateOrder: number;
|
_primitiveCount: number;
|
||||||
_enabled: boolean;
|
_topLeftVertPosition: Vector2;
|
||||||
onEnabled(): void;
|
_width: number;
|
||||||
onDisabled(): void;
|
_height: number;
|
||||||
onRemovedFromScene(): void;
|
_triangles: number[];
|
||||||
update(): void;
|
_verts: VertexPositionColorTexture[];
|
||||||
setEnabled(isEnabled: boolean): SceneComponent;
|
recalculateBounds(recalculateUVs: boolean): this;
|
||||||
setUpdateOrder(updateOrder: number): this;
|
setTexture(texture: egret.Texture): Mesh;
|
||||||
compareTo(other: SceneComponent): number;
|
setVertPositions(positions: Vector2[]): this;
|
||||||
|
setTriangles(triangles: number[]): this;
|
||||||
|
render(camera: es.Camera): void;
|
||||||
|
}
|
||||||
|
class VertexPositionColorTexture {
|
||||||
|
position: Vector2;
|
||||||
|
textureCoordinate: Vector2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
declare module es {
|
declare module es {
|
||||||
@@ -730,32 +867,6 @@ declare module es {
|
|||||||
stop(): void;
|
stop(): void;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
declare module es {
|
|
||||||
class CollisionState {
|
|
||||||
right: boolean;
|
|
||||||
left: boolean;
|
|
||||||
above: boolean;
|
|
||||||
below: boolean;
|
|
||||||
becameGroundedThisFrame: boolean;
|
|
||||||
wasGroundedLastFrame: boolean;
|
|
||||||
isGroundedOnOnewayPlatform: boolean;
|
|
||||||
slopAngle: number;
|
|
||||||
readonly hasCollision: boolean;
|
|
||||||
_movementRemainderX: SubpixelNumber;
|
|
||||||
_movementRemainderY: SubpixelNumber;
|
|
||||||
reset(): void;
|
|
||||||
toString(): string;
|
|
||||||
}
|
|
||||||
class TiledMapMover extends Component {
|
|
||||||
colliderHorizontalInset: number;
|
|
||||||
colliderVerticalInset: number;
|
|
||||||
_boxColliderBounds: Rectangle;
|
|
||||||
constructor();
|
|
||||||
testCollisions(motion: Vector2, boxColliderBounds: Rectangle, collisionState: CollisionState): void;
|
|
||||||
testMapCollision(collisionRect: Rectangle, direction: Edge, collisionState: CollisionState, collisionResponse: number): void;
|
|
||||||
collisionRectForSide(side: Edge, motion: number): Rectangle;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module es {
|
declare module es {
|
||||||
class TiledMapRenderer extends RenderableComponent {
|
class TiledMapRenderer extends RenderableComponent {
|
||||||
tiledMap: TmxMap;
|
tiledMap: TmxMap;
|
||||||
@@ -782,96 +893,6 @@ declare module es {
|
|||||||
removeColliders(): void;
|
removeColliders(): void;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
declare module es {
|
|
||||||
interface ITriggerListener {
|
|
||||||
onTriggerEnter(other: Collider, local: Collider): any;
|
|
||||||
onTriggerExit(other: Collider, local: Collider): any;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module es {
|
|
||||||
class Mover extends Component {
|
|
||||||
private _triggerHelper;
|
|
||||||
onAddedToEntity(): void;
|
|
||||||
calculateMovement(motion: Vector2, collisionResult: CollisionResult): boolean;
|
|
||||||
applyMovement(motion: Vector2): void;
|
|
||||||
move(motion: Vector2, collisionResult: CollisionResult): boolean;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module es {
|
|
||||||
class ProjectileMover extends Component {
|
|
||||||
private _tempTriggerList;
|
|
||||||
private _collider;
|
|
||||||
onAddedToEntity(): void;
|
|
||||||
move(motion: Vector2): boolean;
|
|
||||||
private notifyTriggerListeners;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module es {
|
|
||||||
abstract class Collider extends Component {
|
|
||||||
shape: Shape;
|
|
||||||
isTrigger: boolean;
|
|
||||||
physicsLayer: Ref<number>;
|
|
||||||
collidesWithLayers: Ref<number>;
|
|
||||||
shouldColliderScaleAndRotateWithTransform: boolean;
|
|
||||||
registeredPhysicsBounds: Rectangle;
|
|
||||||
_localOffsetLength: number;
|
|
||||||
_isPositionDirty: boolean;
|
|
||||||
_isRotationDirty: boolean;
|
|
||||||
protected _colliderRequiresAutoSizing: any;
|
|
||||||
protected _isParentEntityAddedToScene: any;
|
|
||||||
protected _isColliderRegistered: any;
|
|
||||||
readonly absolutePosition: Vector2;
|
|
||||||
readonly rotation: number;
|
|
||||||
readonly bounds: Rectangle;
|
|
||||||
protected _localOffset: Vector2;
|
|
||||||
localOffset: Vector2;
|
|
||||||
setLocalOffset(offset: Vector2): Collider;
|
|
||||||
setShouldColliderScaleAndRotateWithTransform(shouldColliderScaleAndRotationWithTransform: boolean): Collider;
|
|
||||||
onAddedToEntity(): void;
|
|
||||||
onRemovedFromEntity(): void;
|
|
||||||
onEntityTransformChanged(comp: transform.Component): void;
|
|
||||||
onEnabled(): void;
|
|
||||||
onDisabled(): void;
|
|
||||||
registerColliderWithPhysicsSystem(): void;
|
|
||||||
unregisterColliderWithPhysicsSystem(): void;
|
|
||||||
overlaps(other: Collider): boolean;
|
|
||||||
collidesWith(collider: Collider, motion: Vector2, result: CollisionResult): boolean;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module es {
|
|
||||||
class BoxCollider extends Collider {
|
|
||||||
hollowShape: egret.Shape;
|
|
||||||
polygonShape: egret.Shape;
|
|
||||||
pixelShape1: egret.Shape;
|
|
||||||
pixelShape2: egret.Shape;
|
|
||||||
constructor(x?: number, y?: number, width?: number, height?: number);
|
|
||||||
width: number;
|
|
||||||
height: number;
|
|
||||||
setSize(width: number, height: number): this;
|
|
||||||
setWidth(width: number): BoxCollider;
|
|
||||||
setHeight(height: number): void;
|
|
||||||
debugRender(camera: Camera): void;
|
|
||||||
toString(): string;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module es {
|
|
||||||
class CircleCollider extends Collider {
|
|
||||||
private rectShape;
|
|
||||||
private circleShape;
|
|
||||||
private pixelShape1;
|
|
||||||
private pixelShape2;
|
|
||||||
constructor(radius?: number);
|
|
||||||
radius: number;
|
|
||||||
setRadius(radius: number): CircleCollider;
|
|
||||||
debugRender(camera: Camera): void;
|
|
||||||
toString(): string;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module es {
|
|
||||||
class PolygonCollider extends Collider {
|
|
||||||
constructor(points: Vector2[]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module es {
|
declare module es {
|
||||||
class EntitySystem {
|
class EntitySystem {
|
||||||
private _entities;
|
private _entities;
|
||||||
@@ -1472,6 +1493,50 @@ declare module es {
|
|||||||
constructor(position: Vector2, end: Vector2);
|
constructor(position: Vector2, end: Vector2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
declare module es {
|
||||||
|
class SpatialHash {
|
||||||
|
gridBounds: Rectangle;
|
||||||
|
_raycastParser: RaycastResultParser;
|
||||||
|
_cellSize: number;
|
||||||
|
_inverseCellSize: number;
|
||||||
|
_overlapTestCircle: Circle;
|
||||||
|
_cellDict: NumberDictionary;
|
||||||
|
_tempHashSet: Collider[];
|
||||||
|
constructor(cellSize?: number);
|
||||||
|
register(collider: Collider): void;
|
||||||
|
remove(collider: Collider): void;
|
||||||
|
removeWithBruteForce(obj: Collider): void;
|
||||||
|
clear(): void;
|
||||||
|
debugDraw(secondsToDisplay: number, textScale?: number): void;
|
||||||
|
aabbBroadphase(bounds: Rectangle, excludeCollider: Collider, layerMask: number): Collider[];
|
||||||
|
linecast(start: Vector2, end: Vector2, hits: RaycastHit[], layerMask: number): number;
|
||||||
|
overlapCircle(circleCenter: Vector2, radius: number, results: Collider[], layerMask: any): number;
|
||||||
|
private cellCoords;
|
||||||
|
private cellAtPosition;
|
||||||
|
private debugDrawCellDetails;
|
||||||
|
}
|
||||||
|
class NumberDictionary {
|
||||||
|
_store: Map<string, Collider[]>;
|
||||||
|
add(x: number, y: number, list: Collider[]): void;
|
||||||
|
remove(obj: Collider): void;
|
||||||
|
tryGetValue(x: number, y: number): Collider[];
|
||||||
|
getKey(x: number, y: number): string;
|
||||||
|
clear(): void;
|
||||||
|
}
|
||||||
|
class RaycastResultParser {
|
||||||
|
hitCounter: number;
|
||||||
|
static compareRaycastHits: (a: RaycastHit, b: RaycastHit) => number;
|
||||||
|
_hits: RaycastHit[];
|
||||||
|
_tempHit: RaycastHit;
|
||||||
|
_checkedColliders: Collider[];
|
||||||
|
_cellHits: RaycastHit[];
|
||||||
|
_ray: Ray2D;
|
||||||
|
_layerMask: number;
|
||||||
|
start(ray: Ray2D, hits: RaycastHit[], layerMask: number): void;
|
||||||
|
checkRayIntersection(cellX: number, cellY: number, cell: Collider[]): boolean;
|
||||||
|
reset(): void;
|
||||||
|
}
|
||||||
|
}
|
||||||
declare module es {
|
declare module es {
|
||||||
abstract class Shape {
|
abstract class Shape {
|
||||||
position: Vector2;
|
position: Vector2;
|
||||||
@@ -1579,47 +1644,60 @@ declare module es {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
declare module es {
|
declare module es {
|
||||||
class SpatialHash {
|
class Particle {
|
||||||
gridBounds: Rectangle;
|
position: Vector2;
|
||||||
_raycastParser: RaycastResultParser;
|
lastPosition: Vector2;
|
||||||
_cellSize: number;
|
mass: number;
|
||||||
_inverseCellSize: number;
|
radius: number;
|
||||||
_overlapTestCircle: Circle;
|
collidesWithColliders: boolean;
|
||||||
_cellDict: NumberDictionary;
|
isPinned: boolean;
|
||||||
_tempHashSet: Collider[];
|
acceleration: Vector2;
|
||||||
constructor(cellSize?: number);
|
pinnedPosition: Vector2;
|
||||||
register(collider: Collider): void;
|
applyForce(force: Vector2): void;
|
||||||
remove(collider: Collider): void;
|
|
||||||
removeWithBruteForce(obj: Collider): void;
|
|
||||||
clear(): void;
|
|
||||||
debugDraw(secondsToDisplay: number, textScale?: number): void;
|
|
||||||
aabbBroadphase(bounds: Rectangle, excludeCollider: Collider, layerMask: number): Collider[];
|
|
||||||
linecast(start: Vector2, end: Vector2, hits: RaycastHit[], layerMask: number): number;
|
|
||||||
overlapCircle(circleCenter: Vector2, radius: number, results: Collider[], layerMask: any): number;
|
|
||||||
private cellCoords;
|
|
||||||
private cellAtPosition;
|
|
||||||
private debugDrawCellDetails;
|
|
||||||
}
|
}
|
||||||
class NumberDictionary {
|
}
|
||||||
_store: Map<string, Collider[]>;
|
declare module es {
|
||||||
add(x: number, y: number, list: Collider[]): void;
|
class VerletWorld {
|
||||||
remove(obj: Collider): void;
|
gravity: Vector2;
|
||||||
tryGetValue(x: number, y: number): Collider[];
|
constraintIterations: number;
|
||||||
getKey(x: number, y: number): string;
|
maximumStepIterations: number;
|
||||||
clear(): void;
|
simulationBounds?: Rectangle;
|
||||||
|
allowDragging: boolean;
|
||||||
|
_composites: Composite[];
|
||||||
|
static _colliders: Collider[];
|
||||||
|
_tempCircle: Circle;
|
||||||
|
_leftOverTime: number;
|
||||||
|
_fixedDeltaTime: number;
|
||||||
|
_iterationSteps: number;
|
||||||
|
_fixedDeltaTimeSq: number;
|
||||||
|
constructor(simulationBounds?: Rectangle);
|
||||||
|
update(): void;
|
||||||
|
handleCollisions(p: Particle, collidesWithLayers: number): void;
|
||||||
|
constrainParticleToBounds(p: Particle): void;
|
||||||
|
updateTiming(): void;
|
||||||
|
addComposite<T extends Composite>(composite: T): T;
|
||||||
|
removeComposite(composite: Composite): void;
|
||||||
|
handleDragging(): void;
|
||||||
|
debugRender(camera: Camera): void;
|
||||||
}
|
}
|
||||||
class RaycastResultParser {
|
}
|
||||||
hitCounter: number;
|
declare module es {
|
||||||
static compareRaycastHits: (a: RaycastHit, b: RaycastHit) => number;
|
class Composite {
|
||||||
_hits: RaycastHit[];
|
friction: Vector2;
|
||||||
_tempHit: RaycastHit;
|
collidesWithLayers: number;
|
||||||
_checkedColliders: Collider[];
|
particles: Particle[];
|
||||||
_cellHits: RaycastHit[];
|
_constraints: Constraint[];
|
||||||
_ray: Ray2D;
|
solveConstraints(): void;
|
||||||
_layerMask: number;
|
updateParticles(deltaTimeSquared: number, gravity: Vector2): void;
|
||||||
start(ray: Ray2D, hits: RaycastHit[], layerMask: number): void;
|
handleConstraintCollisions(): void;
|
||||||
checkRayIntersection(cellX: number, cellY: number, cell: Collider[]): boolean;
|
debugRender(camera: Camera): void;
|
||||||
reset(): void;
|
}
|
||||||
|
}
|
||||||
|
declare module es {
|
||||||
|
abstract class Constraint {
|
||||||
|
collidesWithColliders: boolean;
|
||||||
|
abstract solve(): any;
|
||||||
|
handleCollisions(collidesWithLayers: number): void;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
declare module es {
|
declare module es {
|
||||||
@@ -2295,7 +2373,7 @@ declare module es {
|
|||||||
}
|
}
|
||||||
declare module es {
|
declare module es {
|
||||||
class CoroutineImpl implements ICoroutine, IPoolable {
|
class CoroutineImpl implements ICoroutine, IPoolable {
|
||||||
enumerator: IEnumerator;
|
enumerator: Iterator<any>;
|
||||||
waitTimer: number;
|
waitTimer: number;
|
||||||
isDone: boolean;
|
isDone: boolean;
|
||||||
waitForCoroutine: CoroutineImpl;
|
waitForCoroutine: CoroutineImpl;
|
||||||
@@ -2305,16 +2383,11 @@ declare module es {
|
|||||||
prepareForuse(): void;
|
prepareForuse(): void;
|
||||||
reset(): void;
|
reset(): void;
|
||||||
}
|
}
|
||||||
interface IEnumerator {
|
|
||||||
current: any;
|
|
||||||
moveNext(): boolean;
|
|
||||||
reset(): any;
|
|
||||||
}
|
|
||||||
class CoroutineManager extends GlobalManager {
|
class CoroutineManager extends GlobalManager {
|
||||||
_isInUpdate: boolean;
|
_isInUpdate: boolean;
|
||||||
_unblockedCoroutines: CoroutineImpl[];
|
_unblockedCoroutines: CoroutineImpl[];
|
||||||
_shouldRunNextFrame: CoroutineImpl[];
|
_shouldRunNextFrame: CoroutineImpl[];
|
||||||
startCoroutine(enumerator: IEnumerator): CoroutineImpl;
|
startCoroutine(enumerator: Iterator<any>): CoroutineImpl;
|
||||||
update(): void;
|
update(): void;
|
||||||
tickCoroutine(coroutine: CoroutineImpl): boolean;
|
tickCoroutine(coroutine: CoroutineImpl): boolean;
|
||||||
}
|
}
|
||||||
|
|||||||
+1227
-966
File diff suppressed because it is too large
Load Diff
Vendored
+1
-1
File diff suppressed because one or more lines are too long
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"groups": [
|
"groups": [
|
||||||
{
|
{
|
||||||
"keys": "bg_png,bgNorm_png,moon_png,orange_png,moonNorm_png,orangeNorm_png,tiledMap_json,orthogonal-outside_json,tilemap_json,plume_png",
|
"keys": "bg_png,bgNorm_png,moon_png,orange_png,moonNorm_png,orangeNorm_png,tiledMap_json,orthogonal-outside_json,tilemap_json,plume_png,cabbage_png",
|
||||||
"name": "preload"
|
"name": "preload"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -116,6 +116,11 @@
|
|||||||
"url": "preload/plume.png",
|
"url": "preload/plume.png",
|
||||||
"type": "image",
|
"type": "image",
|
||||||
"name": "plume_png"
|
"name": "plume_png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "preload/cabbage.png",
|
||||||
|
"type": "image",
|
||||||
|
"name": "cabbage_png"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 4.5 KiB |
@@ -4,13 +4,14 @@ module samples {
|
|||||||
super.onStart();
|
super.onStart();
|
||||||
manager.AlterManager.alter_tips("空白场景加载成功");
|
manager.AlterManager.alter_tips("空白场景加载成功");
|
||||||
|
|
||||||
this.content.loadRes("moon_png").then(moonTexture => {
|
this.content.loadRes("moon_png").then(moonTexture => {
|
||||||
let moonEntity = this.createEntity("moon");
|
let moonEntity = this.createEntity("moon");
|
||||||
moonEntity.position = new es.Vector2(0, 0);
|
moonEntity.position = new es.Vector2(0, 0);
|
||||||
moonEntity.addComponent(new es.SpriteRenderer(moonTexture));
|
moonEntity.addComponent(new es.SpriteRenderer(moonTexture));
|
||||||
|
|
||||||
this.camera.entity.addComponent(new es.FollowCamera(moonEntity));
|
this.camera.entity.addComponent(new es.FollowCamera(moonEntity));
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -37,7 +37,7 @@ egret_native.egretStart = function () {
|
|||||||
contentWidth: 640,
|
contentWidth: 640,
|
||||||
contentHeight: 1136,
|
contentHeight: 1136,
|
||||||
showPaintRect: false,
|
showPaintRect: false,
|
||||||
showFPS: false,
|
showFPS: true,
|
||||||
fpsStyles: "x:0,y:0,size:12,textColor:0xffffff,bgAlpha:0.9",
|
fpsStyles: "x:0,y:0,size:12,textColor:0xffffff,bgAlpha:0.9",
|
||||||
showLog: false,
|
showLog: false,
|
||||||
logFilter: "",
|
logFilter: "",
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
{}
|
||||||
@@ -3,19 +3,21 @@
|
|||||||
"ui://m4sln17ak7mf0",
|
"ui://m4sln17ak7mf0",
|
||||||
"ui://m4sln17ajde15"
|
"ui://m4sln17ajde15"
|
||||||
],
|
],
|
||||||
"libview.firstColumnWidth": 328,
|
|
||||||
"auxline1": true,
|
|
||||||
"libview.iconScale": 0,
|
"libview.iconScale": 0,
|
||||||
"backgroundColor": 6710886,
|
"auxline1": true,
|
||||||
"doc.activeDoc": "ui://m4sln17ak7mf0",
|
"doc.activeDoc": "ui://m4sln17ak7mf0",
|
||||||
"libview.currentGroup": "",
|
|
||||||
"canvasColor": 10066329,
|
|
||||||
"auxline2": true,
|
|
||||||
"libview.twoColumn": false,
|
"libview.twoColumn": false,
|
||||||
|
"libview.currentGroup": "",
|
||||||
|
"libview.firstColumnWidth": 459,
|
||||||
|
"auxline2": true,
|
||||||
|
"backgroundColor": 6710886,
|
||||||
|
"canvasColor": 10066329,
|
||||||
"libview.expandedNodes": [
|
"libview.expandedNodes": [
|
||||||
"m4sln17a",
|
"m4sln17a",
|
||||||
"/",
|
"/",
|
||||||
"m4sln17a",
|
"m4sln17a",
|
||||||
|
"/资源/",
|
||||||
|
"m4sln17a",
|
||||||
"/组件/"
|
"/组件/"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -6,6 +6,7 @@
|
|||||||
<component id="jde13" name="combo_sc_item.xml" path="/组件/"/>
|
<component id="jde13" name="combo_sc_item.xml" path="/组件/"/>
|
||||||
<component id="jde14" name="combo_sc_popup.xml" path="/组件/"/>
|
<component id="jde14" name="combo_sc_popup.xml" path="/组件/"/>
|
||||||
<component id="jde15" name="combo_sc.xml" path="/组件/" exported="true"/>
|
<component id="jde15" name="combo_sc.xml" path="/组件/" exported="true"/>
|
||||||
|
<image id="hn197" name="cabbage.png" path="/资源/"/>
|
||||||
</resources>
|
</resources>
|
||||||
<publish name="" genCode="true"/>
|
<publish name="" genCode="true"/>
|
||||||
</packageDescription>
|
</packageDescription>
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 4.5 KiB |
Vendored
+248
-175
@@ -208,7 +208,7 @@ declare module es {
|
|||||||
static registerGlobalManager(manager: es.GlobalManager): void;
|
static registerGlobalManager(manager: es.GlobalManager): void;
|
||||||
static unregisterGlobalManager(manager: es.GlobalManager): void;
|
static unregisterGlobalManager(manager: es.GlobalManager): void;
|
||||||
static getGlobalManager<T extends es.GlobalManager>(type: any): T;
|
static getGlobalManager<T extends es.GlobalManager>(type: any): T;
|
||||||
static startCoroutine(enumerator: IEnumerator): CoroutineImpl;
|
static startCoroutine(enumerator: Iterator<any>): CoroutineImpl;
|
||||||
static schedule(timeInSeconds: number, repeats: boolean, context: any, onTime: (timer: ITimer) => void): Timer;
|
static schedule(timeInSeconds: number, repeats: boolean, context: any, onTime: (timer: ITimer) => void): Timer;
|
||||||
onOrientationChanged(): void;
|
onOrientationChanged(): void;
|
||||||
draw(): Promise<void>;
|
draw(): Promise<void>;
|
||||||
@@ -580,6 +580,137 @@ declare module es {
|
|||||||
abstract reset(): any;
|
abstract reset(): any;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
declare module es {
|
||||||
|
class SceneComponent {
|
||||||
|
scene: Scene;
|
||||||
|
enabled: boolean;
|
||||||
|
updateOrder: number;
|
||||||
|
_enabled: boolean;
|
||||||
|
onEnabled(): void;
|
||||||
|
onDisabled(): void;
|
||||||
|
onRemovedFromScene(): void;
|
||||||
|
update(): void;
|
||||||
|
setEnabled(isEnabled: boolean): SceneComponent;
|
||||||
|
setUpdateOrder(updateOrder: number): this;
|
||||||
|
compareTo(other: SceneComponent): number;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
declare module es {
|
||||||
|
class CollisionState {
|
||||||
|
right: boolean;
|
||||||
|
left: boolean;
|
||||||
|
above: boolean;
|
||||||
|
below: boolean;
|
||||||
|
becameGroundedThisFrame: boolean;
|
||||||
|
wasGroundedLastFrame: boolean;
|
||||||
|
isGroundedOnOnewayPlatform: boolean;
|
||||||
|
slopAngle: number;
|
||||||
|
readonly hasCollision: boolean;
|
||||||
|
_movementRemainderX: SubpixelNumber;
|
||||||
|
_movementRemainderY: SubpixelNumber;
|
||||||
|
reset(): void;
|
||||||
|
toString(): string;
|
||||||
|
}
|
||||||
|
class TiledMapMover extends Component {
|
||||||
|
colliderHorizontalInset: number;
|
||||||
|
colliderVerticalInset: number;
|
||||||
|
_boxColliderBounds: Rectangle;
|
||||||
|
constructor();
|
||||||
|
testCollisions(motion: Vector2, boxColliderBounds: Rectangle, collisionState: CollisionState): void;
|
||||||
|
testMapCollision(collisionRect: Rectangle, direction: Edge, collisionState: CollisionState, collisionResponse: number): void;
|
||||||
|
collisionRectForSide(side: Edge, motion: number): Rectangle;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
declare module es {
|
||||||
|
interface ITriggerListener {
|
||||||
|
onTriggerEnter(other: Collider, local: Collider): any;
|
||||||
|
onTriggerExit(other: Collider, local: Collider): any;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
declare module es {
|
||||||
|
class Mover extends Component {
|
||||||
|
private _triggerHelper;
|
||||||
|
onAddedToEntity(): void;
|
||||||
|
calculateMovement(motion: Vector2, collisionResult: CollisionResult): boolean;
|
||||||
|
applyMovement(motion: Vector2): void;
|
||||||
|
move(motion: Vector2, collisionResult: CollisionResult): boolean;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
declare module es {
|
||||||
|
class ProjectileMover extends Component {
|
||||||
|
private _tempTriggerList;
|
||||||
|
private _collider;
|
||||||
|
onAddedToEntity(): void;
|
||||||
|
move(motion: Vector2): boolean;
|
||||||
|
private notifyTriggerListeners;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
declare module es {
|
||||||
|
abstract class Collider extends Component {
|
||||||
|
shape: Shape;
|
||||||
|
isTrigger: boolean;
|
||||||
|
physicsLayer: Ref<number>;
|
||||||
|
collidesWithLayers: Ref<number>;
|
||||||
|
shouldColliderScaleAndRotateWithTransform: boolean;
|
||||||
|
registeredPhysicsBounds: Rectangle;
|
||||||
|
_localOffsetLength: number;
|
||||||
|
_isPositionDirty: boolean;
|
||||||
|
_isRotationDirty: boolean;
|
||||||
|
protected _colliderRequiresAutoSizing: any;
|
||||||
|
protected _isParentEntityAddedToScene: any;
|
||||||
|
protected _isColliderRegistered: any;
|
||||||
|
readonly absolutePosition: Vector2;
|
||||||
|
readonly rotation: number;
|
||||||
|
readonly bounds: Rectangle;
|
||||||
|
protected _localOffset: Vector2;
|
||||||
|
localOffset: Vector2;
|
||||||
|
setLocalOffset(offset: Vector2): Collider;
|
||||||
|
setShouldColliderScaleAndRotateWithTransform(shouldColliderScaleAndRotationWithTransform: boolean): Collider;
|
||||||
|
onAddedToEntity(): void;
|
||||||
|
onRemovedFromEntity(): void;
|
||||||
|
onEntityTransformChanged(comp: transform.Component): void;
|
||||||
|
onEnabled(): void;
|
||||||
|
onDisabled(): void;
|
||||||
|
registerColliderWithPhysicsSystem(): void;
|
||||||
|
unregisterColliderWithPhysicsSystem(): void;
|
||||||
|
overlaps(other: Collider): boolean;
|
||||||
|
collidesWith(collider: Collider, motion: Vector2, result: CollisionResult): boolean;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
declare module es {
|
||||||
|
class BoxCollider extends Collider {
|
||||||
|
hollowShape: egret.Shape;
|
||||||
|
polygonShape: egret.Shape;
|
||||||
|
pixelShape1: egret.Shape;
|
||||||
|
pixelShape2: egret.Shape;
|
||||||
|
constructor(x?: number, y?: number, width?: number, height?: number);
|
||||||
|
width: number;
|
||||||
|
height: number;
|
||||||
|
setSize(width: number, height: number): this;
|
||||||
|
setWidth(width: number): BoxCollider;
|
||||||
|
setHeight(height: number): void;
|
||||||
|
debugRender(camera: Camera): void;
|
||||||
|
toString(): string;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
declare module es {
|
||||||
|
class CircleCollider extends Collider {
|
||||||
|
private rectShape;
|
||||||
|
private circleShape;
|
||||||
|
private pixelShape1;
|
||||||
|
private pixelShape2;
|
||||||
|
constructor(radius?: number);
|
||||||
|
radius: number;
|
||||||
|
setRadius(radius: number): CircleCollider;
|
||||||
|
debugRender(camera: Camera): void;
|
||||||
|
toString(): string;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
declare module es {
|
||||||
|
class PolygonCollider extends Collider {
|
||||||
|
constructor(points: Vector2[]);
|
||||||
|
}
|
||||||
|
}
|
||||||
declare module es {
|
declare module es {
|
||||||
abstract class RenderableComponent extends Component implements IRenderable {
|
abstract class RenderableComponent extends Component implements IRenderable {
|
||||||
displayObject: egret.DisplayObject;
|
displayObject: egret.DisplayObject;
|
||||||
@@ -613,18 +744,24 @@ declare module es {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
declare module es {
|
declare module es {
|
||||||
class SceneComponent {
|
class Mesh extends RenderableComponent {
|
||||||
scene: Scene;
|
displayObject: egret.Mesh;
|
||||||
enabled: boolean;
|
readonly bounds: Rectangle;
|
||||||
updateOrder: number;
|
_primitiveCount: number;
|
||||||
_enabled: boolean;
|
_topLeftVertPosition: Vector2;
|
||||||
onEnabled(): void;
|
_width: number;
|
||||||
onDisabled(): void;
|
_height: number;
|
||||||
onRemovedFromScene(): void;
|
_triangles: number[];
|
||||||
update(): void;
|
_verts: VertexPositionColorTexture[];
|
||||||
setEnabled(isEnabled: boolean): SceneComponent;
|
recalculateBounds(recalculateUVs: boolean): this;
|
||||||
setUpdateOrder(updateOrder: number): this;
|
setTexture(texture: egret.Texture): Mesh;
|
||||||
compareTo(other: SceneComponent): number;
|
setVertPositions(positions: Vector2[]): this;
|
||||||
|
setTriangles(triangles: number[]): this;
|
||||||
|
render(camera: es.Camera): void;
|
||||||
|
}
|
||||||
|
class VertexPositionColorTexture {
|
||||||
|
position: Vector2;
|
||||||
|
textureCoordinate: Vector2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
declare module es {
|
declare module es {
|
||||||
@@ -730,32 +867,6 @@ declare module es {
|
|||||||
stop(): void;
|
stop(): void;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
declare module es {
|
|
||||||
class CollisionState {
|
|
||||||
right: boolean;
|
|
||||||
left: boolean;
|
|
||||||
above: boolean;
|
|
||||||
below: boolean;
|
|
||||||
becameGroundedThisFrame: boolean;
|
|
||||||
wasGroundedLastFrame: boolean;
|
|
||||||
isGroundedOnOnewayPlatform: boolean;
|
|
||||||
slopAngle: number;
|
|
||||||
readonly hasCollision: boolean;
|
|
||||||
_movementRemainderX: SubpixelNumber;
|
|
||||||
_movementRemainderY: SubpixelNumber;
|
|
||||||
reset(): void;
|
|
||||||
toString(): string;
|
|
||||||
}
|
|
||||||
class TiledMapMover extends Component {
|
|
||||||
colliderHorizontalInset: number;
|
|
||||||
colliderVerticalInset: number;
|
|
||||||
_boxColliderBounds: Rectangle;
|
|
||||||
constructor();
|
|
||||||
testCollisions(motion: Vector2, boxColliderBounds: Rectangle, collisionState: CollisionState): void;
|
|
||||||
testMapCollision(collisionRect: Rectangle, direction: Edge, collisionState: CollisionState, collisionResponse: number): void;
|
|
||||||
collisionRectForSide(side: Edge, motion: number): Rectangle;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module es {
|
declare module es {
|
||||||
class TiledMapRenderer extends RenderableComponent {
|
class TiledMapRenderer extends RenderableComponent {
|
||||||
tiledMap: TmxMap;
|
tiledMap: TmxMap;
|
||||||
@@ -782,96 +893,6 @@ declare module es {
|
|||||||
removeColliders(): void;
|
removeColliders(): void;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
declare module es {
|
|
||||||
interface ITriggerListener {
|
|
||||||
onTriggerEnter(other: Collider, local: Collider): any;
|
|
||||||
onTriggerExit(other: Collider, local: Collider): any;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module es {
|
|
||||||
class Mover extends Component {
|
|
||||||
private _triggerHelper;
|
|
||||||
onAddedToEntity(): void;
|
|
||||||
calculateMovement(motion: Vector2, collisionResult: CollisionResult): boolean;
|
|
||||||
applyMovement(motion: Vector2): void;
|
|
||||||
move(motion: Vector2, collisionResult: CollisionResult): boolean;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module es {
|
|
||||||
class ProjectileMover extends Component {
|
|
||||||
private _tempTriggerList;
|
|
||||||
private _collider;
|
|
||||||
onAddedToEntity(): void;
|
|
||||||
move(motion: Vector2): boolean;
|
|
||||||
private notifyTriggerListeners;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module es {
|
|
||||||
abstract class Collider extends Component {
|
|
||||||
shape: Shape;
|
|
||||||
isTrigger: boolean;
|
|
||||||
physicsLayer: Ref<number>;
|
|
||||||
collidesWithLayers: Ref<number>;
|
|
||||||
shouldColliderScaleAndRotateWithTransform: boolean;
|
|
||||||
registeredPhysicsBounds: Rectangle;
|
|
||||||
_localOffsetLength: number;
|
|
||||||
_isPositionDirty: boolean;
|
|
||||||
_isRotationDirty: boolean;
|
|
||||||
protected _colliderRequiresAutoSizing: any;
|
|
||||||
protected _isParentEntityAddedToScene: any;
|
|
||||||
protected _isColliderRegistered: any;
|
|
||||||
readonly absolutePosition: Vector2;
|
|
||||||
readonly rotation: number;
|
|
||||||
readonly bounds: Rectangle;
|
|
||||||
protected _localOffset: Vector2;
|
|
||||||
localOffset: Vector2;
|
|
||||||
setLocalOffset(offset: Vector2): Collider;
|
|
||||||
setShouldColliderScaleAndRotateWithTransform(shouldColliderScaleAndRotationWithTransform: boolean): Collider;
|
|
||||||
onAddedToEntity(): void;
|
|
||||||
onRemovedFromEntity(): void;
|
|
||||||
onEntityTransformChanged(comp: transform.Component): void;
|
|
||||||
onEnabled(): void;
|
|
||||||
onDisabled(): void;
|
|
||||||
registerColliderWithPhysicsSystem(): void;
|
|
||||||
unregisterColliderWithPhysicsSystem(): void;
|
|
||||||
overlaps(other: Collider): boolean;
|
|
||||||
collidesWith(collider: Collider, motion: Vector2, result: CollisionResult): boolean;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module es {
|
|
||||||
class BoxCollider extends Collider {
|
|
||||||
hollowShape: egret.Shape;
|
|
||||||
polygonShape: egret.Shape;
|
|
||||||
pixelShape1: egret.Shape;
|
|
||||||
pixelShape2: egret.Shape;
|
|
||||||
constructor(x?: number, y?: number, width?: number, height?: number);
|
|
||||||
width: number;
|
|
||||||
height: number;
|
|
||||||
setSize(width: number, height: number): this;
|
|
||||||
setWidth(width: number): BoxCollider;
|
|
||||||
setHeight(height: number): void;
|
|
||||||
debugRender(camera: Camera): void;
|
|
||||||
toString(): string;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module es {
|
|
||||||
class CircleCollider extends Collider {
|
|
||||||
private rectShape;
|
|
||||||
private circleShape;
|
|
||||||
private pixelShape1;
|
|
||||||
private pixelShape2;
|
|
||||||
constructor(radius?: number);
|
|
||||||
radius: number;
|
|
||||||
setRadius(radius: number): CircleCollider;
|
|
||||||
debugRender(camera: Camera): void;
|
|
||||||
toString(): string;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module es {
|
|
||||||
class PolygonCollider extends Collider {
|
|
||||||
constructor(points: Vector2[]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module es {
|
declare module es {
|
||||||
class EntitySystem {
|
class EntitySystem {
|
||||||
private _entities;
|
private _entities;
|
||||||
@@ -1472,6 +1493,50 @@ declare module es {
|
|||||||
constructor(position: Vector2, end: Vector2);
|
constructor(position: Vector2, end: Vector2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
declare module es {
|
||||||
|
class SpatialHash {
|
||||||
|
gridBounds: Rectangle;
|
||||||
|
_raycastParser: RaycastResultParser;
|
||||||
|
_cellSize: number;
|
||||||
|
_inverseCellSize: number;
|
||||||
|
_overlapTestCircle: Circle;
|
||||||
|
_cellDict: NumberDictionary;
|
||||||
|
_tempHashSet: Collider[];
|
||||||
|
constructor(cellSize?: number);
|
||||||
|
register(collider: Collider): void;
|
||||||
|
remove(collider: Collider): void;
|
||||||
|
removeWithBruteForce(obj: Collider): void;
|
||||||
|
clear(): void;
|
||||||
|
debugDraw(secondsToDisplay: number, textScale?: number): void;
|
||||||
|
aabbBroadphase(bounds: Rectangle, excludeCollider: Collider, layerMask: number): Collider[];
|
||||||
|
linecast(start: Vector2, end: Vector2, hits: RaycastHit[], layerMask: number): number;
|
||||||
|
overlapCircle(circleCenter: Vector2, radius: number, results: Collider[], layerMask: any): number;
|
||||||
|
private cellCoords;
|
||||||
|
private cellAtPosition;
|
||||||
|
private debugDrawCellDetails;
|
||||||
|
}
|
||||||
|
class NumberDictionary {
|
||||||
|
_store: Map<string, Collider[]>;
|
||||||
|
add(x: number, y: number, list: Collider[]): void;
|
||||||
|
remove(obj: Collider): void;
|
||||||
|
tryGetValue(x: number, y: number): Collider[];
|
||||||
|
getKey(x: number, y: number): string;
|
||||||
|
clear(): void;
|
||||||
|
}
|
||||||
|
class RaycastResultParser {
|
||||||
|
hitCounter: number;
|
||||||
|
static compareRaycastHits: (a: RaycastHit, b: RaycastHit) => number;
|
||||||
|
_hits: RaycastHit[];
|
||||||
|
_tempHit: RaycastHit;
|
||||||
|
_checkedColliders: Collider[];
|
||||||
|
_cellHits: RaycastHit[];
|
||||||
|
_ray: Ray2D;
|
||||||
|
_layerMask: number;
|
||||||
|
start(ray: Ray2D, hits: RaycastHit[], layerMask: number): void;
|
||||||
|
checkRayIntersection(cellX: number, cellY: number, cell: Collider[]): boolean;
|
||||||
|
reset(): void;
|
||||||
|
}
|
||||||
|
}
|
||||||
declare module es {
|
declare module es {
|
||||||
abstract class Shape {
|
abstract class Shape {
|
||||||
position: Vector2;
|
position: Vector2;
|
||||||
@@ -1579,47 +1644,60 @@ declare module es {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
declare module es {
|
declare module es {
|
||||||
class SpatialHash {
|
class Particle {
|
||||||
gridBounds: Rectangle;
|
position: Vector2;
|
||||||
_raycastParser: RaycastResultParser;
|
lastPosition: Vector2;
|
||||||
_cellSize: number;
|
mass: number;
|
||||||
_inverseCellSize: number;
|
radius: number;
|
||||||
_overlapTestCircle: Circle;
|
collidesWithColliders: boolean;
|
||||||
_cellDict: NumberDictionary;
|
isPinned: boolean;
|
||||||
_tempHashSet: Collider[];
|
acceleration: Vector2;
|
||||||
constructor(cellSize?: number);
|
pinnedPosition: Vector2;
|
||||||
register(collider: Collider): void;
|
applyForce(force: Vector2): void;
|
||||||
remove(collider: Collider): void;
|
|
||||||
removeWithBruteForce(obj: Collider): void;
|
|
||||||
clear(): void;
|
|
||||||
debugDraw(secondsToDisplay: number, textScale?: number): void;
|
|
||||||
aabbBroadphase(bounds: Rectangle, excludeCollider: Collider, layerMask: number): Collider[];
|
|
||||||
linecast(start: Vector2, end: Vector2, hits: RaycastHit[], layerMask: number): number;
|
|
||||||
overlapCircle(circleCenter: Vector2, radius: number, results: Collider[], layerMask: any): number;
|
|
||||||
private cellCoords;
|
|
||||||
private cellAtPosition;
|
|
||||||
private debugDrawCellDetails;
|
|
||||||
}
|
}
|
||||||
class NumberDictionary {
|
}
|
||||||
_store: Map<string, Collider[]>;
|
declare module es {
|
||||||
add(x: number, y: number, list: Collider[]): void;
|
class VerletWorld {
|
||||||
remove(obj: Collider): void;
|
gravity: Vector2;
|
||||||
tryGetValue(x: number, y: number): Collider[];
|
constraintIterations: number;
|
||||||
getKey(x: number, y: number): string;
|
maximumStepIterations: number;
|
||||||
clear(): void;
|
simulationBounds?: Rectangle;
|
||||||
|
allowDragging: boolean;
|
||||||
|
_composites: Composite[];
|
||||||
|
static _colliders: Collider[];
|
||||||
|
_tempCircle: Circle;
|
||||||
|
_leftOverTime: number;
|
||||||
|
_fixedDeltaTime: number;
|
||||||
|
_iterationSteps: number;
|
||||||
|
_fixedDeltaTimeSq: number;
|
||||||
|
constructor(simulationBounds?: Rectangle);
|
||||||
|
update(): void;
|
||||||
|
handleCollisions(p: Particle, collidesWithLayers: number): void;
|
||||||
|
constrainParticleToBounds(p: Particle): void;
|
||||||
|
updateTiming(): void;
|
||||||
|
addComposite<T extends Composite>(composite: T): T;
|
||||||
|
removeComposite(composite: Composite): void;
|
||||||
|
handleDragging(): void;
|
||||||
|
debugRender(camera: Camera): void;
|
||||||
}
|
}
|
||||||
class RaycastResultParser {
|
}
|
||||||
hitCounter: number;
|
declare module es {
|
||||||
static compareRaycastHits: (a: RaycastHit, b: RaycastHit) => number;
|
class Composite {
|
||||||
_hits: RaycastHit[];
|
friction: Vector2;
|
||||||
_tempHit: RaycastHit;
|
collidesWithLayers: number;
|
||||||
_checkedColliders: Collider[];
|
particles: Particle[];
|
||||||
_cellHits: RaycastHit[];
|
_constraints: Constraint[];
|
||||||
_ray: Ray2D;
|
solveConstraints(): void;
|
||||||
_layerMask: number;
|
updateParticles(deltaTimeSquared: number, gravity: Vector2): void;
|
||||||
start(ray: Ray2D, hits: RaycastHit[], layerMask: number): void;
|
handleConstraintCollisions(): void;
|
||||||
checkRayIntersection(cellX: number, cellY: number, cell: Collider[]): boolean;
|
debugRender(camera: Camera): void;
|
||||||
reset(): void;
|
}
|
||||||
|
}
|
||||||
|
declare module es {
|
||||||
|
abstract class Constraint {
|
||||||
|
collidesWithColliders: boolean;
|
||||||
|
abstract solve(): any;
|
||||||
|
handleCollisions(collidesWithLayers: number): void;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
declare module es {
|
declare module es {
|
||||||
@@ -2295,7 +2373,7 @@ declare module es {
|
|||||||
}
|
}
|
||||||
declare module es {
|
declare module es {
|
||||||
class CoroutineImpl implements ICoroutine, IPoolable {
|
class CoroutineImpl implements ICoroutine, IPoolable {
|
||||||
enumerator: IEnumerator;
|
enumerator: Iterator<any>;
|
||||||
waitTimer: number;
|
waitTimer: number;
|
||||||
isDone: boolean;
|
isDone: boolean;
|
||||||
waitForCoroutine: CoroutineImpl;
|
waitForCoroutine: CoroutineImpl;
|
||||||
@@ -2305,16 +2383,11 @@ declare module es {
|
|||||||
prepareForuse(): void;
|
prepareForuse(): void;
|
||||||
reset(): void;
|
reset(): void;
|
||||||
}
|
}
|
||||||
interface IEnumerator {
|
|
||||||
current: any;
|
|
||||||
moveNext(): boolean;
|
|
||||||
reset(): any;
|
|
||||||
}
|
|
||||||
class CoroutineManager extends GlobalManager {
|
class CoroutineManager extends GlobalManager {
|
||||||
_isInUpdate: boolean;
|
_isInUpdate: boolean;
|
||||||
_unblockedCoroutines: CoroutineImpl[];
|
_unblockedCoroutines: CoroutineImpl[];
|
||||||
_shouldRunNextFrame: CoroutineImpl[];
|
_shouldRunNextFrame: CoroutineImpl[];
|
||||||
startCoroutine(enumerator: IEnumerator): CoroutineImpl;
|
startCoroutine(enumerator: Iterator<any>): CoroutineImpl;
|
||||||
update(): void;
|
update(): void;
|
||||||
tickCoroutine(coroutine: CoroutineImpl): boolean;
|
tickCoroutine(coroutine: CoroutineImpl): boolean;
|
||||||
}
|
}
|
||||||
|
|||||||
+1227
-966
File diff suppressed because it is too large
Load Diff
Vendored
+1
-1
File diff suppressed because one or more lines are too long
@@ -0,0 +1,106 @@
|
|||||||
|
///<reference path="RenderableComponent.ts"/>
|
||||||
|
module es {
|
||||||
|
/**
|
||||||
|
* 可用于创建简单网格的基本类
|
||||||
|
*/
|
||||||
|
export class Mesh extends RenderableComponent {
|
||||||
|
public displayObject: egret.Mesh = new egret.Mesh();
|
||||||
|
public get bounds(){
|
||||||
|
if (this._areBoundsDirty){
|
||||||
|
this._bounds.calculateBounds(Vector2.add(this.entity.transform.position, this._topLeftVertPosition), Vector2.zero,
|
||||||
|
Vector2.zero, this.entity.transform.scale, this.entity.transform.rotation, this._width, this._height);
|
||||||
|
this._areBoundsDirty = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this._bounds;
|
||||||
|
}
|
||||||
|
|
||||||
|
public _primitiveCount: number = 0;
|
||||||
|
public _topLeftVertPosition: Vector2;
|
||||||
|
public _width: number = 0;
|
||||||
|
public _height: number = 0;
|
||||||
|
public _triangles: number[] = [];
|
||||||
|
public _verts: VertexPositionColorTexture[] = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 重新计算边界和可选地设置uv。设置uv以最适合的方式映射纹理。
|
||||||
|
* @param recalculateUVs
|
||||||
|
*/
|
||||||
|
public recalculateBounds(recalculateUVs: boolean){
|
||||||
|
this._topLeftVertPosition = new Vector2(Number.MAX_VALUE, Number.MAX_VALUE);
|
||||||
|
let max = new Vector2(Number.MIN_VALUE, Number.MIN_VALUE);
|
||||||
|
|
||||||
|
for (let i = 0; i < this._verts.length; i ++){
|
||||||
|
this._topLeftVertPosition.x = Math.min(this._topLeftVertPosition.x, this._verts[i].position.x);
|
||||||
|
this._topLeftVertPosition.y = Math.min(this._topLeftVertPosition.y, this._verts[i].position.y);
|
||||||
|
max.x = Math.max(max.x, this._verts[i].position.x);
|
||||||
|
max.y = Math.max(max.y, this._verts[i].position.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
this._width = max.x - this._topLeftVertPosition.x;
|
||||||
|
this._height = max.y - this._topLeftVertPosition.y;
|
||||||
|
|
||||||
|
// 如果需要处理uv
|
||||||
|
if (recalculateUVs){
|
||||||
|
for (let i = 0; i < this._verts.length; i ++){
|
||||||
|
this._verts[i].textureCoordinate.x = (this._verts[i].position.x - this._topLeftVertPosition.x) / this._width;
|
||||||
|
this._verts[i].textureCoordinate.y = (this._verts[i].position.y - this._topLeftVertPosition.y) / this._height;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置纹理。传入null来取消纹理设置。
|
||||||
|
* @param texture
|
||||||
|
*/
|
||||||
|
public setTexture(texture: egret.Texture): Mesh{
|
||||||
|
this.displayObject.texture = texture;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置vert位置。如果position数组与vert数组大小不匹配,则将重新创建vert数组。
|
||||||
|
* @param positions
|
||||||
|
*/
|
||||||
|
public setVertPositions(positions: Vector2[]){
|
||||||
|
if (this._verts == undefined || this._verts.length != positions.length){
|
||||||
|
this._verts = new Array(positions.length);
|
||||||
|
this._verts.fill(new VertexPositionColorTexture(), 0, positions.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let i = 0; i < this._verts.length; i ++){
|
||||||
|
this._verts[i].position = positions[i];
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置渲染的三角形索引
|
||||||
|
* @param triangles
|
||||||
|
*/
|
||||||
|
public setTriangles(triangles: number[]){
|
||||||
|
if (triangles.length % 3 != 0){
|
||||||
|
console.error("三角形必须是3的倍数");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._primitiveCount = triangles.length / 3;
|
||||||
|
this._triangles = triangles;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public render(camera: es.Camera) {
|
||||||
|
let renderNode = this.displayObject.$renderNode as egret.sys.MeshNode;
|
||||||
|
renderNode.imageWidth = this._width;
|
||||||
|
renderNode.imageHeight = this._height;
|
||||||
|
renderNode.vertices = this._triangles;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class VertexPositionColorTexture {
|
||||||
|
public position: Vector2;
|
||||||
|
public textureCoordinate: Vector2;
|
||||||
|
}
|
||||||
|
}
|
||||||
+230
-230
@@ -1,231 +1,231 @@
|
|||||||
///<reference path="./PooledComponent.ts" />
|
///<reference path="../PooledComponent.ts" />
|
||||||
module es {
|
module es {
|
||||||
/**
|
/**
|
||||||
* 所有可渲染组件的基类
|
* 所有可渲染组件的基类
|
||||||
*/
|
*/
|
||||||
export abstract class RenderableComponent extends Component implements IRenderable {
|
export abstract class RenderableComponent extends Component implements IRenderable {
|
||||||
/**
|
/**
|
||||||
* 用于装载egret显示对象
|
* 用于装载egret显示对象
|
||||||
*/
|
*/
|
||||||
public displayObject: egret.DisplayObject = new egret.DisplayObject();
|
public displayObject: egret.DisplayObject = new egret.DisplayObject();
|
||||||
public hollowShape: egret.Shape = new egret.Shape();
|
public hollowShape: egret.Shape = new egret.Shape();
|
||||||
public pixelShape: egret.Shape = new egret.Shape();
|
public pixelShape: egret.Shape = new egret.Shape();
|
||||||
/**
|
/**
|
||||||
* 用于着色器处理精灵
|
* 用于着色器处理精灵
|
||||||
*/
|
*/
|
||||||
public color: number = 0x000000;
|
public color: number = 0x000000;
|
||||||
protected _areBoundsDirty = true;
|
protected _areBoundsDirty = true;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* renderableComponent的宽度
|
* renderableComponent的宽度
|
||||||
* 如果你不重写bounds属性则需要实现这个
|
* 如果你不重写bounds属性则需要实现这个
|
||||||
*/
|
*/
|
||||||
public get width() {
|
public get width() {
|
||||||
return this.bounds.width;
|
return this.bounds.width;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* renderableComponent的高度
|
* renderableComponent的高度
|
||||||
* 如果你不重写bounds属性则需要实现这个
|
* 如果你不重写bounds属性则需要实现这个
|
||||||
*/
|
*/
|
||||||
public get height() {
|
public get height() {
|
||||||
return this.bounds.height;
|
return this.bounds.height;
|
||||||
}
|
}
|
||||||
|
|
||||||
public debugRenderEnabled: boolean = true;
|
public debugRenderEnabled: boolean = true;
|
||||||
protected _localOffset: Vector2 = Vector2.zero;
|
protected _localOffset: Vector2 = Vector2.zero;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 从父实体的偏移量。用于向需要特定定位的实体
|
* 从父实体的偏移量。用于向需要特定定位的实体
|
||||||
*/
|
*/
|
||||||
public get localOffset(): Vector2 {
|
public get localOffset(): Vector2 {
|
||||||
return this._localOffset;
|
return this._localOffset;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 从父实体的偏移量。用于向需要特定定位的实体
|
* 从父实体的偏移量。用于向需要特定定位的实体
|
||||||
* @param value
|
* @param value
|
||||||
*/
|
*/
|
||||||
public set localOffset(value: Vector2) {
|
public set localOffset(value: Vector2) {
|
||||||
this.setLocalOffset(value);
|
this.setLocalOffset(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected _renderLayer: number = 0;
|
protected _renderLayer: number = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 较低的渲染层在前面,较高的在后面
|
* 较低的渲染层在前面,较高的在后面
|
||||||
*/
|
*/
|
||||||
public get renderLayer(): number {
|
public get renderLayer(): number {
|
||||||
return this._renderLayer;
|
return this._renderLayer;
|
||||||
}
|
}
|
||||||
|
|
||||||
public set renderLayer(value: number) {
|
public set renderLayer(value: number) {
|
||||||
this.setRenderLayer(value);
|
this.setRenderLayer(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected _bounds: Rectangle = new Rectangle();
|
protected _bounds: Rectangle = new Rectangle();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 这个物体的AABB, 用于相机剔除
|
* 这个物体的AABB, 用于相机剔除
|
||||||
*/
|
*/
|
||||||
public get bounds(): Rectangle {
|
public get bounds(): Rectangle {
|
||||||
if (this._areBoundsDirty) {
|
if (this._areBoundsDirty) {
|
||||||
this._bounds.calculateBounds(this.entity.transform.position, this._localOffset, Vector2.zero,
|
this._bounds.calculateBounds(this.entity.transform.position, this._localOffset, Vector2.zero,
|
||||||
this.entity.transform.scale, this.entity.transform.rotation, this.width, this.height);
|
this.entity.transform.scale, this.entity.transform.rotation, this.width, this.height);
|
||||||
this._areBoundsDirty = false;
|
this._areBoundsDirty = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return this._bounds;
|
return this._bounds;
|
||||||
}
|
}
|
||||||
|
|
||||||
private _isVisible: boolean;
|
private _isVisible: boolean;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 可渲染的可见性。状态的改变会调用onBecameVisible/onBecameInvisible方法
|
* 可渲染的可见性。状态的改变会调用onBecameVisible/onBecameInvisible方法
|
||||||
*/
|
*/
|
||||||
public get isVisible() {
|
public get isVisible() {
|
||||||
return this._isVisible;
|
return this._isVisible;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 可渲染的可见性。状态的改变会调用onBecameVisible/onBecameInvisible方法
|
* 可渲染的可见性。状态的改变会调用onBecameVisible/onBecameInvisible方法
|
||||||
* @param value
|
* @param value
|
||||||
*/
|
*/
|
||||||
public set isVisible(value: boolean) {
|
public set isVisible(value: boolean) {
|
||||||
if (this._isVisible != value) {
|
if (this._isVisible != value) {
|
||||||
this._isVisible = value;
|
this._isVisible = value;
|
||||||
|
|
||||||
if (this._isVisible)
|
if (this._isVisible)
|
||||||
this.onBecameVisible();
|
this.onBecameVisible();
|
||||||
else
|
else
|
||||||
this.onBecameInvisible();
|
this.onBecameInvisible();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public onEntityTransformChanged(comp: transform.Component) {
|
public onEntityTransformChanged(comp: transform.Component) {
|
||||||
this._areBoundsDirty = true;
|
this._areBoundsDirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 由渲染器调用。可以使用摄像机进行剔除
|
* 由渲染器调用。可以使用摄像机进行剔除
|
||||||
* @param camera
|
* @param camera
|
||||||
*/
|
*/
|
||||||
public abstract render(camera: Camera);
|
public abstract render(camera: Camera);
|
||||||
|
|
||||||
public debugRender(camera: Camera) {
|
public debugRender(camera: Camera) {
|
||||||
if (!this.debugRenderEnabled)
|
if (!this.debugRenderEnabled)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!this.hollowShape.parent)
|
if (!this.hollowShape.parent)
|
||||||
this.debugDisplayObject.addChild(this.hollowShape);
|
this.debugDisplayObject.addChild(this.hollowShape);
|
||||||
|
|
||||||
if (!this.pixelShape.parent)
|
if (!this.pixelShape.parent)
|
||||||
this.debugDisplayObject.addChild(this.pixelShape);
|
this.debugDisplayObject.addChild(this.pixelShape);
|
||||||
|
|
||||||
if (!this.entity.getComponent(Collider)){
|
if (!this.entity.getComponent(Collider)){
|
||||||
this.hollowShape.graphics.clear();
|
this.hollowShape.graphics.clear();
|
||||||
this.hollowShape.graphics.beginFill(Colors.renderableBounds, 0);
|
this.hollowShape.graphics.beginFill(Colors.renderableBounds, 0);
|
||||||
this.hollowShape.graphics.lineStyle(1, Colors.renderableBounds);
|
this.hollowShape.graphics.lineStyle(1, Colors.renderableBounds);
|
||||||
this.hollowShape.graphics.drawRect(this.bounds.x - camera.bounds.x, this.bounds.y - camera.bounds.y, this.bounds.width, this.bounds.height);
|
this.hollowShape.graphics.drawRect(this.bounds.x - camera.bounds.x, this.bounds.y - camera.bounds.y, this.bounds.width, this.bounds.height);
|
||||||
this.hollowShape.graphics.endFill();
|
this.hollowShape.graphics.endFill();
|
||||||
}
|
}
|
||||||
|
|
||||||
let pixelPos = Vector2.add(this.entity.transform.position, this._localOffset).subtract(camera.bounds.location);
|
let pixelPos = Vector2.add(this.entity.transform.position, this._localOffset).subtract(camera.bounds.location);
|
||||||
this.pixelShape.graphics.clear();
|
this.pixelShape.graphics.clear();
|
||||||
this.pixelShape.graphics.beginFill(Colors.renderableCenter, 0);
|
this.pixelShape.graphics.beginFill(Colors.renderableCenter, 0);
|
||||||
this.pixelShape.graphics.lineStyle(4, Colors.renderableCenter);
|
this.pixelShape.graphics.lineStyle(4, Colors.renderableCenter);
|
||||||
this.pixelShape.graphics.moveTo(pixelPos.x, pixelPos.y);
|
this.pixelShape.graphics.moveTo(pixelPos.x, pixelPos.y);
|
||||||
this.pixelShape.graphics.lineTo(pixelPos.x, pixelPos.y);
|
this.pixelShape.graphics.lineTo(pixelPos.x, pixelPos.y);
|
||||||
this.pixelShape.graphics.endFill();
|
this.pixelShape.graphics.endFill();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 如果renderableComponent的边界与camera.bounds相交 返回true
|
* 如果renderableComponent的边界与camera.bounds相交 返回true
|
||||||
* 用于处理isVisible标志的状态开关
|
* 用于处理isVisible标志的状态开关
|
||||||
* 在渲染方法中使用这个方法来决定是否渲染
|
* 在渲染方法中使用这个方法来决定是否渲染
|
||||||
* @param camera
|
* @param camera
|
||||||
*/
|
*/
|
||||||
public isVisibleFromCamera(camera: Camera): boolean {
|
public isVisibleFromCamera(camera: Camera): boolean {
|
||||||
if (!camera)
|
if (!camera)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
this.isVisible = camera.bounds.intersects(this.bounds);
|
this.isVisible = camera.bounds.intersects(this.bounds);
|
||||||
return this.isVisible;
|
return this.isVisible;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 较低的渲染层在前面,较高的在后面
|
* 较低的渲染层在前面,较高的在后面
|
||||||
* @param renderLayer
|
* @param renderLayer
|
||||||
*/
|
*/
|
||||||
public setRenderLayer(renderLayer: number): RenderableComponent {
|
public setRenderLayer(renderLayer: number): RenderableComponent {
|
||||||
if (renderLayer != this._renderLayer) {
|
if (renderLayer != this._renderLayer) {
|
||||||
let oldRenderLayer = this._renderLayer;
|
let oldRenderLayer = this._renderLayer;
|
||||||
this._renderLayer = renderLayer;
|
this._renderLayer = renderLayer;
|
||||||
|
|
||||||
// 如果该组件拥有一个实体,那么是由ComponentList管理,需要通知它改变了渲染层
|
// 如果该组件拥有一个实体,那么是由ComponentList管理,需要通知它改变了渲染层
|
||||||
if (this.entity && this.entity.scene)
|
if (this.entity && this.entity.scene)
|
||||||
this.entity.scene.renderableComponents.updateRenderableRenderLayer(this, oldRenderLayer, this._renderLayer);
|
this.entity.scene.renderableComponents.updateRenderableRenderLayer(this, oldRenderLayer, this._renderLayer);
|
||||||
}
|
}
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用于着色器处理精灵
|
* 用于着色器处理精灵
|
||||||
* @param color
|
* @param color
|
||||||
*/
|
*/
|
||||||
public setColor(color: number): RenderableComponent {
|
public setColor(color: number): RenderableComponent {
|
||||||
this.color = color;
|
this.color = color;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 从父实体的偏移量。用于向需要特定定位的实体
|
* 从父实体的偏移量。用于向需要特定定位的实体
|
||||||
* @param offset
|
* @param offset
|
||||||
*/
|
*/
|
||||||
public setLocalOffset(offset: Vector2): RenderableComponent {
|
public setLocalOffset(offset: Vector2): RenderableComponent {
|
||||||
if (this._localOffset != offset) {
|
if (this._localOffset != offset) {
|
||||||
this._localOffset = offset;
|
this._localOffset = offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 进行状态同步
|
* 进行状态同步
|
||||||
*/
|
*/
|
||||||
public sync(camera: Camera) {
|
public sync(camera: Camera) {
|
||||||
if (this.displayObject.x != this.bounds.x - camera.bounds.y) this.displayObject.x = this.bounds.x - camera.bounds.y;
|
if (this.displayObject.x != this.bounds.x - camera.bounds.y) this.displayObject.x = this.bounds.x - camera.bounds.y;
|
||||||
if (this.displayObject.y != this.bounds.y - camera.bounds.y) this.displayObject.y = this.bounds.y - camera.bounds.y;
|
if (this.displayObject.y != this.bounds.y - camera.bounds.y) this.displayObject.y = this.bounds.y - camera.bounds.y;
|
||||||
if (this.displayObject.scaleX != this.entity.scale.x) this.displayObject.scaleX = this.entity.scale.x;
|
if (this.displayObject.scaleX != this.entity.scale.x) this.displayObject.scaleX = this.entity.scale.x;
|
||||||
if (this.displayObject.scaleY != this.entity.scale.y) this.displayObject.scaleY = this.entity.scale.y;
|
if (this.displayObject.scaleY != this.entity.scale.y) this.displayObject.scaleY = this.entity.scale.y;
|
||||||
if (this.displayObject.rotation != this.entity.rotationDegrees) this.displayObject.rotation = this.entity.rotationDegrees;
|
if (this.displayObject.rotation != this.entity.rotationDegrees) this.displayObject.rotation = this.entity.rotationDegrees;
|
||||||
}
|
}
|
||||||
|
|
||||||
public compareTo(other: RenderableComponent){
|
public compareTo(other: RenderableComponent){
|
||||||
return other.renderLayer - this.renderLayer;
|
return other.renderLayer - this.renderLayer;
|
||||||
}
|
}
|
||||||
|
|
||||||
public toString() {
|
public toString() {
|
||||||
return `[RenderableComponent] renderLayer: ${this.renderLayer}`;
|
return `[RenderableComponent] renderLayer: ${this.renderLayer}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 当renderableComponent进入相机框架时调用
|
* 当renderableComponent进入相机框架时调用
|
||||||
* 如果渲染器不适用isVisibleFromCamera进行剔除检查 这些方法不会被调用
|
* 如果渲染器不适用isVisibleFromCamera进行剔除检查 这些方法不会被调用
|
||||||
*/
|
*/
|
||||||
protected onBecameVisible() {
|
protected onBecameVisible() {
|
||||||
this.displayObject.visible = this.isVisible;
|
this.displayObject.visible = this.isVisible;
|
||||||
this.debugDisplayObject.visible = this.isVisible;
|
this.debugDisplayObject.visible = this.isVisible;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 当renderableComponent离开相机框架时调用
|
* 当renderableComponent离开相机框架时调用
|
||||||
* 如果渲染器不适用isVisibleFromCamera进行剔除检查 这些方法不会被调用
|
* 如果渲染器不适用isVisibleFromCamera进行剔除检查 这些方法不会被调用
|
||||||
*/
|
*/
|
||||||
protected onBecameInvisible() {
|
protected onBecameInvisible() {
|
||||||
this.displayObject.visible = this.isVisible;
|
this.displayObject.visible = this.isVisible;
|
||||||
this.debugDisplayObject.visible = this.isVisible;
|
this.debugDisplayObject.visible = this.isVisible;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+62
-62
@@ -1,62 +1,62 @@
|
|||||||
module es {
|
module es {
|
||||||
import RenderTexture = egret.RenderTexture;
|
import RenderTexture = egret.RenderTexture;
|
||||||
import Bitmap = egret.Bitmap;
|
import Bitmap = egret.Bitmap;
|
||||||
import SpriteSheet = egret.SpriteSheet;
|
import SpriteSheet = egret.SpriteSheet;
|
||||||
|
|
||||||
export class Sprite {
|
export class Sprite {
|
||||||
public texture2D: egret.Texture;
|
public texture2D: egret.Texture;
|
||||||
public readonly sourceRect: Rectangle;
|
public readonly sourceRect: Rectangle;
|
||||||
public readonly center: Vector2;
|
public readonly center: Vector2;
|
||||||
public origin: Vector2;
|
public origin: Vector2;
|
||||||
public readonly uvs: Rectangle = new Rectangle();
|
public readonly uvs: Rectangle = new Rectangle();
|
||||||
|
|
||||||
constructor(texture: egret.Texture,
|
constructor(texture: egret.Texture,
|
||||||
sourceRect: Rectangle = new Rectangle(0, 0, texture.textureWidth, texture.textureHeight),
|
sourceRect: Rectangle = new Rectangle(0, 0, texture.textureWidth, texture.textureHeight),
|
||||||
origin: Vector2 = sourceRect.getHalfSize()) {
|
origin: Vector2 = sourceRect.getHalfSize()) {
|
||||||
this.texture2D = texture;
|
this.texture2D = texture;
|
||||||
this.sourceRect = sourceRect;
|
this.sourceRect = sourceRect;
|
||||||
this.center = new Vector2(sourceRect.width * 0.5, sourceRect.height * 0.5);
|
this.center = new Vector2(sourceRect.width * 0.5, sourceRect.height * 0.5);
|
||||||
this.origin = origin;
|
this.origin = origin;
|
||||||
|
|
||||||
let inverseTexW = 1 / texture.textureWidth;
|
let inverseTexW = 1 / texture.textureWidth;
|
||||||
let inverseTexH = 1 / texture.textureHeight;
|
let inverseTexH = 1 / texture.textureHeight;
|
||||||
|
|
||||||
this.uvs.x = sourceRect.x * inverseTexW;
|
this.uvs.x = sourceRect.x * inverseTexW;
|
||||||
this.uvs.y = sourceRect.y * inverseTexH;
|
this.uvs.y = sourceRect.y * inverseTexH;
|
||||||
this.uvs.width = sourceRect.width * inverseTexW;
|
this.uvs.width = sourceRect.width * inverseTexW;
|
||||||
this.uvs.height = sourceRect.height * inverseTexH;
|
this.uvs.height = sourceRect.height * inverseTexH;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 提供一个精灵的列/行等间隔的图集的精灵列表
|
* 提供一个精灵的列/行等间隔的图集的精灵列表
|
||||||
* @param texture
|
* @param texture
|
||||||
* @param cellWidth
|
* @param cellWidth
|
||||||
* @param cellHeight
|
* @param cellHeight
|
||||||
* @param cellOffset 处理时要包含的第一个单元格。基于0的索引
|
* @param cellOffset 处理时要包含的第一个单元格。基于0的索引
|
||||||
* @param maxCellsToInclude 包含的最大单元
|
* @param maxCellsToInclude 包含的最大单元
|
||||||
*/
|
*/
|
||||||
public static spritesFromAtlas(texture: egret.Texture, cellWidth: number, cellHeight: number,
|
public static spritesFromAtlas(texture: egret.Texture, cellWidth: number, cellHeight: number,
|
||||||
cellOffset: number = 0, maxCellsToInclude: number = Number.MAX_VALUE){
|
cellOffset: number = 0, maxCellsToInclude: number = Number.MAX_VALUE){
|
||||||
let sprites: Sprite[] = [];
|
let sprites: Sprite[] = [];
|
||||||
let cols = texture.textureWidth / cellWidth;
|
let cols = texture.textureWidth / cellWidth;
|
||||||
let rows = texture.textureHeight / cellHeight;
|
let rows = texture.textureHeight / cellHeight;
|
||||||
let i = 0;
|
let i = 0;
|
||||||
let spriteSheet = new SpriteSheet(texture);
|
let spriteSheet = new SpriteSheet(texture);
|
||||||
|
|
||||||
for (let y = 0; y < rows; y ++){
|
for (let y = 0; y < rows; y ++){
|
||||||
for (let x = 0; x < cols; x ++) {
|
for (let x = 0; x < cols; x ++) {
|
||||||
if (i++ < cellOffset) continue;
|
if (i++ < cellOffset) continue;
|
||||||
|
|
||||||
let texture = spriteSheet.getTexture(`${y}_${x}`);
|
let texture = spriteSheet.getTexture(`${y}_${x}`);
|
||||||
if (!texture)
|
if (!texture)
|
||||||
texture = spriteSheet.createTexture(`${y}_${x}`, x * cellWidth, y * cellHeight, cellWidth, cellHeight);
|
texture = spriteSheet.createTexture(`${y}_${x}`, x * cellWidth, y * cellHeight, cellWidth, cellHeight);
|
||||||
sprites.push(new Sprite(texture));
|
sprites.push(new Sprite(texture));
|
||||||
|
|
||||||
if (sprites.length == maxCellsToInclude) return sprites;
|
if (sprites.length == maxCellsToInclude) return sprites;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return sprites;
|
return sprites;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+11
-11
@@ -1,11 +1,11 @@
|
|||||||
module es {
|
module es {
|
||||||
export class SpriteAnimation {
|
export class SpriteAnimation {
|
||||||
public readonly sprites: Sprite[];
|
public readonly sprites: Sprite[];
|
||||||
public readonly frameRate: number;
|
public readonly frameRate: number;
|
||||||
|
|
||||||
constructor(sprites: Sprite[], frameRate: number = 10) {
|
constructor(sprites: Sprite[], frameRate: number = 10) {
|
||||||
this.sprites = sprites;
|
this.sprites = sprites;
|
||||||
this.frameRate = frameRate;
|
this.frameRate = frameRate;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+163
-163
@@ -1,163 +1,163 @@
|
|||||||
///<reference path="./SpriteRenderer.ts" />
|
///<reference path="./SpriteRenderer.ts" />
|
||||||
module es {
|
module es {
|
||||||
export enum LoopMode {
|
export enum LoopMode {
|
||||||
/** 在一个循环序列[A][B][C][A][B][C][A][B][C]... */
|
/** 在一个循环序列[A][B][C][A][B][C][A][B][C]... */
|
||||||
loop,
|
loop,
|
||||||
/** [A][B][C]然后暂停,设置时间为0 [A] */
|
/** [A][B][C]然后暂停,设置时间为0 [A] */
|
||||||
once,
|
once,
|
||||||
/** [A][B][C]。当它到达终点时,它会继续播放最后一帧,并且不会停止播放 */
|
/** [A][B][C]。当它到达终点时,它会继续播放最后一帧,并且不会停止播放 */
|
||||||
clampForever,
|
clampForever,
|
||||||
/** 以一个乒乓循环的方式永远播放这个序列 [A][B][C][B][A][B][C][B]... */
|
/** 以一个乒乓循环的方式永远播放这个序列 [A][B][C][B][A][B][C][B]... */
|
||||||
pingPong,
|
pingPong,
|
||||||
/** 将顺序向前播放一次,然后返回到开始[A][B][C][B][A],然后暂停并设置时间为0 */
|
/** 将顺序向前播放一次,然后返回到开始[A][B][C][B][A],然后暂停并设置时间为0 */
|
||||||
pingPongOnce,
|
pingPongOnce,
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum State {
|
export enum State {
|
||||||
none,
|
none,
|
||||||
running,
|
running,
|
||||||
paused,
|
paused,
|
||||||
completed,
|
completed,
|
||||||
}
|
}
|
||||||
|
|
||||||
export class SpriteAnimator extends SpriteRenderer {
|
export class SpriteAnimator extends SpriteRenderer {
|
||||||
/**
|
/**
|
||||||
* 在动画完成时触发,包括动画名称
|
* 在动画完成时触发,包括动画名称
|
||||||
*/
|
*/
|
||||||
public onAnimationCompletedEvent: (string) => {};
|
public onAnimationCompletedEvent: (string) => {};
|
||||||
/**
|
/**
|
||||||
* 动画播放速度
|
* 动画播放速度
|
||||||
*/
|
*/
|
||||||
public speed = 1;
|
public speed = 1;
|
||||||
/**
|
/**
|
||||||
* 动画的当前状态
|
* 动画的当前状态
|
||||||
*/
|
*/
|
||||||
public animationState = State.none;
|
public animationState = State.none;
|
||||||
/**
|
/**
|
||||||
* 当前动画
|
* 当前动画
|
||||||
*/
|
*/
|
||||||
public currentAnimation: SpriteAnimation;
|
public currentAnimation: SpriteAnimation;
|
||||||
/**
|
/**
|
||||||
* 当前动画的名称
|
* 当前动画的名称
|
||||||
*/
|
*/
|
||||||
public currentAnimationName: string;
|
public currentAnimationName: string;
|
||||||
/**
|
/**
|
||||||
* 当前动画的精灵数组中当前帧的索引
|
* 当前动画的精灵数组中当前帧的索引
|
||||||
*/
|
*/
|
||||||
public currentFrame: number;
|
public currentFrame: number;
|
||||||
public _elapsedTime: number = 0;
|
public _elapsedTime: number = 0;
|
||||||
public _loopMode: LoopMode;
|
public _loopMode: LoopMode;
|
||||||
|
|
||||||
constructor(sprite?: Sprite) {
|
constructor(sprite?: Sprite) {
|
||||||
super(sprite);
|
super(sprite);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 检查当前动画是否正在运行
|
* 检查当前动画是否正在运行
|
||||||
*/
|
*/
|
||||||
public get isRunning(): boolean {
|
public get isRunning(): boolean {
|
||||||
return this.animationState == State.running;
|
return this.animationState == State.running;
|
||||||
}
|
}
|
||||||
|
|
||||||
private _animations: Map<string, SpriteAnimation> = new Map<string, SpriteAnimation>();
|
private _animations: Map<string, SpriteAnimation> = new Map<string, SpriteAnimation>();
|
||||||
|
|
||||||
/** 提供对可用动画列表的访问 */
|
/** 提供对可用动画列表的访问 */
|
||||||
public get animations() {
|
public get animations() {
|
||||||
return this._animations;
|
return this._animations;
|
||||||
}
|
}
|
||||||
|
|
||||||
public update() {
|
public update() {
|
||||||
if (this.animationState != State.running || !this.currentAnimation) return;
|
if (this.animationState != State.running || !this.currentAnimation) return;
|
||||||
|
|
||||||
let animation = this.currentAnimation;
|
let animation = this.currentAnimation;
|
||||||
let secondsPerFrame = 1 / (animation.frameRate * this.speed);
|
let secondsPerFrame = 1 / (animation.frameRate * this.speed);
|
||||||
let iterationDuration = secondsPerFrame * animation.sprites.length;
|
let iterationDuration = secondsPerFrame * animation.sprites.length;
|
||||||
|
|
||||||
this._elapsedTime += Time.deltaTime;
|
this._elapsedTime += Time.deltaTime;
|
||||||
let time = Math.abs(this._elapsedTime);
|
let time = Math.abs(this._elapsedTime);
|
||||||
|
|
||||||
// Once和PingPongOnce完成后重置为Time = 0
|
// Once和PingPongOnce完成后重置为Time = 0
|
||||||
if (this._loopMode == LoopMode.once && time > iterationDuration ||
|
if (this._loopMode == LoopMode.once && time > iterationDuration ||
|
||||||
this._loopMode == LoopMode.pingPongOnce && time > iterationDuration * 2) {
|
this._loopMode == LoopMode.pingPongOnce && time > iterationDuration * 2) {
|
||||||
this.animationState = State.completed;
|
this.animationState = State.completed;
|
||||||
this._elapsedTime = 0;
|
this._elapsedTime = 0;
|
||||||
this.currentFrame = 0;
|
this.currentFrame = 0;
|
||||||
(this.displayObject as egret.Bitmap).texture = animation.sprites[this.currentFrame].texture2D;
|
(this.displayObject as egret.Bitmap).texture = animation.sprites[this.currentFrame].texture2D;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 弄清楚我们在哪个坐标系上
|
// 弄清楚我们在哪个坐标系上
|
||||||
let i = Math.floor(time / secondsPerFrame);
|
let i = Math.floor(time / secondsPerFrame);
|
||||||
let n = animation.sprites.length;
|
let n = animation.sprites.length;
|
||||||
if (n > 2 && (this._loopMode == LoopMode.pingPong || this._loopMode == LoopMode.pingPongOnce)) {
|
if (n > 2 && (this._loopMode == LoopMode.pingPong || this._loopMode == LoopMode.pingPongOnce)) {
|
||||||
// pingpong
|
// pingpong
|
||||||
let maxIndex = n - 1;
|
let maxIndex = n - 1;
|
||||||
this.currentFrame = maxIndex - Math.abs(maxIndex - i % (maxIndex * 2));
|
this.currentFrame = maxIndex - Math.abs(maxIndex - i % (maxIndex * 2));
|
||||||
} else {
|
} else {
|
||||||
this.currentFrame = i % n;
|
this.currentFrame = i % n;
|
||||||
}
|
}
|
||||||
|
|
||||||
(this.displayObject as egret.Bitmap).texture = animation.sprites[this.currentFrame].texture2D;
|
(this.displayObject as egret.Bitmap).texture = animation.sprites[this.currentFrame].texture2D;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 添加一个SpriteAnimation
|
* 添加一个SpriteAnimation
|
||||||
* @param name
|
* @param name
|
||||||
* @param animation
|
* @param animation
|
||||||
*/
|
*/
|
||||||
public addAnimation(name: string, animation: SpriteAnimation): SpriteAnimator {
|
public addAnimation(name: string, animation: SpriteAnimation): SpriteAnimator {
|
||||||
// 如果我们没有精灵,使用我们找到的第一帧
|
// 如果我们没有精灵,使用我们找到的第一帧
|
||||||
if (!this.sprite && animation.sprites.length > 0)
|
if (!this.sprite && animation.sprites.length > 0)
|
||||||
this.setSprite(animation.sprites[0]);
|
this.setSprite(animation.sprites[0]);
|
||||||
this._animations[name] = animation;
|
this._animations[name] = animation;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 以给定的名称放置动画。如果没有指定循环模式,则默认为循环
|
* 以给定的名称放置动画。如果没有指定循环模式,则默认为循环
|
||||||
* @param name
|
* @param name
|
||||||
* @param loopMode
|
* @param loopMode
|
||||||
*/
|
*/
|
||||||
public play(name: string, loopMode: LoopMode = null) {
|
public play(name: string, loopMode: LoopMode = null) {
|
||||||
this.currentAnimation = this._animations[name];
|
this.currentAnimation = this._animations[name];
|
||||||
this.currentAnimationName = name;
|
this.currentAnimationName = name;
|
||||||
this.currentFrame = 0;
|
this.currentFrame = 0;
|
||||||
this.animationState = State.running;
|
this.animationState = State.running;
|
||||||
(this.displayObject as egret.Bitmap).texture = this.currentAnimation.sprites[0].texture2D;
|
(this.displayObject as egret.Bitmap).texture = this.currentAnimation.sprites[0].texture2D;
|
||||||
this._elapsedTime = 0;
|
this._elapsedTime = 0;
|
||||||
this._loopMode = loopMode ? loopMode : LoopMode.loop;
|
this._loopMode = loopMode ? loopMode : LoopMode.loop;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 检查动画是否正在播放(即动画是活动的)。它可能仍然处于暂停状态)
|
* 检查动画是否正在播放(即动画是活动的)。它可能仍然处于暂停状态)
|
||||||
* @param name
|
* @param name
|
||||||
*/
|
*/
|
||||||
public isAnimationActive(name: string): boolean {
|
public isAnimationActive(name: string): boolean {
|
||||||
return this.currentAnimation && this.currentAnimationName == name;
|
return this.currentAnimation && this.currentAnimationName == name;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 暂停动画
|
* 暂停动画
|
||||||
*/
|
*/
|
||||||
public pause() {
|
public pause() {
|
||||||
this.animationState = State.paused;
|
this.animationState = State.paused;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 继续动画
|
* 继续动画
|
||||||
*/
|
*/
|
||||||
public unPause() {
|
public unPause() {
|
||||||
this.animationState = State.running;
|
this.animationState = State.running;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 停止当前动画并将其设为null
|
* 停止当前动画并将其设为null
|
||||||
*/
|
*/
|
||||||
public stop() {
|
public stop() {
|
||||||
this.currentAnimation = null;
|
this.currentAnimation = null;
|
||||||
this.currentAnimationName = null;
|
this.currentAnimationName = null;
|
||||||
this.currentFrame = 0;
|
this.currentFrame = 0;
|
||||||
this.animationState = State.none;
|
this.animationState = State.none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+131
-131
@@ -1,131 +1,131 @@
|
|||||||
module es {
|
module es {
|
||||||
import Bitmap = egret.Bitmap;
|
import Bitmap = egret.Bitmap;
|
||||||
|
|
||||||
export class SpriteRenderer extends RenderableComponent {
|
export class SpriteRenderer extends RenderableComponent {
|
||||||
constructor(sprite: Sprite | egret.Texture = null) {
|
constructor(sprite: Sprite | egret.Texture = null) {
|
||||||
super();
|
super();
|
||||||
if (sprite instanceof Sprite)
|
if (sprite instanceof Sprite)
|
||||||
this.setSprite(sprite);
|
this.setSprite(sprite);
|
||||||
else if (sprite instanceof egret.Texture)
|
else if (sprite instanceof egret.Texture)
|
||||||
this.setSprite(new Sprite(sprite));
|
this.setSprite(new Sprite(sprite));
|
||||||
}
|
}
|
||||||
|
|
||||||
public get bounds() {
|
public get bounds() {
|
||||||
if (this._areBoundsDirty) {
|
if (this._areBoundsDirty) {
|
||||||
if (this._sprite) {
|
if (this._sprite) {
|
||||||
this._bounds.calculateBounds(this.entity.transform.position, this._localOffset, this._origin,
|
this._bounds.calculateBounds(this.entity.transform.position, this._localOffset, this._origin,
|
||||||
this.entity.transform.scale, this.entity.transform.rotation, this._sprite.sourceRect.width,
|
this.entity.transform.scale, this.entity.transform.rotation, this._sprite.sourceRect.width,
|
||||||
this._sprite.sourceRect.height);
|
this._sprite.sourceRect.height);
|
||||||
this._areBoundsDirty = false;
|
this._areBoundsDirty = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return this._bounds;
|
return this._bounds;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用归一化方法设置原点
|
* 用归一化方法设置原点
|
||||||
* x/y 均为 0-1
|
* x/y 均为 0-1
|
||||||
*/
|
*/
|
||||||
public get originNormalized(): Vector2 {
|
public get originNormalized(): Vector2 {
|
||||||
return new Vector2(this._origin.x / this.width * this.entity.transform.scale.x,
|
return new Vector2(this._origin.x / this.width * this.entity.transform.scale.x,
|
||||||
this._origin.y / this.height * this.entity.transform.scale.y);
|
this._origin.y / this.height * this.entity.transform.scale.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用归一化方法设置原点
|
* 用归一化方法设置原点
|
||||||
* x/y 均为 0-1
|
* x/y 均为 0-1
|
||||||
* @param value
|
* @param value
|
||||||
*/
|
*/
|
||||||
public set originNormalized(value: Vector2) {
|
public set originNormalized(value: Vector2) {
|
||||||
this.setOrigin(new Vector2(value.x * this.width / this.entity.transform.scale.x,
|
this.setOrigin(new Vector2(value.x * this.width / this.entity.transform.scale.x,
|
||||||
value.y * this.height / this.entity.transform.scale.y));
|
value.y * this.height / this.entity.transform.scale.y));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected _origin: Vector2;
|
protected _origin: Vector2;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 精灵的原点。这是在设置精灵时自动设置的
|
* 精灵的原点。这是在设置精灵时自动设置的
|
||||||
*/
|
*/
|
||||||
public get origin(): Vector2 {
|
public get origin(): Vector2 {
|
||||||
return this._origin;
|
return this._origin;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 精灵的原点。这是在设置精灵时自动设置的
|
* 精灵的原点。这是在设置精灵时自动设置的
|
||||||
* @param value
|
* @param value
|
||||||
*/
|
*/
|
||||||
public set origin(value: Vector2) {
|
public set origin(value: Vector2) {
|
||||||
this.setOrigin(value);
|
this.setOrigin(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected _sprite: Sprite;
|
protected _sprite: Sprite;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 应该由这个精灵显示的精灵
|
* 应该由这个精灵显示的精灵
|
||||||
* 当设置时,精灵的原点也被设置为精灵的origin
|
* 当设置时,精灵的原点也被设置为精灵的origin
|
||||||
*/
|
*/
|
||||||
public get sprite(): Sprite {
|
public get sprite(): Sprite {
|
||||||
return this._sprite;
|
return this._sprite;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 应该由这个精灵显示的精灵
|
* 应该由这个精灵显示的精灵
|
||||||
* 当设置时,精灵的原点也被设置为精灵的origin
|
* 当设置时,精灵的原点也被设置为精灵的origin
|
||||||
* @param value
|
* @param value
|
||||||
*/
|
*/
|
||||||
public set sprite(value: Sprite) {
|
public set sprite(value: Sprite) {
|
||||||
this.setSprite(value);
|
this.setSprite(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置精灵并更新精灵的原点以匹配sprite.origin
|
* 设置精灵并更新精灵的原点以匹配sprite.origin
|
||||||
* @param sprite
|
* @param sprite
|
||||||
*/
|
*/
|
||||||
public setSprite(sprite: Sprite): SpriteRenderer {
|
public setSprite(sprite: Sprite): SpriteRenderer {
|
||||||
this._sprite = sprite;
|
this._sprite = sprite;
|
||||||
if (this._sprite) {
|
if (this._sprite) {
|
||||||
this._origin = this._sprite.origin;
|
this._origin = this._sprite.origin;
|
||||||
this.displayObject.anchorOffsetX = this._origin.x;
|
this.displayObject.anchorOffsetX = this._origin.x;
|
||||||
this.displayObject.anchorOffsetY = this._origin.y;
|
this.displayObject.anchorOffsetY = this._origin.y;
|
||||||
}
|
}
|
||||||
this.displayObject = new Bitmap(sprite.texture2D);
|
this.displayObject = new Bitmap(sprite.texture2D);
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置可渲染的原点
|
* 设置可渲染的原点
|
||||||
* @param origin
|
* @param origin
|
||||||
*/
|
*/
|
||||||
public setOrigin(origin: Vector2): SpriteRenderer {
|
public setOrigin(origin: Vector2): SpriteRenderer {
|
||||||
if (this._origin != origin) {
|
if (this._origin != origin) {
|
||||||
this._origin = origin;
|
this._origin = origin;
|
||||||
this.displayObject.anchorOffsetX = this._origin.x;
|
this.displayObject.anchorOffsetX = this._origin.x;
|
||||||
this.displayObject.anchorOffsetY = this._origin.y;
|
this.displayObject.anchorOffsetY = this._origin.y;
|
||||||
this._areBoundsDirty = true;
|
this._areBoundsDirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用归一化方法设置原点
|
* 用归一化方法设置原点
|
||||||
* x/y 均为 0-1
|
* x/y 均为 0-1
|
||||||
* @param value
|
* @param value
|
||||||
*/
|
*/
|
||||||
public setOriginNormalized(value: Vector2): SpriteRenderer {
|
public setOriginNormalized(value: Vector2): SpriteRenderer {
|
||||||
this.setOrigin(new Vector2(value.x * this.width / this.entity.transform.scale.x,
|
this.setOrigin(new Vector2(value.x * this.width / this.entity.transform.scale.x,
|
||||||
value.y * this.height / this.entity.transform.scale.y));
|
value.y * this.height / this.entity.transform.scale.y));
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public render(camera: Camera) {
|
public render(camera: Camera) {
|
||||||
this.sync(camera);
|
this.sync(camera);
|
||||||
|
|
||||||
if (this.displayObject.x != this.bounds.x - camera.bounds.x) this.displayObject.x = this.bounds.x - camera.bounds.x;
|
if (this.displayObject.x != this.bounds.x - camera.bounds.x) this.displayObject.x = this.bounds.x - camera.bounds.x;
|
||||||
if (this.displayObject.y != this.bounds.y - camera.bounds.y) this.displayObject.y = this.bounds.y - camera.bounds.y;
|
if (this.displayObject.y != this.bounds.y - camera.bounds.y) this.displayObject.y = this.bounds.y - camera.bounds.y;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
+148
-148
@@ -1,148 +1,148 @@
|
|||||||
///<reference path="./SpriteRenderer.ts" />
|
///<reference path="./SpriteRenderer.ts" />
|
||||||
module es {
|
module es {
|
||||||
import Bitmap = egret.Bitmap;
|
import Bitmap = egret.Bitmap;
|
||||||
import RenderTexture = egret.RenderTexture;
|
import RenderTexture = egret.RenderTexture;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 滚动由两张图片组合而成
|
* 滚动由两张图片组合而成
|
||||||
*/
|
*/
|
||||||
export class TiledSpriteRenderer extends SpriteRenderer {
|
export class TiledSpriteRenderer extends SpriteRenderer {
|
||||||
public get bounds(): Rectangle {
|
public get bounds(): Rectangle {
|
||||||
if (this._areBoundsDirty){
|
if (this._areBoundsDirty){
|
||||||
if (this._sprite){
|
if (this._sprite){
|
||||||
this._bounds.calculateBounds(this.entity.transform.position, this._localOffset, this._origin,
|
this._bounds.calculateBounds(this.entity.transform.position, this._localOffset, this._origin,
|
||||||
this.entity.transform.scale, this.entity.transform.rotation, this.width, this.height);
|
this.entity.transform.scale, this.entity.transform.rotation, this.width, this.height);
|
||||||
this._areBoundsDirty = false;
|
this._areBoundsDirty = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return this._bounds;
|
return this._bounds;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 纹理滚动的x值
|
* 纹理滚动的x值
|
||||||
*/
|
*/
|
||||||
public get scrollX() {
|
public get scrollX() {
|
||||||
return this._sourceRect.x;
|
return this._sourceRect.x;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 纹理滚动的x值
|
* 纹理滚动的x值
|
||||||
* @param value
|
* @param value
|
||||||
*/
|
*/
|
||||||
public set scrollX(value: number) {
|
public set scrollX(value: number) {
|
||||||
this._sourceRect.x = value;
|
this._sourceRect.x = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 纹理滚动的y值
|
* 纹理滚动的y值
|
||||||
*/
|
*/
|
||||||
public get scrollY() {
|
public get scrollY() {
|
||||||
return this._sourceRect.y;
|
return this._sourceRect.y;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 纹理滚动的y值
|
* 纹理滚动的y值
|
||||||
* @param value
|
* @param value
|
||||||
*/
|
*/
|
||||||
public set scrollY(value: number) {
|
public set scrollY(value: number) {
|
||||||
this._sourceRect.y = value;
|
this._sourceRect.y = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 纹理比例尺
|
* 纹理比例尺
|
||||||
*/
|
*/
|
||||||
public get textureScale(): Vector2 {
|
public get textureScale(): Vector2 {
|
||||||
return this._textureScale;
|
return this._textureScale;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 纹理比例尺
|
* 纹理比例尺
|
||||||
* @param value
|
* @param value
|
||||||
*/
|
*/
|
||||||
public set textureScale(value: Vector2) {
|
public set textureScale(value: Vector2) {
|
||||||
this._textureScale = value;
|
this._textureScale = value;
|
||||||
|
|
||||||
// 重新计算我们的inverseTextureScale和源矩形大小
|
// 重新计算我们的inverseTextureScale和源矩形大小
|
||||||
this._inverseTexScale = new Vector2(1 / this._textureScale.x, 1 / this._textureScale.y);
|
this._inverseTexScale = new Vector2(1 / this._textureScale.x, 1 / this._textureScale.y);
|
||||||
this._sourceRect.width = Math.floor(this._sprite.sourceRect.width * this._inverseTexScale.x);
|
this._sourceRect.width = Math.floor(this._sprite.sourceRect.width * this._inverseTexScale.x);
|
||||||
this._sourceRect.height = Math.floor(this._sprite.sourceRect.height * this._inverseTexScale.y);
|
this._sourceRect.height = Math.floor(this._sprite.sourceRect.height * this._inverseTexScale.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 覆盖宽度值,这样TiledSprite可以有一个独立于其纹理的宽度
|
* 覆盖宽度值,这样TiledSprite可以有一个独立于其纹理的宽度
|
||||||
*/
|
*/
|
||||||
public get width(): number{
|
public get width(): number{
|
||||||
return this._sourceRect.width;
|
return this._sourceRect.width;
|
||||||
}
|
}
|
||||||
|
|
||||||
public set width(value: number) {
|
public set width(value: number) {
|
||||||
this._areBoundsDirty = true;
|
this._areBoundsDirty = true;
|
||||||
this._sourceRect.width = value;
|
this._sourceRect.width = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public get height(): number {
|
public get height(): number {
|
||||||
return this._sourceRect.height;
|
return this._sourceRect.height;
|
||||||
}
|
}
|
||||||
|
|
||||||
public set height(value: number) {
|
public set height(value: number) {
|
||||||
this._areBoundsDirty = true;
|
this._areBoundsDirty = true;
|
||||||
this._sourceRect.height = value;
|
this._sourceRect.height = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public get gapXY(): Vector2{
|
public get gapXY(): Vector2{
|
||||||
return new Vector2(this._gapX, this._gapY);
|
return new Vector2(this._gapX, this._gapY);
|
||||||
}
|
}
|
||||||
|
|
||||||
public set gapXY(value: Vector2){
|
public set gapXY(value: Vector2){
|
||||||
this._gapX = value.x;
|
this._gapX = value.x;
|
||||||
this._gapY = value.y;
|
this._gapY = value.y;
|
||||||
|
|
||||||
let renderTexture = new RenderTexture();
|
let renderTexture = new RenderTexture();
|
||||||
let newRectangle = this.sprite.sourceRect;
|
let newRectangle = this.sprite.sourceRect;
|
||||||
newRectangle.x = 0;
|
newRectangle.x = 0;
|
||||||
newRectangle.y = 0;
|
newRectangle.y = 0;
|
||||||
newRectangle.width += this._gapX;
|
newRectangle.width += this._gapX;
|
||||||
newRectangle.height += this._gapY;
|
newRectangle.height += this._gapY;
|
||||||
renderTexture.drawToTexture(this.displayObject, newRectangle);
|
renderTexture.drawToTexture(this.displayObject, newRectangle);
|
||||||
|
|
||||||
if (!this.displayObject){
|
if (!this.displayObject){
|
||||||
this.displayObject = new Bitmap(renderTexture);
|
this.displayObject = new Bitmap(renderTexture);
|
||||||
}else{
|
}else{
|
||||||
(this.displayObject as Bitmap).texture = renderTexture;
|
(this.displayObject as Bitmap).texture = renderTexture;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected _sourceRect: Rectangle;
|
protected _sourceRect: Rectangle;
|
||||||
protected _textureScale = Vector2.one;
|
protected _textureScale = Vector2.one;
|
||||||
protected _inverseTexScale = Vector2.one;
|
protected _inverseTexScale = Vector2.one;
|
||||||
private _gapX = 0;
|
private _gapX = 0;
|
||||||
private _gapY = 0;
|
private _gapY = 0;
|
||||||
|
|
||||||
constructor(sprite: Sprite) {
|
constructor(sprite: Sprite) {
|
||||||
super(sprite);
|
super(sprite);
|
||||||
|
|
||||||
this._sourceRect = sprite.sourceRect;
|
this._sourceRect = sprite.sourceRect;
|
||||||
let bitmap = this.displayObject as Bitmap;
|
let bitmap = this.displayObject as Bitmap;
|
||||||
bitmap.$fillMode = egret.BitmapFillMode.REPEAT;
|
bitmap.$fillMode = egret.BitmapFillMode.REPEAT;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置间隔
|
* 设置间隔
|
||||||
* @param value
|
* @param value
|
||||||
*/
|
*/
|
||||||
public setGapXY(value: Vector2): TiledSpriteRenderer {
|
public setGapXY(value: Vector2): TiledSpriteRenderer {
|
||||||
this.gapXY = value;
|
this.gapXY = value;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public render(camera: es.Camera) {
|
public render(camera: es.Camera) {
|
||||||
super.render(camera);
|
super.render(camera);
|
||||||
|
|
||||||
let bitmap = this.displayObject as Bitmap;
|
let bitmap = this.displayObject as Bitmap;
|
||||||
bitmap.width = this.width;
|
bitmap.width = this.width;
|
||||||
bitmap.height = this.height;
|
bitmap.height = this.height;
|
||||||
bitmap.scrollRect = this._sourceRect;
|
bitmap.scrollRect = this._sourceRect;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -133,7 +133,7 @@ module es {
|
|||||||
* 返回null将使协程在下一帧中被执行。
|
* 返回null将使协程在下一帧中被执行。
|
||||||
* @param enumerator
|
* @param enumerator
|
||||||
*/
|
*/
|
||||||
public static startCoroutine(enumerator: IEnumerator){
|
public static startCoroutine(enumerator: Iterator<any>){
|
||||||
return this._instance._coroutineManager.startCoroutine(enumerator);
|
return this._instance._coroutineManager.startCoroutine(enumerator);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ module es {
|
|||||||
* CoroutineManager使用的内部类,用于隐藏协同程序所需的数据
|
* CoroutineManager使用的内部类,用于隐藏协同程序所需的数据
|
||||||
*/
|
*/
|
||||||
export class CoroutineImpl implements ICoroutine, IPoolable {
|
export class CoroutineImpl implements ICoroutine, IPoolable {
|
||||||
public enumerator: IEnumerator;
|
public enumerator: Iterator<any>;
|
||||||
/**
|
/**
|
||||||
* 每当产生延迟时,它就被添加到跟踪延迟的waitTimer中
|
* 每当产生延迟时,它就被添加到跟踪延迟的waitTimer中
|
||||||
*/
|
*/
|
||||||
@@ -34,12 +34,6 @@ module es {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IEnumerator {
|
|
||||||
current: any;
|
|
||||||
moveNext(): boolean;
|
|
||||||
reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 基本CoroutineManager。协同程序可以做以下事情:
|
* 基本CoroutineManager。协同程序可以做以下事情:
|
||||||
* - return null(在下一帧继续执行)
|
* - return null(在下一帧继续执行)
|
||||||
@@ -60,7 +54,7 @@ module es {
|
|||||||
* 将i枚举器添加到CoroutineManager。协程在每一帧调用更新之前被执行。
|
* 将i枚举器添加到CoroutineManager。协程在每一帧调用更新之前被执行。
|
||||||
* @param enumerator
|
* @param enumerator
|
||||||
*/
|
*/
|
||||||
public startCoroutine(enumerator: IEnumerator) {
|
public startCoroutine(enumerator: Iterator<any>) {
|
||||||
// 查找或创建CoroutineImpl
|
// 查找或创建CoroutineImpl
|
||||||
let coroutine = Pool.obtain<CoroutineImpl>(CoroutineImpl);
|
let coroutine = Pool.obtain<CoroutineImpl>(CoroutineImpl);
|
||||||
coroutine.prepareForuse();
|
coroutine.prepareForuse();
|
||||||
@@ -126,30 +120,30 @@ module es {
|
|||||||
* @param coroutine
|
* @param coroutine
|
||||||
*/
|
*/
|
||||||
public tickCoroutine(coroutine: CoroutineImpl){
|
public tickCoroutine(coroutine: CoroutineImpl){
|
||||||
|
let current = coroutine.enumerator.next();
|
||||||
// 这个协同程序已经完成了
|
// 这个协同程序已经完成了
|
||||||
if (!coroutine.enumerator.moveNext() || coroutine.isDone){
|
if (!current.value || current.done){
|
||||||
Pool.free<CoroutineImpl>(coroutine);
|
Pool.free<CoroutineImpl>(coroutine);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (coroutine.enumerator.current == null){
|
if (!current.value){
|
||||||
// 再运行下一帧
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (coroutine.enumerator.current instanceof WaitForSeconds){
|
if (current.value instanceof WaitForSeconds){
|
||||||
coroutine.waitTimer = (coroutine.enumerator.current as WaitForSeconds).waitTime;
|
coroutine.waitTimer = (current.value as WaitForSeconds).waitTime;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (coroutine.enumerator.current instanceof Number){
|
if (current.value instanceof Number){
|
||||||
console.warn("协同程序检查返回一个Number类型,请不要在生产环境使用");
|
console.warn("协同程序检查返回一个Number类型,请不要在生产环境使用");
|
||||||
coroutine.waitTimer = Number(coroutine.enumerator.current);
|
coroutine.waitTimer = Number(current);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (coroutine.enumerator.current instanceof CoroutineImpl){
|
if (current.value instanceof CoroutineImpl){
|
||||||
coroutine.waitForCoroutine = coroutine.enumerator.current as CoroutineImpl;
|
coroutine.waitForCoroutine = current.value as CoroutineImpl;
|
||||||
return true;
|
return true;
|
||||||
}else {
|
}else {
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
Reference in New Issue
Block a user