我如何为许多精灵组创建随机位置?

时间:2011-03-05 00:03:10

标签: python pygame

我尝试了一个带有blit和for方法的for循环,并为“PlayerSprite”和“Treegroup”使用了不同的变量

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

也尝试了

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

我得到的只是错误

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()

此代码仅显示5到10棵树“Trees = []” 没有别的。我已经解决了这个问题超过一个星期,阅读了很多教程,看了很多网站,似乎没什么用。我必须忽略或遗漏某些东西。我觉得这很容易!

非常感谢!

3 个答案:

答案 0 :(得分:1)

据我了解您想要实现的目标,以下代码应该对您有所帮助。我对python语法保持非常简单,因为你似乎是一个新手(对于有经验的程序员:是的,我在下面写的是可怕的python代码,但我相信OP可以理解它并且它可能有帮助。)

关键是如果你想获得几组树,你必须在一个循环中有一个循环。内循环将树放在组内,外循环放置几组。当然,你可以(而且应该)隐藏一些函数或类后面的内部循环。

# 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)

一些注意事项

  • 正如其他海报所说,你不应该像你一样使用大写变量。 python的用法是保留它们用于类
  • 在不使用基本变体时使用范围循环也是不好的做法。我强调了这一点,在未使用时将下划线用作循环变量的变量名。

答案 1 :(得分:1)

我会使用randintmove_ip来获得您想要的内容。这是我自己的游戏中的代码片段,同样有效:

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

四个变量minX,maxX,minY,maxY形成一个矩形,可以放置精灵。在您的情况下,树木将放置在整个屏幕上,但最大X和Y范围减小,因此树木不会穿过屏幕底部。

另外,使用Group类来存储树而不是列表。列表会停止产生多个树,而Group会产生。以下是如何称呼它:

Treegroup = pygame.sprite.Group

并向该组添加一个精灵:

Treegroup.add(Tree1(screen))

确保类本身在其init中具有屏幕,如下所示:

def __init__(self, screen)

完成后,您的代码应如下所示:

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()

答案 2 :(得分:0)

这对我来说没有多大意义。

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

你的循环在这里什么都不做。树应该是0和Howmanytrees之间的数字。同样,以下块不缩进,因此它不是循环的一部分。即便如此,该块仍然无效。而且,你和我们混淆了变量名称。树是对象?树是列表?不要这样做。严重。

不知道以下代码是什么。

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

创建传递上述树列表的SpriteGroup?或者我错过了什么:) TreeGroup = Trees 10次就是这样做了10次。您使用循环变体。在循环中唯一修改的东西。即便如此,整个代码块都没用。

while keepgoing:

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

这将导致一个不错的无限循环。它不断地评估保持变量。除非用户退出,否则永远不会将其设置为false,但它也不会在屏幕上显示任何内容。失去这个。请改用:

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

这不会导致无限循环,因为每个tick只需要处理很多事件。然后程序将循环并执行该过程或更新,渲染并再次获得输入。