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

1
Preguntas y respuestas / Re:Sobre instance_nearest
Octubre 31, 2018, 12:32:35 AM
Cita de: dixon2010 en Octubre 29, 2018, 12:55:08 PM
Hola gusto en saludarles en esta mañana de este bello lunes 29 de octubre. Se le saluda de Maracay Estado Aragua en Venezuela.

Vuelves a agregar complejidad al código, pero no te preocupes.

Para solucionar tenemos que tomar en cuenta lo siguiente: Supongamos que un tal Axel de streets of rage 2 se siente un poco preocupado porque al parecer en la  Game Off 2018 no ofrecen ningún premio solo un reconocimiento, entonces al ver que hay mucha crisis decide donar unos pocos dolares que le queda a la caja de la comunidadgm. Entonces obtendriamos esto



El código que se está manejando presenta las siguientes caracteristicas.

1. El enemigo actua cuando es el más cercano al player.
2. El player detecta solo al enemigo mas cercano.
3. Cada enemigo tiene una distancia de deteccion distinta.

El código es el siguiente:

PARA EL OBJETO player
[CREATE EVENT]

global.distancia=150

[STEP EVENT]
//detectar enemigos
if instance_exists(obj_parent_enemigos)
            {
                global.objetivo = instance_nearest(x, y, obj_parent_enemigos);
                dir = point_direction(x,y,global.objetivo.x,global.objetivo.y);
               
                if(point_distance(x,y,global.objetivo.x,global.objetivo.y) < global.distancia)
                {
                if ( dir < 90 || dir > 270 ) {sprite_index = spr_jugador_movimiento; image_xscale = 1;} else     
                if ( dir < 270 && dir > 90 ) {sprite_index = spr_jugador_movimiento; image_xscale = -1;}
                }
            }


PARA EL OBJETO obj_parent_enemigos

[CREATE EVENT]
distancia=150
[STEP EVENT]
if(global.objetivo=id)
{
global.distancia=distancia
}


PARA EL OBJETO obj_enemigo1
[CREATE EVENT]

distancia=150
[END STEP]
if(global.distancia=distancia && point_distance(x,y,player.x,player.y) < global.distancia)
{
//aqui colocas lo que va ha hacer el enemigo
}


PARA EL OBJETO caja
[CREATE EVENT]
distancia=25
[END STEP]
if(global.distancia=distancia && point_distance(x,y,player.x,player.y) < global.distancia)
{
//aqui colocas lo que va ha hacer LA CAJA
}


Para modificar las distintas distancias de los objetos del parent, se modifica la variable distancia de cada objeto en el evento create.

Al final hay un ejemplo para descargar

Muchísimas gracias por tu atención!

Al final lo solucione ya que pensaba que no tuve respuesta en este tema, ya que normalmente gamemaker me notifica por correo electrónico cuando me responden un tema y esta vez o no lo hizo o no me di cuenta (mas bien la 2..).

Al final después de muchísimas horas cambiando y probando varias cosas lo conseguí, me quedo así:
[gml]
var ex, ey;
ex = instance_nearest(x, y, obj_parent_enemigos).x;
ey = instance_nearest(x, y, obj_parent_enemigos).y;
objetivo = instance_nearest(x, y, obj_parent_enemigos);

if instance_exists(obj_parent_enemigos) and point_distance(x,y,ex,ey) < objetivo.distancia_jugador
            {
                dir = point_direction(x,y,objetivo.x,objetivo.y);
                if ( dir < 90 || dir > 270 )
                {sprite_index = spr_jugador_movimiento; image_xscale = 1;} else     
                if ( dir < 270 && dir > 90 )
                {sprite_index = spr_jugador_movimiento; image_xscale = -1;}
            }
[/gml]

Casi igual que como estaba, lo único que cambian un par de cosas, las justas.. para que funcione, mi juego es 2D top down y ahora si que si detecta cual es el jugador mas cercano y que "distancia_jugador" tiene. Te dejo una captura de pantalla para que veas el resultado final.



