首页 > 解决方案 > 制作 Flappy Bird 但我如何实现在屏幕外生成然后穿过屏幕并消失的管道

问题描述

所以我有点坚持如何实现管道在屏幕外产卵并让它们在屏幕上移动,以便它们可以碰撞鸟,然后在屏幕外产卵。我需要给管道加速还是其他什么?

我对代码相当陌生,但我对如何做到这一点有一些想法,但我真的不知道如何实现它或如何使管道随机生成。

#Floppy disk
import sys, pygame
from pygame import mixer
import time

pygame.init()
pygame.mixer.init()
FRAMERATE = 60
clock = pygame.time.Clock()


mixer.music.load('africa-toto.wav')
mixer.music.play(1, 0.0, 3000)

size = width, height = 1000, 1000
speed = [2,2]
power = [0.1, 0.1]
white = 255, 255, 255
black = 0, 0, 0
blue = 0, 255, 200
green = 0, 200, 0
dy = 2
dx =2
screen = pygame.display.set_mode(size)



player1 = pygame.image.load("floppy1.jpg")
pygame.key.set_repeat(1,1)
player = pygame.draw.rect(screen, blue, (500, 500,10, 10))
playerrect = player1.get_rect()

background_image = pygame.image.load("circuit.jpeg").convert()

def obstacles():
    obst1 = pygame.draw.rect(screen, green, (500, 600, 100, 450))
    obst2 = pygame.draw.rect(screen, green, (500, 0, 100, 450))
    obst3 = pygame.draw.rect(screen, green, (700, 0, 100, 400))
    obst4 = pygame.draw.rect(screen, green, (700, 550, 100, 500))

obstacles()  


while True:
    clock.tick(FRAMERATE)
    print(dy)

    if dy > 0:
        dy *= 1.03
        if dy < 2:
            dy *= 1.03
    if dy < 0:
        dy *= 0.9
        if dy > -1.3:
            dy *= 0.95
    if dy < 0 and dy > -0.6:        #Deceleraiton point
        dy *= -1.2
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.KEYDOWN:
##            if event.key == pygame.K_LEFT:
##                speed[0] -= power[0]
##            if event.key == pygame.K_RIGHT:
##                speed[0] += power[0]
            if event.key == pygame.K_UP:
                dy = -10

                #speed[1] -= power[1]
            if event.key == pygame.K_DOWN:
                speed[1] += power[1]

    if playerrect.bottom > height:
        dy = -20
    if playerrect.top < 0:
        dy = 15
    playerrect = playerrect.move(0, dy)
    
    #screen.fill(white)
    screen.blit(background_image, [0,0])
    screen.blit(player1, playerrect,  obstacles())
    pygame.display.flip()
    pygame.display.update()

标签: pythonpygame

解决方案


对于做非常相似的事情的多项事情,我强烈建议使用https ://docs.python.org/3/tutorial/classes.html

# you don't need to declare those variables globally, it's only one of multiple ways.
# a cleaner way would be to declare those as class variables, you can check out the 
# documentation (linked above) for more information.

# random needs to be imported
spawn_timer = 0
movement_speed = 2
x_size = 50
gap_size = 300
pipes = []
# screen, width and height have already been declared

class Pipe:
    def __init__(self, x_pos=width):
        random_height = random.randint(0, height - gap_size)
        self.upper_rect = pygame.Rect(x_pos, 0, x_size, random_height)
        self.lower_rect = pygame.Rect(x_pos, random_heigt - gap_size,
        x_size, height - random_height - gap_size)

    def draw(self):
        pygame.draw.rect(screen, green, self.upper_rect)
        pygame.draw.rect(screen, green, self.lower_rect)

    def collide(self, rect):
        return self.lower_rect.colliderect(rect) or self.upper_rect.colliderect(rect)

    def update(self)
        self.upper_rect.move_ip(-movement_speed, 0)
        self.lower_rect.move_ip(-movement_speed, 0)

# in the main loop:
spawn_timer += 1
if spawn_timer >= 200:  # use different values for distance between pipes
    pipes.append(Pipe())
    spawn_timer = 0
for pipe in pipes:
    pipe.draw()
    pipe.update()
    if pipe.collide(playerrect):
        print('GAME OVER')  # reset the game
if pipes and pipes[0].upper_rect.right < 0:  # first pipe will be leftmost pipe.
    pipes.pop(0)

我还注意到坠落的感觉不那么干净。对于更自然的运动,我建议在值上添加一些东西dy而不是乘以它。

如果您有任何问题,请写评论。

编辑:修复list index out of range错误。
编辑:固定'module' object is not callable


推荐阅读