Почему мои прямоугольники не рисуют? - python и пигмей - PullRequest
1 голос
/ 19 марта 2020

У меня есть несколько вопросов. Первое: я уверен, что приведенный ниже код можно оптимизировать так, чтобы он не использовал 4 класса, однако я не уверен, как это сделать go. Я пытаюсь нарисовать ряд и столбец кругов с меньшими кругами, вращающимися вокруг центра каждого круга. Ряд окружностей имеет вертикальные линии, которые следуют за вращением меньших орбитальных окружностей. Столбцы следуют той же схеме, но линии горизонтальны.

На данный момент я пытаюсь использовать четыре класса, один для горизонтальных кругов, один для вертикальных кругов, один для горизонтальных прямоугольников (используя прямоугольники, потому что я буду обнаруживать столкновения), и еще один для вертикальные прямоугольники. Я делаю это, чтобы передать информацию прямоугольникам, чтобы соотнести их положение с орбитальными кругами.

Второй вопрос / проблема: так как код сейчас, вертикальные линии не будут отображаться при запуске программы. Я не совсем уверен, почему, поскольку код для рисования горизонтальных линий работает правильно, и они совпадают.

Любой совет относительно того, как сделать это лучше, будет высоко ценится.

import pygame as pg
import pygame.gfxdraw
import math

pg.init()
windowWidth = 800
windowHeight = 800
surface = pg.display.set_mode((windowWidth, windowHeight))
pg.display.set_caption("Circle")
clock = pg.time.Clock()
black = (0, 0, 0)
white = (255, 255, 255)
gray = (50, 50, 50)
red = (255, 0, 0)

class VerticalCircle(object):
    def __init__(self, posX, posY):
        self.circlePositionX = posX
        self.circlePositionY = posY
        self.radius = 38
        self.theta = 0
        self.x = int((self.circlePositionX + (self.radius * math.cos(self.theta))))
        self.y = int((self.circlePositionY + (self.radius * math.sin(self.theta))))

    def draw(self, surface):
        self.x = int((self.circlePositionX + (self.radius * math.cos(-self.theta))))
        self.y = int((self.circlePositionY + (self.radius * math.sin(-self.theta))))
        pygame.gfxdraw.aacircle(surface, self.circlePositionX, self.circlePositionY, self.radius, white)
        pygame.gfxdraw.filled_circle(surface, self.x, self.y, 2, white)

    def method_circle(self):
        return self.x, self.y

class HorizontalCircle(object):
    def __init__(self, posX, posY):
        self.circlePositionX = posX
        self.circlePositionY = posY
        self.radius = 38
        self.theta = 0
        self.x = int((self.circlePositionX + (self.radius * math.cos(self.theta))))
        self.y = int((self.circlePositionY + (self.radius * math.sin(self.theta))))

    def draw(self, surface):
        self.x = int((self.circlePositionX + (self.radius * math.cos(self.theta))))
        self.y = int((self.circlePositionY + (self.radius * math.sin(self.theta))))
        pygame.gfxdraw.aacircle(surface, self.circlePositionX, self.circlePositionY, self.radius, white)
        pygame.gfxdraw.filled_circle(surface, self.x, self.y, 2, white)

    def method_circle(self):
        return self.x, self.y


class VerticalLine(HorizontalCircle):
    def __init__(self, surface, Target_Circle):
        pg.draw.rect(surface, gray, (Target_Circle.x, 0, 800, 1))

    def draw(self,surface, Target_Circle):
            pg.draw.rect(surface, gray, (Target_Circle.x, 0, 800, 1))


class HorizontalLine(VerticalCircle):
    def __init__(self, surface, Target_Circle):
        pg.draw.rect(surface, gray, (0, Target_Circle.y, 800, 1))

    def draw(self,surface, Target_Circle):
            pg.draw.rect(surface, gray, (0, Target_Circle.y, 800, 1))





HorizontalCircleList = []
VerticalCircleList =[]

HorizontalRectList = []
VerticalRectList = []
x = 120
for i in range(1, 10):
    VCircle = VerticalCircle(40, x)
    VerticalCircleList.append(VCircle)
    VCircle.draw(surface)

    HLine = HorizontalLine(surface, VCircle)
    HorizontalRectList.append(HLine)
    HLine.draw(surface, VCircle)

    HCircle = HorizontalCircle(x, 40)
    HorizontalCircleList.append(HCircle)
    HCircle.draw(surface)

    VLine = VerticalLine(surface, HCircle)
    VerticalRectList.append(VLine)
    VLine.draw(surface, HCircle)

    x += 80 # offset to place circles

pg.display.update()
loop = 0

run = True
while run:

    clock.tick(160)
    for event in pg.event.get():
        if event.type == pg.QUIT:
            run = False

    if loop == len(HorizontalCircleList):
        loop = 0
    print("x ", len(HorizontalRectList))
    print("y ", len(VerticalRectList))

    print("circle ", len(HorizontalCircleList))
    surface.fill(0)
    for i in range(int(len(HorizontalCircleList))):
        HorizontalRectList[i].draw(surface, VerticalCircleList[i])
        VerticalRectList[i].draw(surface, HorizontalCircleList[i])

        HorizontalCircleList[i].theta += .002 + i/100
        HorizontalCircleList[i].draw(surface)
        VerticalCircleList[i].theta += .002 + i/100
        VerticalCircleList[i].draw(surface)


    pg.display.update()
    loop += 1


pg.quit()

1 Ответ

1 голос
/ 19 марта 2020

Линии нарисованы прямоугольниками (pygame.draw.rect()). Вертикальные прямоугольники нарисованы, купить вы перепутали ширину и высоту:

pg.draw.rect(surface, gray, (Target_Circle.x, 0, 800, 1))

pg.draw.rect(surface, gray, (Target_Circle.x, 0, 1, 800))

В любом случае, я рекомендую использовать pygame.draw.line() для рисования линий:

class VerticalLine(HorizontalCircle):
    def __init__(self, surface, Target_Circle):
        self.surface = surface

    def draw(self,surface, Target_Circle):
        x = Target_Circle.x
        pg.draw.line(self.surface, gray, (x, 0), (x, self.surface.get_height()))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...