├── README.md ├── background-day.png ├── base.png ├── bluebird-downflap.png ├── bluebird-midflap.png ├── bluebird-upflap.png ├── flappy.py └── pipe-red.png /README.md: -------------------------------------------------------------------------------- 1 | Em breve, vídeo no YouTube explicando o código! 2 | 3 | Assets tirados de: https://github.com/sourabhv/FlapPyBird -------------------------------------------------------------------------------- /background-day.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filhoweuler/python-flappybird/9e572fc3c141b530e74953bf3344f7d454d7deac/background-day.png -------------------------------------------------------------------------------- /base.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filhoweuler/python-flappybird/9e572fc3c141b530e74953bf3344f7d454d7deac/base.png -------------------------------------------------------------------------------- /bluebird-downflap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filhoweuler/python-flappybird/9e572fc3c141b530e74953bf3344f7d454d7deac/bluebird-downflap.png -------------------------------------------------------------------------------- /bluebird-midflap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filhoweuler/python-flappybird/9e572fc3c141b530e74953bf3344f7d454d7deac/bluebird-midflap.png -------------------------------------------------------------------------------- /bluebird-upflap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filhoweuler/python-flappybird/9e572fc3c141b530e74953bf3344f7d454d7deac/bluebird-upflap.png -------------------------------------------------------------------------------- /flappy.py: -------------------------------------------------------------------------------- 1 | import pygame, random 2 | from pygame.locals import * 3 | 4 | SCREEN_WIDTH = 400 5 | SCREEN_HEIGHT = 800 6 | SPEED = 10 7 | GRAVITY = 1 8 | GAME_SPEED = 10 9 | 10 | GROUND_WIDTH = 2 * SCREEN_WIDTH 11 | GROUND_HEIGHT = 100 12 | 13 | PIPE_WIDTH = 80 14 | PIPE_HEIGHT = 500 15 | 16 | PIPE_GAP = 200 17 | 18 | class Bird(pygame.sprite.Sprite): 19 | 20 | def __init__(self): 21 | pygame.sprite.Sprite.__init__(self) 22 | 23 | self.images = [pygame.image.load('bluebird-upflap.png').convert_alpha(), 24 | pygame.image.load('bluebird-midflap.png').convert_alpha(), 25 | pygame.image.load('bluebird-downflap.png').convert_alpha()] 26 | 27 | self.speed = SPEED 28 | 29 | self.current_image = 0 30 | 31 | self.image = pygame.image.load('bluebird-upflap.png').convert_alpha() 32 | self.mask = pygame.mask.from_surface(self.image) 33 | 34 | self.rect = self.image.get_rect() 35 | self.rect[0] = SCREEN_WIDTH / 2 36 | self.rect[1] = SCREEN_HEIGHT / 2 37 | 38 | def update(self): 39 | self.current_image = (self.current_image + 1) % 3 40 | self.image = self.images[ self.current_image ] 41 | 42 | self.speed += GRAVITY 43 | 44 | # Update height 45 | self.rect[1] += self.speed 46 | 47 | def bump(self): 48 | self.speed = -SPEED 49 | 50 | class Pipe(pygame.sprite.Sprite): 51 | 52 | def __init__(self, inverted, xpos, ysize): 53 | pygame.sprite.Sprite.__init__(self) 54 | 55 | self.image = pygame.image.load('pipe-red.png').convert_alpha() 56 | self.image = pygame.transform.scale(self.image, (PIPE_WIDTH,PIPE_HEIGHT)) 57 | 58 | self.rect = self.image.get_rect() 59 | self.rect[0] = xpos 60 | 61 | if inverted: 62 | self.image = pygame.transform.flip(self.image, False, True) 63 | self.rect[1] = - (self.rect[3] - ysize) 64 | else: 65 | self.rect[1] = SCREEN_HEIGHT - ysize 66 | 67 | self.mask = pygame.mask.from_surface(self.image) 68 | 69 | def update(self): 70 | self.rect[0] -= GAME_SPEED 71 | 72 | class Ground(pygame.sprite.Sprite): 73 | 74 | def __init__(self, xpos): 75 | pygame.sprite.Sprite.__init__(self) 76 | 77 | self.image = pygame.image.load('base.png').convert_alpha() 78 | self.image = pygame.transform.scale(self.image, (GROUND_WIDTH, GROUND_HEIGHT)) 79 | 80 | self.mask = pygame.mask.from_surface(self.image) 81 | 82 | self.rect = self.image.get_rect() 83 | self.rect[0] = xpos 84 | self.rect[1] = SCREEN_HEIGHT - GROUND_HEIGHT 85 | 86 | def update(self): 87 | self.rect[0] -= GAME_SPEED 88 | 89 | def is_off_screen(sprite): 90 | return sprite.rect[0] < -(sprite.rect[2]) 91 | 92 | def get_random_pipes(xpos): 93 | size = random.randint(100, 300) 94 | pipe = Pipe(False, xpos, size) 95 | pipe_inverted = Pipe(True, xpos, SCREEN_HEIGHT - size - PIPE_GAP) 96 | return (pipe, pipe_inverted) 97 | 98 | 99 | pygame.init() 100 | screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) 101 | 102 | BACKGROUND = pygame.image.load('background-day.png') 103 | BACKGROUND = pygame.transform.scale(BACKGROUND, (SCREEN_WIDTH, SCREEN_HEIGHT)) 104 | 105 | bird_group = pygame.sprite.Group() 106 | bird = Bird() 107 | bird_group.add(bird) 108 | 109 | ground_group = pygame.sprite.Group() 110 | for i in range(2): 111 | ground = Ground(GROUND_WIDTH * i) 112 | ground_group.add(ground) 113 | 114 | pipe_group = pygame.sprite.Group() 115 | for i in range(2): 116 | pipes = get_random_pipes(SCREEN_WIDTH * i + 800) 117 | pipe_group.add(pipes[0]) 118 | pipe_group.add(pipes[1]) 119 | 120 | 121 | clock = pygame.time.Clock() 122 | 123 | while True: 124 | clock.tick(30) 125 | for event in pygame.event.get(): 126 | if event.type == QUIT: 127 | pygame.quit() 128 | 129 | if event.type == KEYDOWN: 130 | if event.key == K_SPACE: 131 | bird.bump() 132 | 133 | screen.blit(BACKGROUND, (0, 0)) 134 | 135 | if is_off_screen(ground_group.sprites()[0]): 136 | ground_group.remove(ground_group.sprites()[0]) 137 | 138 | new_ground = Ground(GROUND_WIDTH - 20) 139 | ground_group.add(new_ground) 140 | 141 | if is_off_screen(pipe_group.sprites()[0]): 142 | pipe_group.remove(pipe_group.sprites()[0]) 143 | pipe_group.remove(pipe_group.sprites()[0]) 144 | 145 | pipes = get_random_pipes(SCREEN_WIDTH * 2) 146 | 147 | pipe_group.add(pipes[0]) 148 | pipe_group.add(pipes[1]) 149 | 150 | bird_group.update() 151 | ground_group.update() 152 | pipe_group.update() 153 | 154 | bird_group.draw(screen) 155 | pipe_group.draw(screen) 156 | ground_group.draw(screen) 157 | 158 | pygame.display.update() 159 | 160 | if (pygame.sprite.groupcollide(bird_group, ground_group, False, False, pygame.sprite.collide_mask) or 161 | pygame.sprite.groupcollide(bird_group, pipe_group, False, False, pygame.sprite.collide_mask)): 162 | # Game over 163 | input() 164 | break 165 | -------------------------------------------------------------------------------- /pipe-red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filhoweuler/python-flappybird/9e572fc3c141b530e74953bf3344f7d454d7deac/pipe-red.png --------------------------------------------------------------------------------