Y por cierto me hizo mucha gracia que pusieras en tu ejemplo mi foto de perfil jajajajaja!

La redonda roja es la "distancia_jugador", el enemigo tiene 150 y la caja 35 por eso tiene esa diferencia de tamaño y la linea roja que sale del player marca el objetivo mas cercano, en este caso era la caja, con id = 1 (lo puse para cuando habían muchos enemigos iguales..) y me dice que su radio es de 35 (la redonda roja dicha anteriormente).

Ahora si mi pj se mete dentro de la redonda roja ("distancia_jugador") se activa el if y mi personaje mira cara al enemigo mas cercano.

Bueno, muchísimas gracias por todo, toca dar por solucionado el tema, un saludo!!!!
2
Preguntas y respuestas / Re:Sobre instance_nearest
Octubre 26, 2018, 12:39:47 PM
El código funciona perfectamente!!

El causante del error era este código:
(point_distance(x,y,obj_parent_enemigos.x,obj_parent_enemigos.y) < 150)

Este hace que cuando mi personaje (obj_jugador) entre en un rango de 150 o menos "entre en combate con el enemigo" y por eso quería hacer que el jugador mirase al enemigo, si esta este código mi personaje no busca al enemigo mas cercano, peeero, si elimino este código SÍ funciona el código que me habéis dado.

Voy a seguir probando mas y mas hasta ver como consigo hacer funcionar las 2 cosas y cerrar este tema ya porque me esta dando mas problemas.. jajajajaja

Actualmente mi código es este:
ASÍ NO FUNCIONA:
if instance_exists(obj_parent_enemigos) and (point_distance(x,y,obj_parent_enemigos.x,obj_parent_enemigos.y) < 150)
            {
                objetivo = instance_nearest(x, y, obj_parent_enemigos);
                dir = point_direction(x,y,objetivo.x,objetivo.y);
                if ( dir < 90 || dir > 270 ) {sprite_index = spr_jugador_movimiento; image_xscale = 1;} else     
                if ( dir < 270 && dir > 90 ) {sprite_index = spr_jugador_movimiento; image_xscale = -1;}
            }


ASÍ SÍ:
if instance_exists(obj_parent_enemigos)// and (point_distance(x,y,obj_parent_enemigos.x,obj_parent_enemigos.y) < 150)
            {
                objetivo = instance_nearest(x, y, obj_parent_enemigos);
                dir = point_direction(x,y,objetivo.x,objetivo.y);
                if ( dir < 90 || dir > 270 ) {sprite_index = spr_jugador_movimiento; image_xscale = 1;} else     
                if ( dir < 270 && dir > 90 ) {sprite_index = spr_jugador_movimiento; image_xscale = -1;}
            }


La única diferencia es que estoy comentando el código de "point_distance", pero bueno, tendré que buscar una opción para que funcionen los dos códigos a la vez!

Gracias, dejo el tema abierto por si no encuentro solución.. si la encuentro la diré (por si alguien mas lo necesita) y pondré mi Solucionado en el titulo, gracias!

EDITO:

He conseguido hacer CASI que funcione!

He conseguido que ahora el jugador mire a un enemigo (dentro del obj_parent_enemigos) justo cuando entra dentro de su distancia con point_distance, así que eso es lo que yo quería en un principio y por fin lo he logrado, pero ahora se me vuelve a complicar otra vez cuando he decidido agregar una caja (como ejemplo) dentro del obj_parent_enemigos pero esta caja con una distancia_jugador = 25, cuando el obj_enemigo1 tiene una distancia_jugador = 150. Es decir.. mi personaje entra en "modo combate" por decirlo de alguna manera con el jugador en 150 y la caja en 25, ya que la caja no se mueve y la he echo solo de prueba. ¿Donde esta el problema? que mi código no detecte la distancia_jugador del enemigo mas cercano si no la del enemigo que antes he puesto en la room. Llevo varias horas probando a conseguir esto pero no hay manera, me gustaría que si mi personaje tiene mas cerca suyo la caja que el enemigo (ambos metidos en obj_parent_enemigos) mire a la caja en el rango 25 y no que la mire a 150.

