python - 我在使用 pygame 显示对表面的更改时遇到问题
问题描述
我目前的目标是让一个较小的圆圈围绕一个较大圆圈的中心旋转,并使矩形跟随较小圆圈的路径。
我创建了一个TargetCircle
类,因为当这个可视化完成时,总共会有 18 个圆圈。我的问题是,在更改theta
每个圆圈的值并尝试显示更改后,什么也没有发生。
目前,所有显示的是顶部的 9 个圆圈以及水平和垂直线,但是,一切都保持静止。任何帮助将非常感激。谢谢你。
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 TargetCircle(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, win):
pg.draw.rect(win, gray, (0, self.y, 800, 1))
pg.draw.rect(win, gray, (self.x, 0, 1, 800))
pygame.gfxdraw.aacircle(win, self.circlePositionX, self.circlePositionY, self.radius, white)
pygame.gfxdraw.filled_circle(win, self.x, self.y, 2, white)
circleList = []
x = 120
for i in range(1, 10):
circle = TargetCircle(x, 40)
circle.draw(surface)
circleList.append(circle)
x += 80
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(circleList):
loop = 0
surface.fill(0)
for i in range(len(circleList)):
circleList[i].theta += .10
circleList[i].draw(surface)
pg.display.flip()
loop += 1
pg.quit()
解决方案
问题是您没有更新TargetCircle
. 你设置
self.x = int((self.circlePositionX + (self.radius * math.cos(self.theta))))
self.y = int((self.circlePositionY + (self.radius * math.sin(self.theta))))
一次__init__
(在开始时调用一次),然后永远不会再次设置。为了解决这个问题,将这两行移到TargetCircle.draw
(每帧调用):
class TargetCircle(object):
def __init__(self, posX, posY):
self.circlePositionX = posX
self.circlePositionY = posY
self.radius = 38
self.theta = 0
def draw(self, win):
self.x = int((self.circlePositionX + (self.radius * math.cos(self.theta))))
self.y = int((self.circlePositionY + (self.radius * math.sin(self.theta))))
pg.draw.rect(win, gray, (0, self.y, 800, 1))
pg.draw.rect(win, gray, (self.x, 0, 1, 800))
pygame.gfxdraw.aacircle(win, self.circlePositionX, self.circlePositionY, self.radius, white)
pygame.gfxdraw.filled_circle(win, self.x, self.y, 2, white)
推荐阅读
- python - 为什么自定义对象在 python 中是可散列的(并且可以在 dict 中使用)?
- c++ - 从虚方法返回派生对象指针
- php - 为什么我需要“重新分配” stdClass 的对象以将其值用作字符串?
- php - Symfony 数组作为表单集合
- r - 从外部链接闪亮导航到特定选项卡
- datetime - SAS日期格式化时/分/秒
- default - ODOO:在生产中使用管理员帐户是一种好习惯吗
- sql - 如何在大型 SQL Server 数据库中更改 xsd 架构而不发生大规模中断
- javascript - 在 IE7、IE8 中使用滤镜淡化
- python - Int(2) 到 16 位转换 python