示例#1
0
    public void GenerateChunksWithin(Rect frameDisc, Rect frameCont)
    {
        for (float y = frameDisc.y; y < frameDisc.y + frameDisc.height; y++)
        {
            for (float x = frameDisc.x; x < frameDisc.x + frameDisc.width; x++)
            {
                ChunkTexture chunk = null;
                if (chunks[((int)y + radiusChunks) * radiusChunks * 2 + ((int)x + radiusChunks)] != null)
                {
                    chunk = chunks[((int)y + radiusChunks) * radiusChunks * 2 + ((int)x + radiusChunks)];
                }
                else
                {
                    Vector3 chunkPos = new Vector3(x * GameManager.CHUNK_SIZE, y * GameManager.CHUNK_SIZE, 0f);

                    chunk = (ChunkTexture)Instantiate(chunkTexture, chunkPos, Quaternion.identity);
                    chunk.Init();

                    chunk.transform.parent = gameObject.transform;

                    // chunk.FillTextureTrans();

                    chunks[((int)y + radiusChunks) * radiusChunks * 2 + ((int)x + radiusChunks)] = chunk;
                }

                Rect chunkBox   = new Rect(x, y, 1f, 1f);
                Rect overlapBox = MathTests.GetOverlappingBox(frameCont, chunkBox);

                Rect chunkDivBox = GetChunkDivisionBox(chunkBox, overlapBox, div);

                GenParts(chunk, chunkDivBox);
            }
        }
    }
示例#2
0
    private void GenerateBatch()
    {
        int length = 2;

        length = (int)Mathf.Min(length, query.Count);

        List <ChunkTexture> chunkList = new List <ChunkTexture>();

        for (int i = 0; i < length; i++)
        {
            DictionaryEntry entry = query.Dequeue();

            ChunkTexture chunk     = (ChunkTexture)entry.Key;
            Rect         pixelsBox = (Rect)entry.Value;

            chunk.FillTexturePlanet(pixelsBox);
            chunk.UpdateColliders(pixelsBox);

            if (!chunkList.Contains(chunk))
            {
                chunkList.Add(chunk);
            }
        }

        foreach (ChunkTexture chunk in chunkList)
        {
            chunk.chunkTexture.Apply();
        }
    }
示例#3
0
    public void ApplyRadial(Vector3 point, float radius)
    {
        point = Camera.main.ScreenToWorldPoint(point);
        Rect dmgBox = new Rect(point.x - radius, point.y - radius, radius * 2, radius * 2f);

        Rect chunkRange          = MathTests.GetOverlappingBox(planetFrame, dmgBox);
        Rect chunkRangeUnits     = MathTests.BoxChunkUnits(chunkRange);
        Rect chunkRangeUnitsDisc = MathTests.BoxToGrid(chunkRangeUnits);

        for (float y = chunkRangeUnitsDisc.y; y < chunkRangeUnitsDisc.y + chunkRangeUnitsDisc.height; y++)
        {
            for (float x = chunkRangeUnitsDisc.x; x < chunkRangeUnitsDisc.x + chunkRangeUnitsDisc.width; x++)
            {
                ChunkTexture chunk = chunks[((int)y + radiusChunks) * radiusChunks * 2 + ((int)x + radiusChunks)];

                Rect chunkBox   = new Rect(x, y, 1f, 1f);
                Rect overlapBox = MathTests.GetOverlappingBox(chunkRangeUnits, chunkBox);

                Rect pixelsBox = GetPixelsBox(chunkBox, overlapBox);

                chunk.ApplyRadial(point, radius, pixelsBox);
                chunk.UpdateColliders(pixelsBox);
            }
        }
    }
