Pygames math.Vector2()错误

Pygames math.Vector2()错误,pygame,runtime-error,game-physics,Pygame,Runtime Error,Game Physics,我正在将pygame中的小物理测试代码从使用变量对来描述位置、速度和加速度转换为math.Vector2()。原因是显而易见的,因为有很多与向量2相关的方法,可以很容易地找到长度、规格化、叉积等等 在pygame文档中,它还支持一系列数字操作,如vec*number、vec*=vec等。然而,当我开始使用vec+=vec或vec*=vec时,我的问题就出现了。我得到了这种错误 “malloc:*对象0x7fb4a1ec31a0的错误:未分配要释放的指针” 如果我注释掉所有这些操作,代码当然可以在

我正在将pygame中的小物理测试代码从使用变量对来描述位置、速度和加速度转换为math.Vector2()。原因是显而易见的,因为有很多与向量2相关的方法,可以很容易地找到长度、规格化、叉积等等

在pygame文档中,它还支持一系列数字操作,如vec*number、vec*=vec等。然而,当我开始使用vec+=vec或vec*=vec时,我的问题就出现了。我得到了这种错误

“malloc:*对象0x7fb4a1ec31a0的错误:未分配要释放的指针”

如果我注释掉所有这些操作,代码当然可以在没有动画的情况下正常运行。Vector2()是否存在错误,或者我只是利用了错误

import pygame, math, random

pygame.init() 

class Circle(pygame.sprite.Sprite):
    def __init__(self, screen):
        pygame.sprite.Sprite.__init__(self)
        self.screen = screen
        self.position =  pygame.math.Vector2(random.randrange(20,self.screen.get_width()), self.screen.get_height()/3)
        self.velocity = pygame.math.Vector2(0.0, 0.0)
        self.acceleration = pygame.math.Vector2(0.0, 0.1)
        self.netForce =  pygame.math.Vector2(0.0, 0.0)
        self.x = random.randrange(20,self.screen.get_width())
        self.y = self.screen.get_height()/2
        self.radius = random.randrange(5,30)
        self.image = pygame.Surface((self.radius*2,self.radius*2))
        self.image.set_colorkey((0,0,0))
        self.image.set_alpha(120)
        self.mass = self.radius/15.0
        pygame.draw.circle(self.image, (175,255,0), (self.radius,self.radius), self.radius)
        self.image = self.image.convert_alpha()
        self.rect = self.image.get_rect()
        self.rect.center = self.position

    def update(self):
        self.calcPos()
        self.checkBounds()
        self.rect.center = self.position
        self.netForce *= 0.0


    def calcPos(self): 
        self.acceleration = self.netForce
        self.velocity += self.acceleration
        self.position += self.velocity 


    def applyForce(self, force):
        force /self.mass
        self.netForce += force

    def checkBounds(self):
        if self.position[1] > self.screen.get_height():
            self.acceleration[1] *= -1.0
            self.position[1] = self.screen.get_height()
        if self.position[0] > self.screen.get_width(): 
            self.acceleration[0] *= -1.0
            self.position[0] = self.screen.get_width()
        if self.position[1] < 0: 
            self.acceleration[1] *= -1.0
        if self.position[0] < 0: 
            self.acceleration[0] *= -1.0

def main():
    screen = pygame.display.set_mode((600,400))
    background = pygame.Surface((screen.get_size()))
    background.fill((150,150,150)) 
    background = background.convert()

    circleGRP = pygame.sprite.Group() #Add balls
    for x in range(10):
        circleGRP.add(Circle(screen))

    wind = pygame.math.Vector2(1.0, 0)
    gravity = pygame.math.Vector2(0, 1.0)

    clock = pygame.time.Clock()
    mainLoop = True

    while mainLoop: 
        clock.tick(30) #Clock
        for event in pygame.event.get(): #Key events
            if event.type == pygame.QUIT:
                mainLoop = False
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    mainLoop = False
            elif event.type == pygame.MOUSEBUTTONDOWN: #Add wind
                if pygame.mouse.get_pressed()[0]:
                    for circle in circleGRP:
                        circle.applyForce(wind)

 #----------------------------------------------------------------------------                   
        for circle in circleGRP: #Add gravity
            gravity = gravity * circle.mass
            circle.applyForce(gravity)
            #pass 

            #circleX = circle.dx * -1 #Add drag
            #circleY = circle.dy * -1
            #drag = (circleX/80* circle.mass* (circle.radius/5), circleY/80* circle.mass* (circle.radius/5))
            #circle.applyForce(drag)

 #----------------------------------------------------------------------------    
        circleGRP.update()  
        screen.blit(background, (0,0))
        circleGRP.draw(screen)
        pygame.display.flip()

    pygame.quit()

