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.

Temas - fab62

1
hola makeros! hoy se me ha pasado un problema que me ha hecho quedarme de manos cruzadas jaja.. bueno, yo se que alguno de ustedes sabra:

El problema surge a traves del manejo de surfaces, lo que quiero es cortar una imagen particular de la siguiente manera


Lo que tengo hasta ahora es hasta la imagen 3, pero no se como llegar a la 4


        // vemos si la superficie existe, si no la volvemos a crear
        if (!surface_exists(surface)) surface = surface_create(radio*2,radio*2);
       
        // iniciamos la edicion del surface
        surface_set_target(surface)
            draw_clear_alpha(0,0);
            draw_circle_colour(radio,radio,radio,c_white,c_white,0);
            draw_set_blend_mode_ext(bm_dest_color,bm_zero);
                draw_sprite(sprite, 0, 0, 0)
            draw_set_blend_mode(bm_normal);
        surface_reset_target()


Otra cosa, la imagen 3 no se ve asi, se ve de esta manera:


de antemano muchas gracias, cualquier ayuda les agradecere mucho :)
si alguien me explica mejor acerca de los surfaces y los canales alpha seria mejor, o una pagina en donde se entienda realmente como funciona :P
2
Desarrollo de Scripts / Movimiento preciso
Diciembre 28, 2014, 02:33:00 AM
Hola! saludos a todos los makeros que estan en la comunidad, hoy les vengo a dejar un script muy util para mover un objeto de forma precisa solo definiendo 3 argumentos, velocidad horizontal, velocidad vertical, y obstaculo del movimiento, lo he testeado y funciona la 100 %  ;)

Creador: Fab62


Version de GM:  :GMS:


Descripción: Mueve un objeto de forma precisa, sin estancarse en el objeto obstaculo que se define en el 3er argumento, las velocidades horizontal y vertical son independientes, es decir, que si el objeto se detiene de forma vertical, puede seguir moviendose de forma horizontal y viceversa, como tambien puede doblar libremente en las esquinas, este script funciona a cualquier velocidad. Su uso sirve en cualquier evento, pero es mas util utilizarlo en el evento step.


Script: Consta de un solo script, y se utiliza de la misma manera que la funcion motion_add()

precise_movement(velocidad horizontal, velocidad vertical, obstaculo)

/****************************************************************************************************************************
    precise_movement(xspeed,yspeed,obstacle)
-----------------------------------------------------------------------------------------------------------------------------
    movimiento preciso con movimientos horizontal y vertical separados
****************************************************************************************************************************/

// obstaculo del movimiento
var obstacle = argument2;

// obtenemos direcciones: vertical y horizontal
var dirh = sign(argument0);
var dirv = sign(argument1);

// para la velocidad de precision
var pspeed = 0;

// loop horizontal
while (pspeed*dirh < argument0*dirh)
{
    // si se encuentra un obstaculo en la velocidad_precision actual, se sale del while
    if place_meeting(x+pspeed+dirh,y,obstacle) break;
    else
    {
        // si se encuentra en una esquina, se puede doblar
        if !place_meeting(x+pspeed+dirh,y+dirv,obstacle)
        && place_meeting(x,y+dirv,obstacle)
            y += dirv;

        // en este caso, velocidad_precision cambia
        pspeed += dirh;
    }
}

// movemos en x
x += pspeed;

// reseteamos la velocidad de precision obtenida
pspeed = 0;

// velocidad de precision en y
while (pspeed*dirv < argument1*dirv)
{
    // si se encuentra un obstaculo en la velocidad_precision actual, se sale del while
    if place_meeting(x,y+pspeed+dirv,obstacle) break;
    else
    {
        // si se encuentra en una esquina, se puede doblar
        if !place_meeting(x+dirh,y+pspeed+dirv,obstacle)
        && place_meeting(x+dirh,y,obstacle)
            x += dirh;

        // en este caso, velocidad_precision cambia
        pspeed += dirv;
    }
}

// movemos en y
y += pspeed;


Espero que les sea de utilidad en sus juegos para que no ocurran esas molestas ocasiones en donde los objetos quedan pegados... un ejemplo sencillo en la siguiente linea.


Ejemplo: Movimiento en 8 direcciones


Evento Create

velocidad = 5

Evento Step

