public virtual void Update()
{
if (_clipNode != null && !_skipZero) {
// get position of _clipNode relative to this
Vector2 relPos = StageToLocal(_clipNode.GetPosition());
float xMin = relPos.x - _clipWidth / 2 - _tileWidth * 0.75f;
float yMin = relPos.y - _clipHeight / 2 - _tileHeight * 0.75f;
// check if the _clipNode has moved enough to check tile positions
if (Mathf.Round(xMin / _tileWidth) == _clipPos.x && Mathf.Round(yMin / _tileHeight) == _clipPos.y) {
return;
}
_clipPos = new Vector2(Mathf.Round(xMin / _tileWidth), Mathf.Round(yMin / _tileHeight));
float tileOffsetX = (Mathf.Floor(_clipWidth / _tileWidth) + 2) * _tileWidth;
float tileOffsetY = (Mathf.Floor(_clipHeight / _tileHeight) + 2) * _tileHeight;
float xMax = xMin + tileOffsetX;
float yMax = yMin + tileOffsetY;
foreach (FSprite tile in _tiles) {
bool tileChangedX = false;
bool tileChangedY = false;
while (tile.x < xMin) {
tile.x += tileOffsetX;
tileChangedX = true;
}
if (!tileChangedX) {
while (tile.x > xMax) {
tile.x -= tileOffsetX;
tileChangedX = true;
}
}
while (tile.y < yMin) {
tile.y += tileOffsetY;
tileChangedY = true;
}
if (!tileChangedY) {
while (tile.y > yMax) {
tile.y -= tileOffsetY;
tileChangedY = true;
}
}
if (tileChangedX || tileChangedY) {
int tileX = Mathf.FloorToInt((tile.x - _tileWidth / 2) / _tileWidth);
int tileY = Mathf.FloorToInt((-tile.y - _tileHeight / 2) / _tileHeight);
if (repeatX) {
while (tileX < 0) {
tileX += _tilesWide;
}
while (tileX >= _tilesWide) {
tileX -= _tilesWide ;
}
} else if (tileX < 0 || tileX >= _tilesWide) { // display empty tile, outside of known data
tileX = -1;
tileY = -1;
}
if (repeatY) {
while (tileY < 0) {
tileY += _tilesHigh;
}
while (tileY >= _tilesHigh) {
tileY -= _tilesHigh;
}
} else if (tileY < 0 || tileY >= _tilesHigh) { // display empty tile, outside of known data
tileX = -1;
tileY = -1;
}
int frame = tileX + tileY * _tilesWide;
if (frame >= 0 && frame < _tileArray.GetLength(0)) {
int frameNum = _tileArray[frame];
tile.element = Futile.atlasManager.GetElementWithName(_baseName+"_"+frameNum);
tile.isVisible = true;
} else {
tile.isVisible = false;
}
}
}
}
}