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

Re: [pygame] extending pygame masks



Sounds cool.

Remember to also write unittests  :)  The mask module is falling
behind it unittests at the moment.

cheers!


On Thu, Oct 16, 2008 at 5:40 AM, Michael George <mdgeorge@xxxxxxxxxxxxxx> wrote:
> Nirav Patel wrote:
>>
>> It's not necessarily a good idea to have stuff that specific to an app
>> in a library.  I think it would be good to have the convolution
>> function built into mask, and leave the rest of the implementation up
>> to the user.  As for how to deal with the interface for convolving,
>> perhaps it would be useful to have one of the masks specified as being
>> the "world", and the other as the object being moved? Something like:
>> Mask.convolve(world = Mask) returning a mask the size of the world mask.
>>
>>
>
> I think it makes more sense to do it the other way - world.convolve(obj)
> rather than obj.convolve(world).  The two are flips of each other anyway, so
> it's probably not a big deal.  In either case, the output needs to be bigger
> than both of the inputs (the size of the convolution is the sum of the sizes
> of the inputs, minus one).
>
> I guess it's not too hard to compute the rects if you're careful.
>>
>> It would be fairly easy to construct this world mask by using Mask.draw.
>>
>>
>
> Yeah, that's probably best.  In fact, I was thinking that I might need to do
> it that way anyway.  The only reason to do it for a collection in one go is
> that you can avoid allocating all of those intermediate masks, and shifting
> everything twice.  I guess masks are pretty small and shifts are pretty fast
> so it's not such a big deal.
>
> So here's a revised proposal:
>
> Mask.convolve(other = Mask): return Mask
>   compute the convolution of self and other.  The (x,y) bit of the return
> value will be set if shifting the lower-right corner of other to position
> (x,y) would cause it to overlap with self.  The return value has size equal
> to self.getsize() + other.getsize() - (1,1).
>
>
> (and possibly)
> Mask.convolve(other = Mask, world = Mask, offset = (x,y)): return None
>   Functionally the same as world.union(self.convolve(other), offset) but
> more efficient
>
> Then the stuff that computes the rectangles and masks for a sprite group
> would be up to the application developer (i.e. me).
>
> On a side note, does Mask.draw do an "or" or a copy of the two masks?
>  They're probably both useful.  Assuming it's a copy, I've used world.union
> to denote orring the bitmasks.
>
> --Mike
>