obstaculo = obj_solido;

//---------------------------------------------------------------------------------------------------------------------------
// ACTUALIZAR CONTROLES DE DIRECCION
//---------------------------------------------------------------------------------------------------------------------------

key_left  = keyboard_check(vk_left)
key_right = keyboard_check(vk_right)
key_up    = keyboard_check(vk_up)
key_down  = keyboard_check(vk_down)

//---------------------------------------------------------------------------------------------------------------------------
// ENCONTRAR LAS DIRECCIONES
//---------------------------------------------------------------------------------------------------------------------------

// direccion horizontal
vel_h = velocidad*(key_right - key_left)

// direccion vertical
vel_v = velocidad*(key_down - key_up)

// movemos
precise_movement(vel_h,vel_v,obstaculo);


El obstaculo debe ser un objeto creado con anterioridad y debe representar el objeto solido, que tengan un buen dia y saludos!
3
Desarrollo de Scripts / Listas probables v2
Septiembre 29, 2014, 04:38:11 PM
Hola Makeros! ultimamente he estado realizando varios ejemplos de utilidades para el game maker, y como hace tiempo que no me adentraba al sitio estaba olvidando subirlos para que ustedes los usen en sus proyectos.

Estos scripts sirven para crear listas con elementos que se escojen con probabilidad, mientras mayor sea la probabilidad de un elemento, mayor serán las veces que se escoja ese elemento de la lista.

Creador: Fab62


Version de GM:  :GMS:


Descripcion: Elije un elemento al azar, dependiendo de una probabilidad dada por la formula:
probabilidad = factor de probabilidad * 100 / suma total de los factores probables
El factor de probabilidad es el numero que los usuarios pueden dar a la probabilidad en la lista.


Scripts:
Para iniciar el sistema, se necesita un contador de listas probables, aunque sea un script de una sola linea, es necesaria.
Su uso debe ser en el evento create, antes de todo script que de a conocer aqui.

probable_iniciar()
prob_count = -1;


Para crear una lista probable, que en si son dos listas del mismo tamaño, solo basta agregar este script:

probable_crear()

prob_count++;
prob_elements[prob_count] = ds_list_create();
prob_factors[prob_count]  = ds_list_create();
   
return prob_count;


para usarlo debe guardarse en una variable, para su uso posterior, esto tambien debe estar en el evento create:

lista = probable_crear();



despues de haber creado la lista, es necesario agregar los elementos:

probable_elemento(elemento, factor de probabilidad)

ds_list_add(prob_elements[prob_count],argument0);
ds_list_add(prob_factors[prob_count],argument1);


Como se puede ver, este script no necesita la variable que se guardo anteriormente, que es para guardar un identificador de la lista, ya que el contador nos proporciona esto por ahora.


Ya tenemos la lista creada, por lo que ahora se puede elegir un elemento al azar con la probabilidad que se le dio a cada elemento:

probable_elegir(id de la lista, comienzo, fin)
elige un elemento entre comienzo y fin
probable_elegir(id de la lista, fin)
elige un elemento entre 0 y fin
probable_elegir(id de la lista)
elige un elemento de toda la lista


// elegimos el intervalo
var pstart, pend;
if (argument_count == 1) {pstart = 0; pend = ds_list_size(prob_factors[argument[0]])-1}
else if (argument_count == 2) {pstart = 0; pend = argument[1]}
else {pstart = argument[1]; pend = argument[2]}

// para saber cual es el total de la probabilidad en el intervalo
var ptotal = 0;
for (var i=pstart; i<=pend; i++) ptotal += ds_list_find_value(prob_factors[argument[0]],i);

// semilla
randomize();

// valor aleatorio y suma parcial
var prand = irandom(ptotal);
var pparcial = 0;

// encontrando el valor
for (var i=pstart; i<=pend; i++)
{
    // reseteamos suma parcial
    pparcial = 0;
   
    // sumamos todas las probabilidades hasta la i
    for (var j=pstart; j<i; j++) pparcial += ds_list_find_value(prob_factors[argument[0]],j);
   
    // chequeamos si estamos en el rango
    if (prand >= pparcial && prand <= pparcial+ds_list_find_value(prob_factors[argument[0]],i))
        return ds_list_find_value(prob_elements[argument[0]],i);
}