Mi actual código es este:
[gml]
var ex, ey;
ex = instance_nearest(x, y, obj_parent_enemigos).x;
ey = instance_nearest(x, y, obj_parent_enemigos).y;

if instance_exists(obj_parent_enemigos) and point_distance(x,y,ex,ey) < obj_parent_enemigos.distancia_jugador
            {
                objetivo = instance_nearest(x, y, obj_parent_enemigos);
                dir = point_direction(x,y,objetivo.x,objetivo.y);
                if ( dir < 90 || dir > 270 ) {sprite_index = spr_jugador_movimiento; image_xscale = 1;} else     
                if ( dir < 270 && dir > 90 ) {sprite_index = spr_jugador_movimiento; image_xscale = -1;}
            }
[/gml]

Lo dicho, funciona CASI TODO, mi personaje ahora puede caminar por la room libremente, mirando para donde me dirijo.. y a la hora de "luchar" (entrar en rango de distancia_jugador) mira con una distancia de 150 ya sea una caja (que debería ser 25) o el enemigo 1 (que este si es 150), no distingue que distancia tiene cada objeto.

Muchas gracias por todo.. y a ver si me quito este dolor de cabeza ya! jajajaja
3
Preguntas y respuestas / Re:Sobre instance_nearest
Octubre 26, 2018, 12:13:11 AM
Cita de: Johann en Octubre 25, 2018, 06:10:27 PM
Es muy facil:

[gml]
if instance_exists(obj_parent_enemigos) {
       with (instance_nearest(x, y, obj_parent_enemigos)) {
            //Aquí iría el código que haría con el enemigo mas cercano. :)
       }
}
[/gml]

El codigo se ejecuta desde el objeto encontrado como el mas cercano.
Revisa la documentación de la palabra with paramas detalles.

No me funciona..

He probado tu código y no lo consigo, he probado cambiando algunas cosas y tampoco.

Te dejo mi código a ver si hay algún error:
if instance_exists(obj_parent_enemigos)
                {
                    with (instance_nearest(x, y, obj_parent_enemigos))
                    {
                        dir = point_direction(x,y,obj_parent_enemigos.x,obj_parent_enemigos.y);
                        if ( dir < 90 || dir > 270 ) {sprite_index = spr_jugador_parado; image_xscale = 1;} else     
                        if ( dir < 270 && dir > 90 ) {sprite_index = spr_jugador_parado; image_xscale = -1;}
                    }
                }


Este código funciona perfectamente si en la room solo coloco 1 enemigo, a la que hay 2 enemigos (con el mismo nombre obj_enemigo1) solo hace caso al primer enemigo que coloque en la room, no se si es casualidad o no, es decir.. mi código hace que el jugador SIEMPRE mire al enemigo, y lo dicho si solo hay 1 enemigo funciona perfecto, pero a la que hay 2 o mas deja de funcionar, como ves ya he implemente el código que tu me diste pero sigue igual..

Gracias de antemano!!
4
Buenas, tengo un grupo de enemigos llamados obj_enemigo1, esos mismos enemigos tienen un parent llamado obj_parent_enemigos (ya que en un futuro añadiré mas enemigos, de momento solo tengo 1 tipo, el nombrado anteriormente), quisiera saber como puedo hacer para que el enemigo mas cercano del parent me detecte para que haga el código que yo quiero.

De momento lo único que tengo es esto (y no funciona):
if instance_exists(obj_parent_enemigos)
                {
                    id_objetivo = instance_nearest(x, y, obj_parent_enemigos);
                    //Aquí iría el código que haría con el enemigo mas cercano no??
                }


Gracias de antemano!
5
Preguntas y respuestas / Re:Depth del jugador y el enemigo
Septiembre 12, 2018, 10:49:47 AM
Cita de: BssString en Septiembre 12, 2018, 01:25:03 AM
Hola zHeMaa

Borra ese código que pusiste.
En vez de eso, en el objeto enemigo, pone lo siguiente en su Step Event:
if y < obj_player.y { depth = 1 }; else { depth = -1 }

