本文整理汇总了Python中pygame.Rect.clamp_ip方法的典型用法代码示例。如果您正苦于以下问题:Python Rect.clamp_ip方法的具体用法?Python Rect.clamp_ip怎么用?Python Rect.clamp_ip使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类pygame.Rect
的用法示例。
在下文中一共展示了Rect.clamp_ip方法的7个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: Camera
# 需要导入模块: from pygame import Rect [as 别名]
# 或者: from pygame.Rect import clamp_ip [as 别名]
class Camera(object):
def __init__(self, target, bounds, size):
self.bounds = bounds
self.rect = Rect((0,0), size)
def update(self, target):
self.rect.center = target.center
self.rect.clamp_ip(self.bounds)
def draw_background(self, surf, bg):
surf.blit(bg, (-self.rect.x, -self.rect.y))
def draw_sprite(self, surf, sprite):
if self.rect.colliderect(sprite.rect):
surf.blit(sprite.image, rel_rect(sprite.rect, self.rect))
示例2: collision_check
# 需要导入模块: from pygame import Rect [as 别名]
# 或者: from pygame.Rect import clamp_ip [as 别名]
def collision_check(self):
""" Method for checking if the entity has run into a tree or something
and move it back a pixel if it has
"""
if self.wall_collides:
# Move the entity inside of the window (border collision)
entity_rect = Rect(self.x, self.y, self.width,self.height)
window_rect = Rect(0, 0, g.width * c.TILE_SIZE, g.height * c.TILE_SIZE)
if not window_rect.contains(entity_rect):
entity_rect.clamp_ip(window_rect)
self.x = entity_rect.left
self.y = entity_rect.top
collided = False
if self.collides:
# Make sure collision rectangles are up to date
self.update_collision_rects()
# Get the tile the entity is standing on
tile_pos = self.get_tile()
checked_tiles = []
# Loop through a 3x3 tile square around the entity, to not check the entire map
for i in range(tile_pos[0] - 1, tile_pos[0] + 2):
for j in range(tile_pos[1] - 1, tile_pos[1] + 2):
try:
if c.IMAGES[g.map[i][j].type].collides:
checked_tiles.append(g.map[i][j].rect())
except IndexError:
# That index was apparently outside of the map
pass
# Check if each of the zones collides with any of the tiles
# If so, move it in the appropriate direction, specified in update_collision_rects() as the keys
for rect in self.rects:
if self.rects[rect].collidelist(checked_tiles) != -1:
self.x += rect[0]
self.y += rect[1]
collided = True
self.collided = collided
示例3: Camera
# 需要导入模块: from pygame import Rect [as 别名]
# 或者: from pygame.Rect import clamp_ip [as 别名]
class Camera(object):
def __init__(self, target, bounds, size):
self.bounds = bounds
self.rect = Rect((0,0), size)
def update(self, target):
self.rect.center = target.center
self.rect.clamp_ip(self.bounds)
def draw_background(self, surf, bg):
surf.blit(bg, (-self.rect.x, -self.rect.y))
def draw_background_alpha(self, surf, bg, alpha):
new_bg = bg.copy()
new_bg.set_alpha(alpha)
surf.blit(new_bg, (-self.rect.x, -self.rect.y))
def draw_sprite(self, surf, sprite):
if self.rect.colliderect(sprite.rect):
surf.blit(sprite.image, rel_rect(sprite.rect, self.rect))
def draw_sprite_group(self, surf, group):
for sprite in group:
if self.rect.colliderect(sprite.rect):
surf.blit(sprite.image, rel_rect(sprite.rect, self.rect))
def draw_sprite_group_alpha(self, surf, group, alpha):
for sprite in group:
if self.rect.colliderect(sprite.rect):
new_sprite = sprite.image.copy()
new_sprite.set_alpha(alpha)
surf.blit(new_sprite, rel_rect(sprite.rect, self.rect))
def draw_sprite_alpha(self, surf, sprite, alpha):
if self.rect.colliderect(sprite.rect):
new_sprite = sprite.image.copy()
new_sprite.set_alpha(alpha)
surf.blit(new_sprite, rel_rect(sprite.rect, self.rect))
示例4: test_clamp_ip
# 需要导入模块: from pygame import Rect [as 别名]
# 或者: from pygame.Rect import clamp_ip [as 别名]
def test_clamp_ip( self ):
r = Rect(10, 10, 10, 10)
c = Rect(19, 12, 5, 5)
c.clamp_ip(r)
self.assertEqual(c.right, r.right)
self.assertEqual(c.top, 12)
c = Rect(1, 2, 3, 4)
c.clamp_ip(r)
self.assertEqual(c.topleft, r.topleft)
c = Rect(5, 500, 22, 33)
c.clamp_ip(r)
self.assertEqual(c.center, r.center)
示例5: MapBase
# 需要导入模块: from pygame import Rect [as 别名]
# 或者: from pygame.Rect import clamp_ip [as 别名]
class MapBase(Window):
def __init__(self, width, height, default_tile_name='floor'):
Window.__init__(self,None,10)
self.save_data = SaveObject()
self.tile_manager = TileManager()
default_tile = self.tile_manager.get_tile(default_tile_name)
self.tiles = []
for x in range(width):
col = []
self.tiles.append(col)
for y in range(height):
location = MapLocation(self, (x,y), default_tile)
col.append(location)
self.width = width
self.height = height
tiles_x = core.screen.get_width() / 32
tiles_y = core.screen.get_height() / 32
self.dimentions = Rect(0,0,width,height)
self.character = None
self.entities = RenderEntity()
self.non_passable_entities = RenderEntity()
self.viewport = Rect(0,0,tiles_x,tiles_y)
self.offset = Rect(0,0,0,0)
self.map_tile_coverage = Rect(0,0,tiles_x+5,tiles_y+5)
if self.map_tile_coverage.width > width:
self.map_tile_coverage.width = width
if self.map_tile_coverage.height > height:
self.map_tile_coverage.height = height
self.map_non_scroll_region = \
self.viewport.inflate(SCROLL_EDGE*-2,SCROLL_EDGE*-2)
self.action_listeners = {}
self.entry_listeners = {}
self.movement_listeners = []
self.scrolling = False
self.frame = 0
self.map_frames_dirty = [True,True,True,True]
self.map_frames = []
self.heal_points = 0
self.regen_rate = 2000000000
self.sound = core.mixer.Sound('%s/sounds/beep.wav' % DATA_DIR)
for f in range(4):
#TODO Add non hardcoded values for buffer
#TODO Make sure we don't make a larger surface than we need
#TODO Ex: 5x5 map
self.map_frames.append(Surface(((1+width) * TILE_SIZE, \
(1+height) * TILE_SIZE)))
def __getstate__(self):
dict = {}
dict['width'] = self.width
dict['height'] = self.height
dict['offset.width'] = self.offset.width
dict['offset.height'] = self.offset.height
dict['save_data'] = self.save_data
return dict
def __setstate__(self, dict):
if self.__class__.__name__ == 'MapBase':
self.__init__(dict['width'],dict['height'])
else:
self.__init__()
self.save_data = dict['save_data']
self.offset.width = dict['offset.width']
self.offset.height = dict['offset.height']
self.blur_events()
def dispose(self):
self.destroy()
del self.tiles
self.tile_manager.clear()
del self.action_listeners
del self.entry_listeners
del self.movement_listeners
self.entities.empty()
self.non_passable_entities.empty()
self.character.map = None
def set_regen_rate(self, rate):
self.regen_rate = rate
def get(self, x, y):
if x<0 or y<0: return None
try:
return self.tiles[x][y]
except:
return None
def calculate_tile_coverage(self, viewable):
if self.character is None:
return
coverage = self.map_tile_coverage
coverage.center = self.character.pos
view_scroll = viewable.inflate(8,8)
coverage.clamp_ip(view_scroll)
coverage.clamp_ip(self.dimentions)
self.offset.left = (viewable.left - coverage.left) * TILE_SIZE
self.offset.top = (viewable.top - coverage.top ) * TILE_SIZE
if not self.map_non_scroll_region.collidepoint(self.character.pos):
self.map_non_scroll_region = \
self.viewport.inflate(SCROLL_EDGE*-2,SCROLL_EDGE*-2)
#.........这里部分代码省略.........
示例6: BufferedRenderer
# 需要导入模块: from pygame import Rect [as 别名]
# 或者: from pygame.Rect import clamp_ip [as 别名]
#.........这里部分代码省略.........
self._x_offset = 0
self._y_offset = 0
def make_rect(x, y):
return Rect((x * tw, y * th), (tw, th))
rects = [make_rect(*i) for i in product(range(buffer_tile_width),
range(buffer_tile_height))]
# TODO: figure out what depth -actually- does
self._layer_quadtree = quadtree.FastQuadTree(rects, 4)
self.redraw_tiles()
def scroll(self, vector):
""" scroll the background in pixels
:param vector: (int, int)
"""
self.center((vector[0] + self.view_rect.centerx,
vector[1] + self.view_rect.centery))
def center(self, coords):
""" center the map on a pixel
float numbers will be rounded.
:param coords: (number, number)
"""
x, y = [round(i, 0) for i in coords]
self.view_rect.center = x, y
if self.clamp_camera:
self.view_rect.clamp_ip(self.map_rect)
x, y = self.view_rect.center
# calc the new position in tiles and offset
tw, th = self.data.tile_size
left, self._x_offset = divmod(x - self._half_width, tw)
top, self._y_offset = divmod(y - self._half_height, th)
# adjust the view if the view has changed without a redraw
dx = int(left - self._tile_view.left)
dy = int(top - self._tile_view.top)
view_change = max(abs(dx), abs(dy))
if view_change <= self._redraw_cutoff:
self._buffer.scroll(-dx * tw, -dy * th)
self._tile_view.move_ip((dx, dy))
self._queue_edge_tiles(dx, dy)
self._flush_tile_queue()
elif view_change > self._redraw_cutoff:
logger.info('scrolling too quickly. redraw forced')
self._tile_view.move_ip((dx, dy))
self.redraw_tiles()
def _queue_edge_tiles(self, dx, dy):
""" Queue edge tiles and clear edge areas on buffer if needed
:param dx: Edge along X axis to enqueue
:param dy: Edge along Y axis to enqueue
:return: None
"""
v = self._tile_view
fill = partial(self._buffer.fill, self._clear_color)
示例7: Menu
# 需要导入模块: from pygame import Rect [as 别名]
# 或者: from pygame.Rect import clamp_ip [as 别名]
class Menu(object):
"""popup_menu.Menu
Menu(pos, name, items) : return menu
pos -> (x,y); topleft coordinates of the menu.
name -> str; the name of the menu.
items -> list; a list containing strings for menu items labels.
This class is not intended to be used directly. Use PopupMenu or
NonBlockingPopupMenu instead, unless designing your own subclass.
"""
def __init__(self, pos, name, items):
screen = pygame.display.get_surface()
screen_rect = screen.get_rect()
self.name = name
self.items = []
self.menu_item = None
# Make the frame rect
x,y = pos
self.rect = Rect(x,y,0,0)
self.rect.width += margin * 2
self.rect.height += margin * 2
# Make the title image and rect, and grow the frame rect
self.title_image = font.render(name, True, text_color)
self.title_rect = self.title_image.get_rect(topleft=(x+margin,y+margin))
self.rect.width = margin*2 + self.title_rect.width
self.rect.height = margin + self.title_rect.height
# Make the item highlight rect
self.hi_rect = Rect(0,0,0,0)
# Make menu items
n = 0
for item in items:
menu_item = MenuItem(item, n)
self.items.append(menu_item)
self.rect.width = max(self.rect.width, menu_item.rect.width+margin*2)
self.rect.height += menu_item.rect.height + margin
n += 1
self.rect.height += margin
# Position menu fully within view
if not screen_rect.contains(self.rect):
savex,savey = self.rect.topleft
self.rect.clamp_ip(screen_rect)
self.title_rect.top = self.rect.top + margin
self.title_rect.left = self.rect.left + margin
# Position menu items within menu frame
y = self.title_rect.bottom + margin
for item in self.items:
item.rect.x = self.rect.x + margin
item.rect.y = y
y = item.rect.bottom + margin
item.rect.width = self.rect.width - margin*2
# Calculate highlight rect's left-alignment and size
self.hi_rect.left = menu_item.rect.left
self.hi_rect.width = self.rect.width - margin*2
self.hi_rect.height = menu_item.rect.height
# Create the menu frame and highlight frame images
self.bg_image = pygame.surface.Surface(self.rect.size)
self.hi_image = pygame.surface.Surface(self.hi_rect.size)
self.bg_image.fill(bg_color)
self.hi_image.fill(hi_color)
# Draw menu border
rect = self.bg_image.get_rect()
pygame.draw.rect(self.bg_image, glint_color, rect, 1)
t,l,b,r = rect.top,rect.left,rect.bottom,rect.right
pygame.draw.line(self.bg_image, shadow_color, (l,b-1), (r,b-1), 1)
pygame.draw.line(self.bg_image, shadow_color, (r-1,t), (r-1,b), 1)
# Draw title divider in menu frame
left = margin
right = self.rect.width - margin*2
y = self.title_rect.height + 1
pygame.draw.line(self.bg_image, shadow_color, (left,y), (right,y))
def draw(self):
# Draw the menu on the main display.
screen = pygame.display.get_surface()
screen.blit(self.bg_image, self.rect)
screen.blit(self.title_image, self.title_rect)
for item in self.items:
if item is self.menu_item:
self.hi_rect.top = item.rect.top
screen.blit(self.hi_image, self.hi_rect)
screen.blit(item.image, item.rect)
def check_collision(self, mouse_pos):
# Set self.menu_item if the mouse is hovering over one.
self.menu_item = None
if self.rect.collidepoint(mouse_pos):
for item in self.items:
if item.rect.collidepoint(mouse_pos):
self.menu_item = item
break