Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: Barduck en Diciembre 17, 2010, 02:01:40 AM

Título: Objeto que sigue a la view
Publicado por: Barduck en Diciembre 17, 2010, 02:01:40 AM
Que tal, soy nuevo en esto del Game Maker lo retome hace poco, y estoy probando algunas cosas.

El tema es que quiero hacer una especie de interface para aprender, y me pasa lo siguiente:

Tengo un objeto que lo utilizo como boton para ejecutar un accion sobre el personaje, ese objeto esta ligado a la view mediante Step:

[gml]
x=view_xview[0] + 60;
y=view_yview[0] + view_hview[0] - 55;
[/gml]

El problema esta en que cuando muevo el personaje y la camara (view) se mueve, el boton tambien se mueve un poco y luego se acomoda. Esto no pasa si uso draw_ pero al usar draw no puedo tratarlo como un objeto, y entonces no lo puedo hacer boton.

Alguno se le ocurre alguna solucion? subo el proyecto por si no se entiente la explicacion.
Título: Re: Objeto que sigue a la view
Publicado por: Texic en Diciembre 17, 2010, 02:15:55 AM
Como q con draw no lo pod?s tratar como un objeto?
Prob? usando draw, pero con m?s atributos propios al objeto
[gml]draw_sprite_ext(sprite_index,image_index,x,y,image_xscale,image_yscale,image_angle,image_blend,image_alpha)[/gml]
Y hac? los eventos de mouse en c?digo asi no ten?s q andar moviendo el objeto
[gml]if mouse_x>view_xview[0]+60 and mouse_x<view_xview[0]+60+sprite_width*image_xscale and mouse_y>view_yview[0]+view_hview[0]-55 and mouse_y<view_yview[0]+view_hview[0]-55+sprite_height*image_yscale and mouse_check_button(mb_left) {/*acciones al presionar la imagen*/}[/gml]
Se ve complicado, pero se puede sintetizar mucho m?s, lo q pasa q quise tomar en cuenta todos los factores
Título: Re: Objeto que sigue a la view
Publicado por: Barduck en Diciembre 17, 2010, 02:40:34 AM
Cita de: Texic en Diciembre 17, 2010, 02:15:55 AM
Como q con draw no lo pod?s tratar como un objeto?
Prob? usando draw, pero con m?s atributos propios al objeto
[gml]draw_sprite_ext(sprite_index,image_index,x,y,image_xscale,image_yscale,image_angle,image_blend,image_alpha)[/gml]
Y hac? los eventos de mouse en c?digo asi no ten?s q andar moviendo el objeto
[gml]if mouse_x>view_xview[0]+60 and mouse_x<view_xview[0]+60+sprite_width*image_xscale and mouse_y>view_yview[0]+view_hview[0]-55 and mouse_y<view_yview[0]+view_hview[0]-55+sprite_height*image_yscale and mouse_check_button(mb_left) {/*acciones al presionar la imagen*/}[/gml]
Se ve complicado, pero se puede sintetizar mucho m?s, lo q pasa q quise tomar en cuenta todos los factores

Gracias por responder, entiendo el codigo que pusiste.

Lo que yo uso para detectar la colusion con un objeto esto:

[gml]
if (position_meeting(mouse_x,mouse_y,parado_agachado))
[/gml]

Donde parado_agachado seria el sprite que dibuje:

[gml]
draw_sprite(parado_agachado,0,view_xview[0]+120,view_yview[0]+view_hview[0]-55);
[/gml]

Pero como no me funciono saque la conclusion de que no lo toma como objeto al draw_sprite.
Título: Re: Objeto que sigue a la view
Publicado por: Texic en Diciembre 17, 2010, 02:46:03 AM
Si es nada m?s por el mouse el c?digo q te puse deber?a bastar, ahora si necesit?s chequear colisiones con otros objetos podr?as dibujarlo y moverlo a la vez
Título: Re: Objeto que sigue a la view
Publicado por: Barduck en Diciembre 17, 2010, 03:06:41 AM
Cita de: Texic en Diciembre 17, 2010, 02:46:03 AM
Si es nada m?s por el mouse el c?digo q te puse deber?a bastar, ahora si necesit?s chequear colisiones con otros objetos podr?as dibujarlo y moverlo a la vez

Si fueras tan amable, me podrias explicar porque el codigo que utilizo no funciona? asi por lo menos voy aprendiendo

Sobre tu codigo, lo probe, pero no me funciono y me parece un if demasiado largo para algo tan simple, lo modifique y quedo:

