Todd
Todd

Reputation: 21

How would I create random locations for many groups of sprites?

I have tried a for loop with the blit and draw methods and using different variables for " PlayerSprite " and " Treegroup "

for PlayerSprite in Treegroup:
    surface.blit(PlayerSprite,(random.randrange(100,500),random.randrange(100,600)))

also tried

 SPRITES=[]
 for Sprites in range(10):
     Sprites= PlayerSprite
     SPRITES.append(Sprites)

all I get are errors

screen=pygame.display.set_mode((640,480))
background1=pygame.image.load("C:\Pygame-Docs\examples\data\Random Map.bmp")


class Tree1(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image=pygame.image.load('C:\Pygame-Docs\examples\data\Tree 1.bmp')
        self.image=self.image.convert()
        self.rect=self.image.get_rect()
        self.rect.centerx=random.randrange(10,100)
        self.rect.centery=random.randrange(10,100)

# Makes a group of trees 
Howmanytrees=random.randrange(5,10)
Trees=[]        
for tree in range(Howmanytrees):            
trees=Tree1()
Trees.append(trees)

# Howmany groups 
for Treegroup in range(10):
    Treegroup=Trees

# Places groups

PlayerSprite=pygame.sprite.Group(Treegroup)

# keeps loop ( game ) going until canceled
keepgoing=True
while keepgoing:

   for event in pygame.event.get():
      if event.type==pygame.QUIT:
         keepgoing=False

# actually draws screen
screen.blit(background1,(0,0))
PlayerSprite.draw(screen)
pygame.display.flip()

This code only displays 5 to 10 trees " Trees=[] " and nothing else. I have worked on this problem for over a week , read many tutorials, looked on many websites, nothing seems to work. I must be overlooking or missing somethig. I thought this would be easy!

Thanks so much!

Upvotes: 2

Views: 1856

Answers (3)

Oventoaster
Oventoaster

Reputation: 299

I would use randint and move_ip to get what you want. Here is a code snippet from my own game that works just as well:

self.rect.move_ip(random.randint(minX, maxX), random.randint(minY, maxY))

the four variables minX, maxX, minY, maxY form a rectangle where the sprite can be placed. In your case, the trees would be placed along the entire screen, but with a reduced max X and Y range so trees won't clip through the bottom of the screen.

Also, use a Group class to store your trees rather than a list. A list stops the spawning of multiple trees, while a Group does. Here is how to call it:

Treegroup = pygame.sprite.Group

and to add a sprite to the group:

Treegroup.add(Tree1(screen))

Make sure the class itself has screen in its init, like so:

def __init__(self, screen)

Once that's done, your code should look something like this:

for Treegroup in range(10):
    Treegroup.add(Tree(screen))
[...]
class Tree(pygame.sprite.Sprite):
    def __init__(self, screen):
        pygame.sprite.Sprite.__init__(self)
        self.image, self.rect = load_image('tree.png', -1)
        self.rect.move_ip(random.randint(0, 800), random.randint(0, 600))
        self.area = screen.get_rect()

Upvotes: 1

kriss
kriss

Reputation: 24157

As far as I understand what you want to achieve, the below code should help you. I kept it very very simple regarding python syntax, as you seems to be a newbie (for experienced programmers: yes, what I wrote below is horrible python code, but I believe the OP can understand it and it may help).

The key is that if you want to get several groups of trees, you must have a loop within a loop. The inner loop put the trees inside the group, and the outer loop put several groups. Of course you can (and should) certainly hide the inner loop behind some function or class.

# Howmany groups ? say 3 
trees_groups = []
number_of_groups = 3
for _ in range(number_of_groups):
    # Choose a base position for my group of trees
    base_x = random.randrange(0,530)
    base_y = random.randrange(0,370)
    # Makes a group of trees 
    trees=[]
    number_of_trees = random.randrange(5,10)
    for _ in range(number_of_trees):
        one_tree = Tree1()
        trees.append(one_tree)
    for tree in trees:
        tree.rect.centerx += base_x
        tree.rect.centery += base_y
        trees_groups.append(tree)


# Places groups
PlayerSprite=pygame.sprite.Group(trees_groups)

Some after notes:

  • And as other posters said, you should not use capitalized variables as you do. The python usage is to keep them for classes
  • Also looping using range when the base variant is not used is bad practice. I emphasized this by using underline as a variable name for the loop variant when it is not used.

Upvotes: 1

Chris Dennett
Chris Dennett

Reputation: 22721

It doesn't really make much sense to me.

for tree in range(Howmanytrees):            
trees=Tree1()
Trees.append(trees)

Your loop here is doing nothing at all. tree should be a number between 0 and Howmanytrees. Again, the following block isn't indented so it's not part of the loop. Even so, the block still wouldn't work. Also, you're confusing yourself and us with variable names. Trees is the object? trees is the list? Don't do this. Seriously.

No idea what the following code is up to.

# Howmany groups 
for Treegroup in range(10):
    Treegroup=Trees

Create your SpriteGroup passing in the aforementioned trees list? Or am I missing something :) TreeGroup = Trees 10 times is just going to do that 10 times. You are not using the loop variant. The only thing that modifies during the loop. Even so, this entire block of code is useless.

while keepgoing:

   for event in pygame.event.get():
      if event.type==pygame.QUIT:
         keepgoing=False

This is going to cause a nice infinite loop. It is evaluating the keepgoing variable constantly. This will never get set to false unless the user quits, but also it will never display anything on the screen. Lose this. Use this instead:

for event in pygame.event.get():
    if event.type == QUIT:
        return

This will not cause an infinite loop as there are only so many events to be processed per tick. Then the program will loop around and do the process or updating, rendering and getting input again.

Upvotes: 0

Related Questions