2014-04-04 33 views
0

这是vector2模块:不能得到这个Python程序工作

class Vector2(object): 
    "this calculates the vector between two points" 
    def __init__(self , x = 0.0, y = 0.0): 
     self.x = x 
     self.y = y 

    def __str__(self): 
     return "(%s,%s)"%(self.x, self.y) 

    @classmethod 
    def from_points(cls,p1,p2): 
     return cls(p2[0]-p1[0],p2[1]-p1[1]) 

    #the magnetude of a vector is the distance between two points 
    def get_magnetude(self): 
     return math.sqrt(self.x**2+self.y**2) 

    def normalize(self): 
     magnetude = self.get_magnetude() 
     self.x /= magnetude 
     self.y /= magnetude 

    #rhs stands for right hand side 
    def __add__(self,rhs): 
     return Vector2(self.x + rhs.x,self.y+rhs.y) 

    def __sub__(self,rhs): 
     return Vector2(self.x-rhs.x,self.y-rhs.y) 

    def __neg__(self): 
     return Vector2(-self.x, -self.y) 

    def __mul__(self,scalar): 
     return Vector2(self.x*scalar,self.y*scalar) 

    def __div__(self,scalar): 
     return Vector2(self.x /scalar, self.y/scalar) 

这是主程序,其中进口vector2

background_image_file = 'download.jpeg' 
sprite_image_file = 'images.jpeg' 

import math 
import pygame 
from pygame.locals import* 
from sys import exit 
import vector2 


pygame.init() 

screen = pygame.display.set_mode((640,480), 0 ,32) 

background = pygame.image.load(background_image_file).convert() 
sprite = pygame.image.load(sprite_image_file).convert_alpha() 

clock = pygame.time.Clock() 


position = Vector2(100.0, 100.0)#the starting point coordonates 
heading = Vector2()#a vector without its magnetude(unit vector) 
speed = 250.0 

running = True 

while running: 
    for event in pygame.event.get(): 
     if event.type == QUIT: 
      exit() 

     if event.type == MOUSEBUTTONDOWN: 
      destination_x = event.pos[0]-sprite.get_width()/2 
      destination_y =event.pos[1]-sprite.get_height()/2 
      destination = (destination_x, destination_y) 
      heading = Vector2.get_magnetude(position,destination)# 
      heading.normalize()#a vector without magnetude,just direction 

    screen.blit(background, (0,0)) 
    screen.blit(sprite, position) 

    time_passed = clock.tick() 
    time_passed_seconds = time_passed/1000.0 
    distance_moved = time_passed_seconds * speed 
    position += (heading * distance_moved) 

    pygame.display.update() 

我正在学习Python和pygame的通过我的自我(用Python和Pygame开始游戏开发 - 从新手到专业(2007)),我无法让程序工作。也可以有人请向我解释为什么作者使用position = Vector2(100.0,100.0)position = Vector2()来创建新的载体?

口口声声说:

traceback (most recent call last): 
    File "/home/moussa/Documents/python /vector_movement.py", line 21, in <module> 
    position = Vector2(100.0, 100.0)#the starting point coordonates 
NameError: name 'Vector2' is not defined 
+0

@adchilds这是不正确的。假设类Vector2处于文件vector2中,需要使用vector2.Vector2来引用它,或者使用from vector2 import Vector2来引用它。 –

+0

问题中所显示的代码是在一个文件中显示的,还是在“#主程序从这里开始”的评论中是两分为二?如果它是全部在一个文件中,你得到的异常没有任何意义,但如果顶部部分在'vector2.py'中,则会发生异常。 – Blckknght

+0

它实际上是两个独立的代码,但在同一个文件夹内。因此,我只是导入了Vector2以便使用它。 – user2983686

回答

3

我猜测,在问题的代码实际上是两个文件,一个与Vector2类(在vector2.py)和其他一些文件中的其余部分之间的分裂(其中进口vector2)。

您遇到的问题是您没有正确访问该类。在您的主模块中,您需要使用vector2.Vector2访问其模块中的类。

或者,如果您希望更方便地访问课程,则可以改为将您的导入从import vector2更改为from vector2 import Vector2。这将该类放入主模块的名称空间,因此您可以直接以Vector2的身份访问它。

至于使用position = Vector2(100.0,100.0),这是对Vector2类的构造函数的调用。它创建该类的一个实例,使用值100x100y进行初始化,然后将其绑定到变量position。然后可以使用类定义的各种方法和运算符来更新实例或获取新值。例如,后面的行position += (heading * distance_moved)首先将矢量heading乘以标量distance_moved,然后将矢量结果添加到position。你可以用列表或元组中的值来做到这一点,但它会复杂得多(你需要自己添加和增加矢量的组件)。

+0

我的意思是我没有得到使用Vector2创建一个新的向量的含义,因为它的一个类,所以它不会让我感觉从类创建新的向量。如果说position = [100.0,100.0 ]?我希望它现在更清晰。感谢 – user2983686

+0

@ user2983686:我已经更新了我的答案,试图解释一下那里发生的一些事情。如果你仍然不理解它,你可能想看看关于Python面向对象编程的教程,比如[Python文档的这一页](https://docs.python.org/2/tutorial/classes。 HTML)。 – Blckknght

+0

谢谢你,我现在完全明白了。 – user2983686