Почему я не могу заставить мой Pygame Sprite двигаться на OSX? - PullRequest
0 голосов
/ 06 сентября 2011

Я играю с Pygame (учу себя из книги Энди Харриса «Программирование игр» 2007 года).

Он приводит несколько примеров движущихся спрайтов.Я не вижу разницы между его примерами и моим кодом ниже, но мой спрайт (jpeg fish, который я сделал) не двигается.«Остров» - это также JPEG, который я сделал.По сути, рыба должна двигаться горизонтально на 5 пикселей каждый кадр.Но вместо этого он просто сидит там.Возможно, я просто упускаю из виду что-то очевидное, или, возможно, что-то не так с моей системой (у меня установлено несколько версий Python, и в той, которая, по-видимому, запущена игра, написано import error, no module named scrap).

[edit:Я удалил все свои сумасшедшие вещи OSX, потому что это довольно отвлекает, и это не было проблемой].

import pygame  
pygame.init()  

screen = pygame.display.set_mode((800, 600))  
background = pygame.image.load('island_background.jpg')  
background = background.convert()  

class Fish(pygame.sprite.Sprite):  
    def __init__(self):  
        pygame.sprite.Sprite.__init__(self)  
        self.image = pygame.image.load('fish.jpg')  
        self.image = self.image.convert()  
        self.rect = self.image.get_rect()  
        self.rect.centerx = (600)  
        self.rect.centery = (500)  
        self.dx = 5  

    def update(self):  
        self.rect.centerx += self.dx  


def main():  
    keepgoing = True  
    clock = pygame.time.Clock()  
    fish = Fish()  
    allsprites = pygame.sprite.Group(fish)  

    while keepgoing:  
        clock.tick(30)  
        for event in pygame.event.get():  
            if event.type == pygame.QUIT:  
                keepgoing = False  

        screen.blit(background, (0, 0))  

        allsprites.clear(screen, background)
        #I thought the line above might be a problem, 
        #but commented it out and nothing changed (well, maybe I got a 
        #black background, but I don't recall. The fish just sat there in 
        #the same spot still

        allsprites.update  
        allsprites.draw(screen)  

        pygame.display.flip()  

if __name__ == '__main__':  
    main()      

1 Ответ

3 голосов
/ 09 сентября 2011

Я - Энди (автор книги, которую вы используете). Я ответил на ваше электронное письмо напрямую, но если кто-то еще читает, я опубликую здесь на благо SO сообщества.

Этовообще не проблема с OSX.
Все содержимое Mac - красная сельдь (извините, это была рыбная программа ... Я не смог устоять.)

Проблема в строке 42: allsprites.update

Должно читаться allsprites.update ()

Вот тонкое, но принципиальное отличие: в Python метод или функция также могут быть прочитаны как переменная.Это действительно мощная функция, но вы ее еще не используете.Если скобки сняты, они считываются как переменные (и ничего не делают.) Если скобки включены, функция выполняется.

Вы забыли скобки (на самом деле, некоторые редакторы, кажется, иногда удаляют их), и поэтому Python с радостью принял ваш код в качестве юридической инструкции.Тем не менее, он просто признал, что на самом деле существует метод с именем allsprites.update.Метод обновления никогда не вызывался, поэтому спрайт никогда не обновлялся, поэтому его позиция никогда не менялась.

Моя версия фактически вызывает метод обновления группы спрайтов, который, в свою очередь, вызывает методы обновления всех спрайтов-членов, ипрограмма работает просто отлично.Просто чтобы быть уверенным, я протестировал его на всех трех основных операционных системах (Ubuntu, Mac и Win 7), и он работает нормально.

Если у вас когда-нибудь возникают сомнения по поводу того, работает ли код в вашей ОС,Пожалуйста, загрузите мой оригинальный проверенный код с моего веб-сайта (http://www.aharrisbooks.net) и посмотрите, работает ли он.

Дайте мне знать, если вы застряли где-нибудь еще.

Кстати, я сейчас работаю надкнига по программированию игр для HTML5. Заходите на мой сайт за дополнительной информацией ....

...