Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mensajes - penumbra

1741
En GM existe una variable predefinida llamada id, la cuál es única para cada instancia.

Así que si hay un objeto enemigo y tres instancias de ese objeto, cada instancia posee su propia id distinta y única. Cuando haces click para indicar a qué enemigo atacar, debes usar la id de la instancia sobre la cual está el puntero del ratón. Eso haría que se atacara individualmente (por instancia) en lugar de globalmente (por objeto)
1742
Cita de: kade en Abril 03, 2014, 09:33:10 PM
Siento que mi post puede llevar a confusiones. Se hacer todo el aspecto básico, en realidad sólo son tres preguntas las que hago, pero por lo que veo no lo he dejado muy claro jaja.

Lo que necesito es:

1. Una función que les un archivo txt y lo muestre en pantalla en la room que yo desee, la cosa es que el año pasado conseguí, tras mucho esfuerzo, hacerlo, con un code y un draw que encontré por un foro inglés creo, pero llevo días probando y no me funciona de ninguna forma, también he probado con los includes file, y siempre me da un error.

¿Qué error da?

Cita de: kade en Abril 03, 2014, 09:33:10 PM
2. Una función que en base a la resolución de pantalla del dispositivo android reescale la pantalla, o sea, toda la aplicación.
http://www.comunidadgm.org/preguntas-y-respuestas/duda-resolucion(screen-sprites)-para-android-y-iphone-para-look-pixel-art/msg95122/#msg95122
1743
Mmm, son demasiadas preguntas, y cada una (unas más, otras menos) requiere de no poco conocimiento del GMS y el GML. En esencia estás pidiendo que se te indique cómo desarrollar todos los aspectos de una app (a nivel programación) en un solo post, sin previo conocimiento de la programación. No es mala onda, pero implementar en código una sola de las preguntas cuesta días de pruebas y error (en el foro se puede comprobar) a makeros que ya tienen experiencia con el GML.

Si de verdad quieres crear el proyecto por ti mismo, creo que la única ruta es comenzar por lo más básico de GMS. La mayoría no empezamos haciendo un juego enorme y 100% funcional, sino pequeños esbozos de juegos, lo cual lleva tiempo.
1744
Cita de: vampy09 en Abril 01, 2014, 08:18:34 PM
Lamentablemente no funciona en GM:S. La funciones de transicion son obsoletas.

Uh. no lo sabía. Creo que aun es posible hacer algo similar en GM:S, pero sería muy enredoso de hacer  :-X

Cita de: abramelin en Abril 01, 2014, 09:37:50 PM
gracias por compartir, eres un autentico resource-man

Gracias, en realidad es el primer script que comparto.
1745
Es recomendable que siempre indiques el código que da problemas y el evento en donde lo usas. De otra manera sólo queda adivinar que pueda pasar de entre un gran número de posibilidades.

Quizás  estás usando el código en el evento STEP, el cual se ejecuta una y otra vez, y si no usas un IF para condicionar el número de plantas, se genera un planta cada paso. Debes usar una función como instance_exists o instance_number para controlar el número de plantas que puedes crear en la habitación
1747
Preguntas y respuestas / Re:Boton de Sonido Ayuda
Abril 01, 2014, 09:32:53 PM
Cita de: pacne en Abril 01, 2014, 09:21:14 PM
Muchas gracias, pero no me va bien. lo unico que quiero esq el boton sin sonido cuando lo aprete siga en el boton sin sonido cuando vuelva al menu principal.
gracias

Eso cambia la lógica de tu menú, por lo que tienes que hacer cambios. Al comienzo del juego tu menú ya está definido, y siempre comienza igual, es decir, siempre comienza con el botón con sonido, aunque dentro del juego cambies el botón al botón sin sonido, al cerrar el juego y volver a iniciarlo, el evento CREATE (o el evento donde definas el menu) dicta que aparezca OTRA VEZ el botón con sonido.

Tienes que modificar tu juego de manera que una simple variable (valor 0 o 1) indique si se carga el botón con sonido o el botón sin sonido cuando se ejecuta el evento CREATE (o el evento que defina el menú). Para hacer esto, necesitas usar un sistema de guardado de datos en un archivo ini o un archivo de texto. Hacer un sistema de guardado es una de las preguntas más formuladas en las últimas semanas, por lo que no te costará dar con ejemplos en el foro.
1748
Preguntas y respuestas / Re:unir pieza con pieza
Abril 01, 2014, 11:14:32 AM
Cada figura consistiría de dos objetos, cada uno con su sprite. Lo más laborioso sería hacer los sprites en el editor de imágenes que tu uses (que queden bien alineados los sprites uno respecto del otro). Si sólo hay dos piezas por figura, en GM sería sencillo unirlas, sólo hay que acercar sus orígenes (puntos azules):


1749
Autor: penumbra
Descripción: Un ejemplo de cómo usar un sprite para bloquear parcialmente la vista durante una transición entre habitaciones.
Versión: Desarrollado en GM8.1. No lo he probado en GM:S, quizás funcione o quizás necesite pequeños cambios en el código.

