Pygame, мой круг превращается в прямоугольник после того, как я сохранил его в переменной, как мне предотвратить это - PullRequest
0 голосов
/ 31 декабря 2018

Мне нужно сохранить круг в переменной, но после того, как я это сделал, он превратился в прямоугольник

circle_1 = pygame.draw.circle(screen, (0, 0, 0), (300, 300), 30)
Print(circle_1)

, печать возвращает

<rect(270, 270, 60, 60)>

, но я могу 'работать с этим.Мой круг предопределен, но он не будет отображаться на холсте, вот пример проблемы

> import pygame, sys
> 
> 
> pygame.init() screen = pygame.display.set_mode((600, 600)) 
> predefined_circle = pygame.draw.circle(screen,(0, 0, 0),(300, 300), 30)
> 
> def update():
>     screen.fill((200, 0, 0))
>     while 1:
>         for event in pygame.event.get():
>             if event.type == pygame.QUIT: sys.exit()
>         # It shows my circle if I dirctly tip pygame.draw.circle(screen,(0, 0, 0),(300, 300), 30) into it
>         predefined_circle
>         pygame.display.update()
> 
> update()

Чтобы вы могли лучше соотнести то, чего я пытаюсь достичь, это кодчто я делаю, но читать не обязательно, так как я уже пытался объяснить это как можно лучше.Обратите внимание, что в комментариях должно быть объяснено все, что делает блок кода ниже.

# Creating the canvas which can paint any wanted Object from another class
class Canvas:
# Initialising the screen and setting all needed variables
def __init__(self, painting):
    pygame.init()
    self.screen_size = (600, 600)
    self.background = (25, 255, 255)
    self.screen = pygame.display.set_mode(self.screen_size)
    self.paint = painting

# Let the user set the name of the canvas
def set_screen_name(self):
    return self.screen

# Draw the everything you want to
def update(self):
    # Paint the canvas
    self.screen.fill(self.background)
    # Make the game be quittable
    while 1:
        for event in pygame.event.get():
            if event.type == pygame.QUIT: sys.exit()

        # Draw the defined Circle and then update the Canvas
        # it only draws a circle if directly tip pygame.draw.circle(surface, color, position, radius)

        self.paint
        pygame.display.update()


# Draw any circle you like
class Cir:
# Get all the required Information's to Draw a circle
def __init__(self, canvas, what_color, position, radius, line=0):
    self.can = canvas
    self.color = what_color
    self.pos = position
    self.r = radius
    self.line = line
    self.cir = None

# Create the circle with the acquired Information's
def create(self):
    self.cir = pygame.draw.circle(self.can, self.color, self.pos, self.r, self.line)
    return self.cir


# So far there is no Surface for the Cir class
# And there is no Object that cloud be painted for the Canvas class
# I initialise a canvas instance without anything that needs to be painted
get_surface = Canvas(None)

# Now I can access set_screen_name from the Canvas class and give the surface a name
# Which the Cir class can now use as a surface
screen = get_surface.set_screen_name()

c1 = pygame.draw.circle(screen, (0,0,0), (300, 300), 30)
print(c1)

# I'm initialising a circle
init_circle = Cir(screen, (0, 255, 0), (300, 300), 30)

# Create the initialised circle
circle_1 = init_circle.create()

# Give the Canvas class the created circle
paint = Canvas(circle_1)

# Draw the circle
paint.update()

1 Ответ

0 голосов
/ 31 декабря 2018

Мой circle превращается в rect.

На самом деле, нет, это не так.Согласно документации для этих функций рисования, цель вызовов состоит в том, чтобы нарисовать что-то немедленно, не , чтобы дать вам объект, который вы можете нарисовать позже:

Нарисуйте несколько простых фигур на поверхности.

Из анализа вашего вопроса кажется, что вы считаете, что храните act рисункакруг, так что это может быть сделано позже.Это не относится к делу.Вместо этого на самом деле вы рисуете круг и сохраняете результат этого действия рисования - последующий анализ результата не будет фактически рисовать или перерисовывать круг.

Итак,если функция draw не возвращает что-то для последующего рисования, что возвращает ?Это также можно найти в вышеупомянутой документации:

Функции возвращают прямоугольник , представляющий ограничивающую область измененных пикселей.

Другими словами, он говорит вам о наименьшем прямоугольнике, который был изменен действием рисования - это будет квадрат со сторонами той же длины, что и диаметр, и с центром в той же точке.

Очевидно,авторы PyGame подумали, что эта информация может пригодиться для какой-то цели, но не для перерисовки круга: -)


Один из способов сделать то, чего вы пытаетесь достичь, - это простоиметь функцию , чтобы нарисовать «предопределенный» круг, и вызвать его вместо попытки вычислить прямоугольник, возвращенный из предыдущего вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...