2015-03-24 2 views
0

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

#Import and Init 
import pygame 
import random 
from pygame.locals import * 
pygame.init() 

#Set Up the Window 
width = 1240 
height = 700 
screen = pygame.display.set_mode((width, height)) 
pygame.display.set_caption("Pollination!") 

background = pygame.Surface(screen.get_size()) 
background = pygame.image.load("Forrest.jpg") 
background = background.convert() 

#Load and Convert the wasp 
wasp = pygame.sprite.Sprite() 
wasp.image = pygame.image.load("wasp1.gif") 
wasp.rect = wasp.image.get_rect() 
wasp_group = pygame.sprite.GroupSingle(wasp) 

flowers = pygame.sprite.OrderedUpdates() 

for i in range(5): 
    orchid = pygame.sprite.Sprite() 
    orchid.image = pygame.image.load("orchid1.gif") 
    orchid.rect = orchid.image.get_rect() 
    orchid.rect.right = random.randint(0, 1240) 
    orchid.rect.top = random.randint(0, 700) 
    flowers.add(orchid) 

buzz = pygame.mixer.Sound("buzz.wav") 
#Clock and Loop Variables 
framerate = pygame.time.Clock() 
GameGo = True 

orchid_xinc = 2 
orchid_yinc = 2 

wasp_move = 5 
#The Main Loop 
while GameGo: 

    #Tick the Clock 
    framerate.tick(60) 

    #Keyborad Keypress Events, Movement 

    if pygame.key.get_pressed()[K_UP]: 
     wasp.rect.top -= wasp_move 
     if wasp.rect.top < -30: 
      wasp.rect.top = -30 
    if pygame.key.get_pressed()[K_DOWN]: 
     wasp.rect.top += wasp_move 
     if wasp.rect.top > 625: 
      wasp.rect.top = 625 
    if pygame.key.get_pressed()[K_LEFT]: 
     wasp.rect.right -= wasp_move 
     if wasp.rect.right < 110: 
      wasp.rect.right = 110 
    if pygame.key.get_pressed()[K_RIGHT]: 
     wasp.rect.right += wasp_move 
     if wasp.rect.right > 1255: 
      wasp.rect.right = 1255 

    for orchid in flowers: 
     if orchid.rect.top < -30: 
      orchid_yinc *= -1 
     if orchid.rect.top > 625: 
      orchid_yinc *= -1 
     if orchid.rect.right < 110: 
      orchid_xinc *= -1 
     if orchid.rect.right > 1255: 
      orchid_xinc *= -1 

     orchid.rect.right += orchid_xinc 
     orchid.rect.top -= orchid_yinc 

    for orchid in pygame.sprite.groupcollide(wasp_group, flowers, False, True): 
     buzz.play() 
## #Blit our Images 
    screen.blit(background, (0, 0)) 
    flowers.draw(screen) 
    wasp_group.draw(screen) 
    pygame.display.update() 


    #Handle a Close Event 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      GameGo = False 

pygame.quit() 
+0

Я смиренно предлагаю вам исследовать использование классов, на самом деле довольно легко справляется с несколькими идентичными, но отдельными объектами. – oxrock

+0

Мне легче не использовать классы, как правило. Нужно ли в этом случае? –

+0

Вы пытаетесь управлять группой идентичных спрайтов с помощью одного набора глобальных переменных. Мне кажется довольно очевидным, что они будут действовать одинаково. Вы уже используете класс спрайтов pygame, но довольно красиво, если начинаете создавать свои собственные классы спрайтов, вы можете легко справиться со многими другими вещами и полностью не зависимо от любого другого объекта. Объявите ООП, есть причина, по которой это так популярно. – oxrock

ответ

0

Пожалуй, тот факт, что вы тип «орхидея _ ####» в вашем цикл, который обновляет каждую орхидею. Если в вашем классе орхидеи метод init определяет self. #### как он должен, его вызывается с помощью «Object. ####», а не подчеркиванием. Если я ошибаюсь, проверьте функцию flowers.draw, убедившись, что она рисует все орхидеи, используя свои собственные координаты.

+0

Я изменил знак подчеркивания на период в переменных, как вы предполагали, но это, похоже, не решает мою проблему. На самом деле я получаю сообщение об ошибке сейчас (объект AttributeError: «Sprite» не имеет атрибута «xinc»), когда я пытаюсь использовать более одной орхидеи. –

+0

Имей извините, верните эти изменения. Я не видел, что вы указали имя переменной orchid_xinc и что это была простая переменная. Во всяком случае, после этого, вы должны, вероятно, назначить xinc и yincs для отдельной орхидеи и сделать их случайными. Сейчас xinc и yinc одинаковы для всех из них, поэтому, конечно, они движутся в группе. –

Смежные вопросы