Re: [pygame] circles

2010-10-03 Thread kevin hayes
Thanks guys!  I think I've got a better handle on it now.

On Sat, Oct 2, 2010 at 10:05 PM, B W stabbingfin...@gmail.com wrote:

 I like Ian's earlier suggestion, Kevin, which he only hinted at. But I
 sense you're really struggling with how to extend your Circle class, and
 could use an example to go with the explanations.

 Note that every time you create a circle object with the Circle class,
 you're executing the constructor __init__. So if you add some parameters to
 __init__, then you can manipulate the creation and will get objects that
 behave in the same manner but with different details. Details such as
 position, direction, color, and anything else you need.

 In the constructor do something like this:


 class Circle(pygame.sprite.Sprite):
 def __init__(self, position, direction, color, *groups):
 pygame.sprite.Sprite.__init__(self, *groups)
 #[use your same image and rect code]
 self.rect.center = position
 self.dx,self.dy = direction

 Your update method is fine the way it is. As Ian points out, get rid of
 update_circle2; it doesn't serve your purposes.

 In main create some circles at different start positions, directions, and
 colors, and might as well supply their sprite group since the Sprite
 superclass's constructor can automatically add the sprite to the group for
 you:

 Circle([25,25], [+5,+5], Color(yellow), allSprites)  # top-left, going
 down-right
 Circle([640-25,25], [-5,+5], Color(red), allSprites)  # top-right, going
 down-left

 You may be wondering where the circles go, since you're obviously not
 assigning them to a variable. They're in your sprite group, by virtue of the
 pygame.sprite.Sprite.__init__(self, *groups) call.

 I'm sure you can figure out the other two circles.

 After making these changes, you can remove the few lines of main's sprite
 initialization that no longer serve a purpose.

 Hope that helps to get you over the hump.

 Gumm



 On Sat, Oct 2, 2010 at 7:38 PM, kevin hayes kevino...@gmail.com wrote:

 I just want to thank you for taking the time to help me out.  I'm going to
 take a break for a while and when I come back I'm going to look over your
 suggestions.  I hope to be able to answer some questions at some point
 rather than asking them.

 On Sat, Oct 2, 2010 at 7:24 PM, Ian Mallett geometr...@gmail.com wrote:

 On Sat, Oct 2, 2010 at 8:09 PM, kevin hayes kevino...@gmail.com wrote:

 At this point I don't really care if the sprites write over eachother...

 You should.  Because otherwise, you can't see anything.  I don't mean
 proper handling of occlusion; I mean not being able to see what's going on.
 The problem can be found by first figuring out why they are being drawn on
 top of each other.  In graphics programming the problem is almost always
 self-evident once you see what's actually happening.

 as long as that doesn't cause the program to crash.  I'm just trying to
 get four circles going diagonally from each corner.  The problem I'm having
 is with the update function...Do I write two update functions?  How do I 
 get
 the update function to apply separate code for the two (or more) circles?

 Only one update function can exist.  What you CAN (and should) do,
 though, is have the update function do a different thing for each sprite.
 Your second update function is never getting called, so delete it.

 Here is my code as it stands:

 Add this:
 circle2.dx = -5
 Then, you'll see that the sprites were being drawn over each other (and
 moreover, they were starting in the same position, so the yellow one darts
 off the screen to the left).  This latter is due to the fact that startPosx
 is never used.  Change your update function to change startPosx and
 startPosy instead of rect.center.

 Ian






Re: [pygame] circles

2010-10-02 Thread Ian Mallett
Hi,

Your code only makes one circle.  How can you possibly expect four circles,
when you only make one?  From the spec, you need to add other instances of
your circle sprite in your pygame.sprite.Group() call.  Hint: try
[circle1,circle2,circle3,circle4]

If you tried this, then you'll see (or rather won't, but that's what's
happening) that all the sprites draw over each other.  You'll need to write
separate logic for each sprite's update function, or all the sprites will
draw on top of each other.  I've done this by passing (varying) extra
arguments to your sprites' constructors to alter their internal states.

Ian


Re: [pygame] circles

2010-10-02 Thread kevin hayes
At this point I don't really care if the sprites write over eachother...as
long as that doesn't cause the program to crash.  I'm just trying to get
four circles going diagonally from each corner.  The problem I'm having is
with the update function...Do I write two update functions?  How do I get
the update function to apply separate code for the two (or more) circles?
Here is my code as it stands:

import pygame
pygame.init()

screen = pygame.display.set_mode((640, 480))

class Circle(pygame.sprite.Sprite):
def __init__(self, color):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((50, 50))
self.image.fill((255, 255, 255))
pygame.draw.circle(self.image, (color), (25, 25), 25)
self.rect = self.image.get_rect()
self.startPosx = self.rect.centerx
self.startPosy = self.rect.centery
self.dx = 5
self.dy = 5


def update(self):
self.rect.centerx += self.dx
self.rect.centery += self.dy
if self.rect.right  screen.get_width():
self.rect.left = 0
if self.rect.top  screen.get_height():
   self.rect.bottom = 0

def update_circle2(self):
self.rect.centerx -= self.dx
self.rect.centery += self.dy
if self.rect.left  0:
self.rect.right = 0
if self.rect.top  screen.get_height():
self.rect.bottom = 0

def main():
pygame.display.set_caption(Diagonal Circle)

background = pygame.Surface(screen.get_size())
background.fill((255, 255, 255))
screen.blit(background, (0, 0))

circle1 = Circle(pygame.color.Color(yellow))
circle2 = Circle(pygame.color.Color(red))
circle1.startPosx = 0
circle1.startPosy = 0
circle2.startPosx = screen.get_width()
circle2.startPosy = 0


