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

46
Yo tenia un pequeño sistema que hice, eso si debes saber los numeros que poseen cada una de tus teclas, eso lo ves con la variable global llamada keyboard_key, que es un valor numerico, que si no hay ninguna tecla presionada es 0, yo hice un pequeño codigo:

En el evento Create:

key_tiempo          = 0
key_tiempo_max  = 15 (tiempo que desees con respecto a los fps de tu juego)
key_combinacion  = ""


En el Evento Step:


if (keyboard_check_pressed(vk_anykey))
  {
  key_tiempo = key_tiempo_max;
  if (keyboard_key != 0)
  {combinacion += string(keyboard_key)}
  }
 
  if (key_tiempo > 0)
  {key_tiempo -= 1} else {key_tiempo = 0; combinacion = ""}

  if (string_count("37",combinacion) >= 2) || (string_count("39",combinacion) >= 2)
  { aca tu codigo }



si puedes ver, usé la función string_count(sub_string,string) que cuenta cuantas veces esta sub_string en string, en este caso la tecla 37 y 39, son izquierda y derecha, si se repetia mas de 2 veces en el tiempo que elejí, el personaje hacia algo diferente, no se, ahi ves tu si te es de utilidad, saludos!!!
47
Preguntas y respuestas / Re:Más de 1 barra de vida
Enero 28, 2013, 06:28:37 AM
si, se pueden hacer cualquier tipo de barras de vidas, solo con creatividad y dependiendo de que vas a hacer, puedes agregarles tus propios estilos, es solo de imaginacion :D!!!

Lo puedes hacer desde las funciones que te entrega el game maker, como tambien tu puedes crear una barra de cualquier cosa, lee el manual GM:

http://www.comunidadgm.org/manual_GM/Index.php

Ahi encontrarás todos los procedimientos necesarios, viendo esto me dieron ganas de hacer un sistema de barras de vida XD. Saludos!!!
48
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.
49
Pero al analizar, el bug solo se presenta al producirse un cambio de angulo, si se analiza fisicamente el movimiento del objeto, habría alguna variable que no he tomado en cuenta para este movimiento? , porque he visto un juego de sonic hecho en game maker, y su movimiento es muy preciso, tiene como el 0.1% de error del valor original que debiera tener. tal vez no he considerado algo, me parece complicado... por lo del error de las cifras, no creo que eso afecte mucho al valor real con que el game maker trabaje, ya que el draw_text dibuja un string con decimales limitados, creo que hay una forma de como mostrar mas decimales, pero ya ese es otro tema, ademas he visto que la velocidad con que se mueve el objeto afecta mas su precisión.
50
Parece que no me he explicado bien, el movimiento en si debería funcionar, pero cuando se produce un cambio de angulo, el movimiento en el eje vertical tiende a afectarse, y no se mueve de la manera mas precisa.

Cuando presiono la tecla izquierda

si el angulo cambia de 45 a 0 grados, el movimiento vertical tiende a aumentar (osea el objeto se va un poco mas abajo).
si el angulo cambia de 315 a 0 grados, el movimiento vertical tiende a disminuir (osea el objeto se va un poco mas arriba).

Cuando presiono la tecla derecha

si el angulo cambia de 45 a 0 grados, el movimiento vertical tiende a disminuir.
si el angulo cambia de 315 a 0 grados, el movimiento vertical tiende a aumentar.

Esos son los bug que se me presentaron, pero desconozco su origen, no se por que se forman.

51
Encuentro que es una buena forma de detectar el angulo, pero ahora como reparar el bug que se forma, al mover el objeto, cuando el angulo cambia, por ejemplo de 0 a 45 grados, y lo muevo con las teclas izuierda y derecha muchas veces, el movimiento vertical se va aumentando poco a poco, no se el por qué, ya que lo que hago es esto:

El movimiento lo realizo con las funciones del seno y del coseno:

x   +=  cos(degtorad(angulo))*vel_x;
y   -=  sin(degtorad(angulo))*vel_x;


cuando presiono la tecla de la derecha, vel_x > 0, y el angulo va desde 0 hasta los 90, y desde los 270 hasta los 360, por lo que el coseno siempre va a ser positivo. y pasa lo contrario si vel_x < 0.

