Example #1
0
class World(object):
    def __init__(self, width, height):
        self.width = 300
        self.height = 300
        self.grid_size = 20

        self.pixel_size = Rect(0, 0, width, height)
        self.full_grid = Rect(0, 0, self.width, self.height)
        self.view_grid = Rect(10, 10, 0, 0)
        self.prev_view_grid = None
        self.zoom(0)

        self.ground = [[0 for col in range(self.width)] for row in range(self.height)]

        for y in range(self.height):
            for x in range(self.width):
                self.ground[y][x] = Assets.colors_db.any('dirt')
        self.surface = Surface((width, height), HWSURFACE, 32)

    def draw(self, screen):
        rect = self.view_grid
        if self.prev_view_grid != rect:
            self.prev_view_grid = Rect(rect)
            x1 = rect.left
            y1 = rect.top
            x2 = min(self.width, rect.left + rect.width)
            y2 = min(self.height, rect.top + rect.height)

            r = Rect(0, 0, self.grid_size, self.grid_size)
            for row in self.ground[y1:y2 - 1]:
                for col in row[x1:x2 - 1]:
                    self.surface.fill(col, r)
                    r.left += self.grid_size
                r.left = 0
                r.top += self.grid_size

        screen.blit(self.surface, self.pixel_size)

    def view_move(self, move):
        self.view_grid.left += move.x
        self.view_grid.top += move.y
        self.view_grid.clamp_ip(self.full_grid)

    def zoom_in(self):
        self.zoom(+1)

    def zoom_out(self):
        self.zoom(-1)

    def zoom(self, dz):
        if 50 >= self.grid_size + dz >= 5:
            self.grid_size = self.grid_size + dz
            self.view_grid.width = int(math.ceil(self.pixel_size.width / float(self.grid_size))) + 1
            self.view_grid.height = int(math.ceil(self.pixel_size.height / float(self.grid_size))) + 1
            self.view_grid.clamp_ip(self.full_grid)
            self.prev_view_grid = None