首页 > 解决方案 > 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中会发生这种情况。我觉得这可能与一些浮点数有点偏离但不知道究竟是为什么?

我需要帮助来解决这个问题!

标签: pythonvectorpygame

解决方案


该问题是由浮点不准确引起的。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


推荐阅读