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