我尝试了一个带有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 = []” 没有别的。我已经解决了这个问题超过一个星期,阅读了很多教程,看了很多网站,似乎没什么用。我必须忽略或遗漏某些东西。我觉得这很容易!
非常感谢!
答案 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)
一些注意事项:
答案 1 :(得分:1)
我会使用randint
和move_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只需要处理很多事件。然后程序将循环并执行该过程或更新,渲染并再次获得输入。