if __name__ == "__main__":
    main()    
导入pygame、数学、随机
pygame.init()
类圆(pygame.sprite.sprite):
定义初始化(自身,屏幕):
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
self.screen=屏幕
self.position=pygame.math.Vector2(random.randrange(20,self.screen.get_width()),self.screen.get_height()/3)
self.velocity=pygame.math.Vector2(0.0,0.0)
self.acceleration=pygame.math.Vector2(0.0,0.1)
self.netForce=pygame.math.Vector2(0.0,0.0)
self.x=random.randrange(20,self.screen.get_width())
self.y=self.screen.get_height()/2
自半径=随机随机随机范围(5,30)
self.image=pygame.Surface((self.radius*2,self.radius*2))
self.image.set_colorkey((0,0,0))
self.image.set_alpha(120)
自质量=自半径/15.0
pygame.draw.circle(self.image,(175255,0),(self.radius,self.radius),self.radius)
self.image=self.image.convert_alpha()
self.rect=self.image.get_rect()
self.rect.center=self.position
def更新(自我):
self.calcPos()
self.checkBounds()
self.rect.center=self.position
self.netForce*=0.0
def calcPos(自身):
self.acceleration=self.netForce
自速度+=自加速度
自位置+=自速度
def应用力(自身、力):
力/自身质量
self.netForce+=force
def检查边界(自):
如果self.position[1]>self.screen.get_height():
自加速[1]*=-1.0
self.position[1]=self.screen.get_height()
如果self.position[0]>self.screen.get_width():
自加速[0]*=-1.0
self.position[0]=self.screen.get_width()
如果自身位置[1]<0:
自加速[1]*=-1.0
如果自身位置[0]<0:
自加速[0]*=-1.0
def main():
screen=pygame.display.set_模式((600400))
background=pygame.Surface((screen.get_size()))
背景填充((150150))
background=background.convert()
circleGRP=pygame.sprite.Group()#添加球
对于范围(10)内的x:
圆圈RP.添加(圆圈(屏幕))
wind=pygame.math.Vector2(1.0,0)
重力=pygame.math.Vector2(0,1.0)
clock=pygame.time.clock()
mainLoop=True
而主循环:
时钟。滴答(30)#时钟
对于pygame.event.get()中的事件:#键事件
如果event.type==pygame.QUIT:
mainLoop=False
elif event.type==pygame.KEYDOWN:
如果event.key==pygame.K_退出:
mainLoop=False
elif event.type==pygame.MOUSEBUTTONDOWN:#添加风
如果pygame.mouse.get_按下()[0]:
对于圆形中的圆:
圆圈。应用力(风)
#----------------------------------------------------------------------------                   
对于圆中的圆rp:#添加重力
重力=重力*圆质量
圆。应用力(重力)
#通过
#circleX=circle.dx*-1#添加阻力
#circleY=circle.dy*-1
#阻力=(圆圈/80*圆圈.质量*(圆圈.半径/5),圆圈/80*圆圈.质量*(圆圈.半径/5))
#圆。应用力(拖动)
#----------------------------------------------------------------------------    
circleGRP.update()
屏幕光点(背景,(0,0))
循环绘图(屏幕)
pygame.display.flip()
pygame.quit()
如果名称=“\uuuuu main\uuuuuuuu”:
main()

或者,您可以使用给定的
Vec2d

它有操作符重载(可以与元组或列表一起使用)、使用插槽执行、可拾取、实现列表接口(因此它与pygame函数兼容)、有相当多的高级向量操作符(用于性能和可读性)以及内置单元测试


我曾在模拟和物理测试中使用过它,它提供了您所需要的一切。

它说pygame.math模块是实验性的,所以它是可能的。是的,虽然那是很久以前的事了,考虑到这些年来pygames在beta版中发布的数量,我希望在这方面已经做了一些工作。它说它在V1.10版中是新的,我认为这是最新的版本?--你可以对2d向量使用
numpy
。我使用的是Pygame 1.9.2,不知道从1.10开始使用到现在有多长时间了,说实话,我才刚刚开始使用它。我尝试过安装numpy,但我不是这方面的高手,结果失败了。我想我会继续努力的。