Thanks for your answer. I studied the code.
On Saturday, July 20, 2013 9:49:30 AM UTC+2, Juan J. MartÃnez wrote:
>
> On 20/07/13 00:07, Fred wrote:
> > [...]
> >
> > Am I doing it the wrong way (and if so, could you please point me better
> > ideas) or is my goal clearly unreachable using Python + pyglet, and
> > would require C++/OpenGL code ?
>
> You can do it with Python and Pyglet, you just need to use OpenGL:
>
> http://los-cocos.googlecode.com/svn/trunk/cocos/tiles.py
>
> See MapLayer._update_sprite_set and base class
> layer.ScrollableLayer.draw. Basically if keeps en memory a list of
> visible sprites and uses OpenGL's glTranslate for scrolling.
>
>
>From what I've understood, I use the same scheme. For example, my
equivalent of MapLayer._update_sprite is :
def update(self):
t_left, t_right = GfxBase.screen_left / 32 - 1,
(GfxBase.screen_left + GfxBase.screen_width) / 32 + 1
t_top, t_bottom = -(GfxBase.screen_bottom +
GfxBase.screen_height)/32 - 1, -GfxBase.screen_bottom/32 + 1
for j in xrange(self.th):
for i in xrange(self.tw):
if t_left <= i < t_right and t_top <= j < t_bottom:
# print (i, j), ':', self.sprite_array[j][i]
if not self.sprite_array[j][i] and self.array[j][i][0]
> 0:
_sprites_added += 1
image_id, transfo = self.array[j][i]
image = self.sheet[image_id]
image.anchor_x = image.anchor_y = 16
if transfo & 0x40:
image = image.get_transform(flip_y = True)
elif transfo & 0x80:
image = image.get_transform(flip_x = True)
sprite = pyglet.sprite.Sprite(image,
x = i * 32 + 16,
y = -j * 32 - 16,
blend_src =
self.blend_src,
blend_dest =
self.blend_dest,
batch = self.batch,
group = self.group,
usage = 'static')
sprite.opacity = self.alpha
self.sprite_array[j][i] = sprite
# print 'sprite drawn at
',(self.sprite_array[j][i].x, self.sprite_array[j][i].y), '#',
self.array[j][i], 'batch=', self.batch
elif self.sprite_array[j][i]:
_sprites_removed += 1
self.sprite_array[j][i] = None
I can explain the code more if needed but the difference with cocos' code
is that I use a 2D array to store the sprites, where cocos uses a dict
whose keys are tuples ?
Also, I use an OrderedGroup for each layer (in order to draw them in the
right order), whereas I didn't find how cocos achieves that (a Batch per
layer ?). I was wondering if it wouldn't be more efficient to set a z-value
to every sprites in a layer (rather than a group), but pyglet sprites don't
have a z attribute (I suppose it wouldn't be too hard to implement though,
but I don't know if it has an impact on performances). I suspect this group
drawing procedure to be one of the bottleneck of my program.
As to the draw method, mine is simply :
pyglet.gl.glLoadIdentity()
self.window.clear()
pyglet.gl.glTranslatef(-GfxBase.screen_left,
-GfxBase.screen_bottom, 0)
self.batch.draw()
> Cocos2D code is a great example. I know it can be hard to read if you're
> not used to OOP (too many layers!), but I think it will help you with
> your problem.
>
> In fact, I knew about Cocos2D, and studied its TMX loader before. I agree
that's a great library. Ressources on the net about it should be more
numerous.
> Regards,
>
> Juan
>
> --
> jjm's home: http://www.usebox.net/jjm/
> blackshell: http://blackshell.usebox.net/
>
--
You received this message because you are subscribed to the Google Groups
"pyglet-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/pyglet-users.
For more options, visit https://groups.google.com/groups/opt_out.