public void Update(WorldRender rend) { if (pendingUpdate || state == ChunkState.Empty) { FillSprites(rend); pendingUpdate = false; } }
// Clears all SpriteRenderer objects from this // chunk and returns them to a pool. public void ClearSprites(WorldRender rend) { for (int i = 0; i < rects.Count; ++i) { rend.ReturnTileRect(rects[i]); } rects.Clear(); state = ChunkState.Empty; }
// Adds sprites that fit the tile data for this chunk, // making it able to be rendered. private void FillSprites(WorldRender rend) { if (rects.Count > 0) { ClearSprites(rend); } for (int i = 0; i < Size2; ++i) { Tile tile = tiles[i]; if (tile != TileType.Air) { mask.Set(i, tile.data.visible); } else { mask.Set(i, false); } } int x = 0, y = 0; while (true) { SpriteRect rect = GetNextRectStart(x, y); if (rect == null) { break; } RectScanX(rect); RectScanY(rect); SetSprite(rend, rect); x = rect.startX + rect.width; y = rect.startY; if (x == Size) { x = 0; ++y; } } state = ChunkState.Filled; }
// Fills an area of the chunk with a tile as determined by // the given SpriteRect object. private void SetSprite(WorldRender rend, SpriteRect rect) { Tile tile = rect.tile; SpriteRenderer tileRect = rend.GetTileRect(); tileRect.sprite = tile.data.sprite; tileRect.sortingOrder = tile.data.sortingOrder; tileRect.color = new Color(1.0f, 1.0f, 1.0f, tile.data.alpha); tileRect.drawMode = rect.width > 1 || rect.height > 1 ? SpriteDrawMode.Tiled : SpriteDrawMode.Simple; tileRect.size = new Vector2(rect.width, rect.height); Transform t = tileRect.transform; t.position = new Vector3(wPos.x + rect.startX, wPos.y + rect.startY); t.localScale = Vector3.one; rects.Add(tileRect); }