Pygame:TypeError:无效的结束位置参数

1 投票
2 回答
5425 浏览
提问于 2025-04-17 02:29

在运行这段代码的时候:

for p in self.particles :
       pos1 = p.pos
       pos2 = p.pos[0]+2*p.vel[0], p.pos[1]+2*p.vel[1]
       pygame.draw.line(self.screen, p.color, pos1 , pos2 , 2)

我一直收到这个错误:

类型错误:无效的结束位置参数

于是我用了一个 print p.pos 的语句来查看 p.pos 的值,结果它神奇地就能运行了!
但唯一的问题是,打印出来后游戏的运行速度变得像每秒只有10帧……
那么我该怎么解决这个错误呢?

2 个回答

1

如果你是说你在程序里频繁使用 print() 这个功能,那就应该把它去掉,这样可以让你的程序运行得更快。
否则,你就是在给电脑增加负担,可能需要优化一下你的代码。

比如我看到你写了 for p in self.particles
如果你要在屏幕上画很多粒子,试着减少一下粒子的数量——这其实是一种权衡,而不是单纯的优化,但也是一个选择。

确保你的代码在关键地方是高效的,
也就是说,在你进行大量计算或者多次调用某个功能的地方。

你可以这样写:

drawline = pygame.draw.line

然后改成调用 drawline(),这样可以节省查找的时间。

1

文档参考: pygame.draw.line(表面, 颜色, 起始位置, 结束位置, 宽度=1)

所以我们需要做的是:

import pygame
# This makes event handling, rect, and colors simpler.
# Now you can refer to `Sprite` or `Rect()` vs `pygame.sprite.Sprite` or `pygame.Rect()`
from pygame.locals import *
from pygame import Color, Rect, Surface

def render():
    p1 = (100,100)
    p2 = (p1[0] + 2*v[0], p2[1] + 2*v[1] )
    pygame.draw.line(screen, Color("white"), p1, p2, width=1)

注意:你的代码可以通过使用向量来简化。

(可以使用numpy或者euclid库)。代码变得更简单:其中 pos2、pos1 和 velocity 都是向量。

pos2 = pos1 + 2* velocity

撰写回答