def draw(self, screen, focus, area): self.advanceFrame() pic = self.app.theme.sprites.bigZoneLetter(self.zone.defn.label) r = pic.get_rect() r.center = mapPosToScreen(self.zone.defn.pos, focus, area) screen.blit(pic, r) if (self.worldGUI.universe.uiOptions.showNets and self.zone.defn in self.worldGUI.map.layout.getTrosballTargetZones()): pic = self.app.theme.sprites.netOrb() frame = None r = pic.get_rect() else: if self.zone.owner: colour = self.zone.owner.colour else: colour = (128, 128, 128) pic = self.app.theme.sprites.orbs.get(colour) frame = self.getSpriteSheetRect() r = pygame.Rect(frame) r.center = mapPosToScreen(self.zone.defn.pos, focus, area) screen.blit(pic, r, frame) self.drawIndicator(screen, focus, area, 'F', -1, -1) self.drawIndicator(screen, focus, area, 'H', 0, -1) self.drawIndicator(screen, focus, area, 'B', 1, -1) self.drawIndicator(screen, focus, area, 'B', -1, 1) self.drawIndicator(screen, focus, area, 'H', 0, 1) self.drawIndicator(screen, focus, area, 'F', 1, 1)
def draw(self, screen, area, focus): if not self.app.displaySettings.showObstacles: return from trosnoth.model.obstacles import Obstacle, Corner player = self.universe.universe.getPlayer(globaldebug.localPlayerId) attachedObstacle = player.attachedObstacle if player else None worldRect = viewRectToMap(focus, area) for block in getBlocksInRect(self.universe, worldRect): for obs in block.defn.obstacles: if isinstance(obs, Obstacle): pt1 = mapPosToScreen(obs.pt1, focus, area) pt2 = mapPosToScreen(obs.pt2, focus, area) c = (0, 255, 0) if obs is attachedObstacle else (255, 0, 0) pygame.draw.line(screen, c, pt1, pt2, 2) elif isinstance(obs, Corner): pt1 = mapPosToScreen( [obs.pt[i] - obs.offset[i] * 10 for i in (0, 1)], focus, area) pt2 = mapPosToScreen([ obs.pt[i] - (obs.offset[i] + obs.delta[i]) * 10 for i in (0, 1) ], focus, area) c = (0 if obs is attachedObstacle else 255, 255, 0) pygame.draw.line(screen, c, pt1, pt2, 2) pt2 = (int(pt2[0]), int(pt2[1])) pygame.draw.circle(screen, c, pt2, 3, 0)
def draw(self, screen, area, focus): worldRect = viewRectToMap(focus, area) for zone in getZonesInRect(self.universe, worldRect): pic = self.app.theme.sprites.bigZoneLetter(zone.defn.label) r = pic.get_rect() r.center = mapPosToScreen(zone.defn.pos, focus, area) screen.blit(pic, r) if (self.universe.universe.uiOptions.showNets and zone.defn in self.universe.map.layout.getTrosballTargetZones()): pic = self.app.theme.sprites.netOrb() else: pic = self.app.theme.sprites.orb(zone.owner) r = pic.get_rect() r.center = mapPosToScreen(zone.defn.pos, focus, area) screen.blit(pic, r)
def drawSprite(sprite, pos=None): # Calculate the position of the sprite. if pos is None: pos = sprite.pos sprite.rect.center = mapPosToScreen(pos, focus, area) if sprite.rect.colliderect(area): sprite.update() screen.blit(sprite.image, sprite.rect)
def drawIndicator(self, screen, focus, area, kind, xDir, yDir): nextZone = self.zone.getNextZone(xDir, yDir) if nextZone is None: return img = self.app.theme.sprites.orbIndicator(kind, nextZone.owner) r = img.get_rect() x, y = self.zone.defn.pos xOffset, yOffset = self.INDICATOR_OFFSETS[xDir, yDir] r.center = mapPosToScreen((x + xOffset, y + yOffset), focus, area) screen.blit(img, r)
def draw(self, surface): trajectory = self.getTrajectory() if trajectory is None: return focus = self.viewManager._focus area = self.viewManager.sRect points = list(trajectory.predictedTrajectoryPoints()) numPoints = len(points) if numPoints == 0: return greenToYellow = [(i, 255, 0) for i in range( 0, 255, 255 // (numPoints // 2 + numPoints % 2))] yellowToRed = [(255, i, 0) for i in range( 255, 0, -255 // (numPoints // 2))] colours = [(0, 255, 0)] + greenToYellow + yellowToRed lastPoint = None for item in zip(points, colours): point = item[0] colour = item[1] # Set first point if lastPoint is None: lastPoint = point adjustedPoint = mapPosToScreen(point, focus, area) pygame.draw.circle(surface, colour, adjustedPoint, 2) continue adjustedPoint = mapPosToScreen(point, focus, area) adjustedLastPoint = mapPosToScreen(lastPoint, focus, area) pygame.draw.line(surface, colour, adjustedLastPoint, adjustedPoint, 5) lastPoint = point pygame.draw.circle(surface, colour, adjustedPoint, 2) radius = int(trajectory.explosionRadius() * MAP_TO_SCREEN_SCALE) if radius > 0: pygame.draw.circle(surface, (0,0,0), adjustedPoint, radius, 2)
def draw(self, screen, area, focus): worldRect = viewRectToMap(focus, area) regions = [] for block in getBlocksInRect(self.universe, worldRect): bd = block.defn pos = mapPosToScreen(bd.pos, focus, area) if bd.kind in ('top', 'btm'): if bd.zone is None: regions.append(pygame.Rect(pos, BODY_BLOCK_SCREEN_SIZE)) continue elif bd.zone1 is None or bd.zone2 is None: regions.append(pygame.Rect(pos, INTERFACE_BLOCK_SCREEN_SIZE)) continue x0, y0 = mapPosToScreen((0, 0), focus, area) if area.top < y0: r = pygame.Rect(area) r.bottom = y0 regions.append(r) if area.left < x0: r = pygame.Rect(area) r.right = x0 regions.append(r) x1, y1 = mapPosToScreen(self.universe.map.layout.worldSize, focus, area) if area.bottom > y1: r = pygame.Rect(area) r.top = y1 regions.append(r) if area.right > x1: r = pygame.Rect(area) r.left = x1 regions.append(r) clip = screen.get_clip() for region in regions: region = region.clip(clip) screen.set_clip(region) self.drawRegion(screen, region, worldRect.topleft) screen.set_clip(clip)
def showPathFinding(self, viewManager, screen, sprite): ''' For debugging, displays the player's predicted path. ''' import pygame.draw from trosnoth.trosnothgui.ingame.utils import mapPosToScreen if self.player.dead: return focus = viewManager._focus area = viewManager.sRect lastPos = mapPosToScreen(sprite.pos, focus, area) colour = (64, 255, 255) for record in self.future.actionRecords: for pos in record.simulator.positions: screenPos = mapPosToScreen(pos, focus, area) pygame.draw.circle(screen, colour, screenPos, 3) pygame.draw.line(screen, colour, lastPos, screenPos) lastPos = screenPos
def getAngle(self, playerPos=None): if playerPos is None: livePlayer = self.player.clone() livePlayer.respawn() playerPos = livePlayer.pos focus = self.viewManager._focus area = self.viewManager.sRect playerScreenPos = mapPosToScreen(playerPos, focus, area) targetPos = pygame.mouse.get_pos() return atan2(targetPos[0] - playerScreenPos[0], -(targetPos[1] - playerScreenPos[1]))
def _drawPointsUntil(self, ticksNow, screen, focus, area): if not self.drawPoints: return ticks0, pos = self.drawPoints[0] screenPos0 = mapPosToScreen(pos, focus, area) points = [screenPos0] for ticks1, pos in self.drawPoints[1:]: screenPos1 = mapPosToScreen(pos, focus, area) if ticks1 > ticksNow: fraction = (ticksNow - ticks0) / (ticks1 - ticks0) points.append(( fadeValues(screenPos0[0], screenPos1[0], fraction), fadeValues(screenPos0[1], screenPos1[1], fraction), )) break points.append(screenPos1) screenPos0 = screenPos1 ticks0 = ticks1 if len(points) > 1: self.drawLines(screen, area, self.colour, points, thickness=6)
def draw(self, screen, area, focus): if not __debug__: return if not (globaldebug.enabled and globaldebug.showObstacles): return worldRect = viewRectToMap(focus, area) for leafNode in self.universe.universe.layout.getCandidatePolygons( worldRect.left, worldRect.top, worldRect.right, worldRect.bottom): points = [ mapPosToScreen(pt, focus, area) for pt in leafNode.getPoints() ] if leafNode.isLedge(): c = (255, 255, 0) closed = False else: c = (255, 0, 0) closed = True pygame.draw.polygon(screen, (128, 64, 128), points) pygame.draw.lines(screen, c, closed, points)
def drawOverlay(self, screen): area = self.sRect target = self.getTargetPlayer() if target is not None and self.app.displaySettings.showRange: physics = target.world.physics gunRange = physics.shotLifetime * physics.shotSpeed gunRange += max(target.X_SHOULDERS_TO_GUN, target.Y_SHOULDERS_TO_GUN) radius = int(gunRange * MAP_TO_SCREEN_SCALE + 0.5) pygame.draw.circle(screen, (192, 64, 64), area.center, radius, 1) if target and target.ninja: radius = int(200 * MAP_TO_SCREEN_SCALE + 0.5) for zone in getZonesInRect(target.world, self.getMapRect()): if target.isFriendsWithTeam(zone.owner): continue pos = mapPosToScreen(zone.defn.pos, self._focus, area) pygame.draw.circle(screen, (128, 64, 128), pos, radius, 1) if self.universe.universe.uiOptions.showPauseMessage: self._drawPauseMessage(screen)
def drawShiftingBackground(self, screen, area, focus, trosballLocation): worldRect = viewRectToMap(focus, area) for block in getBlocksInRect(self.universe, worldRect): blueBlock = self.bkgCache.getForTeam(0, block) redBlock = self.bkgCache.getForTeam(1, block) if blueBlock is None or redBlock is None: continue blockHorizontalPosition = block.defn.pos[0] relativeLocation = trosballLocation - blockHorizontalPosition blockWidth = block.defn.rect.width relativeLocation = max(0, min(blockWidth, relativeLocation)) x = int(relativeLocation * MAP_TO_SCREEN_SCALE + 0.5) topleft = mapPosToScreen(block.defn.pos, focus, area) r = blueBlock.get_rect() r.width = x screen.blit(blueBlock, topleft, r) r = redBlock.get_rect() r.left = x screen.blit(redBlock, (topleft[0] + x, topleft[1]), r)
def _drawSprites(self, screen): focus = self._focus area = self.sRect # Go through and update the positions of the players on the screen. ntGroup = set() visPlayers = set() for player in self.universe.iterPlayers(): self.addSpritesForPlayer(player, visPlayers, ntGroup) hook = player.items.get(GrapplingHook) if hook and hook.hookState != HOOK_NOT_ACTIVE: pygame.draw.line( screen, (255, 0, 0), mapPosToScreen(player.pos, focus, area), mapPosToScreen(hook.hookPosition, focus, area), 5) # Draw the on-screen players and nametags. for s in visPlayers: s.update() screen.blit(s.image, s.rect) for s in ntGroup: screen.blit(s.image, s.rect) def drawSprite(sprite, pos=None): # Calculate the position of the sprite. if pos is None: pos = sprite.pos sprite.rect.center = mapPosToScreen(pos, focus, area) if sprite.rect.colliderect(area): sprite.update() screen.blit(sprite.image, sprite.rect) # Draw the shots. for shot in self.universe.iterShots(): drawSprite(shot) for coin in self.universe.iterCollectableCoins(): drawSprite(coin) try: # Draw the grenades. for grenade in self.universe.iterGrenades(): drawSprite(grenade) except Exception as e: log.exception(str(e)) for sprite in self.universe.iterExtras(): drawSprite(sprite) if __debug__ and globaldebug.enabled: if globaldebug.showSpriteCircles: for pos, radius in globaldebug.getSpriteCircles(): screenPos = mapPosToScreen(pos, focus, area) pygame.draw.circle(screen, (255, 255, 0), screenPos, radius, 2) for sprite in visPlayers: sprite.player.onOverlayDebugHook(self, screen, sprite) for region in self.universe.universe.regions: region.debug_draw(self, screen)
def drawStandardBackground(self, screen, area, focus): worldRect = viewRectToMap(focus, area) for block in getBlocksInRect(self.universe, worldRect): pic = self.bkgCache.get(block) if pic is not None: screen.blit(pic, mapPosToScreen(block.defn.pos, focus, area))
def _drawSprites(self, screen): focus = self._focus area = self.sRect # Go through and update the positions of the players on the screen. ntGroup = set() visPlayers = set() ropeColour = self.app.theme.colours.ropeColour thickness = 2 targetPlayer = self.getTargetPlayer() for player in self.universe.iterPlayers(): self.addSpritesForPlayer(player, visPlayers, ntGroup) if player.dead: continue hook = player.getGrapplingHook() if hook.hookState != HOOK_NOT_ACTIVE: showRope = (not player.invisible or targetPlayer is None or player.isFriendsWith(targetPlayer.player)) if not showRope: continue # TODO: rope bending around corners x0, y0 = mapPosToScreen(player.pos, focus, area) x1, y1 = mapPosToScreen(player.hookPos, focus, area) if (x0, y0) != (x1, y1): angle = math.atan2(y1 - y0, x1 - x0) else: angle = 0 sinTheta = math.sin(angle) cosTheta = math.cos(angle) points = ( (x0 - thickness * sinTheta, y0 + thickness * cosTheta), (x0 - thickness * cosTheta, y0 - thickness * sinTheta), (x0 + thickness * sinTheta, y0 - thickness * cosTheta), (x1 + thickness * sinTheta, y1 - thickness * cosTheta), (x1 + thickness * cosTheta, y1 + thickness * sinTheta), (x1 - thickness * sinTheta, y1 + thickness * cosTheta), ) pygame.gfxdraw.filled_polygon(screen, points, ropeColour) pygame.gfxdraw.aapolygon(screen, points, ropeColour) # Draw the on-screen players and nametags. for s in visPlayers: s.update() screen.blit(s.image, s.rect) for s in ntGroup: screen.blit(s.image, s.rect) def drawSprite(sprite, pos=None): # Calculate the position of the sprite. if pos is None: pos = sprite.pos sprite.rect.center = mapPosToScreen(pos, focus, area) if sprite.rect.colliderect(area): sprite.update() screen.blit(sprite.image, sprite.rect) for coin in self.universe.iterCollectableCoins(): drawSprite(coin) try: # Draw the grenades. for grenade in self.universe.iterGrenades(): drawSprite(grenade) except Exception as e: log.exception(str(e)) # Draw the shots. for shot in self.universe.iterShots(): shot.draw(screen, focus, area) for sprite in self.universe.iterExtras(): drawSprite(sprite) if __debug__ and globaldebug.enabled: if globaldebug.showSpriteCircles: for pos, radius in globaldebug.getSpriteCircles(): screenPos = mapPosToScreen(pos, focus, area) pygame.draw.circle(screen, (255, 255, 0), screenPos, radius, 2) for sprite in visPlayers: sprite.player.onOverlayDebugHook(self, screen, sprite) if self.universe.universe.isServer: for region in self.universe.universe.regions: region.debug_draw(self, screen)
def addSpritesForPlayer(self, player, visPlayers, ntGroup): focus = self._focus area = self.sRect targetPlayer = self.getTargetPlayer() showPlayer = (not player.invisible or targetPlayer is None or player.isFriendsWith(targetPlayer.player)) if showPlayer: # Calculate the position of the player. if player is targetPlayer: player.rect.center = area.center else: player.rect.center = mapPosToScreen(player.pos, focus, area) # Check if this player needs its nametag shown. if player.rect.colliderect(area): visPlayers.add(player) if ntGroup is None: return if player.unit.items.has(Bomber): player.countdown.update() player.countdown.rect.midbottom = player.rect.midtop ntGroup.add(player.countdown) lastPoint = player.rect.midbottom shield = player.unit.items.get(Shield) if shield: shieldBar = player.shieldBar shieldBar.setHealth(shield.protections, shield.maxProtections) if shieldBar.visible: ntGroup.add(shieldBar) shieldBar.rect.midtop = lastPoint lastPoint = shieldBar.rect.midbottom healthBar = player.healthBar healthBar.setHealth( player.unit.health, player.unit.world.physics.playerRespawnHealth) if healthBar.visible: ntGroup.add(healthBar) healthBar.rect.midtop = lastPoint lastPoint = healthBar.rect.midbottom player.nametag.rect.midtop = lastPoint # Check that entire nametag's on screen. if player.nametag.rect.left < area.left: player.nametag.rect.left = area.left elif player.nametag.rect.right > area.right: player.nametag.rect.right = area.right if player.nametag.rect.top < area.top: player.nametag.rect.top = area.top elif player.nametag.rect.bottom > area.bottom: player.nametag.rect.bottom = area.bottom ntGroup.add(player.nametag) if not player.dead: # Place the coin rectangle below the nametag. mx, my = player.nametag.rect.midbottom player.coinTally.setCoins(player.getCoinDisplayCount()) player.coinTally.rect.midtop = (mx, my - 5) ntGroup.add(player.coinTally)