Coroutine 类型从IEnumerable为Iterator

This commit is contained in:
yhh
2020-09-01 11:51:03 +08:00
parent 8db028db1c
commit 34a8d48df9
26 changed files with 3835 additions and 3057 deletions
+1 -1
View File
@@ -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>
+248 -175
View File
@@ -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;
} }
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
+6 -1
View File
@@ -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

+2 -1
View File
@@ -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));
}); });
} }
} }
} }
+1 -1
View File
@@ -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 @@
{}
+8 -6
View File
@@ -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",
"/组件/" "/组件/"
] ]
} }
+1
View File
@@ -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

+248 -175
View File
@@ -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
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
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[] = [];
/**
* uvuv以最适合的方式映射纹理
* @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;
}
}
@@ -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;
} }
} }
} }
@@ -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;
} }
} }
} }
@@ -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;
} }
} }
} }
@@ -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;
} }
} }
} }
@@ -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;
} }
} }
} }
@@ -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;
} }
} }
} }
+1 -1
View File
@@ -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);
} }
+11 -17
View File
@@ -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;