Error: AttributeError("'str' object has no attribute 'z'",)

Buenas noches, he estado programando un juego en el que la mecánica principal son los disparos, sin embargo, al establecer que una clase predeterminada será utilizada como bala, salta el siguiente error:

La gracia es que, al intentar con otra clase exactamente igual, el error no hace presencia, por lo que me he quedado sin ideas a lo que se puede deber el error. Mandaría el código pero ya van como 1000 líneas :dizzy_face: alguna ayuda? Gracias de antemano.

Buenas, @Mateo_Bc!

Es raro ese error, parece que la class del proyectil o bala no estuviera bien definida.
El error marca que en vez de un actor se le está enviando a “disparar” un string (cadena de texto).

Podrias mostrar el fragmento de código de la bala y del actor al disparar?

Un saludo :wink:

Definición de la bala:

Inteligencia artificial que aprende a disparar:

Necesitas algo mas?

¡Buenas!, como menciona @jordinur pareciera que a la habilidad le está llegando un string/cadena de texto (“str”) en lugar del actor.

Lo que me parece que puede estar ocasionando eso es la linea 1131, donde dice:

self.aprender("disparar", municion=balasmalas ....

creo que en el parámetro municion se espera el nombre de una clase, en tu caso la clase Bala en lugar de balasmalas.

Probá cambiando la sentencia anterior para que en lugar de municion=balasmalas sea municion=Bala y vemos si es eso.

Abrazo!

Ok, probare eso… Avisaré cualquier cosa!

He intentado con eso… desafortunadamente me surgió otro error.


He intentado cambiando el nombre de la clase, de la etiqueta, pero no obtengo resultados…

Estoy revisando el código de pilas para la habilidad disparar y encontré algo, por suerte se puede resolver fácil:

Veo que la clase Disparar espera que la clase que le enviamos como munición no se llame bala o proyectil, porque esas son dos clases especiales que ya vienen con pilas. Una forma de resolverlo es llamar a la clase de otra forma, por ejemplo “Disparo”.

Con eso vas a poder resolverlo directamente así. Te paso un ejemplo:

# coding: utf-8
import pilasengine

pilas = pilasengine.iniciar()

nave = pilas.actores.Nave()

class Disparo(pilasengine.actores.Actor):
    
    def iniciar(self):
            self.imagen = self.pilas.imagenes.cargar_grilla("banana.png", 2, 1)
                
    def actualizar(self):
        self.rotacion += 20


nave.aprender("disparar", municion=Disparo, angulo_salida_disparo=90)

pilas.ejecutar()

Eso tiene sentido… Lo bueno de tener dudas es que cada vez se aprende más! :joy: Intentaré eso y avisaré cuando esté solucionado.
P.d. pronto subire una beta del juego :grinning:

Última duda, he intentado eso y ha dado frutos. Sin embargo, al hacer que el actor dispare las balas según su clase (Misiles actualmente), le he dado la etiqueta de balasmalas. La cuestión es que, si en la parte que defino disparo pongo la clase, a la hora de realizar las colisiones, me dice que no puede ser declarado con clases, sino con etiquetas, y la definición de disparo no puedo usar etiquetas… En el caso de cambiar la definición de las pistolas por etiquetas me da el mismo error de “z”…
Lamento tantas dudas, pero si logro acabar con la mecánica básica, ya podré finalizar el juego… Gracias de antemano.