Как сделать ромбовидную форму с помощью библиотеки графики Polygon in Pygames - PullRequest
0 голосов
/ 09 января 2019

Я не могу понять, как функция polygon упорядочивает точки, и документы не помогают, поэтому я не могу сделать требуемую ромбовидную форму.

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Pygame.draw.polygon - это функция, которую вы можете использовать, чтобы соединить несколько точек вместе и нарисовать их в виде фигуры.

Это дает гибкость в формах, которые вы можете нарисовать. Если фигура, которую вы имеете в виду, не имеет функции где-то в pygame.draw или pygame.gfxdraw, то вы можете создать ее самостоятельно, используя эту функцию.

Давайте возьмем в качестве примера алмаз, который вы хотите нарисовать.

Прежде всего, вы можете просто нарисовать квадрат и повернуть его вокруг его центра на 45 °, но так как вы хотите нарисовать его с помощью функции polygon (которая, вероятно, более аккуратна), вот пример этого ниже

ПРИМЕЧАНИЕ. Точки, используемые для этого, рассчитываются следующим образом:

  • Прежде всего определите ширину и высоту :

    diamondWidth = 80
    diamondHeight = 100
    
  • Точка 1 и 3 (верхняя и нижняя точка алмаза):

    Точка 1 может быть любой точкой на экране. Вы можете думать об этом как о положении алмаза, если хотите.

    Я хочу, чтобы алмаз был в центре, поэтому я определю его следующим образом:

    pos1 = (screenWidth/2, screenHeight/2 - diamondHeight/2)
    

    Что касается пункта 3, то это нижняя точка алмаза. Это означает, что он имеет тот же X, но большее значение y (в частности, больше, чем значение y точки 1 на diamondHeight). Это должно быть легко

    pos3 = (pos1[0], pos1[1]+diamondHeight)
    
  • Точка 2 и 4 (левая и правая точки алмаза):

    Любой из пунктов 2 и 4 должен быть правым, другой - левой точкой алмаза. Скажем, точка 2 - это левая точка. Затем его можно определить следующим образом:

    pos2 = (pos1[0] - diamondWidth/2, pos1[1] + diamondHeight/2)
    

    Точка 4 будет просто другой стороной, что означает, что она имеет то же значение Y, но оно меньше или больше значения Y точки 2 на diamondWidth. В моем случае, поскольку точка 2 - это точка слева, а точка 4 - больше вправо, поэтому точка 4 будет на больше , чем точка 2, на diamondWidth.

    pos4 = (pos2[0]+diamondWidth, pos2[1])
    

Теперь, когда мы определили точки ромба, мы можем использовать функцию pygame.draw.polygon, чтобы соединить их и нарисовать форму.


примечание

Вы упоминаете, что запутались в функции, поэтому вот обзор параметров:

  1. Поверхность: экран, изображение или любой другой экземпляр pygame.Surface для рисования фигуры. В большинстве случаев это будет экран, который вы определяете в верхней части кода.
  2. color: цвет, используемый для рисования многоугольника. Для простоты это значение rgb. Значения rgba (добавить прозрачность / прозрачность) могут вступить в силу, если экземпляр pygame.Surface, который вы передали в первом параметре, получил флаг pygame.SRCALPHA, например: pygame.Surface((width, height), pygame.SRCALPHA)
  3. pointlist: список (возможно, кортеж) точек для подключения. Они расположены в том порядке, в котором они связаны. I.E: Первая точка в списке связана со второй, вторая с третьей, третья с четвертым и т. Д. Кроме того, последняя точка связана с первой, чтобы завершить форму (в противном случае это будет открытая форма, ее последняя сторона не связана)

  4. width: последний (необязательный) аргумент. Иногда не проходит, как это по умолчанию 0.

    • Если значение равно 0: форма заполняется переданным ранее параметром цвета.

    • Если фигура> 0: рисуется только контур фигуры, а фигура не заполняется. Значением является толщина линии. Вы проходите.

Надеюсь, это прояснит ситуацию. Пожалуйста, следите за любыми вопросами


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

import pygame
from pygame.locals import *

screenWidth = 600
screenHeight = 600

pygame.init()
window = pygame.display.set_mode((screenWidth, screenHeight))
pygame.display.set_caption("Diamond")

clock = pygame.time.Clock()
MAXFPS = 30

# define the diamond points as described above
diamondWidth = 80
diamondHeight = 100

pos1 = (screenWidth/2, screenHeight/2 - diamondHeight/2)
pos2 = (pos1[0] - diamondWidth/2, pos1[1] + diamondHeight/2)
pos3 = (pos1[0], pos1[1]+diamondHeight)
pos4 = (pos2[0]+diamondWidth, pos2[1])

# points for the first diamond
points = [pos1, pos2, pos3, pos4]

# points for the second diamond, which are exactly like the first except their
# Y value is incremented over the original points so it does not appear over
# it, but rather to it's left
secondPoints = [(p[0]+diamondWidth+10, p[1]) for p in points]

stop = False
while not stop:
    for event in pygame.event.get():
        if event.type == QUIT:
            stop = True

    window.fill((255, 255, 255))

    # DRAWING THE DIAMOND:
    # Here is where we connect all the points in the [points] array, and
    # draw them as a shape with a certain color (used cian because it's
    # a diamond-dy color lol)

    # Draw filled diamond
    pygame.draw.polygon(window, (0, 255, 255), points, 0)

    # Draw empty diamond with lines of thickness 4
    pygame.draw.polygon(window, (0, 255, 255), secondPoints , 4)

    pygame.display.flip()
    clock.tick(MAXFPS)

pygame.quit()
0 голосов
/ 09 января 2019

Представьте, что вы нарисуете точки в системе координат на листе бумаги и сразу соедините их линией одна за другой. Таким образом, первая точка будет связана со второй, вторая - с третьей и т. Д., А последняя - с первой. Наконец, полученная форма заполняется нужным цветом.

import pygame as pg


pg.init()
screen = pg.display.set_mode((640, 480))
clock = pg.time.Clock()
BG_COLOR = pg.Color('gray12')
BLUE = pg.Color('dodgerblue')
points = [(200, 200), (250, 250), (200, 300), (150, 250)]

done = False
while not done:
    for event in pg.event.get():
        if event.type == pg.QUIT:
            done = True

    screen.fill(BG_COLOR)
    pg.draw.polygon(screen, BLUE, points)
    pg.display.flip()
    clock.tick(60)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...