Как новичок в Pygame и относительный новичок в Python (около 4 месяцев знаний), я подумал, что было бы неплохо попробовать воссоздать популярное приложение для телефона Flappy Bird. Я хорошо справлялся с этим до той точки, на которой я сейчас нахожусь. Как мне сохранить прокрутку одного прямоугольника при рисовании другого, который будет прокручиваться с использованием той же функции? Это возможно? Вероятно, есть способ для этого, но я изучаю модуль менее 7 часов: D Вот мой код на Python 3.2. (Не включая импорт)

def drawPipe():
    randh = random.randint(40,270)
    scrollx -=0.2
    pygame.draw.rect(screen, (0,150,30), Rect((scrollx,0),(30,340)))


bif = "BG.jpg"
mif = "bird.png"

pygame.init()
screen = pygame.display.set_mode((640,900),0,32)

background = pygame.image.load(bif).convert()
bird = pygame.image.load(mif).convert_alpha()

pygame.display.set_caption("Flappy Bird")
pygame.display.set_icon(bird)

x,y = 320,0
movex, movey = 0,0

scrollx = 640

while True:
    for event in pygame.event.get():
        movey = +0.8
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == KEYDOWN:
            if event.key == K_SPACE:
                movey = -2


    x += movex
    y += movey


    screen.blit(background,(0,0))
    screen.blit(bird,(x,y))

    drawPipe()


    pygame.display.update()

Спасибо за любую помощь, которую вы можете оказать!

0
Harvey 2 Фев 2014 в 22:25
К сожалению, я не знаком с игрой. Не могли бы вы подробнее рассказать о прокрутке, которую вы пытаетесь сделать?
 – 
Bartlomiej Lewandowski
3 Фев 2014 в 01:17
По сути, это зеленая трубка в стиле Марио (в моем случае прямоугольник), которая бесконечно прокручивается на разной высоте. Изначально я подумал: «Ну, это просто прокрутка строк. Как трудно это может быть?' Но я думаю, что наличие на экране более одного прямоугольника одновременно на разной высоте - это то, что создает для меня проблему. Спасибо за ответ!
 – 
Harvey
4 Фев 2014 в 00:57

1 ответ

Лучший ответ

Сначала вы должны создать объект, который вы хотите иметь в игре, с одной операцией по их рисованию.

Итак, вместо функции, которая рисует канал и прокручивает, вам нужно что-то в этом роде:

class Pipe:

def __init__(self,x,height):
    self.rect = Rect((x,0),(30,height))

def update():
    self.rect.move_ip(-2,0)

def draw(screen):
    pygame.draw.rect(screen,color,self.rect)

А позже в игре вы можете иметь:

pipes = [Pipe(x*20,random.randint(40,270)) for x in range(5)]

for pipe in pipes:
    pipe.draw(screen)
    pipe.update()

Позже вы можете просто удалить трубы, которых нет на экране, и добавить новые, когда будет удалена труба.

1
Bartlomiej Lewandowski 4 Фев 2014 в 01:47
Большое спасибо! Я пытался избежать использования классов, но думаю, это было неизбежно. Спасибо, в любом случае!
 – 
Harvey
4 Фев 2014 в 02:32
В использовании классов нет ничего постыдного. Вы можете просто сохранить сами Rects в списке, но удобнее иметь отдельные классы с выделенными методами.
 – 
Bartlomiej Lewandowski
4 Фев 2014 в 03:43
Что ж, на самом деле это произошло в самое подходящее время, потому что пример, который вы мне дали, действительно заставил меня задуматься, и теперь я лучше понимаю классы!
 – 
Harvey
4 Фев 2014 в 11:22