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

181
Preguntas y respuestas / Re: Movimiento en 3D
Diciembre 05, 2011, 04:29:15 PM
El movimiento se hace con seno y coseno... lo de multiplicar por pi/180 es por que el calculo de esta posicion se tiene que hacer en radianes y no en grados... tambien podrias usar:

[gml]
    //Para arriba
    if (keyboard_check(vk_up)){
        x += cos(degtorad(direction))*Vel;
        y -= sin(degtorad(direction))*Vel;
    }

    //Para abajo puedes invertir el + y -
    if (keyboard_check(vk_down)){
        x -= cos(degtorad(direction))*Vel;
        y += sin(degtorad(direction))*Vel;
    }

    //Para los lados sumas 90 a la direccion
    if (keyboard_check(vk_down)){
        if (keyboard_check(vk_control)){
            direction += 6;
        }else{
            x += cos(degtorad((direction+90)))*Vel;
            y -= sin(degtorad((direction+90)))*Vel;
        }
    }

    //Y Para izquierda inviertes los + y -
    if (keyboard_check(vk_down)){
        if (keyboard_check(vk_control)){
            direction += 6;
        }else{
            x -= cos(degtorad((direction+90)))*Vel;
            y += sin(degtorad((direction+90)))*Vel;
        }
    }
[/gml]

Esa es una manera basica de escribirlo... Para ahorar codigo puedes poner