Información preeliminar:
Para comprender cómo funciona el script, hay que enteder el método que GM nos ofrece para agregar nuevas transiciones a las ya disponibles, siempre y cuando nos ciñamos a ciertas directivas del propio sistema de transiciones. Me voy a extender un poco, pero considero que esto es preferible a dejar dudas que podrían suponer obstáculos si te decides a usar transiciones personalizadas. A partir de un solo script, es posible crear un nuevo efecto de transición que puede ser llamado como cualquiera de las otras transiciones incluídas por defecto en GM. Cuando llamamos a un efecto de transición, hacemos esto:

transition_kind = 10    //indice_de_la_transicion
room_goto_next();


El índice de la transición apunta a un script interno de GM el cual se encarga de realizar el efecto de transición. Algo fundamental que debemos saber del sistema de transiciones es que los argumentos con los que trabaja el script de transición ya están previamente definidos, son los mismos siempre, de hecho, al llamar al script, GM le provee automáticamente de los argumentos. Lo que a nosotros nos interesa es saber cuáles son esos parámetros, para poder hacer referencia a ellos y usarlos según nos convenga. Los argumentos son:

argument0: Surface con la imagen de la habitación anterior
argument1: Surface con la imagen de la siguiente habitacion
argument2: Ancho de la surface
argument3: Alto de la surface
argument4: Porcentaje de la transición (varía de 0 a 1)

Una vez que creamos un script, hay que registrarlo de manera que GM sepa que es un efecto de transición. Para esto usamos la función transition_define()
transition_define(100, "nombre_del_script")

El primer argumento es el índice del script, el cual puede ser cualquier número SIEMPRE Y CUANDO no sea un índice que ya se use en otro script de transición, incluidas las 21 transiciones por defecto de GM. Para evitar problemas, puedes usar índices para tus transiciones a partir de un número más o menos grande, por ejemplo 50 o 100.

El segundo argumento es el nombre del script, el cual debe especificarse en comillas.

Quizás el mejor lugar para registrar un script de transición sea el evento [GAME START] de algun objeto controlador, aunque se puede registrar en cualquier evento.


También podemos controlar el tiempo que dura la transición, mediante la variable transition_steps. El valor por defecto de esta variable es de 80 steps, aunque es probable que este número sea algo corto para la mayoría de transiciones.

Factores a considerar para que el script funcione de manera correcta:
Este script usa un sprite (una simple imagen) como máscara para la transición. La imagen tiene una zona transparente (alfa 0) en su centro y el área alrededor es opaca (alfa 1). La transición inicia con la imagen a tamaño normal, y a medida que se efectúa la transición, el tamaño de sprite aumenta, lo que produce que la zona central (transparente) sea cada vez mayor y revele más y más la vista del juego. Adjunto una imagen que deja más claro de lo que se trata.

spr_mask: LA ZONA CLARA ES EN REALIDAD TRANSPARENTE


Es necesario realizar ciertas preparaciones para que el script funciones de manera correcta, de lo contrario el efecto se hecha a perder (y realmente se ve mal)


  • El sprite que uses como máscara debe ser exactamente del tamaño de la vista (view).
  • La zona transparente del sprite debe ser con alfa = 0, la zona opaca que yo usé es de color negro, pero creo que cualquier color (alfa 1) funcionaría igual. Obviamente el formato recomendado de la imagen debe ser PNG-24
  • En GM, debes indicar el origen del sprite EN SU CENTRO (en las propiedades del sprite)
  • El sprite debe estar cargado en el árbol de recursos de GM, en el ejemplo el nombre del sprite es spr_mask, pero se puede usar otro nombre siempre y cuando se modifique el script.
  • Debes declarar una variable global (en cualquier objeto persistente) de nombre inc e iniciarla a 0 antes de llamar al script.

Después de tanto rollo, el script:

/*
Descripcion: Script para usar un sprite como máscara en una transición entre habitaciones
Autor: penumbra
*/
var surfaces, ancho, alto, fraction;
surfaces[0] = argument0; // surface con la imagen de la habitación anterior.
surfaces[1] = argument1; // surface con la imagen de la habitación siguiente.
ancho = argument2; // ancho de la surface
alto = argument3; // alto de la surface
fraction = argument4; // porcentaje de la transición (entre 0 y 1)
draw_clear(c_black);

var mascara, f, w, esc;                                    //surface de mascara, factor normalizador, ancho del sprite máscara, factor de escala.

mascara = surface_create(ancho, alto)
surface_copy(mascara, 0, 0, surfaces[1])                        // copiar la superficie de la habitación siguiente en la superficie de máscara
surface_set_target(mascara)
draw_set_blend_mode(bm_subtract)
draw_set_color(c_black)