Eso hará que la depth del enemigo varíe entre 1 y -1
1: para ponerse detrás del player cuando está "más arriba en la pantalla"
-1:para ponerse delante del player cuando su "y" esté más abajo que la del player.
Esto sólo funciona si eres consistente con el "y_origen" de cada sprite. Ej: que ambos tengan su origen arriba, o en los pies, o en el centro.

Favor nota que cambia la depth de dibujo del enemigo en todo momento, si tienes bloques con depth = 0, puede ser que el enemigo atraviese esos bloques cuando no es necesario, causando un error visual.

Lo que puedes hacer es asignarle al player una depth -2. Así haces que la depth del enemigo cambie entre -1 y -3, para que tanto el enemigo como el player se dibuje, siempre por encima del resto de los objetos de tu juego.

Saludos

Funciona a la perfección, y mejor aun porque tengo un código para hacer body block (justo la barriga de los jugadores y enemigos, piernas y cabeza no.) y queda de 10, ya que si choca por el medio hace el body block y si pasa uno por encima del otro la depth es simplemente perfecta!

Ahora bien, a la hora de poner varios enemigos..

Debería cambiar "obj_player" por "other" (globalizando todo, enemigos y jugador)???? ya que lo he probado este ultimo y parece no funcionar.

Gracias!!
6
Preguntas y respuestas / Depth del jugador y el enemigo
Septiembre 12, 2018, 01:16:28 AM
Buenas, llevo varias horas probando y buscando información sobre como hacer para que si mi jugador esta mas arriba que un enemigo este se vea por debajo.

Es decir.. Ahora mismo tengo un personaje y un enemigo, los dos con depth 0, mi idea es que cuando uno esta mas arriba que el otro en coordenada Y, este se vea por debajo del otro.

Ahora mismo el código que tenia (pero no funciona) es este:

if place_meeting(x,y,obj_jugador) < (self.y) {
    depth = +1;
} else {
    depth = -1;
}


Aclaro que "self" es el enemigo, y esto esta en Draw.

A ver si me quitáis la duda de la cabeza.. Gracias de antemano!!
7
Cita de: Arcadian en Agosto 27, 2018, 04:09:14 PM
Sí, se puede hacer.

También se puede conseguir, si sacas el juego para Android y también para PC (por ejemplo), que jueguen jugadores de una plataforma contra jugadores de la otra.

Muchas gracias, el juego de momento estría destinado únicamente para andoid, aun  que no descarto pasarlo a pc en un futuro (si todo va bien claro).

Cita de: somnus en Agosto 27, 2018, 11:08:00 PM
creo la pregunta deberia ser quien me puede ensenar a hacer un juego multijugador para android en game maker, de que se puede se puede, no hay informacion que diga
" manual para hacer un juego multijugador en android usando game maker", la informacion esta, pero una parte de un tutorial te sirve, la parte de otro Tambien te sirve y vas a tener que investigar mucho ya que te estas metiendo un tema demasiado dificil.

Llevo años usando game maker.. si es por esa la razón por la cual no me paso a unity o ue4 por ejemplo, el problema no esta en la dificultad de hacerlo o no si no en que por mucho que buscaba "multiplayer android game maker" (por ejemplo), no me salia nada claro y ni mucho menos vídeos de youtube para que pueda ver que realmente se puede.

Bueno ahora que ya se que se puede 100% hacer un multiplayer para android voy a darle al proyecto que tengo en mente, que básicamente sera 1 jugador con mapas en los que sean posibles unirse hasta 4 personas.

Gracias a los dos!
8
Buenas, tengo una grandisima duda y por mas que busco no encuentro nada.

Es posible hacer un juego multijugador para android? no me refiero a LAN, si no a que por ejemplo pueda crear una partida y pueda jugar con todo el mundo.

