Gracias Gracias:  3
Resultados 1 al 5 de 5

Tema: Game engine Contador de objetos con una propiedad concreta

  1. #1
    Senior Member Avatar de Azrael^^
    Fecha de ingreso
    Jul 2007
    Ubicación
    Tomelloso y Alicante
    Mensajes
    177

    Blender Game engine. Contador de objetos con una propiedad concreta

    Hola de nuevo!!

    Bueno, si os habéis estado fijando últimamente ando con problemas con el game engine. Y es que yo, estudiando arquitectura, me he metido en un fregao bastante guapo y ahora no me queda otra que seguir adelante. Y mi gran problema es, por supuesto, python, que no sé mucho...

    En fin a lo que voy. El caso es que tengo una escena en la que voy añadiendo diferentes tipos de objetos, con la ruleta del ratón selecciono el que quiero añadir y lo pongo. También puedo quitar esos objetos. Lo que quiero es un contador para algunos de esos objetos en concreto, para saber cuantos hay en escena en cada momento.
    Ahora mismo lo tengo casi casi conseguido, pero después de patear Internet, creo que lo tengo de una forma demasiado enrevesada (luego os la cuento si lo creéis conveniente). Además de que no termina de funcionar claro.

    En un post en blenderartist me he topado con esto:
    to count objects, simply use the len() methods:

    sce = bge.logic.getCurrentScene()
    objects_amount = len(sce.objects)

    with a property:
    property = "countit"
    objects_amount = len([i for i in sce.objects if "countit" in i])
    Pero luego se lían a hablar de otra cosa y no me aclaran cómo funciona eso. Si consigo que eso funcione es, de lejos, mucho más fácil que lo que yo estoy haciendo. Mi pregunta entonces es: ¿cómo usar eso y llevar esa cantidad de objetos con la propiedad "countit" a un objeto de texto?
    Última edición por Azrael^^; 28-11-2012 a las 22:37

  2. #2
    Miembro Avatar de Beral
    Fecha de ingreso
    Nov 2011
    Ubicación
    Madrid, España.
    Mensajes
    84

    Re: Game engine. Contador de objetos con una propiedad concreta

    Muy buenas, según he entendido lo que quieres es que el contador cuente el número de uno o varios objetos determinados que hay en la escena. Si los pones tu lo cierto es que no es demasiado complicado hacer un código que te lo implemente.

    Te pongo un código de ejemplo:

    Código:
    import bge
    co = bge.logic.getCurrentController()
    obj = co.owner
    
    #Los sensores de la rueda del ratón y del click.
    
    mouseUp = co.sensors['mouseUp'] #movimiento rueda arriba
    mouseDown = co.sensors['mouseDown'] #movimiento rueda abajo
    mouseClik = co.sensors['mouseClick'] #clik del raton
    
    #Los actuadores
    
    crearObjeto = co.actuators['crearObjeto']
    
    #Los objetos que quieras crear
    
    cubo = "cubo" #El string "cubo" es el nombre que tiene el objeto en si dentro de blender 
    esfera = "esfera"
    
    # Definicion de la función principal
    
    def main():
    
    propiedades()
    rueda()
    crear()
    
    #Definicion de las propiedades
    
    def propiedades():
    
     if not 'contador' in obj:
    
     obj['contador'] = 0 #Porpiedad contador que almacenara el número de objetos
     obj['posición'] = 0 #Propiedad que almacena la posición de la rueda
    
    #Definicion de la función que configura la posición de la rueda.
    
    def rueda():
    
     if obj['posición'] > 1: #Solo tenemos dos objetos, así que le diremos que cuando se pase de 1 se quede en uno
     
     obj['posición'] == 1
    
     if obj['posición'] < 0: #Solo tenemos dos objetos, así que le diremos que cuando baje de 0 se quede en 0
     
     obj['posición'] == 0
    
     if mouseUp.positive:
    
     obj['posición'] +=1 #Cuando accionamos la rueda hacia arriba, suma uno
    
     if mouseDown.positive:
    
     obj['posición'] -=1 #Cuando accionamos la rueda hacia abajo, resta uno
    
    #Funcion que crea y cuenta. Suponemos que solo queremos contar las esferas y no los cubos.
    
    def crear():
    
     if (obj['posición'] == 0 and mouseClick.positive):
     crearObjeto.object = cubo #Suponemos que la posición inicial de rueda corresponde al cubo y se acciona cuando 
     co.activate(crearObjeto) #hacemos clik con el raton
     co.deactivate(crearObjeto)
    
     #Como no queremos contar cubos no ponemos nada
    
     if (obj['posición'] == 1 and mouseClick.positive):
     crearObjeto.object = esfera #Suponemos que la posición uno de la rueda corresponde a la esfera y se acciona cuando 
     co.activate(crearObjeto) #hacemos clik con el raton
     co.deactivate(crearObjeto)
     
     obj['contador'] += 1 #como queremos contar esferas, sumamos uno al contador
    
    #Ya hemos acabado las funciones, solo queda ponerlas en el main y ejecutar el main:
    
    main() #Importante
    Lo he hecho ahora un poco de carrerilla y no se si tendrá algún fallo, pero igual te sirve.

    El script esta hecho para que funcione con un solo actuador addobject, si tu tenias uno por objeto, solo tienes que declararlos y actvarlos cuando corresponda.

    PD: si no entiendes algo o lo que sea preguntame e igual te ayuda mejor la api de blender http://www.blender.org/documentation...n_api_2_64_6/#

    Un Saludo.
    Última edición por Beral; 29-11-2012 a las 00:48

  3. #3
    Miembro Avatar de Beral
    Fecha de ingreso
    Nov 2011
    Ubicación
    Madrid, España.
    Mensajes
    84

    Re: Game engine. Contador de objetos con una propiedad concreta

    Al quitarlos sería más o menos igual, pero con un sensor que te detectase la propiedad y cuando accionases la tecla de borrado y el sensor estuviese activo restar uno al contador.

  4. #4
    Senior Member Avatar de Azrael^^
    Fecha de ingreso
    Jul 2007
    Ubicación
    Tomelloso y Alicante
    Mensajes
    177

    Re: Game engine. Contador de objetos con una propiedad concreta

    Muchas gracias Beral!!

    Lo que me faltaba en realidad era conseguir que el contador restase al borrar un objeto concreto, y tu segundo mensaje me ha dado la pista de cómo hacerlo, que estaba encerrado intentando conseguirlo con código y con bricks ha sido bastante rapido.
    Ya puesto cuento como lo tengo funcionando para que quede constancia. Los objetos los añado con este script:

    Código:
    import GameLogic as gl
    import bge
    
    cont = gl.getCurrentController()
    seeblok = cont.sensors['seeblock']
    clik = cont.sensors['click']
    rclik = cont.sensors['rclick']
    addob = cont.actuators['addob']
    addpos = cont.sensors['addpos'].owner
    type = 1
    
    type = gl.type
    
    if click.positive and seeblock.positive:
     seeblock.hitObject.endObject()
    if rclick.positive and seeblock.positive:
     ob = seeblock.hitObject.position
     hit = seeblock.hitPosition
     print(hit[2] - ob[2])
     if hit[0] - ob[0] < 0.21 and hit[0] - ob[0] > 0.19:
     addpos.position = [ob[0] + 0.4,ob[1],ob[2]]
     if hit[0] - ob[0] > -0.21 and hit[0] - ob[0] < -0.19:
     addpos.position = [ob[0] - 0.4,ob[1],ob[2]]
     if hit[1] - ob[1] < 0.21 and hit[1] - ob[1] > 0.19:
     addpos.position = [ob[0],ob[1] + 0.4,ob[2]]
     if hit[1] - ob[1] > -0.21 and hit[1] - ob[1] < -0.19:
     addpos.position = [ob[0],ob[1] - 0.4,ob[2]]
     if hit[2] - ob[2] < 0.21 and hit[2] - ob[2] > 0.19:
     addpos.position = [ob[0],ob[1],ob[2] + 0.4]
     if hit[2] - ob[2] > -0.21 and hit[2] - ob[2] < -0.19:
     addpos.position = [ob[0],ob[1],ob[2] - 0.4]
     if type == 1:
     addob.object = 'madera1'
     if type == 2:
     addob.object = 'madera2'
     if type == 3:
     addob.object = 'madera3'
     if type == 4:
     addob.object = 'esponja'
     if type == 5:
     addob.object = 'tela'
     if type == 6:
     addob.object = 'cristal'
     if type == 7:
     addob.object = 'hojas'
     bge.logic.sendMessage('añade')
     if type == 8:
     addob.object = 'chapa'
     if type == 9:
     addob.object = 'ropa'
     if type == 10:
     addob.object = 'pantalones'
     if type == 11:
     addob.object = 'sabana'
     cont.activate(addob)
    Entonces lo que tenía hecho para llevar la cuenta del objeto tipo 7 por ejemplo, era añadirle la línea "bge.logic.sendMessage('añade')", para que además de poner el objeto, mandase un mensaje con el título "añade". Mensaje que lee un objeto de texto que tengo puesto a modo de contador. El problema es que en ese script, quitar objetos esta puesto de manera genérica, sea cual sea el objeto. Así que lo que he hecho ha sido lo que has dicho: añadir a la cámara un sensor "ray" que busque una propiedad que le he dado al objeto "hojas" y que cuando coincida con un clik izquierdo del ratón, además de borrar el objeto, mande otro mensaje que recibira el contador, en este caso restando.

    Por tener tantos tipos de objetos es por lo que pensaba que quizá sería más fácil si hubiese forma de contar los objetos que hay en escena con una propiedad concreta. Pero vamos, visto el código, si se te ocurre alguna otra forma de conseguirlo, bienvenida será, que por aprender no sea!!

    Ahh, y muchas gracias por el enlace a la api, intuyo que tengo para horas y horas ahí metido!!

  5. #5
    Miembro Avatar de Beral
    Fecha de ingreso
    Nov 2011
    Ubicación
    Madrid, España.
    Mensajes
    84

    Re: Game engine. Contador de objetos con una propiedad concreta

    Hummm me alegro que te haya servido! Pero creo que podrías poner al objeto un sensor mouse|mouse over, así cuando pongas el ratón encima y hagas clik (el clik lo detecte con otro sensor) lo detecte y antes de borrarse envié un mensaje de descontar uno al contador, creo que te simplificaría todo muchísimo.
    De hecho cre que esto último lo podrías hacer sin código ninguno solo con bricks!
    A la api cuesta cogerle el punto, pero todo lo que qieras hacer esta ahí dentro
    Un Saludo
    Última edición por Beral; 29-11-2012 a las 01:19

Temas similares

  1. Blender Desaparecen objetos en Blender Game Engine
    Por blendcarlos en el foro Problemas con Programas
    Respuestas: 14
    Último mensaje: 08-01-2016, 20:44
  2. Respuestas: 4
    Último mensaje: 05-04-2013, 14:00
  3. Blender Objetos rebotando en game engine
    Por martinz846 en el foro Animación y Rigging
    Respuestas: 7
    Último mensaje: 23-06-2012, 23:31
  4. Blender Property Objetos en Game Engine
    Por 3dpoder en el foro Blender
    Respuestas: 0
    Último mensaje: 18-04-2009, 19:45
  5. Game Engine - Texto en el Game Engine - Tutorial
    Por 3dpoder en el foro Blender
    Respuestas: 1
    Último mensaje: 11-01-2009, 19:38

Actualmente estos son sus permisos de publicación en el foro.

  • -No puedes crear nuevos temas al no estar registrado o no haber iniciado sesión en el foro.
  • -No puedes responder temas al no estar registrado o no haber iniciado sesión en el foro.
  • -No puedes subir archivos adjuntos al no estar registrado o no haber iniciado sesión en el foro.
  • -No puedes editar tus mensajes al no estar registrado o no haber iniciado sesión en el foro.
  •