inc += 0.01 // incremento del escalado
w = sprite_get_width(spr_mask)
//hacer que el factor f sea tal que f*x_scale y f*y_scale sea 1 para el sprite máscara. fraction * w nunca será mayor al ancho del sprite.
if (fraction * w < ancho)
{
    f = fraction * ( ancho/(0.01 + fraction * w) )            //0.01 es para evitar error de división por 0, al inicio de la transición.
    esc = f + f*inc
}
else { esc = 8 }

draw_sprite_ext(spr_mask, 0, view_xview + view_wview/2 , view_yview + view_hview/2, esc, esc, 0, c_white, 1)
draw_set_blend_mode(bm_normal)
surface_reset_target()
draw_surface(surfaces[0], 0, 0)
draw_surface(mascara, 0, 0)
surface_free(mascara)


Para usar esta transición, en el evento [STEP] del obj_jugador harías algo similar a esto:
if place_meeting(x,y,obj_portal)
{
     transition_kind = 100;                 //Yo registré el script con el índice 100, especifica el número de índice que tu hayas registrado
     transition_steps = 300;       
     visible = false
     room_goto_next();
}


¿Por qué uso visible = false? Es por el modo en que GM se comporta cuando se usan las funciones de cambio de habitación. Si no hago invisible el sprite del personaje, el sprite aparece en la superficie especificada por argument0 durante la transición, y eso hecha a perder el efecto, tal vez esto sea confuso, pero es cuestión de que pruebes a mantener el sprite visible y verás que durante la transición el sprite del personaje se puede ver repetido en dos lugares distintos. Es por esto que hay que hacer invisible el sprite. Ahora, para volver a hacerlo visible, usamos el evento ROOM START. En mi caso, luce así:

Objeto jugador, evento [ROOM_START]
if (room == room1)     //Este IF se puede modificar para que sea verdadero en todas las habitaciones excepto la primera
{
  x = 1;                       //El jugador es un objeto persistente, por lo que debemos posicionarlo al comienzo de la nueva habitación
  visible = true              //Hacemos visible de nuevo al jugador
}


Bueno, eso es todo, si hay alguna duda o algo no se entiende, escribe un mensaje. Ah, casi se me olvida. El efecto de máscara luce algo así.
1750
Preguntas y respuestas / Re:transicion entre rooms
Marzo 31, 2014, 11:33:54 PM
¿Te refieres a algo así?

La máscara es una imagen de batman que descargué de la red.



Era cuestión de honor resolver mi problema con las transiciones personalizadas, así que estuve trasteando y por fin logré solucionarlo. Aproveché para jugar un poco más y después de batallar un poco, pude usar sprites como máscaras en el sistema de transiciones. En un rato subo el script a la sección de ejemplos

EDITADO: Script subido, enlace:
http://www.comunidadgm.org/desarrollo-de-scripts/transicion-personalizada-enmascarar-la-vista-mediante-sprite/msg95798/#msg95798

1751
Intenta

Resources > Change Global Settings> Android Tab>Graphics Tab>Texture Size

cambiando a 256x256 o algun otro valor, a ver si funciona.

Si no funciona, no sé qué más pueda ser  :-[
1752
De hecho, es imposible manipular una variable sin conocer el objeto, a menos que esa variable sea global. En el ejemplo de Mega G primero se trata de conocer el enemigo y luego de eso se consulta la variable. También se puede así (igual, los enemigos tienen que ser todos de un objeto o todos los objetos enemigos tener un padre en común)

with (obj_parent_enemy)
{
    if obj_parent_enemy.x>x
    nivel_enemigo = enemigo.nivel
}


Cita de: p34 en Marzo 31, 2014, 05:16:57 AM
Cualquier idea es aceptada :) y creo sirve con cualquier GM, no sólo con el Studio

En GM8.1 se podía usar una función como variable_local_exists() para preguntar si dentro de algún objeto existía cierta variable, pero este tipo de funciones se volvieron obsoletas en GM:Studio y ya no se pueden usar, aunque si usas gm8.1 todavía puedes aprovecharlas
1753
sólo tienes que cambiar la función de leer teclado por la de leer mouse

http://www.comunidadgm.org/manual_GM/El_raton.htm
1755
si los cambios que haces en variables de tu personaje no se mantienen al cambiar de room es porque el objeto personaje no está marcado como persistente.

Esto quiere decir que tal como está, su evento CREATE se ejecuta cada que se inicia una habitación (lo que hace que las variables regresen a su valor inicial). La solución es marcar la casilla persistente en las propiedades del objeto, al hacer esto, sólo tienes que colocar al jugador en la primera habitación. Una vez un objeto es persistente, al cambiar de room se mantienen sus variables, esto quiere decir que su posición también se mantiene, por lo que no te sorprendas si no aparece al principio de la nueva habitación (está al final, de acuerdo a su posición en anterior). asi que tienes que encargarte de que al iniciar una nueva habitación, colocar al personaje donde se supone que debe comenzar.

Si quieres guardar datos que se mantengan aun cerrando el juego, tienes que usar archivos ini o archivos de texto, para lo cual hay un tutorial incluído en el GM:S y es una pregunta que se ha respondido mucho últimamente en el foro.