def ShowActor(self, actor): while actor.sprite != None: actor.sprite.kill() actor.sprite = None actor.sprite = ActorSprite(actor.type, self.frontSprites) actor.sprite.rect.center = actor.sector.sprite.rect.center if actor.targeted: self.ClearTarget() self.target_sprite = TargetSprite(self.frontSprites) self.target_sprite.rect.center = actor.sprite.rect.center actor.sector.blocked = True
def __init__(self, evManager): self.evManager = evManager self.evManager.RegisterListener( self ) pygame.init() self.window = pygame.display.set_mode((WINDOW_X, WINDOW_Y)) pygame.display.set_caption( 'RGENGINE' ) self.background = pygame.Surface((self.window.get_size())) self.backSprites = pygame.sprite.RenderUpdates() self.frontSprites = pygame.sprite.RenderUpdates() self.center_sector_coords = STARTING_COORDS self.target_sprite = TargetSprite(self.frontSprites) top_left = pygame.Rect((-TILE_SIZE, 0, TILE_SIZE, TILE_SIZE)) self.target_sprite.rect.center = top_left.center self.map = None
class PygameView: def __init__(self, evManager): self.evManager = evManager self.evManager.RegisterListener( self ) pygame.init() self.window = pygame.display.set_mode((WINDOW_X, WINDOW_Y)) pygame.display.set_caption( 'RGENGINE' ) self.background = pygame.Surface((self.window.get_size())) self.backSprites = pygame.sprite.RenderUpdates() self.frontSprites = pygame.sprite.RenderUpdates() self.center_sector_coords = STARTING_COORDS self.target_sprite = TargetSprite(self.frontSprites) top_left = pygame.Rect((-TILE_SIZE, 0, TILE_SIZE, TILE_SIZE)) self.target_sprite.rect.center = top_left.center self.map = None #---------------------------------------------------------------------- def SetUpMap(self): self.BuildMapSprites() self.ShowMap() ev = MapSetUpEvent() self.evManager.Post(ev) #---------------------------------------------------------------------- def BuildMapSprites(self): map_x = self.map.map_x map_y = self.map.map_y for y in range(1, map_y): for x in range(map_x): self.map.sectors[y][x].sprite = SectorSprite(self.map.sectors[y][x], self.backSprites) squareRect = pygame.Rect( (-TILE_SIZE, 0, TILE_SIZE, TILE_SIZE)) self.map.sectors[y][x].sprite.rect = squareRect #---------------------------------------------------------------------- def ShowMap(self): # use this squareRect as a cursor and go through the # columns and rows and assign the rect # positions of the SectorSprites squareRect = pygame.Rect((-TILE_SIZE * 2, -TILE_SIZE, TILE_SIZE, TILE_SIZE)) column = 0 row = 0 visible = self.VisibleMap() for each in visible: for sector in each: sector.sprite.rect = squareRect squareRect = squareRect.move(TILE_SIZE, 0) squareRect = squareRect.move(-(TILE_SIZE *(len(each))), TILE_SIZE) #---------------------------------------------------------------------- def VisibleMap(self): start_x = self.center_sector_coords[0] - 2 start_y = self.center_sector_coords[1] - 1 half_x = (TILES_X - 1) / 2 half_y = (TILES_Y - 1) / 2 upper_left_x = start_x - half_x upper_left_y = start_y - half_y bottom_right_x = start_x + half_x bottom_right_y = start_y + half_y list = [] for y in range(upper_left_y , bottom_right_y + 3): foo = [] for x in range(upper_left_x, bottom_right_x + 4): foo.append(self.map.sectors[y][x]) list.append(foo) return list #---------------------------------------------------------------------- def ShowActor(self, actor): while actor.sprite != None: actor.sprite.kill() actor.sprite = None actor.sprite = ActorSprite(actor.type, self.frontSprites) actor.sprite.rect.center = actor.sector.sprite.rect.center if actor.targeted: self.ClearTarget() self.target_sprite = TargetSprite(self.frontSprites) self.target_sprite.rect.center = actor.sprite.rect.center actor.sector.blocked = True #---------------------------------------------------------------------- def ClearActor(self, actor): actor.sector.blocked = False if actor.targeted: self.ClearTarget() if actor.sprite: actor.sprite.kill() actor.sprite = None ev = ActorClearedEvent() self.evManager.Post(ev) #---------------------------------------------------------------------- def ClearTarget(self): if self.target_sprite != None: self.target_sprite.kill() self.target_sprite = None #---------------------------------------------------------------------- def UpdateCenter(self, actor): self.center_sector_coords = actor.sector.location self.ShowMap() ev = ScreenUpdatedEvent() self.evManager.Post(ev) #---------------------------------------------------------------------- def GetActorSprite(self, actor): for s in self.frontSprites: return s return None #---------------------------------------------------------------------- def GetSectorSprite(self, sector): for s in self.backSprites: if hasattr(s, "sector") and s.sector == sector: return s #---------------------------------------------------------------------- def GetSector(self, pos): for j in self.VisibleMap(): for i in j: if i.sprite.rect.collidepoint(pos): return i raise Exception("Sector not found onscreen.") #---------------------------------------------------------------------- def draw_everything(self): self.backSprites.clear(self.window, self.background) self.frontSprites.clear(self.window, self.background) self.backSprites.update() self.frontSprites.update() dirtyRects1 = self.backSprites.draw(self.window) dirtyRects2 = self.frontSprites.draw(self.window) dirtyRects = dirtyRects1 + dirtyRects2 pygame.display.update(dirtyRects) #---------------------------------------------------------------------- def Notify(self, event): if isinstance(event, TickEvent): self.draw_everything() elif isinstance(event, EnemiesPlaceEvent): self.map = event.map self.SetUpMap() elif isinstance(event, ActorPlaceEvent): self.ShowActor(event.actor) elif isinstance(event, ActorMoveEvent): self.UpdateCenter(event.actor) elif isinstance(event, ActorClearEvent): self.ClearActor(event.actor) elif isinstance(event, ShowActorEvent): self.ShowActor(event.actor) elif isinstance(event, UntargetEvent): self.ClearTarget() elif isinstance(event, MouseClickEvent): sector = self.GetSector(event.pos) ev = PlayerActionEvent(sector) self.evManager.Post(ev)