149 lines
4.3 KiB
TypeScript
149 lines
4.3 KiB
TypeScript
///<reference path="./SpriteRenderer.ts" />
|
||
module es {
|
||
import Bitmap = egret.Bitmap;
|
||
import RenderTexture = egret.RenderTexture;
|
||
|
||
/**
|
||
* 滚动由两张图片组合而成
|
||
*/
|
||
export class TiledSpriteRenderer extends SpriteRenderer {
|
||
public get bounds(): Rectangle {
|
||
if (this._areBoundsDirty){
|
||
if (this._sprite){
|
||
this._bounds.calculateBounds(this.entity.transform.position, this._localOffset, this._origin,
|
||
this.entity.transform.scale, this.entity.transform.rotation, this.width, this.height);
|
||
this._areBoundsDirty = false;
|
||
}
|
||
}
|
||
|
||
return this._bounds;
|
||
}
|
||
|
||
/**
|
||
* 纹理滚动的x值
|
||
*/
|
||
public get scrollX() {
|
||
return this._sourceRect.x;
|
||
}
|
||
|
||
/**
|
||
* 纹理滚动的x值
|
||
* @param value
|
||
*/
|
||
public set scrollX(value: number) {
|
||
this._sourceRect.x = value;
|
||
}
|
||
|
||
/**
|
||
* 纹理滚动的y值
|
||
*/
|
||
public get scrollY() {
|
||
return this._sourceRect.y;
|
||
}
|
||
|
||
/**
|
||
* 纹理滚动的y值
|
||
* @param value
|
||
*/
|
||
public set scrollY(value: number) {
|
||
this._sourceRect.y = value;
|
||
}
|
||
|
||
/**
|
||
* 纹理比例尺
|
||
*/
|
||
public get textureScale(): Vector2 {
|
||
return this._textureScale;
|
||
}
|
||
|
||
/**
|
||
* 纹理比例尺
|
||
* @param value
|
||
*/
|
||
public set textureScale(value: Vector2) {
|
||
this._textureScale = value;
|
||
|
||
// 重新计算我们的inverseTextureScale和源矩形大小
|
||
this._inverseTexScale = new Vector2(1 / this._textureScale.x, 1 / this._textureScale.y);
|
||
this._sourceRect.width = this._sprite.sourceRect.width * this._inverseTexScale.x;
|
||
this._sourceRect.height = this._sprite.sourceRect.height * this._inverseTexScale.y;
|
||
}
|
||
|
||
/**
|
||
* 覆盖宽度值,这样TiledSprite可以有一个独立于其纹理的宽度
|
||
*/
|
||
public get width(): number{
|
||
return this._sourceRect.width;
|
||
}
|
||
|
||
public set width(value: number) {
|
||
this._areBoundsDirty = true;
|
||
this._sourceRect.width = value;
|
||
}
|
||
|
||
public get height(): number {
|
||
return this._sourceRect.height;
|
||
}
|
||
|
||
public set height(value: number) {
|
||
this._areBoundsDirty = true;
|
||
this._sourceRect.height = value;
|
||
}
|
||
|
||
public get gapXY(): Vector2{
|
||
return new Vector2(this._gapX, this._gapY);
|
||
}
|
||
|
||
public set gapXY(value: Vector2){
|
||
this._gapX = value.x;
|
||
this._gapY = value.y;
|
||
|
||
let renderTexture = new RenderTexture();
|
||
let newRectangle = this.sprite.sourceRect;
|
||
newRectangle.x = 0;
|
||
newRectangle.y = 0;
|
||
newRectangle.width += this._gapX;
|
||
newRectangle.height += this._gapY;
|
||
renderTexture.drawToTexture(this.displayObject, newRectangle);
|
||
|
||
if (!this.displayObject){
|
||
this.displayObject = new Bitmap(renderTexture);
|
||
}else{
|
||
(this.displayObject as Bitmap).texture = renderTexture;
|
||
}
|
||
}
|
||
|
||
protected _sourceRect: Rectangle;
|
||
protected _textureScale = Vector2.one;
|
||
protected _inverseTexScale = Vector2.one;
|
||
private _gapX = 0;
|
||
private _gapY = 0;
|
||
|
||
constructor(sprite: Sprite) {
|
||
super(sprite);
|
||
|
||
this._sourceRect = sprite.sourceRect;
|
||
let bitmap = this.displayObject as Bitmap;
|
||
bitmap.$fillMode = egret.BitmapFillMode.REPEAT;
|
||
}
|
||
|
||
/**
|
||
* 设置间隔
|
||
* @param value
|
||
*/
|
||
public setGapXY(value: Vector2): TiledSpriteRenderer {
|
||
this.gapXY = value;
|
||
return this;
|
||
}
|
||
|
||
public render(camera: es.Camera) {
|
||
super.render(camera);
|
||
|
||
let bitmap = this.displayObject as Bitmap;
|
||
bitmap.width = this.width;
|
||
bitmap.height = this.height;
|
||
bitmap.scrollRect = this._sourceRect;
|
||
}
|
||
}
|
||
}
|