Pygame:绘制直线

3
在我之前的问题中Python中的For Loop Functions,我在为一个hangman游戏绘制线条的函数中遇到了麻烦。它并没有完全画出线条,我最初怀疑这是for循环或函数的问题。现在我意识到Pygame存在一些小故障。
我已经尝试使用以下代码解决这个问题,在加拿大:
b2 = font.render(str(letters[1]), True, (red))
screen.blit(b2, (bPosition))
if hangman1x == -500 and hangman1y == -500:
    hangman1x = (775, 250)
    hangman1y = (775, 50)
    pygame.draw.line(screen, black, (hangman1x), (hangman1y), (5))
    pygame.display.flip()
    time.sleep(0.5)
    bPosition = -500, -500
    b1.x, b1.y = -500, -500
if hangman1x == (775, 250) and hangman1y == (775, 50):
    print 'hi'
    width = 6
    pygame.draw.line(screen, black, (hangman1x), (hangman1y), (5))
    print 'yay'
    pygame.display.flip()

现在有个奇怪的事情。
当你按下屏幕上的B,它会变成红色,就像它应该的那样,画线也很好,但是当B消失时,它也消失了,我明白为什么。之后,我添加了额外的if代码。(请注意,pygame.draw.line(s)都是相同的)。它会在shell中打印hi和yay,但不会保留线条。有没有办法解决这个问题?

我尝试运行了你的帖子里的代码,但是遇到了 NameError: name 'font' is not defined 的错误。你能否编辑一个简短、自包含、可运行的示例以显示你的问题?这将使读者更容易理解出错的原因,并且你会得到更多、更好的答案 :-) - Kevin
1个回答

1
在调用pygame.draw.line()之后,您可能会完全重绘屏幕为白色,这将覆盖线条并隐藏它。与其像您现在这样绘制线条,我建议从一个hangman类中进行绘制。
class Hangman():
  def __init__(self):
    self.lines = 0 #Number of lines to be drawn

  def draw(self,screen):
    #TODO draw to screen based on self.lines

#More code setting up pygame

drawlist = []
myMan = Hangman()
drawlist.append(myMan)
#mainloop
while 1:
  screen.fill('#000000')
  for item in drawlist:
    item.draw(screen)

这样做可以在每一帧重新绘制你的“绞刑人”,因此他总是被显示出来。

编辑 添加了一个运行示例

#!/usr/bin/python
import pygame
pygame.init()

class Hangman():
  def __init__(self):
    self.lines = 0 #Number of lines to be drawn

  def hang(self):
    self.lines += 1

  def draw(self,screen):
    for x in range(self.lines):
      coord1 = (x*10,20)
      coord2 = (x*10,50)
      pygame.draw.line(screen,(0,0,0),coord1,coord2)

size = screenWidth,screenHeight = 200,70
screen = pygame.display.set_mode(size)
pygame.display.flip()

myman = Hangman()

drawlist = []
drawlist.append(myman)
#mainloop
running = True
while running:
  #EVENT HANDLING#
  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      running = False
    if event.type == pygame.KEYDOWN:
      if event.key == 32: #Spacebar
        myman.hang()

  #DRAWING#
  screen.fill((255,255,255))
  for item in drawlist:
    item.draw(screen)
  pygame.display.flip()

如果事件.键 == 32: 应该是 如果事件.键 == pygame.K_SPACE: - ninMonkey
谢谢你的尝试,但似乎不起作用。我怀疑是我的Mac或我的Pygame版本之类的问题,因为它不起作用。我已经运行了你的示例,它可以工作,但当我使用你的代码时,它根本不起作用。 - JaredCubilla
@monkey 这将是正确的做法。我有一个坏习惯,就是只打印事件,并在日志中查找键代码,而不是像应该那样使用文档。 - Nmorrison72
@user2625902 你是只运行了这段代码本身吗?你所说的“完全不起作用”是什么意思?出现了什么错误?我很乐意提供帮助,但很遗憾,我不知道你的错误信息。 - Nmorrison72

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接