为什么在pygame中我得到的是正方形而不是圆形?

3
我在 pygame 方面还比较新手。我想画一个圆形,但是却画出了一个正方形。我的代码如下。感谢帮助澄清问题。
import sys, pygame
import random

pygame.init()

SCREEN_SIZE = SCREEN_WIDTH, SCREEN_HEIGHT = 800, 600
BACKGROUND_COLOR = pygame.Color("white")
SCREEN_COLOR = BACKGROUND_COLOR

SCREEN = pygame.display.set_mode(SCREEN_SIZE)

class Splatter:
  def __init__(self, (x, y), r, color):
    self.x = x
    self.y = y
    self.r = r
    self.color = color
    self.surface = pygame.Surface((r*2, r*2))
    self.surface.set_alpha(192)
    self.rect = self.surface.get_rect()

  def display(self):
    self.rect.centerx = self.x
    self.rect.centery = self.y
    pygame.draw.circle(self.surface, self.color, (self.x, self.y), self.r)
    SCREEN.blit(self.surface, self.rect)

def main():
  SCREEN.fill(SCREEN_COLOR)

  s = Splatter((SCREEN.get_width()/2, SCREEN.get_height()/2), 10, pygame.Color("black"))
  s.display()
  pygame.display.flip()
  while True:
    for event in pygame.event.get():
      if event.type == pygame.QUIT: sys.exit()

if '__main__' == __name__:
  main()

编辑

根据评论和回答,我已经修改了代码。然而,我仍然得到一个正方形而不是一个圆。我的最终目标是在画布上绘制一个圆形。因此,我可以通过移动画布来实现绘制圆形,而不是每次都绘制一个圆形。

import sys, pygame
import random

pygame.init()

SCREEN_SIZE = SCREEN_WIDTH, SCREEN_HEIGHT = 800, 600
SCREEN_COLOR = pygame.Color("white")

SCREEN = pygame.display.set_mode(SCREEN_SIZE)

class Splatter(object):
  def __init__(self, (x, y), r):
    self.x = x
    self.y = y
    self.r = r
    self.surface = pygame.Surface((r*2, r*2))
    self.surface.fill(pygame.Color("red"))
    self.rect = self.surface.get_rect()
    pygame.draw.circle(self.surface, pygame.Color("black"), (self.x, self.y), self.r)

  def display(self):
    self.rect.centerx = self.x
    self.rect.centery = self.y
    SCREEN.blit(self.surface, self.rect)


  SCREEN.fill(SCREEN_COLOR)
  s = Splatter((SCREEN.get_width()/2, SCREEN.get_height()/2), 20)
  s.display()

  pygame.display.flip()

  while True:
    for event in pygame.event.get():
      if event.type == pygame.QUIT: sys.exit()
1个回答

3

您正在黑色的Surface上绘制黑色圆圈,然后将整个Surface放在SCREEN上。 黑色圆圈确实存在,但显然您看不到它。

尝试这个(已测试)。

global SCREEN
pygame.draw.circle(SCREEN, self.color, (self.x, self.y), self.r)
pygame.display.flip()

作为附注,我认为你的很多代码都是无用的,你想得太多了。例如:
SCREEN_SIZE = SCREEN_WIDTH, SCREEN_HEIGHT = 800, 600
BACKGROUND_COLOR = pygame.Color("white")
SCREEN_COLOR = BACKGROUND_COLOR

是等价于:

SCREEN_SIZE =  800, 600
SCREEN_COLOR  = pygame.Color("white")

编辑:

你仍然得到一个正方形,因为你在屏幕上绘制Surface之外的圆形。

这行代码有问题,因为self.xself.yself.surface之外。

pygame.draw.circle(self.surface, pygame.Color("black"), (self.x, self.y), self.r)

解决方案:

pygame.draw.circle(self.surface, pygame.Color("black"), 
                           (int(self.surface.get_width()/2),
                            int(self.surface.get_height()/2)), 
                           self.r)

在我看来可能更好(但这真的取决于你如何实现游戏的其他部分):

# ...
class Splatter(object):
    def __init__(self, r):
        self.r = int(r)
        self.surface = pygame.Surface((r*2, r*2))
        self.surface.fill(pygame.Color("red"))
        pygame.draw.circle(self.surface, pygame.Color("black"), 
                           (int(self.surface.get_width()/2),
                            int(self.surface.get_height()/2)), 
                           self.r)

    def display(self, x, y):
        SCREEN.blit(self.surface, (int(x), int(y)))


SCREEN.fill(SCREEN_COLOR)
s = Splatter(20)
s.display(SCREEN.get_width()/2, SCREEN.get_height()/2)
pygame.display.flip()
# ...

在创建 Splatter 时,并不需要坐标,而是在展示它时才需要。


你能解释一下我为什么在黑色上涂黑色吗?self.surface = pygame.Surface((r2, r2)) 默认是黑色吗? - flashburn
@flashburn 是的,默认情况下 Surface 是黑色的。另外,以防不清楚,pygame.Surface((r*2, r*2)) 仍然创建一个矩形(即无论您如何命名变量都没有关系)。 - David Mašek
我已经修改了代码。你可以在上面看一下。然而,我仍然得到的是一个正方形而不是一个圆形。 - flashburn
谢谢,太棒了。如果可以的话,我还有一个请求。能否使画圆的表面完全透明? - flashburn
@flashburn 或许可以尝试使用set_alpha,但我没有测试过,也许并不是你想要的。请查看文档。如果这不能帮助你,请提出另一个问题 - 我们已经偏离主题了。 - David Mašek

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