y en el movimiento vertical, pasa algo similar, si vel_x > 0; si el angulo es 45, Y se ira disminuyendo, y si es 315, Y irá aumentando. 
52
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.
53
Preguntas y respuestas / Re:Donde esta el error?
Julio 23, 2012, 04:47:59 AM
deberías colocar global.fen en el evento step, asi:

global.fnn += 1
global.fen=global.fn +  string(global.fnn) + string(global.fe);
54
mmm... que raro... a mi me funciona muy bien si lo implemento bien en el programa... sera mejor que subas tu archivo para ver si tienes un error... porque yo lo he usado muchas veces y me funciona bien...

en el caso del angulo, debes tener la variable angulo expresada en grados para que te funcione, y puedes ya sea colocar en el evento step:

image_angle = angulo

pero es mejor dibujar el sprite en el evento draw:
draw_sprite_ext(sprite_index,imagen,x,y,1,1,angulo,c_white,1)
55
una forma de hacerlo es a través del mismo objeto que crea la bala:

if (disparar)
{
bala = instance_create(x,y,obj_bala)
bala.direction = image_angle
bala.speed     = velocidad
disparar = 0
}

tambien puedes colocarle un codigo mas interesante, y crear una variable de angulo del enemigo, otra variable que contenga la distancia a la que quieres tirar la bala desde el punto que tienes como centro del sprite, y despues tomas el valor del coseno y del seno de la variable angulo (en radianes), o si lo quieres expresar en grados puedes usar la función degtorad(), que te convierte los grados en radianes...

en el evento step:

if (disparar)
{
dx = dis*cos(degtorad(angulo))
dy = dis*-sin(degtorad(angulo))
bala = instance_create(x+dx,y+dy,obj_bala)
bala.direction = angulo
bala.speed     = velocidad
disparar = 0
}

en los signos siempre me confundo en las funciones sin() y cos() XD, pero ahi vas acomodandolo a tu juego :)... espero que te haya sido de utilidad...
56
Jajajajjaj  ;D... gracias por todo... lo pude hacer :)... gracias Mgbu por la idea de colocar las variables de esa manera... me ayudo bastante para realizarlo... lo hice de esta manera:



  ini_open("Niveles.ini")
  filas = ds_list_create()
 
  nivel     = "nivel01"
  max_filas = 10
  max_pos   = 7
  tab_x     = 16
  tab_y     = 16
  ancho     = 19
 
  for (i = 1; i <= max_filas; i+=1)
  {ds_list_add(filas,ini_read_string(nivel,"fila"+string(i),"0000000"))}
 
  var rasgo, mi_string;
 
  for (i = 0; i <= max_filas-1; i += 1)
  {
  mi_string = ds_list_find_value(filas,i)
   for (j = 1; j <= max_pos; j += 1)
   {
   rasgo = real(string_char_at(mi_string,j))
    if (rasgo > 0)
    {
    obj = instance_create(tab_x + j*ancho,tab_y + i*ancho,obj_ball)
    obj.image_single = rasgo-1
    }
   }
  }
 
  ds_list_destroy(filas)
  ini_close()


y el archivo ini, con nombre "Niveles.ini", lo hice asi :


[nivel1]
fila1  = 0103010
fila2  = 4010101
fila3  = 0101010
fila4  = 1010101
fila5  = 0101010
fila6  = 1010111
fila7  = 0101050
fila8  = 1010101
fila9  = 0101010
fila10 = 1010101


coloqué un sprite que contiene 9 imagenes, y esto creara al objeto con la imagen indicada por el numero, y me quedó muy bien!!!!

gracias!!!
57
mmm... y despues podria reconocer la posicion del string con ini_read_string() y string_pos()... sería asi?

En el archivo ini:


[Nivel 1]
fila1 = 0001002
fila2 = 0010011
filan = ...
fila7 = 0001011


y para reconocerlo tendria que leer una seccion en el archivo ini, y eso pasarlo a una variable, y despues chequear cada letra del string con string_pos() y crear un objeto en la room dependiendo si son 0, 1, 2 ...

para que puedan entender mejor se trata de un juego puzzle, en donde me interesa crear pelotas de distintos colores (eso son los rasgos), con la posicion asignada por la fila, como en una tabla, y crea las pelotitas de acuerdo al string, si contiene 0, no crea ninguna, si es 1 un color, si es 2 otro color, y asi... :)

58
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?

59
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
60
muchas gracias!!!  :D, eso me pasa por no leer el manual XD