[gml]if (mouse_x>view_xview[0]+60 and mouse_x<view_xview[0]+60+parado_agachado.sprite_width*parado_agachado.image_xscale and mouse_y>view_yview[0]+view_hview[0]-55 and mouse_y<view_yview[0]+view_hview[0]-55+parado_agachado.sprite_height*parado_agachado.image_yscale and mouse_check_button(mb_left)) { show_message("asd"); }[/gml]
Título: Re: Objeto que sigue a la view
Publicado por: lordgeorge en Diciembre 17, 2010, 03:32:44 PM
Despu?s de pensar un rato solucion? el problema de una forma relativamente simple. Tienes que poner esto en el Draw:
[gml]//Debes mover el sprite "invisible" para la colision con el click
x=view_xview[0]+60
y=view_yview[0]+view_hview[0]-55
//Ahora dibujar el sprite, la variable posicion es para dibujar el image_index correcto
draw_sprite(parado_agachado,posicion,x,y)
// Efecto mouse over
if (position_meeting(mouse_x,mouse_y,self)){
    if (personaje_test.estado == 1){
        image_single=3 //Debes cambiar el sprite para que detecte la colision del mouse
        posicion=3 //Debes cambiar el sprite que se dibuja, el image_single no sirve
    }
    else{
        image_single=2
        posicion=2
    }
}[/gml]
Debes agregar la variable "posicion" en los eventos del mouse, para que funcione tal como quieres. Lo mismo puedes hacer con el objeto Cursor (tambi?n tiembla un poco), pero ten cuidado, porque el objeto y el sprite se llaman "cursor" y hay problemas para dibujar si no cambias sus nombres.

Saludos

* Ya prob? todo en tu archivo adjunto, pero mejor lo haces tu mismo xD
Título: Re: Objeto que sigue a la view
Publicado por: Barduck en Diciembre 17, 2010, 04:10:04 PM
Cita de: lordgeorge en Diciembre 17, 2010, 03:32:44 PM
Despu?s de pensar un rato solucion? el problema de una forma relativamente simple. Tienes que poner esto en el Draw:
[gml]//Debes mover el sprite "invisible" para la colision con el click
x=view_xview[0]+60
y=view_yview[0]+view_hview[0]-55
//Ahora dibujar el sprite, la variable posicion es para dibujar el image_index correcto
draw_sprite(parado_agachado,posicion,x,y)
// Efecto mouse over
if (position_meeting(mouse_x,mouse_y,self)){
    if (personaje_test.estado == 1){
        image_single=3 //Debes cambiar el sprite para que detecte la colision del mouse
        posicion=3 //Debes cambiar el sprite que se dibuja, el image_single no sirve
    }
    else{
        image_single=2
        posicion=2
    }
}[/gml]
Debes agregar la variable "posicion" en los eventos del mouse, para que funcione tal como quieres. Lo mismo puedes hacer con el objeto Cursor (tambi?n tiembla un poco), pero ten cuidado, porque el objeto y el sprite se llaman "cursor" y hay problemas para dibujar si no cambias sus nombres.

Saludos

* Ya prob? todo en tu archivo adjunto, pero mejor lo haces tu mismo xD

Gracias, no lo probe pero estoy seguro de que me servira, la teoria ya la habia pensado, que consistia en crear un objeto invisible para usarlo como colision, y usar draw para mostrarlo.

Habia posteado principalmente para saber el "por que" del asunto, pero quedara en otros de los misterios de la vida (?) xD

Gracias de nuevo saludos
Título: Re: Objeto que sigue a la view
Publicado por: Texic en Diciembre 17, 2010, 04:32:22 PM
Es lo q te dec?a, mover el objeto y dibujarlo a la vez en el evento draw
El por qu? en realidad es la parte m?s complicada, pero bueno, lo voy a tratar de explicar. El evento draw se ejecuta antes que el evento step, y la view es parte del draw global y se actualiza luego del step de todos los objetos, porq los eventos de room siempre van ?ltimos. Entonces el orden es as?. Dibuja el objeto en la posicion actual (antes de ejecutar el step), la posicion del objeto cambia, mueve la view a la posicion del objeto y la secuencua se repite. Si lo analisas con cuidado te vas a dar cuenta de que el error es muy evidente.

PD: Aunq no haya un evento draw declarado por el usuario el evento existe igual para dibujar el objeto, por eso cuando lo agregas manualmente el objeto desaparece
Título: Re: Objeto que sigue a la view
Publicado por: Barduck en Diciembre 17, 2010, 05:05:54 PM
Cita de: Texic en Diciembre 17, 2010, 04:32:22 PM
Es lo q te dec?a, mover el objeto y dibujarlo a la vez en el evento draw
El por qu? en realidad es la parte m?s complicada, pero bueno, lo voy a tratar de explicar. El evento draw se ejecuta antes que el evento step, y la view es parte del draw global y se actualiza luego del step de todos los objetos, porq los eventos de room siempre van ?ltimos. Entonces el orden es as?. Dibuja el objeto en la posicion actual (antes de ejecutar el step), la posicion del objeto cambia, mueve la view a la posicion del objeto y la secuencua se repite. Si lo analisas con cuidado te vas a dar cuenta de que el error es muy evidente.

PD: Aunq no haya un evento draw declarado por el usuario el evento existe igual para dibujar el objeto, por eso cuando lo agregas manualmente el objeto desaparece

Con razon! me imaginaba que pasaba por algo relacionado por el orden en el que se ejecutan las cosas, ahora comprendi, y lo voy a tener en cuenta a la hora de pensar futuros scripts, gracias.

Que la fuerza los acompa?e.