Ya cuando no se necesiten las listas las destruimos para liberar memoria:

probable_destruir()

for (var i=0; i<=prob_count; i++)
{
    ds_list_destroy(prob_elements[i]);
    ds_list_destroy(prob_factors[i]);
}



Un ejemplo puede ser lo siguiente:
Evento create

probable_iniciar()

objeto = probable_crear()
probable_elemento(obj_enemigo00, 100)
probable_elemento(obj_enemigo01, 50)
probable_elemento(obj_enemigo02, 35)
...

tipo = probable_crear()
probable_elemento("normal", 50)
probable_elemento("medio", 38)
probable_elemento("dificil", 20)


Evento del click izquierdo del mouse (cuando se presiona)

var mi_objeto = probable_elegir(objeto, global.nivel);
var mi_tipo    = probable_elegir(tipo);

var instancia = instance_create(mouse_x, mouse_y, mi_objeto)
with (instancia) {tipo = other.mi_tipo}


En este ejemplo se muestra la creacion de 2 listas probables, una de objetos, y otra de sus tipos, en donde la creacion de objetos depende de una variable global.nivel


Bueno... eso es todo espero que les sea de utilidad para sus proyectos, no olviden darme credito si lo usan, les estaria muy agradecido.

Les agrego un .gml adjunto para que tengan todos los scripts rapidamente  ;)

Saludos y que tengan un buen dia!
4
Preguntas y respuestas / Rebote preciso?
Febrero 26, 2014, 10:46:31 PM
Hola Makeros!  :). Ultimamente he estado realizando un juego a lo tipo pong, y como comunmente pasa, la pelotita se queda atrapada en algunas ocasiones en las murallas (por alta velocidad), en el jugador (que mas comunmente pasa porque el jugador se mueve), o con las mismas pelotitas... estuve jugando un poco con la fisica, pero no quiero algo tan realista (en el sentido de que al chocar una pelotita, no disminuya su velocidad), solo quiero que cambie su direccion.

Asi que me puse a hacer codigos  :D :

Para hacer de el movimiento mas preciso y que no se salte un objeto que esté entremedio del trayecto de la bolita hice esto
en el evento step:


// variable que chequea la velocidad correcta
velp = 0;

// for de precision
for (i = 0; i <= max_speed + 1; i += 1)
{
    // solo se chequea el objeto solido que es un cuadrado
    colision = instance_place(x+lengthdir_x(i,direction),y+lengthdir_y(i,direction),obj_solido);
    if (colision != noone)
    {
        break;
    }
    else
        velp = i;
}

// asignamos la velocidad
speed = velp;


Hasta este momento, sólo la pelotita se mueve a una velocidad que esta entre 0 y max_speed, y no se salta ningun objeto, en este caso chequea sólo a obj_solido, pero tambien se puede hacer para el obj_jugador y obj_pelota.

Ya que hasta ahí es un movimiento mas preciso, no puedo hacer que la pelotita rebote en una muralla, ya que en ese momento speed = 0, y creo que la función move_bounce_solid() o move_bounce_all(), multiplica vspeed *=-1 o hspeed *=-1.

Que sería lo mas recomendable que pueda hacer? he intentado recurrir a modificar la variable "direction", pero no siempre
me hace como el efecto de rebote. por ejemplo, antes tenía esto para cuando la pelota chocaba con otra:


direction = 180 - direction + 2*point_direction(x,y,other.x,other.y)


Pero no sirve cuando hay un choque con otra pelota que va practicamente en una direccion similar, no se produce un buen efecto.

hasta ahora el obj_pelota es solido y el obj_jugador tambien, el obj_jugador tiene un sprite como se muestra abajo, y cuando el jugador choca con la pelota, esta debe desviarse.

Es recomendable utilizar fisicas? hasta ahora no he podido hacer un buen efecto  :-\

Saludos bien saludosos  XD.
5
Hola makeros! Tengo solo una duda  :) , Alguien ha visto en algun lugar e internet o sabe como hacer un shader que tiña sólo los colores que tengan (en color HSV) El canal de saturación (S) mayor que 0??? asi no tiñe ni blancos, ni grises, ni negros, para que parezca al efecto que hace el game maker cuando uno tiene un sprite con rojos, verdes o azules, y va al editor de sprites y se encuentra con la herramienta "Colorize", que sólo colorea como dije anteriormente.