La idea es hacer un juego con mapas de hasta 4 jugadores, a día de hoy juego warframe, y me basaría un poco en su sistema de online, el primero que quiere empezar la misión (seria el host) tiene 2 opciones, o jugar solo o esperar a mas jugadores, en el caso de que se unan mas jugadores (ya sea 1, 2 o 3) se unirían a su misma partida y la partida empezaría.

Suena sencillo.. Pero desconozco si se puede hacer y mas para android.

En unity por ejemplo vi que se puede hacer hasta de 24 jugadores (con el unity free, si pagas de mas esta claro).

Gracias de antemano!
9
Cita de: Zapdos43 en Julio 17, 2017, 02:03:40 PM
Es necesario guardar el valor en un archivo ini.

Primero crea en un bloc de notas un archivo ini. Yo he usado el Bloc de notas de Windows.
He puesto:
[Propiedad]
angulo = 0


Para guardarlo elige "Guardar como" y escribe el nombre del archivo con la extensión (.ini). En mi caso pongo: Mi_angulo.ini

Luego en el árbol de recursos me dirijo a la carpeta "Included files" y clic derecho. Elijo "Create included files" y busco el archivo ini que antes es creado.

Después en el objeto que cambia su angulo debes tener:
Evento Game Start:
ini_open("Mi_angulo.ini");// leemos el archivo ini
global.angulo = ini_read_real("Propiedad","angulo",0); // leemos el valor que tenemos en el archivo ini y lo guardamos en la variable globa.angulo
ini_close(); // dejamos de leer el archivo ini


Evento Step:
image_angle = global.angulo; // cambiar el angulo
global.angulo++ // sumamos 1 a la variable global.angulo


Para reiniciar la room puse un evento Key Press Space con el código: room_restart();

Me ha funcionado. Espero te sirva. Puedes buscar en google más información sobre cómo usar archivos ini en gamemaker.

Cita de: Clamud en Julio 17, 2017, 04:03:18 PM
Es más fácil con una variable global, definida en el evento Game Start o en una room anterior
[gml]
// Algún evento en una room anterior
global.angulo = 200;
[/gml]

Antes de reiniciar la room, guarda el último valor
[gml]
global.angulo = image_angle;
room_restart();
[/gml]

En el evento Create recupera el valor guardado
[gml]
image_angle = global.angulo;
[/gml]

Muchas gracias a los 2!! llevaba horas y horas probando cosas y no se me ocurría como hacerlo  :)
10
Buenas a todos, necesito hacer un room_restart y que la room reinicie pero manteniendo el valor de la variable "image_angle".

Por ejemplo si image_angle es -200, quiero que todo se reinicie (hacer un room_restart), pero que image_angle siga siendo -200 (-200 es un ejemplo, pero realmente es un numero random).

Gracias!
11
Preguntas y respuestas / Re:Objeto sube y baja
Diciembre 15, 2015, 08:33:35 PM
Muchas gracias! no sabia eso de las alarmas.. funciona perfectamente!  :)
12
Preguntas y respuestas / [SOLUCIONADO] Objeto sube y baja
Diciembre 15, 2015, 01:00:11 PM
Buenos días makeros!

Estaba probando de hacer un objeto que suba y baje (hasta su posición inicial) en un intervalo de tiempo y así sucesivamente sin parar.

De momento mi codigo es este:

Create:

velocidad = 1;
movimiento = true;



Step:
if movimiento = true
{
    y += velocidad
    alarm[0] = 30
}
else
if movimiento = false
{
    y -= velocidad
    alarm[1] = 30
}



Alarm[0]:

movimiento = false;



Alarm[1]:

movimiento = true;


El problema es que yo veía claro que funcionaria, pero nada, el objeto se va para abajo y no sube al detectar la alarma y la verdad que no tengo ni idea de porque, he tocado varias veces el tema de las alarmas y casi siempre bien, pero esta vez nada..

Ese es el código que tengo de momento, no funciona como os he dicho, pero os lo dejo para que os hagáis una idea de lo que tengo.

Gracias de antemano!! :)
13
Preguntas y respuestas / Re:Pregunta rapida
Diciembre 12, 2015, 02:03:13 PM
Siempre suele ir 2 o 3 días atrasado, es decir.. hoy que estamos a día 12 a mi me salen las estadísticas del jueves día 9 para atrás :)
14
Cita de: Ynfiniti en Diciembre 11, 2015, 04:41:14 PM
Debe haber una solución mas sencilla pero yo siempre me lío  XD

for(var i=0; i < 100; i++){
    var r = random(room_width);
    if(r < (128*i)){r = 128*i;}
    instance_create(r, 144, o1);
}


Cita de: kostra en Diciembre 11, 2015, 04:46:48 PM
en el colisión del arbol consigo mismo:
[gml]if id < other.id instance_change(o1,true);[/gml]

y sobre la distancia,al crearlo mejor cuadricúlalos xD
[gml]instance_create(256*irandom(room_width/256), 144, o1);[/gml]
Espero no haber tenido un lapsus en las cuentas xD.

Cita de: jmbs19 en Diciembre 11, 2015, 05:10:04 PM
pues me parece que tendrias un mejor resultado haciendo algo como esto:
[gml]
//evento que crea arboles
num_arboles=100//numero de arboles
arboles_cre=0//arboles creados
while(arboles_cre<num_arboles)
{
x_a = random(room_width)
if !collision_rectangle(x_a-64,144,x_a+64,200,obj_arbol,false,true)
     {
      instance_create(x_a,144,obj_arbol)
      arboles_cre=arboles_cre+1
     }
}
[/gml]

el codigo de arriba es para crear exactamente 100 arboles, sin embargo tienes que tener cuidado de que haya suficiente espacio para ellos, en caso contrario este while colgara el programa.

si no te interesa tener exactamente 100 arboles puedes hacer esto:

[gml]
for(i=0;i<100;i=i+1)
{
x_a = random(room_width)
if !collision_rectangle(x_a-64,144,x_a+64,200,obj_arbol,false,true)
     {
      instance_create(x_a,144,obj_arbol)
     }
}
[/gml]

en los dos casos lo que se hace es comprobar si no hay colisiones en una caja de 128*64(x,y) y si no las hay crea el obj_arbol

Madre mía.. da gusto no entender algo y que nada mas llegar a casa te encuentres con no una, si no tres soluciones validas! (ya que he probado las 3 y las 3 hacen su papel).

Encima he de afirmar que habrán cosas que se me den muy bien en GM, pero estos códigos aun que para vosotros sean fáciles yo nunca había tocado el "collision_rectangle" ni el "instance_change", así que ahora me pondré a buscar algo de info sobre esos dos códigos ya que cada día es bueno aprender algo nuevo!

Muchas gracias a los tres! :)
15
Buenas a todos, la distancia entre objetos es un tema que nunca he tocado en GM, he estado leyendo y probando códigos sobre el tema pero no consigo nada..
Mi actual código es este:


repeat(100)
{
    instance_create(random(room_width), 144, o1);
}


Aclaro que o1 = arboles (una variable) y 144 es el "suelo" del mapa, juego de plataformas. Una vez aclarado esto me gustaría que en mi mapa se creasen arboles y con este código lo consigo, pero no quiero 3 arboles uno encima del otro, me gustaría que por ejemplo tuvieran una separación mínima de 128 (cada árbol hace 64x64) porque el código que yo he escrito spawnea arboles pero aleatoriamente en la coordenada y = 144, pero claro, como os he dicho para acabar de pulir el código me gustaría que se creasen con una separación lógica, y no que se creen y punto.

Yo estaba probando en hacer que por ejemplo crease los arboles random (con mi mismo código sin modificarlo) y una vez ya estén los arboles creados que se eliminasen si por ejemplo están a una distancia inferior de 128, pero repito, esto es lo que yo he estado probando, pero lo mas lógico es que de primeras ya se creen con una separación mínima y no hacer que se creen y una vez creados que entre ellos se detecten si esta a menos de un valor y si están a menos de ese valor que se eliminen.

Así que nada.. eso es todo, a ver si vosotros tenéis algo mas de idea! un saludo! :)