Resultados 1 al 5 de 5

Game engine contador de objetos con una propiedad concreta

  1. #1
    Fecha de ingreso
    Jul 2007
    Mensajes
    176

    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 fregado 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 cuántos 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 mensaje en blenderartists 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 20:37

  2. #2
    Fecha de ingreso
    Nov 2011
    Mensajes
    82

    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.
    
    Mouseclick = co, sensors[mouseclick] #clik del ratón.
    #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.
    # definición 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 mousedo, positive:
    Obj[posición] -=1 #cuando accionamos la rueda hacia abajo, resta uno.
    #función 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 click con el ratón.
    
    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 click con el ratón.
    
    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 sé si tendrá algún fallo, pero igual te sirve.

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

    Posdata: si no entiendes algo o lo que sea pregúntame 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; 28-11-2012 a las 22:48

  3. #3
    Fecha de ingreso
    Nov 2011
    Mensajes
    82

    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 acciónases la tecla de borrado y el sensor estuviese activo restar uno al contador.

  4. #4
    Fecha de ingreso
    Jul 2007
    Mensajes
    176

    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 rápido.

    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().
    
    Seblok = cont, sensors[seblock].
    
    Click = cont, sensors[click].
    
    Rclik = cont, sensors[rclick].
    
    Addob = cont, Actuators[addob].
    
    Addpues = cont, sensors[addpos].Owner.
    
    Type = 1.
    
    Type = gl, type.
    
    If click, positive and seblock, positive:
    Seblock, hitobject, endobject().
    
    If rclick, positive and seblock, positive:
    Ob = seblock, hitobject, position.
    
    Hit = seblock, 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 le 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 click izquierdo del ratón, además de borrar el objeto, mande otro mensaje que recibirá 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.

    Vaya, y muchas gracias por el enlace a la Api, intuyo que tengo para horas y horas ahí metido.

  5. #5
    Fecha de ingreso
    Nov 2011
    Mensajes
    82

    Game engine contador de objetos con una propiedad concreta

    Hum 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 click (el click 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, cree 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 quieras hacer está ahí dentro. Un saludo.
    Última edición por Beral; 28-11-2012 a las 23:19

Temas similares

  1. Blender Desaparecen objetos en Blender game engine
    Por blendcarlos en el foro Programas de Diseño 3D y CAD
    Respuestas: 14
    : 08-01-2016, 18:44
  2. 3ds Max Game engine tipo Cryengine UDK Unreal engine
    Por nicknick en el foro Videojuegos
    Respuestas: 4
    : 05-04-2013, 13:00
  3. Objetos rebotando en game engine
    Por martinz846 en el foro Animación y Rigging
    Respuestas: 7
    : 23-06-2012, 22:31
  4. Blender Property objetos en game engine
    Por 3dpoder en el foro Blender
    Respuestas: 0
    : 18-04-2009, 18:45
  5. Blender Game engine texto en el game engine tutorial
    Por 3dpoder en el foro Blender
    Respuestas: 1
    : 11-01-2009, 17:38