[英]Why won't my rectangles draw? - python and pygame
我有幾個問題。 第一個:我確定下面的代碼可以優化為不使用 4 個類,但是我不確定如何去做。 我正在嘗試繪制一行和一列圓圈,其中較小的圓圈圍繞每個圓圈的中心。 一排圓圈具有跟隨較小軌道圓圈旋轉的垂直線。 列遵循相同的模式,但線條是水平的。
到目前為止,我正在嘗試使用四種類,一種用於水平圓,一種用於垂直圓形,一種用於水平矩形(使用矩形是因為我會檢測碰撞),另一種用於垂直矩形。 我這樣做是為了將信息傳遞給矩形,以便將它們的位置與軌道圓相對應。
第二個問題/問題:就像現在的代碼一樣,程序運行時不會顯示垂直線。 我不完全確定為什么繪制水平線的代碼運行正常並且它們匹配。
任何關於如何改善這一點的建議將不勝感激。
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()
線條由矩形( 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()))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.