[ Foro de Python ]
Dibujé un rectangulo y funciona bien, el numero 0.5 (o cualquier numero inferior a 1) es tomado en cuenta, ya que x se modifica hacia la izquierda o derecha. Pero cuando quiero que el objeto sea una imagen, el 0.5 se hace invisible . Por ejemplo ese numero resta x pero no lo suma. Pueden comparlo, si cambian el valor de cuadrado.cambio_x a un numero mayor a 1 va a los dos lados.
import pygame
NEGRO = (0, 0, 0)
BLANCO = (255, 255, 255)
pygame.init()
largo_pantalla = 700
alto_pantalla = 500
pantalla = pygame.display.set_mode([largo_pantalla, alto_pantalla])
imagen_cuadrado = pygame.image.load("cuadrado.png").convert()
hecho = False
reloj = pygame.time.Clock()
class Objeto():
def __init__(self, imagen_cuadrado):
self.image = imagen_cuadrado
self.rect = self.image.get_rect()
self.rect.x = 0
self.rect.y = 0
self.cambio_x = 0
self.cambio_y = 0
self.x_mouse = 0
self.y_mouse = 0
def dibujar(self,pantalla):
pantalla.blit(imagen_cuadrado, [self.rect.x, self.rect.y])
def update(self):
if self.rect.x <= self.x_mouse:
self.rect.x += self.cambio_x
if self.rect.x>= self.x_mouse:
self.cambio_x = 0
elif self.rect.x > self.x_mouse:
self.rect.x -= self.cambio_x
if self.rect.x <= self.x_mouse:
self.cambio_x = 0
cuadrado = Objeto(imagen_cuadrado)
cuadrado.rect.x = 240
cuadrado.rect.y = 300
while not hecho:
pos = pygame.mouse.get_pos()
x_mouse = pos[0]
y_mouse = pos[1]
for evento in pygame.event.get():
if evento.type == pygame.QUIT:
hecho = True
elif evento.type == pygame.MOUSEBUTTONDOWN:
cuadrado.cambio_x = 0.6
cuadrado.x_mouse = x_mouse
cuadrado.y_mouse = y_mouse
cuadrado.update()
pantalla.fill(BLANCO)
cuadrado.dibujar(pantalla)
pygame.display.flip()
reloj.tick(60)
pygame.quit()
Ten en cuenta que es posible que, al ser la clase "image" algo que ya está en el sistema, y no algo creado por ti, esas coordenadas se estén tomando siempre como números enteros (y, por tanto, se desprecien las cifras decimales).
Sí, descubrí que se convierten a enteros, (sólo cuando suma rect.x, no cuando lo resta), lo cual me parece un error grave. La manera de que se desplaze bien es escribir en el metodo update
self.rect.x += self.cambio_x + (self.cambio_x - int(self.cambio_x))
con qué necesidad me pregunto, espero que en otro lenguaje no tengan este tipo de errores
una vez eso arreglado quise probar si funcionaba bien esto en el evento del mouse:
cuadrado.x_mouse = x_mouse
cuadrado.y_mouse = y_mouse
velocidad = 4
adyacente = abs(x_mouse - cuadrado.rect.x)
opuesto = abs(y_mouse - cuadrado.rect.y)
hipotenusa = math.sqrt(adyacente**2+opuesto**2)
cuadrado.cambio_x = adyacente/hipotenusa * velocidad
cuadrado.cambio_y = opuesto/hipotenusa * velocidad
esto mantiene el desplazamiento del cuadrado a una velocidad 'real' constante, pero otra vez, tiene errores, y no por la formula, si no porque es una imagen, ya que en un dibujo funciona bien
(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)