2013-04-28 2 views
0

При использовании этого сценария для простой векторной математики я могу добавить вектор скорости, когда значения являются целыми числами, такими как 1 и 2, но когда вектор скорости инициализируется с помощью float .5 нет движения. Насколько я могу сказать, питон не требую объявить терки или Int, но у меня есть ощущение, что полученное число усекаетсяДобавление вектора скорости к вектору позиции работает только с целыми числами

import pygame 
from pygame.locals import * 
pygame.init() 
screen = pygame.display.set_mode((800, 600)) 
background = pygame.Surface(screen.get_size()) 

rectangle = pygame.Rect(65, 45, 50, 50) 

class Vector2D: 
    def __init__(self, x, y): 
     self.x = x 
     self.y = y 

    def __iadd__(self, vector): 
     self.x += vector.x 
     self.y += vector.y 
     return self 

    def __isub__(self, vector): 
     self.x -= vector.x 
     self.y -= vector.y 
     return self 

    def copy(self, vector): 
     self.x = vector.x 
     self.y = vector.y 

speed = Vector2D(.5, .5) 
going = True 

while going: 
#Handle Input Events 
    for event in pygame.event.get(): 
     if event.type == QUIT: 
      going = False 
     elif event.type == KEYDOWN and event.key == K_ESCAPE: 
      going = False 


    rectangle.left += speed.x 
    rectangle.top += speed.y 

    #Draw Everything 
    screen.blit(background, (0, 0)) 
    pygame.draw.rect(screen, (255, 255, 255), rectangle, 1) 
    pygame.display.flip() 

pygame.quit() 
+0

прямоугольника координат могут быть snap to ints, поскольку theres нет такой вещи, как половина пикселя ... просто сделайте позицию позиции position = [0,0] и измените t hat –

+0

У вас есть другая позиция Vector2D, которую вы обновляете. При необходимости добавьте в int, если вы установите 'rect.topleft = position' – ninMonkey

ответ

2

Поскольку нет ничего, как половины пикселя, в Rect классе обрежет десятичное число поплавков, которые вы добавляете.

Так отслеживание положения в Vector2D классе является лучшей идеей:

class Vector2D: 
    def __init__(self, x, y, vx, vy): 
     self.x = x 
     self.y = y 
     self.vx = vx 
     self.vy = vy 

    def update(self): 
     self.x += self.vx 
     self.y += self.vy 

    def copyto(self, rect): 
     rect.x = int(round(self.x,0)) 
     rect.y = int(round(self.y,0)) 


speed = Vector2D(100, 100, .5, .5) 

И есть это:

speed.update() 
speed.copyto(rectangle) 

На месте:

rectangle.left += speed.x 
rectangle.top += speed.y