예제 #1
0
    def __init__(self, pygame, name, seed):
        self.name = name
        self.seed = seed
        self.blocksManager = BlocksManager(pygame)
        self.chunkDimensions = (16, 256)

        self.amtchunks = 1
        self.chunks = [None] * self.amtchunks
        for i in range(len(self.chunks)):
            self.chunks[i] = BlockChunkControl(
                self.seed, ((i * self.chunkDimensions[0]), 0), self.blocksManager, self, i
            )
            self.chunks[i].generateTerrain()
예제 #2
0
class BlockTerrainControl:

    name = None
    seed = None
    blocksManager = None
    chunks = None
    chunkDimensions = None
    amtchunks = None

    def __init__(self, pygame, name, seed):
        self.name = name
        self.seed = seed
        self.blocksManager = BlocksManager(pygame)
        self.chunkDimensions = (16, 256)

        self.amtchunks = 1
        self.chunks = [None] * self.amtchunks
        for i in range(len(self.chunks)):
            self.chunks[i] = BlockChunkControl(
                self.seed, ((i * self.chunkDimensions[0]), 0), self.blocksManager, self, i
            )
            self.chunks[i].generateTerrain()

    def getChunks(self):
        return self.chunks

    def getChunkDimensions(self):
        return self.chunkDimensions

    def getBlockDimensions(self):
        return self.blocksManager.getBlockDimensions()

    def convertToX(self, convert):
        return convert % self.chunkDimensions[0]

    def convertToY(self, convert):
        return convert / self.chunkDimensions[1]

    def convertToCoords(self, tile):
        return (self.convertToX(tile), self.convertToY(tile))

    def convertFromCoords(self, coord):
        x = self.chunkDimensions[0] - coord[0]
        y = self.chunkDimensions[0] * coord[1]
        return y + x

    def getChunksToRender(self, offset, width):

        startingChunk = -1

        for i in range(len(self.getChunks()) - 1):
            if (
                offset[0] >= self.getChunks()[i].getPosition()[0] * 16
                and offset[0] < self.getChunks()[i + 1].getPosition()[0] * 16
            ):
                startingChunk = i

        if startingChunk < 0:
            self.addChunkWest()
            startingChunk = 0

        endingChunk = -1

        for i in range(len(self.getChunks()) - 1):
            if (
                width + offset[0] >= self.getChunks()[i].getPosition()[0] * 16
                and width + offset[0] < self.getChunks()[i + 1].getPosition()[0] * 16
            ):
                endingChunk = i

        if endingChunk < 0:
            self.addChunkEast()
            endingChunk = len(self.getChunks()) - 1

        return self.getChunks()[startingChunk : endingChunk + 1]

    def addChunkWest(self):
        self.amtchunks += 1
        newchunks = [None]
        newchunks[0] = BlockChunkControl(
            self.seed, ((self.chunks[0].getPosition()[0] - self.chunkDimensions[0]), 0), self.blocksManager, self, 0
        )
        newchunks += self.chunks
        self.chunks = newchunks
        for i in range(len(self.chunks)):
            self.chunks[i].setPosInArray(i)
        self.chunks[0].generateTerrain()

    def addChunkEast(self):
        self.amtchunks += 1
        newchunks = [None]
        newchunks[0] = BlockChunkControl(
            self.seed,
            ((self.chunks[-1].getPosition()[0] + self.chunkDimensions[0]), 0),
            self.blocksManager,
            self,
            len(self.chunks),
        )
        newchunks = self.chunks + newchunks
        self.chunks = newchunks
        for i in range(len(self.chunks)):
            self.chunks[i].setPosInArray(i)
        self.chunks[-1].generateTerrain()

    def draw(self, screen, offset, resolution):
        width = resolution[0]
        height = resolution[1]

        for chunk in self.getChunksToRender(offset, width):
            currx = 0
            curry = 0
            for block in chunk.getBlocks():

                if currx > chunk.getDimensions()[0] - 1:
                    currx = 0
                    curry += 1

                if not block.getId() == 0:  # Air
                    location = (
                        currx * block.getImage().getWidth() - offset[0] + (chunk.getPosition()[0] * 16),
                        curry * block.getImage().getHeight() - offset[1],
                    )
                    if (
                        not (
                            location[0]
                            <= 0 - abs(offset[0] / self.getBlockDimensions()[0]) - block.getImage().getWidth()
                        )
                        and not (
                            location[0]
                            >= width + abs((offset[0] / self.getBlockDimensions()[0]) + self.getBlockDimensions()[0])
                        )
                        and not (
                            location[1]
                            <= 0 - abs(offset[1] / self.getBlockDimensions()[1]) - block.getImage().getHeight()
                        )
                        and not (
                            location[1]
                            >= height + abs((offset[1] / self.getBlockDimensions()[1]) + self.getBlockDimensions()[1])
                        )
                    ):
                        screen.blit(block.getImage().getSurface(), location)

                currx += 1