[gml]
    var adelante, lateral;
    adelante = keyboard_check(vk_up)-keyboard_check(vk_down);
    lateral = keyboard_check(vk_left)-keyboard_check(vk_right);

    if (adelante != 0){
       x += cos(degtorad(direction))*Vel*adelante;
       y -= sin(degtorad(direction))*Vel*adelante;
    }

    if (lateral != 0){
       if (keyboard_check(vk_control)){
           direction += 6*lateral;
       else{
           x += cos(degtorad((direction+90)))*Vel*lateral;
           y -= sin(degtorad((direction+90)))*Vel*lateral;
       }
    }
[/gml]

Saludos....
182
[SOLUCI?N]
CitarA quien pueda interesar:
Simplemente a?ad? en la imagen 32, dos pixeles y les coloque alfa 1, de ese modo son invisibles pero tienen dibujo.

Saludos a todos

Hola a todos, estaba haciendo un ensayo importando una fuente desde un sprite, para ser mas exactos es esta http://docs.dead-code.org/img/franklin.png

tiene los 256 caracteres correspondientes al c?digo ascii, donde el " " es el 32 y el "A" es el 65

si ven la imagen, se daran cuenta que esta en fondo morado(rosado o algo asi) asi que ese fondo lo borro con GM. Cuando a?ado la fuente utilizo el siguiente codigo

[gml]fuente = font_add_sprite(spr_fuente,0,1,2);
draw_set_font(fuente); [/gml]

y en draw:

[gml]draw_text(16,16,"Hola mundo")[/gml]

Ahora bien, el problema esta en el espacio que hay entre el "Hola mundo". ese espacio no me lo toma bien y el texto se superpone, esto es porque la subimagen 32 es totalmente vac?a, si le colocara un dibujo, entonces se me dibuja bien, pero el espacio tiene que ser vac?o por obligaci?n...

Como puedo arreglarlo?

PD: una soluci?n que encontr? fue hacer que la fuente empiece en el car?cter 33 osea "!", pero... debe haber alguna para cuando se a?ade todos los caracteres, no?

Les dejo una imagen para ilustrarlos mejor:



--
espero haberme explicado bien.
Saludos.
183
Preguntas y respuestas / Probabilidad de Colision
Septiembre 26, 2011, 09:54:59 PM
Hola a todos, (no se si lo debi nombrar asi), en fin mi problema es el siguiente... Estoy haciendo un juego RPG y tengo el personaje y una computadora que se mueve de forma aleatoria (o controlada)

El movimiento de ambos es mediante una cuadricula de 32*32, es decir que si en este step estas en "x=32" y oprimes derecha por decir algo te moveras hasta llegar al "x=64" sin detenerse

claro que antes del movimiento chequeo que si es un lugar libre y demas... Pero el problema viene a continuacion:



Supongamos que hay 4 objetos de la siguiente manera:



Ahora supongamos que todos se quieren mover al centro:




Como el centro es un "lugar libre" para todos, todos se moveran... Ahora bien, he logrado "medio" solucionar esto haciendo una comprobacion de movimiento de los otros objetos... De este modo si la computadora se empezo a mover una fraccion de segundo antes que tu, tu ya no podr?s moverte y viceversa.

Pero el problema ocurre cuando los 2, 3 o 4 jugadores se mueven exactamente al mismo tiempo... Todos se paran sobre el otro :(



Que ideas me dan para solucionar esto?

:-[

--
Saludos
184
mmm Mala cosa... en fin supongo que tendre que seguir buscando algun metodo de arreglar esto XD



Como sea, gracias por su ayuda


--
Saludos
185
Hola a todos,

Hay una cuestion con la que estoy luchando desde hace tiempo, una de las soluciones fue dibujar dos sprites con diferente depth, pero....

se puede hacer en el mismo objeto?

EJ:
[gml]draw_set_depth(100);
draw_sprite(sprite1,0,16,16);

draw_set_depth(-100);
draw_sprite(sprite2,0,100,100);[/gml]


Espero haberme explicado...


--
Saludos
186
Cita de: kaliman777 en Septiembre 19, 2011, 06:42:29 PM
Cita de: MaanuRP en Septiembre 19, 2011, 06:25:11 PM
Si lo que quieres es retrasar con la alarma 4. Osea que cuando la alarma 4 haga que tarden mas en activarse la alarma 5 y 6.

Solo tienes que poner en el evento de alarma 4 algo como
[gml]
alarm[5] = 20
alarm[6] = 20

//Aqui cambia el 20 por el numero de steps que quieres que tarde.
[/gml]

Probar? a ver si funka, porque pregunto yo: si la reprogramo en la alarma 4 con un atraso de 20 steps, no se disparan dos veces, ya que fue programada ya?

SI la vuelves a programar no hay problema... las alarmas van descontandose hasta llegar a 0... y una vez que termine, se convierte en -1

entonces si la alarma estaba en 15, y tu la pusiste en 45, entonces se ejecutara a los 45 steps en vez de 15...


--
Saludos.
187
Cita de: MaanuRP en Septiembre 17, 2011, 07:34:41 PM
El ejemplo no lo puedo ver porque no tengo el GM8.1, yo uso el 8.

Lo que tu quieres es que la view siga siguiendo (Valga la redundancia) al jugador a pesar de que el room se haya terminado y se vean las partes negras (O el color que elegiste en las opciones)?

eso es lo que el quiere (al menos lo que yo entendi)... Una vez lo hize, pero tuve que hacerlo en 3D, porque no lo logre hacer en 2D, sin embargo....

El limite de tu habitacion esta marcado por el "marco" no?, entonces por que no haces la habitacion mas grande y pones ese marco en el medio, de ese modo el jugador no llegara al final de la habitacion y siempre estara al centro..

--
Saludos
188
Hola, para lo de encima del otro puedes cambiar place_free por collision_circle

[gml]xrandom = random(room_width)
yrandom = random(room_height)
if place_free(xrandom,yrandom){
if not (collision_circle(xrandom,yrandom,32,soldado_02,1,0)){
     instance_create(xrandom,yrandom,soldado_02);
}
}
alarm[0] = 10[/gml]

y para que aparecieran por fuera de las vistas podrias hacer:

[gml]xrandom = random(room_width)
yrandom = random(room_height)
if place_free(xrandom,yrandom){
if not (collision_circle(xrandom,yrandom,32,soldado_02,1,0)){
     if not((xrandom>view_xview[0]&&xrandom<view_xview[0]+view_wview[0])&&
        (yrandom>view_yview[0]&&yrandom<view_yview[0]+view_hview[0])){
          instance_create(xrandom,yrandom,soldado_02);
     }
}
}
alarm[0] = 10[/gml]


--
saludos.
189
a la pregunta 1:

Debes saber el id del objeto que estas buscando, luego comprobar si esa instancia existe, el siguiente codigo va en el evento STEP del objeto que quieres que sepa:

[gml]if not (instance_exists(100002)){ //El 100002 es el id de la instancia que se va a destruir
    //El codigo que vas a hacer
}[/gml]

Y en cuanto a la 2:

en el evento draw del objeto Cuadro pon esto:

[gml]draw_sprite(sprite_index,image_index,x,y);
draw_text(x,y,"Cuadrado");
//Como estamos poniendo el draw_text despues del
//draw_sprite, entonces este se dibujara por encima
//del sprite, debes recordar que todo se dibuja en orden
[/gml]


--
Saludos
190
if comprueba si una expresion es verdadera:

EJ:
[gml]if (numero == 4) //Lo que hace aqui es comprobar si la variable numero es igual a 4, si es asi, entonces se ejecuta el codigo[/gml]

and (tambien se escribe &&) une dos condiciones

EJ:
[gml]if (numero == 4 and nombre="pedro") //Para que esto sea verdadero: Numero tiene que ser 4 y nombre tienen que ser pedro, si nombre es por ejemplo "Javier", entonces ya no se va a cumplir. O si numero no es 4, entonces tampoco se va a cumplir[/gml]

or (tamien escrito ||) es parecido, pero en este caso solo uno de los dos tiene que ser verdadero

EJ:
[gml]if (numero == 4 or numero == 5) //En este caso, uno de los dos tiene que ser verdadero para que se cumpla, ya sea que numero sea igual a 4 o numero sea igual a 5, si numero no es ni 4 ni 5 (ej:3) entonces ya no se va a cumplir la condicion[/gml]

el == es propio de otros lenguajes como C++, php, java.... y es que en esos lenguajes es muy diferente el = a ==.

El primer caso "=" asigna un valor

EJ:
[gml]numero = 4; //En este caso, le estamos diciendo al sistema que numero sera igual a 4[/gml]

el segundo caso "==" es para comprobar

EJ:
[gml]if (numero == 4) //Comprobara si el numero es 4[/gml]

En c++ por ejemplo si compiamos:
[gml]if (numero = 4)//Entonces ya le estamos diciendo al sistema que numero sera 4 y siempre sera verdadera esta funcion. [/gml]

Sin embargo con game maker no hay diferencia entre el = y el ==

el != pregunta si "no es igual"

EJ:
[gml]if (numero != 4) //En este caso, esta comprobacion solo sera verdadera si numero no es 4 (ej: 3, 5, 6)[/gml]

hay otro que es el not

EJ:
[gml]if not(numero == 4)//En este caso tiene la misma funcion que el anterior, pero la diferencia es cuando a?adimos and, o or[/gml]


[gml]if (numero != 4 and nombre == "Javier")[/gml]
Esto es diferente a decir:
[gml]if not (numero == 4 and nombre == "Javier")[/gml]
este ultimo es equivalente a:
[gml]if (numero != 4 and nombre != "Javier")[/gml]




El else (si no...), es para hacer otra funcion cuando la principal ha salido falsa

EJ:
[gml]if (numero == 4){
   show_message("Tu numero es 4");
}else{
   show_message("Tu numero no es 4");
}[/gml]

Leido seria algo como:

Si numero es igual a 4 entonces muestre el mensaje "Tu numero es 4" si no muestre el mensaje "Tu numero no es 4"


En fin... esto es una teoria un poco mas larga, tambien hay que mirar los "<, >, <=, >=" que son "menor que", "mayor que", "menor o igual que", "mayor o igual que" respectivamente.

Esos funcionan con valores numericos

EJ:
[gml]if (numero >= 4){
   show_message("Tu numero es mayor o igual a 4");
}else{
   show_message("Tu numero es menor a 4");
}[/gml]




--
En fin... con el tiempo veras que esto es muy facil XD

Saludos
191
Yo pude :D , bueno, algo asi :o la verdad no habia respondido ya que no lo logre hacer 100% preciso... De cualquier modo te dejo lo que logre hacer.


NOTA:
Tenia una idea de hacerlo preciso, pero no la quise llevar a cabo porque pense que gastaria mucha memoria

--
Saludos
192
?Por que no pones el mismo codigo que te di, con los enemigos?, de ese modo quitas todos los objetos solidos y se te arregla lo de poder pasar por el medio de dos bloques...


---
Saludos.
193
Preguntas y respuestas / Re: Como funciona "var"?
Septiembre 01, 2011, 08:58:51 PM
Cita de: p34 en Septiembre 01, 2011, 08:08:33 PM
Hola.
Estoy haciendo un juego de disparos y quiero que cuando recojo un arma y ya tengo 2 armas (una primaria y otra secundaria) entonces agarre el arma nueva y cree un arma con las variables de la que tenia en la mano.
Lo que trate hacer es que cree otro objeto con las variables del que tenia en la mano
[gml]if arma1 != "no" and arma2 != "NO"
{
var i;
i = instance_create(x,y,obj_arma_glob);
with(i){balas_ = balas; cargadores_ = cargadores} // etc.
}
[/gml]
pero el problema es que aveces si las crea y otras veces solamente desaparece el arma nueva
Estoy usando mal "var"? o como le puedo hacer ???

Var crea una variable temporal que solo se puede usar en ese pedazo de codigo... en cuanto a lo que quieres no se porque dices que a veces y a veces no, pero igual proba cambiando esto

[gml]with(i){balas_ = balas; cargadores_ = cargadores} // etc.[/gml]

por esto:

[gml]i.balas_ = balas; i.cargadores_ = cargadores; // etc.[/gml]

Ya que si  pones el primero entonces las variables (balas_ y balas) pertenecen a la nueva arma y no a la que tenias


No conozco el uso que le das, pero proba y me avisas.


--
Saludos.
194
Cita de: aaron966 en Septiembre 01, 2011, 09:46:59 AM
Hola, siento molestaros tanto, per? tengo otro problemilla  :-[
he hecho que cuando aprietes el boton izquierdo del rat? se cree un objeto en ese cuadro de la cuadricula, per? no siempre se crea en ese cuadro, a veces se crea en el d los alrededore.
He probado a alinearlo en la cuadricula per? no funciona
Saludos

No problem, para eso estamos.

--

Si utilizas un codigo para crear el objeto parecido al siguiente:
[gml]instance_create(32*floor(x/32),32*floor(y/32),obj_Carro);[/gml]

entonces debes tener en cuenta que esto solo funciona si el sprite esta centrado en (0,0) es decir que su origen esta en la esquina superior izquierda del sprite.

Si por ejemplo tu sprite mide (32,32) y le tienes su origen en (16,16), entonces debes agregar esos (16,16) al codigo

[gml]instance_create(32*floor(x/32)+16,32*floor(y/32)+16,obj_Carro);[/gml]

NOTAS:
1. He agregado los "+16" de mi caso hipotetico, debes estar pendiente de esto.
2. Debes experimentar con estos valores hasta que descubras bien su funcionamiento y lo adecues a tus necesidades.
3. Esto va en el evento de clic izquierdo con el raton del mismo objeto que controla la cuadricula

--
saludos
195
Ese es el problema cuando trabajas con solidos... Lo que debes hacer es dejar los bloques como no-solidos, y luego mediante codigo organizar la colision

Mas o menos la idea es asi:

[gml]//Si la velocidad vertical es mayor a 0 es porque esta cayendo
if (vspeed > 0){
   //Los proximos valores de "14" los cambias de acuerdo al tama?o de tu sprite
   bloque = collision_rectangle(x-14,y+1,x+14,y+vspeed,0,0);
   if (bloque){
       y = bloque.y-16; //El 16 es el medio tama?o del bloque
       //Cancelamos gravedad y velocidad vertical y cuadramos la colision
       vspeed = 0;
       gravity = 0;
       //move_contact_all(270,12);
        //No estoy 100% seguro del move_contact_all
   }
}[/gml]


De este modo, el personaje se detendra solo cuando este cayendo, sin importar la velocidad de caida

NOTAS:
1. Debes acomodar los valores de 14 y 16 a tus necesidades
2. Si utilizas algo como "if (place_free(x,y+1)){ gravity = 0.5; }", entonces esto te dara error ya que nunca cancelara la gravedad
3. Si es el caso del 2, entonces debes cambiar el codigo de activar la gravedad por uno de colision.
4. Te haria un ejemplo, pero estoy trabajando en estos momentos XD

Saludos.