示例#4
0
    public void Init()
    {
        left  = null;
        up    = null;
        right = null;
        down  = null;

        chunkData = new byte[GameManager.CHUNK_SIZE * GameManager.CHUNK_SIZE];
        colliders = new CircleCollider2D[GameManager.CHUNK_SIZE * GameManager.CHUNK_SIZE];

        chunkTexture            = new Texture2D(GameManager.CHUNK_SIZE, GameManager.CHUNK_SIZE);
        chunkTexture.filterMode = FilterMode.Point;

        meshRenderer                      = (MeshRenderer)gameObject.AddComponent <MeshRenderer>();
        meshRenderer.material             = new Material(Shader.Find("Unlit/Transparent"));
        meshRenderer.material.mainTexture = chunkTexture;

        meshFilter = (MeshFilter)gameObject.AddComponent <MeshFilter>();
        mesh       = new Mesh();

        List <Vector3> vertices  = new List <Vector3>();
        List <int>     triangles = new List <int>();
        List <Vector2> uvs       = new List <Vector2>();

        vertices.Add(new Vector3(0f, 0f, 0f));
        vertices.Add(new Vector3(0f, GameManager.CHUNK_SIZE, 0f));
        vertices.Add(new Vector3(GameManager.CHUNK_SIZE, GameManager.CHUNK_SIZE, 0f));
        vertices.Add(new Vector3(GameManager.CHUNK_SIZE, 0f, 0f));

        triangles.Add(0);
        triangles.Add(1);
        triangles.Add(2);
        triangles.Add(2);
        triangles.Add(3);
        triangles.Add(0);

        uvs.Add(new Vector2(0f, 0f));
        uvs.Add(new Vector2(0f, 1f));
        uvs.Add(new Vector2(1f, 1f));
        uvs.Add(new Vector2(1f, 0f));

        mesh.vertices  = vertices.ToArray();
        mesh.triangles = triangles.ToArray();
        mesh.uv        = uvs.ToArray();

        mesh.RecalculateBounds();
        mesh.RecalculateNormals();
        mesh.Optimize();

        meshFilter.sharedMesh = mesh;
    }
示例#5
0
    public void UpdateColliders(Rect frame)
    {
        Planet planet = transform.parent.GetComponent <Planet>();

        Vector2 chunkCoor = new Vector2(transform.position.x / GameManager.CHUNK_SIZE + planet.radiusChunks, transform.position.y / GameManager.CHUNK_SIZE + planet.radiusChunks);

        if (chunkCoor.x > 0)
        {
            left = planet.chunks[(int)(chunkCoor.y * planet.radiusChunks * 2 + (chunkCoor.x - 1))];
        }
        if (chunkCoor.x < planet.radiusChunks * 2 - 1)
        {
            right = planet.chunks[(int)(chunkCoor.y * planet.radiusChunks * 2 + (chunkCoor.x + 1))];
        }
        if (chunkCoor.y > 0)
        {
            down = planet.chunks[(int)((chunkCoor.y - 1) * planet.radiusChunks * 2 + (chunkCoor.x))];
        }
        if (chunkCoor.y < planet.radiusChunks * 2 - 1)
        {
            up = planet.chunks[(int)((chunkCoor.y + 1) * planet.radiusChunks * 2 + (chunkCoor.x))];
        }


        for (float y = frame.y; y < frame.y + frame.height; y++)
        {
            for (float x = frame.x; x < frame.x + frame.width; x++)
            {
                int index = (int)(y * GameManager.CHUNK_SIZE + x);

                if (chunkData[index] > 1 && colliders[index] == null)
                {
                    ColliderAt(x, y);
                }
                else if (chunkData[index] <= 1 && colliders[index] != null)
                {
                    Destroy(colliders[index]);
                    colliders[index] = null;
                }
            }
        }
    }
示例#6
0
    private void GenParts(ChunkTexture chunk, Rect genBox)
    {
        int xPos = (int)(chunk.transform.position.x / (GameManager.CHUNK_SIZE / div) + radiusChunks * div);
        int yPos = (int)(chunk.transform.position.y / (GameManager.CHUNK_SIZE / div) + radiusChunks * div);

        int pixelsPart = (int)(GameManager.CHUNK_SIZE / div);

        for (float y = genBox.y; y < genBox.y + genBox.height; y++)
        {
            for (float x = genBox.x; x < genBox.x + genBox.width; x++)
            {
                int index = (int)((yPos + y) * (radiusChunks * div * 2) + (xPos + x));

                if (genChunks[index] == 0)
                {
                    Rect partPixelsBox = new Rect(x * pixelsPart, y * pixelsPart, pixelsPart, pixelsPart);

                    query.Enqueue(new DictionaryEntry(chunk, partPixelsBox));

                    genChunks[index] = 1;
                }
            }
        }
    }