Как бы я создал случайные локации для многих групп спрайтов? - PullRequest
2 голосов
/ 05 марта 2011

Я пробовал цикл for с методами blit и draw и с использованием различных переменных для "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 ]

1 голос
/ 06 марта 2011

Насколько я понимаю, чего вы хотите достичь, приведенный ниже код должен вам помочь. Я сохранил это очень очень просто в отношении синтаксиса 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 голос
/ 19 мая 2012

Я бы использовал 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))

Убедитесь, что класссам по себе экран в своем инициализации, например, так:

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()
0 голосов
/ 05 марта 2011

Для меня это не имеет особого смысла.

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

Это приведет к хорошему бесконечному циклу.Он постоянно оценивает текущую переменную.Это никогда не будет установлено в ложь, пока пользователь не выйдет, но также оно никогда не будет отображать что-либо на экране.Потерять это.Используйте это вместо:

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

Это не приведет к бесконечному циклу, так как на тик нужно обработать только столько событий.Затем программа зациклится и выполнит процесс или обновление, рендеринг и получение ввода снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...