我正在尝试使用pygame在Python中制作游戏,但是我不小心禁用了PyCharm中的错误检查功能。结果,这就是我尝试初始化Vector2
的方式:
self.vel = pg.Vector2(0, 0)
self.acc = pg.Vector2(0, self.GRAVITY)
重新启用错误检查后,PyCharm给了我一条错误消息,告诉我改用pg.Vector2.__new__(0, 0)
。完成后,错误消息消失并且代码可以正常工作。
现在是实际问题:
虽然禁用了错误消息,但我还是写了很多错误的代码,如上面的示例。奇怪的是,代码实际上运行良好。即使一半的代码有错误,游戏也可以启动并正常运行。
有人可以向我解释一下上面的示例为何起作用,但是为什么认为它不好?
完整代码:
import pygame as pg
from game.settings import *
class Player(pg.sprite.Sprite):
"""
I'm a docstring hurr durr
"""
ACCELERATION = 60 / FPS # dummy value
FRICTION = 1 # dummy value
GRAVITY = 1 # dummy value
LIFE = 5
def __init__(self, x, y, h, w):
super().__init__()
self.x = x # x position
self.y = y # y position
self.h = h # height
self.w = w # width
self.vel = pg.Vector2.__new__(0, 0)
self.acc = pg.Vector2.__new__(0, self.GRAVITY)
self.rect = pg.Rect(x, y, w, h)
self.image = pg.Surface(w, h)
self.image.fill(RED)
# self.image = pg.image.load("../resources/player.*")
def update(self):
# key updates
keys = pg.key.get_pressed()
if keys[pg.K_LEFT]:
self.acc.x -= self.a
if keys[pg.K_RIGHT]:
self.acc.x += self.a
# test jumping function
if keys[pg.K_SPACE]:
self.vel.y = -20
# friction
self.acc.x -= self.vel.x * self.FRICTION
# update vel and pos
self.vel.x += self.acc.x
self.x += self.vel.x
self.vel.y += self.acc.y
self.y += self.vel.y
答案 0 :(得分:4)
这里的问题是PyCharm不知道__init__
方法的真实签名应该是什么,因为该文件是作为.pyd文件(如.dll)分发的。您可以通过在代码中pg.Vector2
上的pycharm中使用“转到...声明”(Ctrl + B)函数来进行验证,然后在pyame的pygame.math.Vector2
中的__init__.py
上使用,直到输入pygame.math
的代码。在这里,您会看到这样的声明:
def __init__(self): # real signature unknown; restored from __doc__
pass
还请注意此math.py
文件顶部的注释:
# from C:\Users\User\AppData\Local\Programs\Python\Python35\lib\site-packages\pygame\math.cp35-win_amd64.pyd
# by generator 1.145
PyCharm正在尽最大努力尝试生成类似于实际代码的东西,但这只是一个猜测。
简而言之,您是对的,在这种情况下pycharm是错误的。
这里描述了完全相同的问题类型: