示例#1
0
        private MapChunkData _initChunkBuffers(IMapGrid grid, IMapChunk chunk)
        {
            var vao = (uint)GL.GenVertexArray();

            GL.BindVertexArray(vao);

            var vboSize = _verticesPerChunk(chunk) * Vertex2D.SizeOf;
            var eboSize = _indicesPerChunk(chunk) * sizeof(ushort);

            var vbo = new GLBuffer(this, BufferTarget.ArrayBuffer, BufferUsageHint.DynamicDraw,
                                   vboSize, $"Grid {grid.Index} chunk {chunk.Indices} VBO");
            var ebo = new GLBuffer(this, BufferTarget.ElementArrayBuffer, BufferUsageHint.DynamicDraw,
                                   eboSize, $"Grid {grid.Index} chunk {chunk.Indices} EBO");

            ObjectLabelMaybe(ObjectLabelIdentifier.VertexArray, vao, $"Grid {grid.Index} chunk {chunk.Indices} VAO");
            // Vertex Coords
            GL.VertexAttribPointer(0, 2, VertexAttribPointerType.Float, false, Vertex2D.SizeOf, 0);
            GL.EnableVertexAttribArray(0);
            // Texture Coords.
            GL.VertexAttribPointer(1, 2, VertexAttribPointerType.Float, false, Vertex2D.SizeOf, 2 * sizeof(float));
            GL.EnableVertexAttribArray(1);

            // Assign VBO and EBO to VAO.
            // OpenGL 3.x is such a good API.
            vbo.Use();
            ebo.Use();

            var datum = new MapChunkData(vao, vbo, ebo)
            {
                Dirty = true
            };

            _mapChunkData[grid.Index].Add(chunk.Indices, datum);
            return(datum);
        }
示例#2
0
    // Start is called before the first frame update
    void Start()
    {
        _sLib = GameObject.FindGameObjectWithTag(Constants.TAG_SPRITE_LIBRARY).GetComponent <SpriteLibraryScript>();

        if (_chunkHeightAndWidth % 2 == 0)
        {
            _chunkHeightAndWidth++;
        }

        _mapChunks           = new MapChunkData[_chunkHeightAndWidth, _chunkHeightAndWidth];
        _mapChunkControllers = new GameObject[_chunkHeightAndWidth, _chunkHeightAndWidth];

        for (int x = 0; x < _chunkHeightAndWidth; x++)
        {
            for (int y = 0; y < _chunkHeightAndWidth; y++)
            {
                _mapChunks[x, y] = new MapChunkData(x, y);
            }
        }

        for (int x = 0; x < _chunkHeightAndWidth; x++)
        {
            for (int y = 0; y < _chunkHeightAndWidth; y++)
            {
                var go    = Instantiate(_mapChunkPrefab, new Vector3Int(_mapChunks[x, y]._x, _mapChunks[x, y]._y, 0), Quaternion.identity, transform);
                var chunk = go.GetComponent <MapChunkController>();
                chunk._chunkData = _mapChunks[x, y];

                _mapChunkControllers[x, y] = go;

                // Set Borders to spawner chunks
                if (x == 0 || y == 0 || x == _chunkHeightAndWidth - 1 || y == _chunkHeightAndWidth - 1)
                {
                    go.GetComponent <SpriteRenderer>().sprite = _sLib.GetChunkSpriteByIndex((int)Enums.MapChunkType.MonsterSpawner);
                    _mapChunks[x, y].SetMapChunkType(Enums.MapChunkType.MonsterSpawner);
                    go.tag = Constants.TAG_SPAWNER_CHUNK;
                } // Check middle chunk to player start
                else if (x == _chunkHeightAndWidth / 2 && y == _chunkHeightAndWidth / 2)
                {
                    go.GetComponent <SpriteRenderer>().sprite = _sLib.GetChunkSpriteByIndex((int)Enums.MapChunkType.Initial);
                    _mapChunks[x, y].SetMapChunkType(Enums.MapChunkType.Initial);
                    go.tag = Constants.TAG_PLAYER_CHUNK;
                }
                else
                {
                    go.GetComponent <SpriteRenderer>().sprite = _sLib.GetChunkSpriteByIndex((int)Enums.MapChunkType.Empty_Buildable);
                    _mapChunks[x, y].SetMapChunkType(Enums.MapChunkType.Empty_Buildable);
                }
            }
        }
    }
示例#3
0
        void SpawnEnemies(MapChunkData chunkData, MapChunk chunk)
        {
            var budget = CurrentLevelBudget;

            if (chunkData.Enemies != null)
            {
                while (budget > 0)
                {
                    var enemy = chunkData.Enemies.Sample(Level, chunkData.Type, budget);
                    if (enemy == null)
                    {
                        Debug.LogWarning("Cant spawn more enemies");
                        break;
                    }
                    chunk.Spawn(enemy.Prefab);
                    budget -= enemy.BudgetConsume;
                }
            }
        }
示例#4
0
        public void SpawnNextChunk(MapChunkData chunkData)
        {
            if (chunkData == null)
            {
                Debug.LogWarningFormat("Chunk is null");
                return;
            }

            // World-spaced entry position and rotation
            Vector3    entryPosition;
            Quaternion entryRotation;

            if (_lastChunk != null)
            {
                entryPosition = _lastChunk.ExitPosition;
                entryRotation = _lastChunk.ExitRotation;
            }
            else
            {
                entryPosition = transform.position;
                entryRotation = transform.rotation;
            }


            var pMapChunk = chunkData.Prefab.GetComponent <MapChunk>();

            // Instantiate new chunk so that exit of the last chunk matches the entry of the new one
            // Assuming that prefabs are at zero

            /*
             * var chunkObject = Instantiate(chunkData.Prefab,
             *  entryPosition - pMapChunk.EntryPosition,
             *  entryRotation * Quaternion.Inverse(pMapChunk.EntryRotation));
             */

            var entryOffset         = pMapChunk.EntryPosition;
            var entryRotationOffset = pMapChunk.EntryRotation;

            var chunkObject = Instantiate(chunkData.Prefab,
                                          entryPosition + entryRotation * Quaternion.Inverse(entryRotationOffset) * (-pMapChunk.EntryPosition),
                                          entryRotation * Quaternion.Inverse(entryRotationOffset));

            var chunk = chunkObject.GetComponent <MapChunk>();

            if (chunk == null)
            {
                Debug.LogWarning("Failed to instantiate next chunk");
                return;
            }

            chunk.name = $"Chunk_{_chunksSpawned}";



            _lastChunk     = chunk;
            _lastChunkData = chunkData;
            Debugger.Default.Display("Last chunk position", _lastChunk.transform.position.ToString());
            Debugger.Default.DrawCircleSphere(chunk.EntryPosition, 2f, Color.blue, 1000f);
            Debugger.Default.DrawAxis(chunk.EntryPosition, chunk.EntryRotation, 1000f);

            Debugger.Default.DrawCircleSphere(chunk.ExitPosition, 2f, Color.red, 1000f);
            Debugger.Default.DrawAxis(chunk.ExitPosition, chunk.ExitRotation, 1000f);

            Debugger.Default.DrawCircleSphere(chunk.transform.position, 2f, Color.white, 1000f);
            Debugger.Default.DrawAxis(chunk.transform.position, chunk.transform.rotation, 1000f);

            _surface.BuildNavMesh();

            SpawnEnemies(_lastChunkData, _lastChunk);
            _chunksSpawned += 1;
        }
 // Sets chunkdata
 public void SetChunkData(MapChunkData chunkData)
 {
     _chunkData = chunkData;
 }