Para mi que se utiliza sólamente el Fragment shader, ademas... se pueden colocar condiciones if dentro del mismo programa del shader??

De antemano muchas gracias!!
Saludos :)
6
Preguntas y respuestas / Problema con shaders
Febrero 09, 2014, 07:59:06 PM
Hola a todos  :), hoy me puse a experimentar con los shaders, lo cual es muy nuevo para mi  :-[, por lo que decidi hacerle sombras a mis sprites, y me encontré con este codigo, super basico:

En vertex lo dejé como venia :P asi:

//
// Simple passthrough vertex shader
//
attribute vec3 in_Position;                  // (x,y,z)
attribute vec4 in_Colour;                    // (r,g,b,a)
attribute vec2 in_TextureCoord;              // (u,v)
//attribute vec3 in_Normal;                  // (x,y,z)     unused in this shader.

varying vec2 v_vTexcoord;
varying vec4 v_vColour;

void main()
{
    vec4 object_space_pos = vec4( in_Position.x, in_Position.y, in_Position.z, 1.0);
    gl_Position = gm_Matrices[MATRIX_WORLD_VIEW_PROJECTION] * object_space_pos;
   
    v_vColour = in_Colour;
    v_vTexcoord = in_TextureCoord;
}


Y en fragment puse esto:

varying vec2 v_vTexcoord;
varying vec4 v_vColour;

void main()
{
    gl_FragColor = v_vColour * texture2D( gm_BaseTexture, v_vTexcoord );
    gl_FragColor.rgb = vec3(0,0,0);
}


y sale bien todo... pero vi que tambien existe rgba, que necesita 4 parametros, ya que quiero que la sombra no sea tan intensa:

varying vec2 v_vTexcoord;
varying vec4 v_vColour;

void main()
{
    gl_FragColor = v_vColour * texture2D( gm_BaseTexture, v_vTexcoord );
    gl_FragColor.rgba = vec4(0,0,0,0.5);
}


La sombra asi no es tan intensa, pero ahora no tiene la misma forma del sprite :S, tiene una forma cuadrada.

El shader lo utilicé en el evento draw :):


if (shader_is_compiled(sh_shadow))
{
     shader_set(sh_shadow);
            draw_sprite_ext(sprite_index, image_single, x - 5, y - 5, escala_x, escala_y, 0, c_black, 1);
     shader_reset();
}


escala_x y escala_y son variables que yo utilizo para hacer de la escala algo mas manejable  XD, que es lo que esta mal??
por otra parte, hay alguna pagina o manual que me recomienden para aprender a utilizar los shaders??

Muchas gracias por leer!!
7
Hola a todos! ultimamente he estado en un proyecto de un juego tipo puzzle, en donde debes romper unas pelotitas de colores... ya teniendo realizado la mayoria de los objetos, empecé a ver que necesitaba una forma de crear niveles de forma externa, pero igualmente me surge la duda... GM Studio tiene la capacidad para tener por ejemplo 100 rooms??? el juego no se coloca mas lento??  si existe una forma mas eficiente que tener todos los niveles en cada room del juego, asi como guardar un nivel codificado en un archivo, es mejor este método?

Muchas gracias por leer :)
Todas las respuestas serán de gran ayuda!
8
Preguntas y respuestas / Como hacer buenas colisiones?
Septiembre 11, 2013, 03:08:31 AM
Hola makeros, ultimamente, me he estado dando vueltas en las colisiones de mi juego, y en realidad que me cuestan, ya que quiero tratar de que sean precisas, pero aún asi, no me funciona bien cuando escojo diversos objetos de colision...

El codigo que tengo hasta ahora, no considera para nada el desarrollo de slopes (cuestas), me gustaría poder implementar slopes :).

El juego lo estoy haciendo con gravedad, pero, no depende de la variable gravity, implementada en el programa, ya que ocupo variables propias, mi idea es hacer que funcione tanto para una gravedad positiva
(hacia abajo), como una gravedad negativa (hacia arriba):


if (vel_y*sign(gravedad) < max_vel_y)
{
vel_y += gravedad;
}
else
{
vel_y = max_vel_y*sign(gravedad);
}


