Noticias

¡Ayuda a la Comunidad GM, haz una donación!

Comunidad Game Maker

Bienvenid@ a la comunidad hispana de Game Maker. Nuestro objetivo es crear videojuegos y dar soporte en castellano de GM. Para mejorar nuestro servicio hemos implantado, como adicion al reglamento general, algunas normas especificas en los subforos más comunes. ¡No olvides informarte antes de participar!.

Autor Tema: sprite_get_index  (Leído 2709 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Texic

  • Moderadores globales
  • Legendario
  • *
  • Puntos: 1213
  • Mensajes: 2.158
  • Agradecido: 3 veces
  • Sexo: Masculino
  • I Have The Fire!
    • Ver Perfil
en: Septiembre 30, 2010, 09:56:37 pm
Creador: Yo-Wadk

Version de GM utilizada:  :GM8:

También es compatible con  :GM7: :GM6: y probablemente  :GM5:

Descripcion:
Citar
Este script básicamente saca el índice de un sprite mediante un string que contenga su nombre. De no encontrarlo devuelve -1. En lo posible traten de que el sprite exista para mejorar el rendimiento del script, ya que hasta que encuentra el sprite recorre 1000 para encontrarlo. En el ejemplo verán que el rendimiento no se ve afectado por un simple while de 1000, pero para juegos pesados podría resultar inconveniente usar este script en step sobre sprites inexistentes. Esto para mi script, el de Wadk funciona diferente

sprite_get_index (mio)
z=0
zz=-1
while z<>-1 and z<1000
{
if sprite_get_name(z)=argument0 {zz=z z=-1}
else {z+=1}
}
return zz

o

sprite_get_index (Wadk)
execute_string("return "+argument0);

Ejemplo:
sprite_index=sprite_get_index("sprite2")

Dejo un adjunto para que vean el funcionamiento de ambas, remarco un par de diferencias. La de Wadk es rapidísima, a diferencia de la mía. Pero cuando la sprite no existe da error, a menos que:
A - Desactiven los mensajes de error
B - Activen el "treat uninitialized variables as 0", en éste último no va a devolver -1 al no encontrar la sprite, sino que devuelve 0

Por eso es q dejo las dos. Bueno, espero que les guste alguna XD
« última modificación: Octubre 02, 2010, 09:50:48 pm por Texic »




 


No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.


Desconectado brunoxzx

Respuesta #1 en: Septiembre 30, 2010, 11:00:57 pm
de haber sabido de la existencia de sprite_get_name esto no me habría pasado XD (debí de buscar mas afondo en el manual)

¡¡¡¡GRACIASSSSS ME AHORASTE MUCHOS PROBLEMAS!!!!

edit: me funciono a la perfección
« última modificación: Septiembre 30, 2010, 11:19:17 pm por brunoxzx »

 


Desconectado Wadk

  • In order to see...
  • Legendario
  • *
  • Puntos: 274
  • Mensajes: 2.355
  • Sexo: Masculino
  • ... you must close your eyes.
    • Ver Perfil
Respuesta #2 en: Octubre 01, 2010, 01:37:54 am
No te quiero joder, pero hay una forma más fácil...
execute_string("a=nombre_del_sprite");

También está esta opción, que me parece más sencilla, pero no estoy seguro de si funciona:
a=execute_string("nombre_del_sprite");

Y también, el script se puede optimizar usando sólo un for (amo los for :P):
var z;
for(z=1000;sprite_get_name(z)!=argument0 && z>-1;z-=1){
    // Nada :P
}
return z;
Aunque no estoy seguro de si funcionaría porque nunca probé usar una condición así en un for, no se si el GM lo permite (en C/C++ se puede XD). No puedo usar el GM para confirmarlo...

 


Desconectado Texic

  • Moderadores globales
  • Legendario
  • *
  • Puntos: 1213
  • Mensajes: 2.158
  • Agradecido: 3 veces
  • Sexo: Masculino
  • I Have The Fire!
    • Ver Perfil
Respuesta #3 en: Octubre 01, 2010, 01:41:51 am
Pues obviamente no se me había ocurrido XD
Ahora la cambio, me fijo cuál funciona mejor (de las tuyas, esta claro q la mía no está optimizada)
EDIT: Listo, ya ta
« última modificación: Octubre 01, 2010, 01:56:16 am por Texic »




 


Desconectado Wadk

  • In order to see...
  • Legendario
  • *
  • Puntos: 274
  • Mensajes: 2.355
  • Sexo: Masculino
  • ... you must close your eyes.
    • Ver Perfil
Respuesta #4 en: Octubre 01, 2010, 01:59:35 am
¿Seguro que mi código es más rápido? Yo no lo aseguraría :P La función execute_string tiene fama de ser más bien lenta.

Y la versión con el for, ¿no funciona? :/
Acá una alternativa que debería funcionar:
var z;
for(z=1000;z>-1;z-=1){
    if sprite_get_name(z)==argument0{
        break;
    }
}
return z;
« última modificación: Octubre 01, 2010, 02:01:20 am por Wadk »

 


Desconectado Texic

  • Moderadores globales
  • Legendario
  • *
  • Puntos: 1213
  • Mensajes: 2.158
  • Agradecido: 3 veces
  • Sexo: Masculino
  • I Have The Fire!
    • Ver Perfil
Respuesta #5 en: Octubre 01, 2010, 02:06:19 am
Claro que está bien, pero empieza en 1000 y termina en -1, esa es la parte que no me convence. Normalmente no se llega ni a las 300 sprites (En mi caso particular). Supone más esfuerzo y recorrido llegar desde 1000 a 300 que desde 0 a 300, estaba pensada para ser más rápida en ese sentido




 


Desconectado brunoxzx

Respuesta #6 en: Octubre 01, 2010, 02:14:52 am
WTF !!! existe la funcion execute_string!!!! busque algo parecido durante horas!!!!
y aparte de todo me dijeron que no se podía lo que quería!!!


por cierto texic poner z=<>-1 es lo mismo que !z=-1 ?

 


Desconectado Wadk

  • In order to see...
  • Legendario
  • *
  • Puntos: 274
  • Mensajes: 2.355
  • Sexo: Masculino
  • ... you must close your eyes.
    • Ver Perfil
Respuesta #7 en: Octubre 01, 2010, 02:35:30 am
WTF !!! existe la funcion execute_string!!!! busque algo parecido durante horas!!!!
y aparte de todo me dijeron que no se podía lo que quería!!!


por cierto texic poner z=<>-1 es lo mismo que !z=-1 ?
Sí, existe, pero no te recomiendo que la uses mucho. Como dije, es lenta.
z=<>-1 daría error (seguramente). Si te referís a z<>-1, no es lo mismo que !z=-1, es lo mismo que z!=-1.

@Texic: Es cierto, no pensé en eso.
Entonces así:
var z;
for(z=0;z<1000;z+=1){
    if sprite_get_name(z)==argument0{
        return z;
    }
}
return -1;


En cualquier caso, hacer esto no es la mejor de las ideas en realidad :/

 


Desconectado brunoxzx

Respuesta #8 en: Octubre 01, 2010, 03:39:23 am
MMM disculpa pero creo que !z=-1 y z!=-1 son exactamente lo mismo.

y en el tema del script realmente no me importa la velocidad, lo necesito en create y junto a un proceso que tarda muuucho mas!  

 


Desconectado Wadk

  • In order to see...
  • Legendario
  • *
  • Puntos: 274
  • Mensajes: 2.355
  • Sexo: Masculino
  • ... you must close your eyes.
    • Ver Perfil
Respuesta #9 en: Octubre 01, 2010, 03:50:53 am
No, no lo es. !(z=-1) si es lo mismo que z!=-1, pero si ponés !z=-1 estás negando z y comparando el resultado de dicha negación con -1. Al negar un entero, el resultado será 1 o 0, nunca otro número. !z=-1 siempre devolverá false (o un error si z es un string, supongo).

A no ser, claro, que la memoria me falle (:

 


Desconectado brunoxzx

Respuesta #10 en: Octubre 01, 2010, 04:30:58 am
AHH si disculpa  ???  :-[ mi error si ya recordé que era haci !(a=-1) y de echo ya había comprobado antes lo de que que se niega Z y se compara con -1 XD disculpa!

 


Desconectado Texic

  • Moderadores globales
  • Legendario
  • *
  • Puntos: 1213
  • Mensajes: 2.158
  • Agradecido: 3 veces
  • Sexo: Masculino
  • I Have The Fire!
    • Ver Perfil
Respuesta #11 en: Octubre 02, 2010, 04:36:49 am
Demostrado, tu código 5000 veces por segundo Wadk da 2 fps, el mio según la cantidad de sprites que tenga que recorrer el while, pero en circunstancias normales gana el tuyo por bastante




 


Desconectado Wadk

  • In order to see...
  • Legendario
  • *
  • Puntos: 274
  • Mensajes: 2.355
  • Sexo: Masculino
  • ... you must close your eyes.
    • Ver Perfil
Respuesta #12 en: Octubre 02, 2010, 09:29:07 pm
Ya veo.

Bueno, última cosa, en el mío deberías agregar la línea var a; al principio, y en el tuyo deberías agregar zz en el var.
O mejor, creo que en el mío podrías poner directamente execute_string("return "+argument0);

 


Desconectado Texic

  • Moderadores globales
  • Legendario
  • *
  • Puntos: 1213
  • Mensajes: 2.158
  • Agradecido: 3 veces
  • Sexo: Masculino
  • I Have The Fire!
    • Ver Perfil
Respuesta #13 en: Octubre 02, 2010, 09:51:38 pm
Wow, ahora a 10000 veces por step da 5-6 fps (Quizás se deba también a que mi pc está más liviana que cuando lo probé la otra vez)