pygame: неверная позиция назначения для блита
Неправильная информация:
Traceback (most recent call last):
File "C:\Documents and Settings\Administrator.MICRO-C17310A13\桌面\pygame例子\vectorfish.py", line 24, in <module>
screen.blit(sprite, position)
TypeError: invalid destination position for blit
Код является:
background_image_filename = 'sushiplate.jpg'
sprite_image_filename = 'fugu.bmp'
import pygame
from pygame.locals import *
from sys import exit
from vector2 import Vector2
pygame.init()
screen = pygame.display.set_mode((640, 480), 0, 32)
background = pygame.image.load(background_image_filename).convert()
sprite = pygame.image.load(sprite_image_filename).convert_alpha()
clock = pygame.time.Clock()
position = Vector2(100.0, 100.0)
speed = 250.0
heading = Vector2()
while True:
for event in pygame.event.get():
if event.type == QUIT:
exit()
if event.type == MOUSEBUTTONDOWN:
destination = Vector2(*event.pos) - Vector2(*sprite.get_size())/2.
heading = Vector2.from_points(position, destination)
heading.normalize()
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()
Код вектора2:
import math
class Vector2(object):
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)
@staticmethod
def from_points(P1, P2):
return Vector2( P2[0] - P1[0], P2[1] - P1[1] )
def get_magnitude(self):
return math.sqrt( self.x**2 + self.y**2 )
def normalize(self):
magnitude = self.get_magnitude()
self.x /= magnitude
self.y /= magnitude
Не только этот код, но и все коды, которым нужен вектор2, отвечали на этот вопрос: недопустимая позиция назначения для blit
Я делаю что-то неправильно?
Любая помощь очень нужна.
Гилберт Чан
2 ответа
Surface.blit
ожидает tuple
как dest
параметр. если вы хотите работать с собственным векторным классом, измените его на этот:
class Vector2(tuple):
def __new__(typ, x=1.0, y=1.0):
n = tuple.__new__(typ, (int(x), int(y)))
n.x = x
n.y = y
return n
def __mul__(self, other):
return self.__new__(type(self), self.x*other, self.y*other)
def __add__(self, other):
return self.__new__(type(self), self.x+other.x, self.y+other.y)
def __str__(self):
return "(%s, %s)"%(self.x, self.y)
@staticmethod
def from_points(P1, P2):
return Vector2( P2[0] - P1[0], P2[1] - P1[1] )
def get_magnitude(self):
return math.sqrt( self.x**2 + self.y**2 )
def normalize(self):
magnitude = self.get_magnitude()
self.x /= magnitude
self.y /= magnitude
Теперь это подкласс tuple
и вы можете передать его blit
функция. (Также обратите внимание, что кортеж должен содержать int
с).
Я также добавил __add__
а также __mul__
чтобы он поддерживал сложение и умножение.
Таким образом, никаких дополнительных изменений в вашем коде не требуется, и вы можете использовать свой векторный класс по назначению.
Попробуйте следующее:
screen.blit(sprite, (position.x, position.y))
Проблема в том, что ваш Vector2 не имеет перегрузки для __iter__
который является итератором, так что вы можете позвонить tuple
на вашем объекте. Это означает, что он не может быть преобразован в кортеж blit
вызов функции и, следовательно, параметр недействителен.
Ваш Vector2 будет содержать:
def __iter__(self):
return [self.x, self.y].__iter__()
И твой блин был бы
screen.blit(sprite, tuple(position))