ahora lo que hago es lo siguiente:

if (gravedad > 0)
{
vel_y_pre = 0;
     
if (vel_y > 0)
{     
for (i = 0; i <= vel_y+1; i += 1)
{
if !place_meeting(x,y+i,obj_solido)
     vel_y_pre = i;
else
     break;
}
y += vel_y_pre;
if (vel_y_pre == 0)
{ground = true}
else
{ground = false}
}
else
{
for (i = 0; i >= vel_y-1; i -= 1)
{
if !place_meeting(x,y+i,obj_solido))
    vel_y_pre = i;
else
    break;
}
y += vel_y_pre;
if (vel_y_pre = 0)
{vel_y = 0}
}


Hasta ahora bien, el personaje baja a la velocidad que sea, y colisiona bien con el objeto, sin quedar 1 pixel arriba o 1 pixel abajo, tengo otro codigo para cuando la gravedad es menor que cero, y es casi igual, ahora, cuando en vez de escribir en el codigo "obj_solido", que es un objeto, escribo "colision", que es una variable
que depende de que objeto este topando, que en mi juego puede ser "obj_piso" u "obj_solido", en el cual "obj_piso" es una plataforma que no deja que el personaje la pase desde arriba hacia abajo, pero si de abajo hacia arriba, y lo unico que ocurre mal, es que la precision se va, en el sentido que aveces el personaje se cae,
como podría hacer colisiones sencillas, pero precisas? que el personaje no se quede volando 1 pixel?

gracias por leer. cualquier ayuda estaré muy agradecido  ;)

9
Preguntas y respuestas / Ocultar la pantalla
Septiembre 03, 2013, 01:16:54 AM
Hola comunidad, hoy estaba realizando una observación en un juego, el cual tiene un efecto muy particular para ocultar la pantalla, y yo me pregunté ¿ Se podrá hacer ocupando el GM ?, entonces, empecé a investigar un poco y me tinca que se puede hacer, con funciones avanzadas de dibujo, pero lo malo que no entiendo mucho de que se trata.

Bueno, el juego es un megaman al estilo 8 bit, y cuando oculta la pantalla, lo primero que se ocultan son los colores mas oscuros, o mas cercanos al negro  XD, ocultando por ultimo, los colores mas claros como el blanco, asi quedando toda la pantalla en negro, y luego para hacer aparecer la pantalla, hace aparecer primero los colores mas claros, quedando en ultimo lugar los mas oscuros, y al final todo se ve normal.

Se que existen formas de ocultar la pantalla, como dibujar un rectangulo negro, y aumentar o disminuir el alpha, pero me gustaría saber, si se puede hacer ese efecto que mencione anteriormente, ya que le da un toque retro al juego...

Si se puede hacer, podrían explicarme como se hace, ya que no he sido mucho de ocupar las funciones avanzadas de dibujo... pero me huele a ocupar draw_set_blend_mode_ext() , nose, ... Muchas gracias por leer :).
10
Creador : Fab62


Versión de GM :  :GM8:


Descripción : Elije un elemento al azar, puede ser un string, como también un valor real. lo hace con probabilidad, ya que repite el elemento tantas veces en una lista como se indica, y finalmente se elije al azar con todos los elementos que tiene.


Funcionamiento :

Forma del argumento

El script tiene una forma para que se realice su proceso de la manera correcta, posee solo un argumento que se debe asignar de la forma siguiente:

scr_elegir_probable(string):
string = "A%3,2.5%3,3B%5*"

donde lo que se asigna antes del símbolo "%" va a ser el elemento que quieres que se agregue a la lista,
y lo que sigue de este símbolo hasta la "," tiene que ser un valor numérico, y éste indica la cantidad de veces
que se repite el elemento en la lista, el string debe terminar siempre con el símbolo *.


Proceso

El script va de acuerdo al siguiente orden:


1.- Creación de variables principales
2.- Recorrer el string principal
3.- Reconocer caracteres antes del símbolo "%" y guardarlos en una variable
4.- Reconocer caracteres después del símbolo "%" y guardarlos en una variable hasta llegar a ","
5.- Agregar el elemento a la lista tantas veces como se le asignó
6.- Volver de nuevo al ciclo hasta llegar a un "*"
7.- Elegir aleatoriamente en la lista un elemento.
8.- Observar el tipo de elemento: si es un string o un valor real  y retornar según el tipo.