allSprites = pygame.sprite.Group(circle1, circle2)

clock = pygame.time.Clock()
keepGoing = True
while keepGoing:
clock.tick(30)
for event in pygame.event.get():
if event.type == pygame.QUIT:
keepGoing = False

allSprites.clear(screen, background)
allSprites.update()
allSprites.draw(screen)

pygame.display.flip()

if __name__ == __main__:
main()

pygame.quit()







On Sat, Oct 2, 2010 at 6:43 PM, Ian Mallett geometr...@gmail.com wrote:

 Hi,

 Your code only makes one circle.  How can you possibly expect four circles,
 when you only make one?  From the spec, you need to add other instances of
 your circle sprite in your pygame.sprite.Group() call.  Hint: try
 [circle1,circle2,circle3,circle4]

 If you tried this, then you'll see (or rather won't, but that's what's
 happening) that all the sprites draw over each other.  You'll need to write
 separate logic for each sprite's update function, or all the sprites will
 draw on top of each other.  I've done this by passing (varying) extra
 arguments to your sprites' constructors to alter their internal states.

 Ian



Re: [pygame] circles

2010-10-02 Thread Ian Mallett
On Sat, Oct 2, 2010 at 8:09 PM, kevin hayes kevino...@gmail.com wrote:

 At this point I don't really care if the sprites write over eachother...

You should.  Because otherwise, you can't see anything.  I don't mean proper
handling of occlusion; I mean not being able to see what's going on.  The
problem can be found by first figuring out why they are being drawn on top
of each other.  In graphics programming the problem is almost always
self-evident once you see what's actually happening.

 as long as that doesn't cause the program to crash.  I'm just trying to get
 four circles going diagonally from each corner.  The problem I'm having is
 with the update function...Do I write two update functions?  How do I get
 the update function to apply separate code for the two (or more) circles?

Only one update function can exist.  What you CAN (and should) do, though,
is have the update function do a different thing for each sprite.  Your
second update function is never getting called, so delete it.

 Here is my code as it stands:

Add this:
circle2.dx = -5
Then, you'll see that the sprites were being drawn over each other (and
moreover, they were starting in the same position, so the yellow one darts
off the screen to the left).  This latter is due to the fact that startPosx
is never used.  Change your update function to change startPosx and
startPosy instead of rect.center.

Ian


Re: [pygame] circles

2010-10-02 Thread B W
I like Ian's earlier suggestion, Kevin, which he only hinted at. But I sense
you're really struggling with how to extend your Circle class, and could use
an example to go with the explanations.

Note that every time you create a circle object with the Circle class,
you're executing the constructor __init__. So if you add some parameters to
__init__, then you can manipulate the creation and will get objects that
behave in the same manner but with different details. Details such as
position, direction, color, and anything else you need.

In the constructor do something like this:

class Circle(pygame.sprite.Sprite):
def __init__(self, position, direction, color, *groups):
pygame.sprite.Sprite.__init__(self, *groups)
#[use your same image and rect code]
self.rect.center = position
self.dx,self.dy = direction

Your update method is fine the way it is. As Ian points out, get rid of
update_circle2; it doesn't serve your purposes.

In main create some circles at different start positions, directions, and
colors, and might as well supply their sprite group since the Sprite
superclass's constructor can automatically add the sprite to the group for
you:

Circle([25,25], [+5,+5], Color(yellow), allSprites)  # top-left, going
down-right
Circle([640-25,25], [-5,+5], Color(red), allSprites)  # top-right, going
down-left

You may be wondering where the circles go, since you're obviously not
assigning them to a variable. They're in your sprite group, by virtue of the
pygame.sprite.Sprite.__init__(self, *groups) call.

I'm sure you can figure out the other two circles.

After making these changes, you can remove the few lines of main's sprite
initialization that no longer serve a purpose.

Hope that helps to get you over the hump.

Gumm


On Sat, Oct 2, 2010 at 7:38 PM, kevin hayes kevino...@gmail.com wrote:

 I just want to thank you for taking the time to help me out.  I'm going to
 take a break for a while and when I come back I'm going to look over your
 suggestions.  I hope to be able to answer some questions at some point
 rather than asking them.

 On Sat, Oct 2, 2010 at 7:24 PM, Ian Mallett geometr...@gmail.com wrote:

 On Sat, Oct 2, 2010 at 8:09 PM, kevin hayes kevino...@gmail.com wrote:

 At this point I don't really care if the sprites write over eachother...

 You should.  Because otherwise, you can't see anything.  I don't mean
 proper handling of occlusion; I mean not being able to see what's going on.
 The problem can be found by first figuring out why they are being drawn on
 top of each other.  In graphics programming the problem is almost always
 self-evident once you see what's actually happening.

 as long as that doesn't cause the program to crash.  I'm just trying to
 get four circles going diagonally from each corner.  The problem I'm having
 is with the update function...Do I write two update functions?  How do I get
 the update function to apply separate code for the two (or more) circles?

 Only one update function can exist.  What you CAN (and should) do, though,
 is have the update function do a different thing for each sprite.  Your
 second update function is never getting called, so delete it.

 Here is my code as it stands:

 Add this:
 circle2.dx = -5
 Then, you'll see that the sprites were being drawn over each other (and
 moreover, they were starting in the same position, so the yellow one darts
 off the screen to the left).  This latter is due to the fact that startPosx
 is never used.  Change your update function to change startPosx and
 startPosy instead of rect.center.

 Ian