制作《Flappy Bird》,但我如何执行在屏幕外生成管道,然后穿过屏幕并消失



所以我有点卡在如何实现管道刷出屏幕,使他们在屏幕上移动,以便他们可以碰撞鸟,然后DE刷出屏幕。我需要给管道加速度还是别的什么?

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

#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()

对于做非常相似的事情的多个东西,我强烈建议使用: 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错误。
编辑:fixed'module' object is not callable

最新更新