我目前正在使用Python 3.2在Pygame中制作'Flappy Bird'重拍。我认为这对练习有好处,而且相对简单。然而,事实证明这很难。目前,我在绘制不同高度的矩形时遇到问题,但将矩形保持在设置的高度。
这是我的 Pipe 类
class Pipe:
def __init__(self,x):
self.drawn = True
self.randh = random.randint(30,350)
self.rect = Rect((x,0),(30,self.randh))
def update(self):
self.rect.move_ip(-2,0)
def draw(self,screen):
self.drawn = True
pygame.draw.rect(screen,(0,130,30),self.rect)
我的循环如下:
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))
Pipe1 = Pipe(scrollx)
if Pipe1.drawn == True:
Pipe1.update()
else:
Pipe1 = Pipe(scrollx)
Pipe1.draw(screen)
scrollx -= 0.3
pygame.display.update()
我已经和这段代码搏斗了一个多星期了,我非常感谢你能给予的任何帮助。
答案 0 :(得分:1)
我没有遵循这一部分的逻辑:
Pipe1 = Pipe(scrollx)
if Pipe1.drawn == True:
Pipe1.update()
else:
Pipe1 = Pipe(scrollx)
Pipe1.draw(screen)
drawn
属性在构造函数中设置为True
,那么您何时期望触发else
条件?请记住,您正在重建此管道每一帧。
你是否尝试过用与鸟类相同的方式绘制管道?
编辑:建议你循环:
PIPE_TIME_INTERVAL = 2
pipes = [] # Keep the pipes in a list.
next_pipe_time = 0
while True:
[... existing code to handle events and draw the bird ...]
for pipe in pipes:
pipe.move(10) # You'll have to write this `move` function.
if pipe.x < 0: # If the pipe has moved out of the screen...
pipes.pop(0) # Remove it from the list.
if current_time >= next_pipe_time: # Find a way to get the current time/frame.
pipes.append(Pipe()) # Create new pipe.
next_pipe_time += PIPE_TIME_INTERVAL # Schedule next pipe creation.
答案 1 :(得分:0)
您正在每个循环上创建一个新的Pipe
,但永远不会挂在旧循环上,因此每次都会获得一个新的随机高度。移动这一行:
Pipe1 = Pipe(scrollx)
在while
循环之外。更好的是,有一个管道列表,您可以添加新管道并轻松更新它们。您从未在self.drawn = False
内设置Pipe
。
此外,您正在为每个活动重置movey
,请尝试:
movey = 0.8 # no need for plus
for event in pygame.event.get():