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 - Guacusio

136
Preguntas y respuestas / Re:Pantalla Debug
Septiembre 15, 2015, 05:43:00 PM
Cita de: Clamud en Septiembre 15, 2015, 05:36:22 PM
Otra opción es la siguiente, sin embargo lo que menciona Guacusio me parece mejor.
[gml]
///Evento Game Start
global.debug = false;
instance_create( x,y, obj_debug );
[/gml]
[gml]
///Evento Step
if keyboard_check_pressed( vk_f3 ) //al presionar F3
{
    if( global.debug ) { //si debug está activado
        instance_deactivate_object( obj_debug );
        global.debug = false; //desactivar
    }
    else { //si no está activado
        instance_activate_object( obj_debug );
        global.debug = true; //activar
    }
}
[/gml]
El código debe ir en un objeto diferente a obj_debug.

Si sólo quieres depurar en Windows, puedes usar el debugger integrado en GMS.

Haciendo una optimización, en lugar de crear la variable activo se puede usar la variable visible, que todas las instancias tienen por defecto, entonces se sólo se tiene que poner una línea en el evento Press F3
[gml]
visible = !visible;
[/gml]

Haz lo que dice Clamud, tiene toda la razón.
137
Preguntas y respuestas / Re:Views zoom
Septiembre 15, 2015, 05:39:47 PM
Tal vez a eams1986 le sirve un zoom que se aleje y luego se acerque pero cuya magnitud sea siempre la misma, es decir, que no dependa de la altura que salta el personaje. En ese caso el problema principal es cambiar en forma paulatina los valores del wview y hview, como dicen penumbra y Clamud; creo que un cambio que siga la forma de una curva sinusoidal sería estéticamente el mejor. Si prefieres que el cambio sea mediante una interpolación lineal, recomiendo encarecidamente que dispongas en tu juego de un método genérico para cambiar el valor de una variable en forma paulatina, a modo de script. No sólo ayudaría para lo del zoom sino que tiene un gran potencial para crear otros efectos, como el cambio paulatino de canal alfa, escala, rotación, posición, etc. o de una variable cualquiera entre 2 valores dados sin necesidad de programarlos caso por caso (al menos a mí me ha ayudado al punto de ser casi indispensable).
138
Preguntas y respuestas / Re:Pantalla Debug
Septiembre 15, 2015, 05:26:50 PM
Cita de: chetuu16 en Septiembre 15, 2015, 05:03:12 PM
He intendado hacerlo, le he dicho que cuando presione la F3 que me lo cree, pero luego no caigo como hacer que lo quite pulsando la misma tecla.

Tambien he pensado en activarlo y desactivarlo. Me explico, al empezar el juego ya esta creado, pero desactivado, entonces al pulsar la tecla solamente lo activo y lo desactivo.

Tambien he pensado de hacerlo con variables, mi idea era crear una variable

global.debug = false

if ( global.debug = false) {
instance_deactivate_object(obj_debug);
}else{
instance_activate_object ( obj_debug);
}


Algo asi havia pensado, pero no llego a caer con la forma de hacerlo ://

En vez de estar viendo cada step si la instancia debe activarse o no, lo primero que yo habría tratado de hacer es usar el evento key press F3 en el mismo objeto:

Evento create:
activo=false;

Evento key press F3:
activo=!activo;

Evento draw:
if activo
    {instrucciones para dibujar las líneas}

139
Preguntas y respuestas / Re:Pantalla Debug
Septiembre 15, 2015, 04:32:08 PM
¿Lo has intentado hacer de alguna forma y no te funciona, o no tienes la menor idea de cómo hacerlo?
140
Es un tanto complejo hacer un sistema de selección de room pero esta es una idea: crea un objeto que represente los rooms y coloca 3 instancias de este objeto, una junto a la otra en una fila horizontal, separadas por un espacio no muy grande, con cada instancia teniendo el sprite asociado al room que le corresponde; esa será la tira de imágenes. Conociendo cuántos pixeles horizontales se arrastró el puntero, mueve esas instancias en esa misma cantidad de pixeles a la izquierda o derecha y haz que cuando una de esas instancias se acerque al borde del view o room, sea destruida y se cree una nueva en la tira desde el otro extremo. Deberás llevar un listado de los rooms dentro de un array o una lista y cada vez que se necesite crear una instancia nueva para un room emergente en la tira, lee de esa lista cuál es el room que viene a continuación.
141
Preguntas y respuestas / Re:Menu de revivir
Septiembre 15, 2015, 05:05:57 AM
No es molestia ayudarte, no te preocupes. Adapté el archivo que dejaste para agregar un botón de resurrección. Le agregué esto:

Evento colisión de obj_bird con obj_grass:
show_message("FIN DEL JUEGO");

eso fue para diferenciar una resurrección de un fin de juego

