[ Foro de Python ]

Numero 0.5 en pygame no cuenta si cargo una imagen

27-Aug-2017 23:18
Invitado (pygame2467)
2 Respuestas

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()


 


30-Aug-2017 12:43
Nacho Cabanes (+83)

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).


30-Aug-2017 13:23
Invitado (pygame2467)

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.)