Script: Se utiliza en un solo tiempo, igual como las funciones choose, random... lo bueno es que no se
limita a 16 argumentos  :D

 
  /***************************************************
    scr_elegir_probable(string)
   ***************************************************/
   
  /*
  p = string de la forma:
  ABC%N, DEF%M,HIJ%O*
  donde ABC es un string de cualquier cantidad de caracteres, %N es el multiplicador del string y lo repite N         veces en la lista
  * es el termino, debe colocarse siempre al final
  */
 
  // Asigacion y creacion de variables locales
  var p, lista, det_p;
  p     = argument0
  lista = ds_list_create()
  det_p = 0;
 
  string_reconocido = ""
  string_multiplicador = ""
  repartir = 0
 
  // recorrer el string
  for (i = 1; i <= string_length(p)+1; i += 1)
  {
   if string_char_at(p,i) != "," and string_char_at(p,i) != "*"
   {
    if !(det_p)
    {
     if string_char_at(p,i) != "%"
     {string_reconocido += string_char_at(p,i)}
     else {det_p = 1}
    }
    else {string_multiplicador += string_char_at(p,i)}
   }
   else
   {
    while repartir < real(string_multiplicador)
    {
    ds_list_add(lista,string_reconocido)
    repartir += 1
    }
    string_reconocido    = ""
    string_multiplicador = ""
    repartir             = 0
    det_p                = 0
   }
  }
 
  // elegir un elemento de la lista
  resultado = ds_list_find_value(lista,irandom(ds_list_size(lista)-1))
 
  // observar el tipo de elemento
  if (string_digits(resultado) != "0" && string_letters(resultado) != "")
  || ((string_digits(resultado) == "0" && string_letters(resultado) != ""))
  {return resultado}
  else
  {return real(resultado)}



Ejemplo :
si tienes como string "A%5,5E%10,20%6" se creará una lista de esta forma:
[A,A,A,A,A,5E,5E,5E,5E,5E,5E,5E,5E,5E,5E,20,20,20,20,20,20]
y se elegirá un elemento de esa lista aleatoriamente.

si sale A o 5E será un string, si sale 20 será un valor real.
lo hice porque no me gustaba la idea de que la función choose fuera limitada a 16 argumentos XD.
11
Hola comunidad, he estado haciendo un programa para poder detectar el angulo de colisión que posee el piso, osea con una pendiente distinta de 0, y se me ocurrió hacerlo con 2 puntos, y que a través de ellos, se puede calcular el angulo de inclinación, la detección me ha salido bien hasta ahora, solo en superficies apartadas de los bordes, pero intenté ahora afectar el movimiento a través de la superficie, ocupando las funciones seno y coseno, pero me ocurre un error que no lo logro entender, cuando el angulo de inclinación cambia constantemente durante el movimiento, el objeto tiende a aumentar su posición Y, qué es lo que me recomendarían ustedes para poder mejorar en el código?

les dejo lo que he estado haciendo.
muchas gracias por leer.
12
Hola makeros, se me ha presentado una duda de acuerdo a los archivos externos... es que quería hacer que se cargaran datos externamente a taves de un texto de esta forma:

0000001000
0000201000
1120010000
...

en donde hay 7 filas y 10 columnas de datos, mi duda es si esto se puede hacer en el game maker, para asignar un objeto en una posicion del room tal como esta hecho en el archivo , y los rasgos del objeto dependerían si del dato si es 0,1,2,...

lo quería intentar asi pero no creo que sea la mejor opcion:

dato[i,j] = rasgo

y esto repetirlo hasta que me satisfaga todos los datos, en este caso 7 * 10, y si el rasgo fuera 0, no crearía ningun objeto en esa posicion de la room... esto se puede hacer de una forma mejor?

13
Preguntas y respuestas / rutas asignadas por objetos
Enero 23, 2012, 04:37:32 AM
hola comunidad  :D, estoy haciendo un test, que sea lo mas parecido posible al movimiento de Mario del juego de super mario world, de SNES, en la forma "overworld", lo he intentado, pero me ocurre un bug muy feo XD, cuando el personaje anda por las rutas asignadas, va bien en forma horizontal y vertical, pero cuando tiene que ir en otra direccion, ya sea de 45? y otros, se va desviando de a poco en el camino, creo que no dobla cuando es el momento justo, tal vez una peque?a falla en el codigo...