Evento colisión de obj_bird con obj_pipe_top:
while place_meeting(x,y,obj_pipe_top)
    x-=1;//mueve al pájaro a la izquierda hasta que no genere colisión
gravity=0.2;
vspeed=0;
if global.intentos<global.intentos_max
    instance_create(room_width/2,room_height/2,obj_revivir);


El pájaro debe ser desplazado hasta que no genere colisión con la tubería o se crearán instancias del botón revivir indefinidamente cuando sólo se requiere una. Le puse gravedad menor y velocidad cero para que cuando muera caiga lo suficientemente despacio como para darle tiempo al jugador de presionar el botón.

Evento game start de obj_bird:
global.intentos=0;
global.intentos_max=5;


Con eso inicializo las variables que llevan la cuenta de las resurrecciones. En este caso lo dejé con un máximo de 5 pero puedes poner lo que quieras.

Evento left pressed de obj_revivir (el botón):
global.intentos+=1;
room_restart();
instance_destroy();


Es una forma poco elegante de hacerlo pero te servirá como idea. También adjunto el editable para que lo pruebes.

EDIT: en el último código no es necesario utilizar instance_destroy()  :-[.
142
En el caso de un interstitial la extensión de la demo lo carga en forma asíncrona pero paraliza el juego al mostrarlo, es decir, el juego sigue corriendo mientras se carga y una vez termina de cargar y es mostrado utilizando las funciones para ello, el juego se interrumpe hasta que el interstitial es cerrado. Esto no pasa con los banners, que no interrumpen el juego en ningún momento. Hasta ahora no me ha pasado que la pantalla se ponga negra un largo rato al cerrar el interstitial, en eso no puedo ayudarte y tal vez a otro le pase algo parecido; tal vez dependa del tipo de dispositivo donde se ejecute.
143
Las funciones de advertising de GML quedaron obsoletas y ahora se hace lo mismo mediante extensiones. Te sugiero que pruebes una extensión para mostrar publicidad, como la que viene en el demo de google mobile ads de GMS.
144
Preguntas y respuestas / Re:Problema con colision y alarma
Septiembre 14, 2015, 01:54:42 PM
Estás activando la alarma de un objeto que al mismo tiempo estás destruyendo, lo cual no tiene sentido. Tienes que poner la alarma en otro objeto que no sea destruido al morir el jugador. Por cierto, no hace falta usar with para que una instancia ejecute instrucciones sobre sí misma:

Evento colisión de obj_RedPlayer con obj_pincho:
obj_controlador.alarm[0]=room_speed*3;
instance_destroy();


Evento alarm[0] de obj_controlador:
room_restart();

obj_controlador es un objeto controlador en el juego que no es destruido durante el juego.
145
Cita de: venus en Septiembre 13, 2015, 10:01:59 PM
Os doy las instrucciones.
Cread 2 sprites. Da igual de que sean, pero que se vean.
Cread 2 objetos. ObjetoA y ObjetoB.
Ponedle ujn sprite a cada uno.
En ev. Create de ObjetoA poneis esto:
seleccionado = false;
En ev. Draw de ObjetoA poneis esto:
draw_self();
if(mouse_check_button(mb_left)) {
  if(place_meeting(x,y,objetoB)) {
    seleccionado = true;
  } else {
    seleccionado = false;
  }
}

if(seleccionado == true) {
  draw_circle (x,y,12,true);
}

En ev. Step de ObjetoB poneis esto:
x = mouse_x
y = mouse_y





Lo que quiero es que cuando seleccione un otro ObjetoA no se borre el círculo de los otros. Pero que si se borre cuando no pinche en ningún lado.

Entiendo que este es el proyecto que llevas adelante con Marth sobre el juego de la comunidad y la guerra de planetas. Por lo que recuerdo haber probado en ese juego, lo que quieres es poder seleccionar varios planetas manteniendo presionado el mouse y soltar este ataque liberando el botón del mouse. El objetoA representaría planetas y el objetoB sería el puntero del mouse. Viendo el código y los nuevos antecedentes con una muy mejorada explicación, veo que esto es lo que ocurre:

Al pasar el puntero sobre una instancia de objetoA con el botón del mouse presionado, la variable seleccionado toma el valor true en esa instancia. Al sacar el puntero del mouse del objetoA estando presionado el botón del mouse, la variable seleccionado toma el valor false porque deja de haber colisión entre objetoA y objetoB. Eso explica por qué los círculos no permanecen. Perdóname que te lo diga pero me parece que la forma en que quieres hacer esto es horrible. Probablemente en tu juego habrá varias instancias de objetoA y cada una ejecutará permanentemente ese código en el evento draw, lo que es tremendamente ineficiente. Deberías revisar la colisión de objetoA con objetoB desde objetoB, que tendrá una sola instancia y además hacerlo en el evento mouse left en vez de en draw. Creo que esto es más eficiente y sencillo:

evento create de objetoA:
seleccionado=false;

evento draw de objetoA:
draw_self();
if seleccionado
    draw_circle(x,y,12,true);


evento mouse left de objetoB:
with instance_place(x,y,objetoA)
    seleccionado=true;


evento mouse left released:
objetoA.seleccionado=false;
146
Cita de: venus en Septiembre 13, 2015, 07:36:39 PM
Es un código para saber que objetos han sido clickados. Si pinchas en uno se selecciona, y si pinchas donde no hay objetos todos se deseleccionan.


Esto es lo que tengo en objetoA.
if(mouse_check_button(mb_left)) {
  if(place_meeting(x,y,objetoB)) {
    seleccionado = true;
  } else {
    seleccionado = false;
  }
}

El problema de esto es que cuando pincho otro objeto, el que anteriormente estaba seleccionado se deselecciona.



Con lo que me ha dicho Guacusio debería de quedar así:
if(mouse_check_button(mb_left)) {
  with (objetoB) {
    if (place_meeting(x,y,objetoA)) {
      contacto=true;
    } else {
      contacto=false;
    }
  }
  if(contacto==true) {
    seleccionado = true;
  } else {
    seleccionado = false;
  }
}





Pero parece que no funciona. No me da error, simplemente el código dentro de with no parece ejecutarse. La variable contacto se queda como la he puesto en el ev. create.

Es importante que siempre que hagas referencia a un código indiques en qué objeto y evento están. Suponiendo que ambos códigos que indicaste van en el evento step del objetoA (lo cual ya me parece extraño ya que habías hablado de hacer la comprobación de la colisión desde un objetoC), la única explicación para que la variable contacto permanezca en false es que pase necesariamente alguna de estas cosas:

-el botón izquierdo del mouse no está presionado
-no existen instancias de objetoB
-existiendo al menos una instancia de objetoB, ninguna está colisionando con alguna otra instancia de objetoA

Si quieres asegurarte de que el código dentro de with se está ejecutando (que es lo mismo que asegurarse de que exista alguna instancia de objetoB), y sólo con propósitos de depuración, puedes colocar una variable con un valor antes del with y dentro de éste cambiarlo, para luego mostrar el resultado:

var prueba=false;
with (objetoB) {
    prueba=true;
    if (place_meeting(x,y,objetoA)) {
      contacto=true;
    } else {
      contacto=false;
    }
  }
if prueba
    show_message("el with se ejecuta");
else
    show_message("el with no se ejecuta");


Otra sugerencia es que si la variable seleccionado es igual a la variable contacto, uses una sola variable para guardar el resultado en vez de duplicar la segunda, a menos que le des usos distintos más adelante. Tampoco me queda clara la necesidad de hacer el cálculo en step en vez de el evento mouse (en el que te ahorras comprobar por código si el botón del mouse está presionado); si lo haces en el evento step (que es una suposición), el código se ejecuta permanentemente mientras esté presionado el botón del mouse, lo cual puede no ser lo óptimo.

EDIT: cambié la última frase donde erróneamente dije que la variable contacto cambia a false al soltar el botón
147
¿Te aseguraste de incluir el archivo sub.txt en la carpeta de Included Files?
148
Preguntas y respuestas / Re:Menu de revivir
Septiembre 13, 2015, 06:35:49 PM
Cuando el personaje muera, crea un objeto botón que en su evento mouse left pressed reviva al personaje. En el evento de colisión del personaje con el suelo destruye este botón. Guarda en una variable global el número de veces que el jugador ha pinchado el botón y haz que el botón sólo sea creado si ese valor es menor al límite del número de resurrecciones permitidas.

colisión del personaje con la tubería:
if global.intentos<=global.intentos_max
   instance_create(a,b,obj_boton);


evento mouse left pressed del botón:
instance_create(c,d,obj_personaje);//o lo que sea que hagas para revivir al personaje
global.intentos+=1;
instance_destroy();


colisión de personaje con el suelo:
with obj_boton
    instance_destroy();


donde a,b y c,d son coordenadas que tienes que definir tú.
global.intentos es la variable que lleva la cuenta de los intentos
global.intentos_max es la variable que indica el número máximo de intentos

Sobre agregar un video, tendrás que buscar una extensión ya que con GML no se puede hacer.
149
Cita de: venus en Septiembre 13, 2015, 05:59:27 PM
Pues no me funciona  :(
De todas maneras voy a ser un poco mas concreto. Necesito saber si está haciendo contacto con cualquiera de sus copias. Es decir, saber si objetoB está colisionando con cualquier objetoA.

Podrías ser aún más concreto: ¿por qué no te funciona? ¿el código reporta que hay/no hay una colisión cuando no la hay/si la hay, o te sale un error? ¿Necesitas saber si una instancia del objetoB específica hace contacto con cualquier instancia de objetoA, o te sirve cualquier instancia de objetoB?