Necesito una mano! [SOLUCIONADO]

Hola buenos dias, estoy buscando que alguien me ayude con mi juego, que esta en la pre-pre-pre alpha :sweat_smile:.

El tema es el siguiente:
Quiero hacer un juego al estilo Air Hockey, con 2 “masas”, una pelota y 2 “arcos” o zona de puntaje.Lo que hice hasta el momento es poco, pero me trabe y recien estoy empezando con pilas (hace 1 semana). Me ayude con los ejemplos y fui copiando codigo de alli,el que use fue: bloques.

Logre crear 2 actores, por ahora una aceituna y una paleta(? (si, sin eso no me anda), que seria lo que golpea a la pelota. Estos actores tiene figura de colision circular; tambien hice la simple pelota y no hice la zona de puntajes.

Mis problemas son los siguientes:

  1. No se si es un bug o que pero cuando cualquier aceituna colisiona en su parte frontal con la pelota, esta no rebota. Es como si hubiera gravedad y se pega por un tiempo corto al centro del actor y luego se desprende. esto no sucede en la parte inferior del mismo actor.

aceitu = pilas.actores.Aceituna()
aceitu.x = 0
aceitu.y = 300
aceitu.escala = 2.6
aceitu.figura_de_colision = pilas.fisica.Circulo(0, 0, 50, 20, True)

Estas son las propiedades de la aceituna.

pelota = pilas.actores.Pelota()
pelota.figura.escala_de_gravedad = 0
pelota.empujar(0, -10)
pelota.aprender(pilas.habilidades.Arrastrable)
pilas.colisiones.agregar(paleta, pelota, empujar_pelota)

Estos son las propiedades de la pelota.

2.Por alguna razon, que todavia no entiendo, no puedo tener 2 actores aceituna, y que el juego ande, Sin la paleta que tiene un self. no me anda.

def iniciar(self):
    self.imagen = 'imagenes_bloques/paleta.png'
    self.x = 0
    self.y = -300
    self.figura_de_colision = pilas.fisica.Circulo(0, 0, 50, 20, True)

Este es la barra o paleta.

3.La unica diferencia entre la aceituna y la paleta, es que una dice self y la otra no, pero con respecto a las coliciones estan igual y no se porque cuando la pelota toca la aceituna sale mucho mas fuerte impulsada que cuando toca la paleta.

Como si tuviera ya precargado una velocidad de impulos, si es asi como la modifico?

Les dejo el codigo:

import pilasengine

pilas = pilasengine.iniciar(ancho=550, alto=700)

pilas.fisica.crear_suelo((550, 700))
pilas.fisica.crear_techo((550, 700))

class Paleta(pilasengine.actores.Actor):

def iniciar(self):
#Esto lo tengo que modificar
self.imagen = ‘imagenes_bloques/paleta.png’
self.x = 0
self.y = -300
#Tamaño y forma de colision
self.figura_de_colision = pilas.fisica.Circulo(0, 0, 50, 20, True)

   aceitu = pilas.actores.Aceituna()
    aceitu.x = 0
    aceitu.y = 300
    aceitu.escala = 2.6
    #Tamaño y forma de colision
    aceitu.figura_de_colision = pilas.fisica.Circulo(0, 0, 50, 20, True)
   if aceitu.x <= -265:
        aceitu.x = -265
    elif self.x >= 265:
        self.x = 265  
   #El de arriba se mueva con a y d
    teclas = {
        pilas.simbolos.a: 'izquierda',
        pilas.simbolos.d: 'derecha',
        pilas.simbolos.w: 'arriba',
        pilas.simbolos.s: 'abajo'
    }
    #El de abajo se mueve con j y l
    teclas2 = {
        pilas.simbolos.IZQUIERDA: 'izquierda',
        pilas.simbolos.DERECHA: 'derecha',
        pilas.simbolos.ARRIBA: 'arriba',
        pilas.simbolos.ABAJO: 'abajo'
    }
 mi_control = pilas.control.Control(teclas)
 mi_control2 =pilas.control.Control(teclas2)
 aceitu.aprender(pilas.habilidades.MoverseConElTeclado, control=mi_control) 
    self.aprender(pilas.habilidades.MoverseConElTeclado, control=mi_control2)

paleta = Paleta(pilas)

pelota = pilas.actores.Pelota()
pelota.figura.escala_de_gravedad = 0
pelota.empujar(0, -10)
pelota.aprender(pilas.habilidades.Arrastrable)

pilas.colisiones.agregar(paleta, pelota, empujar_pelota)

pilas.ejecutar()

Desde ya muchas gracias, espero su pronta respuesta.
Matsimus Trolling

Buenas, @MatsimusTrolling !

Yo tambien hace poco que ando en Pilas, y aún no me ha dado tiempo de conocer el motor de física. Para mí tambien es un misterio por que la pelota sale rebotada con fuerza si colisiona con la parte inferior de la aceituna, pero sale rebotada floja cuando colisiona con la parte superior…

Pero seguro que alguien con más conocimientos que yo te podrá ayudar en ese tema.

Me he permitido revisar tu código, que presentaba varios errores. El más evidente eran los fallos de indexación. Otro error era que estabas creando el actor “aceitu” DENTRO del def iniciar(self): del actor “Paleta”. De ahí que unas veces te funcionara el self. y otras veces no (self en este caso se referia al actor “paleta”). Tambien habías puesto una colision que llamaba a la def empujar_pelota() pero esa función no está incluida en tu código (o yo no la sé ver).

Lo de crear 2 actores aceituna no tiene ningún misterio. Te paso tu código rectificado y simplificado, y con dos aceitunas en vez de con una paleta y una aceituna, para que veas como se hace…

# -*- encoding: utf-8 -*-

import pilasengine

pilas = pilasengine.iniciar(ancho=550, alto=700)

#pilas.fisica.crear_suelo((550, 700))
#pilas.fisica.crear_techo((550, 700))
	
aceitu = pilas.actores.Aceituna()
aceitu.x = 0
aceitu.y = 300
aceitu.escala = 2
aceitu.aprender('limitadoabordesdepantalla')
#Tamaño y forma de colision
aceitu.figura_de_colision = pilas.fisica.Circulo(0, 0, 50, 20, True)


aceitu2 = pilas.actores.Aceituna()
aceitu2.x = 0
aceitu2.y = -300
aceitu2.escala = 2
aceitu2.aprender('limitadoabordesdepantalla')
#Tamaño y forma de colision
aceitu2.figura_de_colision = pilas.fisica.Circulo(0, 0, 50, 20, True)

#El de arriba se mueva con a y d
teclas = {
	pilas.simbolos.a: 'izquierda',
	pilas.simbolos.d: 'derecha',
	pilas.simbolos.w: 'arriba',
	pilas.simbolos.s: 'abajo'
    }
#El de abajo se mueve con j y l  (?????????)
teclas2 = {
	pilas.simbolos.IZQUIERDA: 'izquierda',
    pilas.simbolos.DERECHA: 'derecha',
    pilas.simbolos.ARRIBA: 'arriba',
    pilas.simbolos.ABAJO: 'abajo'
    }

mi_control = pilas.control.Control(teclas)
mi_control2 =pilas.control.Control(teclas2)

aceitu.aprender(pilas.habilidades.MoverseConElTeclado, control=mi_control) 
aceitu2.aprender(pilas.habilidades.MoverseConElTeclado, control=mi_control2)

pelota = pilas.actores.Pelota()
pelota.figura.escala_de_gravedad = 0
pelota.empujar(0, -10)
pelota.aprender('arrastrable')

pilas.ejecutar()

Espero haberte ayudado dentro de mis limitaciones.

Un abrazo.

PD: Para que tu código se vea correctamente, debes poner esto

`

(esa pequeña tilde) tres veces al principio y al final del código. Si no la tienes en tu teclado puedes copiarla y pegarla.

1 Like

Hola @MatsimusTrolling, estuve revisando el código y me parece que el problema viene porque la figura es no-dinámica, y al moverla directamente pierde algunas propiedades de la simulación física.

Acá lo modifiqué para que veas como funciona modificado:

Fijate que solo cambié el código relativo al segundo actor, como para que veas las diferencias. Básicamente hice que la figura sea no dinámica, y que se mueva usando una habilidad que mueve la figura usando los atributos de velocidad:

# -*- encoding: utf-8 -*-
import pilasengine

pilas = pilasengine.iniciar(ancho=550, alto=700)

#pilas.fisica.crear_suelo((550, 700))
#pilas.fisica.crear_techo((550, 700))

aceitu = pilas.actores.Aceituna()
aceitu.x = 0
aceitu.y = 300
aceitu.escala = 2
aceitu.aprender('limitadoabordesdepantalla')
#Tamaño y forma de colision
aceitu.figura_de_colision = pilas.fisica.Circulo(0, 0, 50, 20, True)


aceitu2 = pilas.actores.Aceituna()
aceitu2.x = 0
aceitu2.y = -300
aceitu2.escala = 2
aceitu2.aprender('limitadoabordesdepantalla')
#Tamaño y forma de colision
# La figura tiene que ser dinamica, para que pueda impulsarse.
aceitu2.figura = pilas.fisica.Circulo(0, 0, 50, dinamica=True)

#El de arriba se mueva con a y d
teclas = {
	pilas.simbolos.a: 'izquierda',
	pilas.simbolos.d: 'derecha',
	pilas.simbolos.w: 'arriba',
	pilas.simbolos.s: 'abajo'
	}

#El de abajo se mueve con j y l  (?????????)
teclas2 = {
	pilas.simbolos.IZQUIERDA: 'izquierda',
	pilas.simbolos.DERECHA: 'derecha',
	pilas.simbolos.ARRIBA: 'arriba',
	pilas.simbolos.ABAJO: 'abajo'
	}

mi_control = pilas.control.Control(teclas)
mi_control2 =pilas.control.Control(teclas2)

#aceitu.aprender(pilas.habilidades.MoverseConElTeclado, control=mi_control)
#aceitu2.aprender(pilas.habilidades.MoverseConElTeclado, control=mi_control2)


class MoverFiguraConTeclado(pilasengine.habilidades.Habilidad):

	def iniciar(self, receptor):
		self.receptor = receptor

	def actualizar(self):
		velocidad = 30

		if self.pilas.control.izquierda:
			self.receptor.figura.velocidad_x = -velocidad

		if self.pilas.control.derecha:
			self.receptor.figura.velocidad_x = velocidad

		if self.pilas.control.arriba:
			self.receptor.figura.velocidad_y = velocidad

		if self.pilas.control.abajo:
			self.receptor.figura.velocidad_y = -velocidad

		self.reducir_velocidad()
		self.imitar_posicion_de_la_figura()

	def reducir_velocidad(self):
		# Constantemente reducimos la velocidad para que parezca estatica, pero
		# sin perder aceleracion
		figura = self.receptor.figura
		desaceleracion = 1.5

		figura.velocidad_x /= desaceleracion
		figura.velocidad_y /= desaceleracion

		# si la figura va muy lento la detiene directamente.
		if -1 < figura.velocidad_x < 1:
			figura.velocidad_x = 0
		if -1 < figura.velocidad_y < 1:
			figura.velocidad_y = 0

	def imitar_posicion_de_la_figura(self):
		self.receptor.x = self.receptor.figura.x
		self.receptor.y = self.receptor.figura.y

pilas.habilidades.vincular(MoverFiguraConTeclado)

aceitu2.aprender("MoverFiguraConTeclado")

pelota = pilas.actores.Pelota()
pelota.figura.escala_de_gravedad = 0
pelota.empujar(0, -10)
pelota.aprender('arrastrable')

pilas.ejecutar()

1 Like

Ufffff ahora ya sé por que no me he atrevido a hacer ningún juego que use física… :smile:

Aunque viendo el ejemplo me han venido ganas de hacer un PIN-BALL !!! :joy:

1 Like

Hola, estoy muy agradecido con ustedes :grin:, la verdad, no me esperaba una respuesta de esta manera y estoy muy sorprendido, son increibles. Si toda la comunidad es asi :clap: :clap: :clap:. Me ayudaron un monton.

Estuve probando el codigo e intentando :thinking: hacer que mi otra aceituna tenga la mismas propiedades pero no lo logro, me disculpan si los vuelvo a molestar, solo quiero que las 2 aceitunas, tengan la mismas propiedades y que su unica diferencia sea que a una la muevo con flechitas y la otra con a-s-d-w. Gracias!!!

Son una comunidad genial. :+1: :+1:

¡ Hola @MatsimusTrolling !, ahora me pongo a modificar el código y te escribo más tarde.

Abrazo

¡ Hola @MatsimusTrolling !

Ahí pude modificar el código y hacer que los actores se controlen con la configuración que habías definido, ¡quedó muy divertido!:

# -*- encoding: utf-8 -*-
import pilasengine

pilas = pilasengine.iniciar(ancho=550, alto=700)

#pilas.fisica.crear_suelo((550, 700))
#pilas.fisica.crear_techo((550, 700))

aceitu = pilas.actores.Aceituna()
aceitu.x = 0
aceitu.y = 300
aceitu.escala = 2
aceitu.aprender('limitadoabordesdepantalla')

aceitu.figura = pilas.fisica.Circulo(0, 300, 30, True)
aceitu.figura.sin_rotacion = True
aceitu.figura._cuerpo.mass = 300


aceitu2 = pilas.actores.Aceituna()
aceitu2.x = 0
aceitu2.y = -300
aceitu2.escala = 2
aceitu2.aprender('limitadoabordesdepantalla')

aceitu2.figura = pilas.fisica.Circulo(0, -300, 30, dinamica=True)
aceitu2.figura.sin_rotacion = True
aceitu2.figura._cuerpo.mass = 300

#El de arriba se mueva con a y d
teclas = {
	pilas.simbolos.a: 'izquierda',
	pilas.simbolos.d: 'derecha',
	pilas.simbolos.w: 'arriba',
	pilas.simbolos.s: 'abajo'
	}

#El de abajo se mueve con j y l  (?????????)
teclas2 = {
	pilas.simbolos.IZQUIERDA: 'izquierda',
	pilas.simbolos.DERECHA: 'derecha',
	pilas.simbolos.ARRIBA: 'arriba',
	pilas.simbolos.ABAJO: 'abajo'
	}

mi_control_1 = pilas.control.Control(teclas)
mi_control_2 = pilas.control.Control(teclas2)



class MoverFiguraConTeclado(pilasengine.habilidades.Habilidad):

	def iniciar(self, receptor, control):
		self.receptor = receptor
		self.control = control

	def actualizar(self):
		velocidad = 30

		if self.control.izquierda:
			self.receptor.figura.velocidad_x = -velocidad
		elif self.control.derecha:
			self.receptor.figura.velocidad_x = velocidad

		if self.control.arriba:
			self.receptor.figura.velocidad_y = velocidad
		elif self.control.abajo:
			self.receptor.figura.velocidad_y = -velocidad

		self.reducir_velocidad()
		self.imitar_posicion_de_la_figura()

	def reducir_velocidad(self):
		# Constantemente reducimos la velocidad para que parezca estatica, pero
		# sin perder aceleracion
		figura = self.receptor.figura
		desaceleracion = 1.5

		figura.velocidad_x /= desaceleracion
		figura.velocidad_y /= desaceleracion

		# si la figura va muy lento la detiene directamente.
		if -1 < figura.velocidad_x < 1:
			figura.velocidad_x = 0
		if -1 < figura.velocidad_y < 1:
			figura.velocidad_y = 0

	def imitar_posicion_de_la_figura(self):
		self.receptor.x = self.receptor.figura.x
		self.receptor.y = self.receptor.figura.y

pilas.habilidades.vincular(MoverFiguraConTeclado)

aceitu.aprender("MoverFiguraConTeclado", mi_control_1)
aceitu2.aprender("MoverFiguraConTeclado", mi_control_2)

pelota = pilas.actores.Pelota()
pelota.figura.escala_de_gravedad = 0
pelota.empujar(0, -5)
pelota.aprender('arrastrable')

pilas.ejecutar()

Avisanos cualquier cosa, abrazo

Muchisimas gracias @hugoruscitti y @jordinur, son de gran ayuda. Es bueno saber que cuento con ustedes, SON UNOS GENIOS!!:sunglasses:

Hola, @MatsimusTrolling !

Muchas gracias por tus elogios, pero realmente yo no hice gran cosa… :blush:

Si hay algún genio ese seguro es Hugo!

Un abrazo y suerte en tu proyecto.