python - Pygame 线出现断线
问题描述
所以我在python中制作了一个像乌龟一样的对象,我遇到了一个问题得到了解决。
现在我注意到一件有趣或相当烦人的事情,当我尝试用 lt(90) 或 rt(270) 制作一个正方形时,其中一条线似乎断了。
这是我的代码:
import pygame
from pygame.locals import *
from pygame.math import Vector2
from math import sin, cos, radians
class Turtle:
def __init__(self):
self.vector = Vector2(0, 0)
self.angle = 0
self.pen_width = 25
self.pen_color = (255, 255, 255)
self.pen_visible = True
def forward(self, win, distance):
start = self.vector
offset = Vector2(sin(radians(self.angle)), cos(radians(self.angle)))
offset *= distance
end = start + offset
if self.is_down():
pygame.draw.line(win, self.pen_color, start, end, self.pen_width)
self.vector = end
fd = forward
def backward(self, win, distance):
self.forward(win, -distance)
bk = back = backward
def left(self, angle):
self.angle = (self.angle + angle) % 360
self.angle
lt = left
def right(self, angle):
self.left(-angle)
rt = right
def goto(self, win, pos):
if self.is_down():
pygame.draw.line(win, self.pen_color, self.vector, pos, self.pen_width)
self.vector = Vector2(pos)
setposition = setpos = goto
def set_angle(self, angle= None):
if not angle:
return self.angle
self.angle = angle
def position(self):
return self.vector.xy
pos = position
def sety(self, y):
self.vector.y = y
def setx(self, x):
self.vector.x = x
def xcor(self):
return self.vector.x
def ycor(self):
return self.vector.y
def penup(self):
self.pen_visible = False
pu = up = penup
def pendown(self):
self.pen_visible = True
pd = down = pendown
def is_down(self):
return self.pen_visible
def write(self, win, font_label):
win.blit(font_label, self.vector)
def test():
pygame.init()
pygame.font.init()
WIDTH, HEIGHT = 500, 500
CAPTION = 'Caption'
win = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption(CAPTION)
FPS = 60
clock = pygame.time.Clock()
mytut = Turtle()
mytut.pen_width = 5
mytut.goto(win, (250, 250))
mytut.pen_color = '#00FF00'
for _ in range(4):
mytut.fd(win, 100)
mytut.rt(270)
while True:
clock.tick(FPS)
pygame.display.flip()
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
quit()
if __name__ == '__main__':
test()
此外,当我使用 lt(270) 或 rt(90) 时,不会出现此问题。
我不知道为什么在pygame中会发生这种情况。我觉得这可能与一些浮点数有点偏离但不知道究竟是为什么?
我需要帮助来解决这个问题!
解决方案
该问题是由浮点不准确引起的。round
解决问题的坐标。您可以通过在行尾画一个小圆圈来进一步改进表示:
class Turtle:
# [...]
def forward(self, win, distance):
start = self.vector
offset = Vector2(sin(radians(self.angle)), cos(radians(self.angle)))
offset *= distance
end = start + offset
if self.is_down():
s = round(start.x), round(start.y)
e = round(end.x), round(end.y)
pygame.draw.line(win, self.pen_color, s, e, self.pen_width)
pygame.draw.circle(win, self.pen_color, e, self.pen_width // 2)
self.vector = end
推荐阅读
- c# - Json.NET:单个属性的不同 JSON 模式
- python - python pandas函数返回多个值并将它们放入列中
- python - Python - 解析来自 IBM Watson Tone Analyzer 的 Json 响应
- javascript - 安装没有符号链接的 npm 本地模块目录?
- r - 在 R 中重载隐藏的 summary.lm 方法
- c - 除了集群代码之外,pthread_cond 的负面影响是什么
- android - 在 VideoView 中播放 bytearray
- google-apps-script - 如何将表格单元格边框设置为虚线?
- twitter-bootstrap-3 - Bootstrap 轮播格式和样式
- c# - 监控多台机器 - 使用什么样的方法?