2011-03-05 70 views
2

我已经尝试了用于循环使用的blit和借鉴的方法和使用不同的变量“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 = []” 而没有别的。我已经在这个问题上工作了一个多星期,阅读了很多教程,看过很多网站,似乎没有任何工作。我必须忽视或忽略一些事件。我认为这很容易!

非常感谢!

回答

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 

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

+0

对不起!我有一个'树'的拼写错误应该是'树' – Todd 2011-03-05 00:37:38

+0

树是,列出这就是为什么我把它大写;我会尽量让自己的变量更加清晰,就像while循环一样,我只是关闭窗口来停止。我知道Treegroup没有做任何事情,我应该在发布前删除它;只是最后一分钟的实验。 – Todd 2011-03-05 00:52:45

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

我会用randintmove_ip来得到你想要的。下面是我自己的游戏的代码片段的作品一样好:

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

四个变量了minX,maxX的,MINY,美星形式,其中精灵可以放置一个矩形。在你的情况下,树会沿着整个屏幕放置,但减少了最大X和Y范围,所以树不会通过屏幕底部剪辑。

此外,使用Group类来存储您的树,而不是一个列表。列表将停止多棵树的产卵,而Group会。下面是如何称呼它:

Treegroup = pygame.sprite.Group

和一个精灵添加到组:

Treegroup.add(Tree1(screen))

确保类本身有屏幕的初始化,像这样:

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