re:position + = heading * distance_moved TypeError:只能将元组(不是“Vector”)连接到元组

问题描述:

*尽管该操作的所有部分都是元组python似乎认为在这种情况下其中一个元组不是。这是我第一次尝试在python中创建一个向量类。我的意图是通过增加递增到它的速度*载体,其位置将我的简单的鼠标图像的地方,我在屏幕上点击,直到达到目标距离*re:position + = heading * distance_moved TypeError:只能将元组(不是“Vector”)连接到元组

import math 

class Vector(object): 

#defaults are set at 0.0 for x and y 
def __init__(self, x=0.0, y=0.0): 
    self.x = x 
    self.y = y 

#allows us to return a string for print 
def __str__(self): 
    return "(%s, %s)"%(self.x, self.y) 

# from_points generates a vector between 2 pairs of (x,y) coordinates 
@classmethod 
def from_points(cls, P1, P2): 
    return cls(P2[0] - P1[0], P2[1] - P1[1]) 

#calculate magnitude(distance of the line from points a to points b 
def get_magnitude(self): 
    return math.sqrt(self.x**2+self.y**2) 

#normalizes the vector (divides it by a magnitude and finds the direction) 
def normalize(self): 
    magnitude = self.get_magnitude() 
    self.x/= magnitude 
    self.y/= magnitude 

#adds two vectors and returns the results(a new line from start of line ab to end of line bc) 
def __add__(self, rhs): 
    return Vector(self.x +rhs.x, self.y+rhs.y) 

#subtracts two vectors 
def __sub__(self, rhs): 
    return Vector(self.x - rhs.x, self.y-rhs.y) 

#negates or returns a vector back in the opposite direction 
def __neg__(self): 
    return Vector(-self.x, -self.y) 

#multiply the vector (scales its size) multiplying by negative reverses the direction 
def __mul__(self, scalar): 
    return Vector(self.x*scalar, self.y*scalar) 

#divides the vector (scales its size down) 
def __div__(self, scalar): 
    return Vector(self.x/scalar, self.y/scalar) 

def points(self): 
    return (self.x, self.y) 


#imports 
import pygame, sys, Vector 
from pygame.locals import * 
from Vector import * 

#game init 
pygame.init() 

#screen 
screen = pygame.display.set_mode((800,600),0,32) 

#images 
mouse_file = 'mouse.png' 
MOUSE = pygame.image.load(mouse_file).convert_alpha() 


#variables 
bgcolor = (255,255,255) 
position = (100.0, 100.0) 
heading = Vector(0, 0) 

#clock and speed 
clock = pygame.time.Clock() 
speed = 250.0 


#main game function 
while True: 

    for event in pygame.event.get(): 
     if event.type == QUIT: 
      pygame.quit() 

     if event.type == MOUSEBUTTONDOWN: 
      destination = pygame.mouse.get_pos() 
      heading = Vector.from_points(position, destination) 
      heading.normalize() 

    screen.fill(bgcolor) 
    screen.blit(MOUSE, position) 

    time_passed = clock.tick(30.) 
    time_passed_seconds = time_passed/1000.0 

    distance_moved = time_passed_seconds*speed 
    position += heading*distance_moved 
    pygame.display.update() 

这里有一个问题:

position = (100.0, 100.0) 

您需要position = Vector(100.0, 100.0)才能做position += heading * distance_moved,否则您将调用元组+=

(有些人不喜欢Vector类存储“点”,所以你可能需要一个第二Point类,如果你是倾斜的。)

+0

并没有工作。它有我的错误:screen.blit(鼠标,位置) TypeError:blit的目标位置无效 – rrcm 2013-03-01 02:44:19

+0

您需要提供一些方法来将您的'Vector'转换为元组。 (或者,为了简单起见,扩展'namedtuple('Vector','x y')')。 – nneonneo 2013-03-01 02:57:36