[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: [pygame] help with subsurfaces



On Dec 12, 2007 3:18 PM, Patrick Mullen <saluk64007@xxxxxxxxx> wrote:
>
> On Dec 12, 2007 1:10 PM, Dan Krol <orblivion@xxxxxxxxx> wrote:
> > I need to do something similar, but I think I did it by just blitting
> > the subsection of the original surface I needed when it's time to draw
> > (and no other times). Doesn't this not use extra memory as well?  Any
> > reason this is a bad idea?

I did the same thing. ( Using source Rect()'s instead of creating
subsurfaces. ). I created a new sprite group, derived from
RenderPlain() to use source rects.

Then I created a class Unit() which derived pygame.sprite.Sprite()
adding a new member .rect_source . So .rect is the destination
coordinates, and .rect_source is the source rect. Unit().update() will
get called on every sprite in the sprite group.

# usage: file: game.py : Game():
from RenderSrcRect import RenderSrcRect

	# your Game.__init__():
	self.unit_sprites = RenderSrcRect()
	self.player = Unit()

	# add units, player, etc...
	self.units_sprites.add( self.player )
	
	# your Game.draw():
	self.unit_sprites.draw( self.screen )
	
	# your Game.update():
	self.unit_sprites.update()

#!/usr/bin/python
# file: RenderSrcRect.py
# Author: jake bolton [created: 2007/11/14]
# About: RenderSrcRect
	# child of RenderPlain, adds src rect support
	
import pygame
from pygame.locals import *

class RenderSrcRect(pygame.sprite.RenderPlain):
	"""custom sprite group rendering class. Uses src rects of sprite.
	
	the inheritance is: RenderPlain() == Group() which derives
AbstractGroup()
		
	members used from the sprites to blit:
		.image = the sprite's surface
		.rect = the blit dest rect
		.rect_source = the blit source rect
	"""
	
	def __init__(self):
		"""init"""
		pygame.sprite.RenderPlain.__init__(self)
	
	def draw(self, surface):
		"""same as .RenderPlain.draw() except spr.rect_source is used to blit"""
		sprites = self.sprites()
		surface_blit = surface.blit
		for spr in sprites:
			# blit with src rect
			self.spritedict[spr] = surface_blit(spr.image, spr.rect,
spr.rect_source)
		self.lostsprites = []	


> >
>
> For organizational purposes, it may at some point be very unclear what
> this means:
>
> screen.blit(source.subsurface([30,60,100,15]),[30,60])
> Whereas this might make more sense:
>
> screen.blit(player_head,[30,60])
>
> Also, the little bit of memory used in predefining a subsurface is
> going to gain some performance increase, which in blitting you really
> need as much as you can get.

Are you saying a performance increase better than using source
Rect()'s like my example above. ( Or just that its slower to keep
re-creating the same subsurf every frame vs creating it one time? )

>
> Also, if you are meaning you do things thusly:
>
> screen.blit(source,[30,60],[30,60,100,15]) this probably is as fast
> and as memory concious, but to me is even more confusing because the
> area defined belongs to the source but comes AFTER the coordinates.  I
> would forget what that rect is associated with.
>
> But if it works for you, then do it that way :)
>

Either way you blit, take a look at sprite groups ( if you don't
already know about them. )

pygame sprite docs: http://www.pygame.org/docs/ref/sprite.html
sprite group tutorial:
http://kai.vm.bytemark.co.uk/~piman/writing/sprite-tutorial.shtml

-- 
Jake