le he asignado el reconocimiento de los objetos que en este caso serian las rutas, a traves de una variable:


for(i=0;i<=pfactor;i+=1)
   {
   for (j=-1;j<=1;j+=2)
   {objWay = instance_position(x+i*j,y+i*j,ways)}
   }


donde "pfactor" es un factor de precision, pero igual no se si servira de mucho :-[, el codigo lo hice para que me reconociera el objeto tanto como en una direccion, como en otra...

esa variable me reconoce las rutas que el personaje ha de seguir, y creo que ahi esta el problema, nose como dejar al personaje en el centro del camino, para que no se desvie, porque se sale del camino y se estropea todo XD

les dejo el programa adjunto para que lo vean y me digan si tengo algo malo en el codigo, que debo arreglar :D
14
Hola a todos  :D, tengo una duda de acuerdo con los strings, estoy intentando hacer un reconocimiento de los nombres de los sprites, lo cual, le he asignado un nombre a cada uno de acuerdo a un cierto orden, que sale al final d su nombre...

una muestra es:
spr_way_HC
spr_way_HD
spr_way_...

lo cual todos empiezan con este nombre de "spr_way_", con la unica diferencia del final, que lo asigne para demostrar una direccion distinta, diferente de las demas...

posteriormente le asigne una variable al objeto padre
mi_dir = string(sprite_get_name(sprite_index))
en donde este peque?o codigo me asigna todo el nombre del sprite que contiene el objeto, en los objetos "hijos" solo le asigne la accion de llamada del evento del objeto padre, lo cual como podria hacer un procedimiento que me identifique solo lo que viene despues de "spr_way_" para asignarlo a una variable, creo que se puede hacer, pero no se me ocurre  :-[
15
hola comunidad... tengo un a duda de como importar un sprite que sea a lo tipo strip, por ejemplo en gm8 cuando uno guarda un sprite en el editor de sprites, el archivo se crea con nombre de "sprite_stripN", en donde "sprite" es el nombre que le colocamos y "N" el numero de cuadros de la animacion... mi duda es como hacer un script que me importe las imagenes PNG en forma de strips y cree la animaci?n...
creo que debo crear variables, una que tome como valor el ancho del strip, y otra el numero de animaciones dada por "N" y hacer como que el programa dibuje una parte del sprite para mostrarlo como animacion.
16
Preguntas y respuestas / Elegir objetos con prioridad?
Noviembre 24, 2011, 02:46:36 AM
hola a todos!!! estoy haciendo un juego tipo puzzle, los bloques se crean a trav?s de un lanzador... hay distintos tipos de cajas que son lanzadas, por ahora lo estoy haciendo al azar, pero se puede elegir un bloque con prioridad... como por ejemplo, hay un bloque que es el solido, y otro que es una caja, pero lo que deseo que ocurra es que el programa lance mas el objeto solido que el objeto de la caja... no se si me explico bien, pero se pueden elegir variables con distinta prioridad? esa es mi duda, les dejo un dibujo de juego para que entiendan de que se trata  :)

el codigo que tengo es aleatorio, sin prioridad

global.tirar[1] = global.bloque[round(random(global.max_bloques))]


en donde global.tirar[] es la variable que elige que bloque se va a lanzar
global.bloque[n] es el bloque que se va a elegir
global.max_bloques es el numero total de bloques que tengo asignados al juego
17
hola makeros. no se como arreglar el bug de que al colisionar dos objetos, uno que se mueve a tal velocidad mayor que el otro, al chocar se detienen los dos...

el codigo del choque es:


move_bounce_all(1)
sound_play(snd_players_b)
speed += 0.5


asi bien simple... al chocar va a aumentar la velocidad del objeto (en este caso es una pelota)
18
hola makeros, tengo un problema bien raro, es acerca del reemplazo de colores en un sprite, no se mucho acerca de este codigo, pero no puedo realizar cambios de colores en un intervalo de tiempo peque?o, ya que se queda detenido el juego y no resulta as?  :(. Todo esto sucedi? porque el personaje principal se recarga para disparar, y al estar mas recargado parpadea m?s, y no me resulta...

el codigo lo encontr? en gmlscripts.com:

/*
**  Usage:
**      sprite_replace_color(sprite,oldcolor,newcolor)
**
**  Arguments:
**      sprite      sprite to change
**      oldcolor    color that will be replaced
**      newcolor    color used as replacement
**
**  Returns:
**      (-1) on error
**
**  Notes:
**      This script replaces one color in a sprite with another.
**      No new sprites are created, the given sprite is changed.
**
**  GMLscripts.com
*/
{
    var sprite, oldc, newc;
    sprite = argument0;
    oldc  = argument1;
    newc  = argument2;

    var w, h, n, i, xo, yo, surf, tempsprite, newsprite, alphasprite;
    w  = sprite_get_width(sprite);
    h  = sprite_get_height(sprite);
    n  = sprite_get_number(sprite);
    xo = sprite_get_xoffset(sprite);
    yo = sprite_get_yoffset(sprite);

    surf = surface_create(w,h+1);
    surface_set_target(surf);

    for(i=0; i<n; i+=1) {
        draw_clear_alpha(c_black,1);
        draw_set_blend_mode_ext(bm_inv_dest_color,bm_one);
        draw_sprite(sprite,i,xo,yo);
        draw_set_blend_mode(bm_normal);
        draw_point_color(0,h,oldc);
        tempsprite = sprite_create_from_surface(surf,0,0,w,h+1,true,false,xo,yo);
        draw_clear_alpha(newc,1);
        draw_sprite(tempsprite,0,xo,yo);
        sprite_delete(tempsprite);
        if (i == 0) {
            newsprite = sprite_create_from_surface(surf,0,0,w,h,false,false,xo,yo);
            if (newsprite < 0) return -1;
        }else{
            sprite_add_from_surface(newsprite,surf,0,0,w,h,false,false);
        }
        draw_clear_alpha(c_white,1);
        draw_set_blend_mode_ext(bm_zero,bm_src_alpha);
        draw_sprite(sprite,i,xo,yo);
        if (i == 0) {
            alphasprite = sprite_create_from_surface(surf,0,0,w,h,false,false,xo,yo);
            if (alphasprite < 0) {
                sprite_delete(newsprite);
                return -1;
            }
        }else{
            sprite_add_from_surface(alphasprite,surf,0,0,w,h,false,false);
        }
        draw_set_blend_mode(bm_normal);
    }

    surface_reset_target();
    sprite_assign(sprite,newsprite);
    sprite_set_alpha_from_sprite(sprite,alphasprite);
    sprite_delete(newsprite);
    sprite_delete(alphasprite);
    surface_free(surf);
}


solo lo puedo usar al inicio del juego, solo para poder cambiar una sola vez, los colores del personaje, he visto en internet algunos videos en donde pueden hacer que cambie muchas veces el color sin detenerse el juego, pero no se como.
19
Preguntas y respuestas / dibujando decimales
Agosto 07, 2011, 04:25:35 AM
hola makeros, mi duda apareci? cuando quise dibujar un numero decimal de muchas cifras, he visto que en la pantalla solo se ven 2 decimales despues de la coma, asi la raiz de 2 sale como, 1,41... y se puede hacer que se vea con 20 cifras despues de la coma?

he probado con la funcion string_format(), pero se me ve solo 0.0000000000 y no sale nada mas  :( .

deje un archivo adjunto de lo que estoy haciendo.
20
Preguntas y respuestas / problema con sombras
Julio 19, 2011, 04:12:13 AM
hola makeros, pues se me present? una duda con los dibujos que se generan en el evento draw, ya que tengo a un personaje que tiene depth -2, los objetos solidos tienen un depth de 0, y no se me ocurre como hacerle una sombra al personaje que tenga un mayor depth que los objetos solidos, como se le puede asignar un depth a una imagen dibujada en el evento draw?, o no se puede hacer?,

lo habia asignado as?, y creo que estoy muy equivocado!

sombra = draw_sprite_ext(...)
sombra.depth = 1

pero creo que estoy muy errado, porque no pasa absolutamente nada XD, solo quiero saber una forma de hacerle una sombra a mi personaje, si se puede hacer, talvez se haga con un surface, nose  :(.