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

511
Preguntas y respuestas / Re:Premio cada 20 minutos.
Abril 28, 2016, 04:59:16 AM
¿Y por qué no usar una alarma?
[gml]
alarm[0] = room_speed * 60 * 20;
[/gml]
512
El error, si no me equivoco, puede estar en las comprobaciones, en esta parte:
[gml]
global.level3[0]-global.level3[3] and global.level3[3]-global.level3[0]
[/gml]
Esta expresión sólo devolverá un valor booleano. Es decir, de la siguiente forma:

Los primeros dos valores antes del and (global.level3[0]-global.level3[3]) devolverán un número x. Si este número es mayor a 0.5, se tomará como true; de lo contrario, se tomará como false.

Lo mismo con la segunda (después del and), y los resultados serían uno de estos:
[gml]
true and false //'true' es el resultado de la primera resta, y 'false' el de la segunda... Esta expresión devuelve 'false'
false and false //Devuelve 'false'
false and true //Devuelve 'false'
true and true //Devuelve 'true'
[/gml]
Si sabemos que true es 1, y false es 0, también sabemos que en esta condición:
[gml]
if global.level3[0]-global.level3[3] and global.level3[3]-global.level3[0] = global.level3[4]
[/gml]
La variable global.level3[4] debe tener sólo un valor entre 0 y 1 (dependiendo del resultado de la expresión anterior).

Bueno, creo que es ese el problema. Para solucionarlo podrías alargar la condición así:
[gml]
if (global.level3[0]-global.level3[3]) = global.level3[4] and (global.level3[3]-global.level3[0]) = global.level3[4]
[/gml]
513
Preguntas y respuestas / Re:ayuda con la id
Abril 27, 2016, 10:16:13 PM
Cita de: eams1986 en Abril 27, 2016, 03:23:03 PM
Perfect!!
NiuWeb nunca he tenido claro esto de los ID nos podrías alargar este tema con algunos detalles más se lo agradecieramos.
Gracias
A todos las instancias que se crean en la sala en cualquier momento se les asigna una id específica. La id es un número real.
Para modificar variables de otro objeto, se pueden usar dos formas: El método del punto, o un with.

El método del punto se escribe como objeto.variable, y de esta forma se pueden tando obtener como modificar los valores de una variable de otro objeto. Lo que va en 'objeto' puede ser tanto un identificador de objeto (normalmente el nombre del objeto, 'oPlayer', 'obj_wall', etc.) como de instancia (la id, de la que hablé arriba).

Si el identificador es un objeto como tal, al realizar acciones (modificar variables o cualquier cosa dentro de un with), éstas se realizarán en todas las instancias de ese objeto, y si se obtiene el valor de la variable, se obtiene de la instancia de ese objeto que se ejecuta primero (no estoy seguro de esto último).

Si el identificador es una id de instancia, todas las operaciones se realizarán sólo en la instancia con ese id.

Por ejemplo, si tenemos manualmente la id de una instancia, digamos '10023401'. Y escribimos:
[gml]
(10023401).speed = 6
[/gml]
Vamos a asignar el valor de 6 a la variable speed de la instancia con la id 10023401.

Existen otras formas de obtener la id de una instancia. Por ejemplo, cuando la creamos con instance_create(), esta función devuelve la id de la instancia recién creada.
[gml]
instancia = instance_create(x, y, objeto);
instancia.speed = 6;
[/gml]
Vamos a asignar el valor de 6 a la variavle speed de la instancia creada.

Y existen otras formas de obtener la id de una instancia, como funciones de colisión.
514
Preguntas y respuestas / Re:ayuda con la id
Abril 27, 2016, 03:13:16 PM
La constante other sólo funciona en eventos de colisión y dentro de un with.

Cuando quieras ejecutar acciones con una instancia en específico, debes tener su id almacenada en alguna variable o algo por el estilo. Formas de obtener la id de una instancia hay varias. Ya sea las funciones de colisión con figuras collision_rectangle() y sus hermanas, o las funciones de detección con una posición instance_place() ó instance_position(). Con estas funciones, entre otras, puedes obtener la id de una instancia en específico.
515
Es difícil entender lo que quieres llegar a hacer, ¿No podrías dejar una imagen/gráfica que describiera el problema?
516
¿Al final fue el break lo que lo solucionó?
Como no se me ocurrió antes  :'( :-[ xD

PD: Vampy, en GM no es necesario este cambio de operador, la comprobación funciona perfectamente igual con los dos operadores, ni tampoco son necesarios los paréntesis.
517
Sólo para probar, reemplaza esta parte del código:
[gml]
global.mensaje = "La combinacion no es correcta.#Sigue probando.";
if llamada == true {
    alarm[0] = 90;
    llamada = false;
}
[/gml]
Por esto:
[gml]
show_message("combinación incorrecta");
[/gml]

Si el mensaje se muestra, quiere decir que en realidad sí se está verificando que el número esté o no repetido.

Aunque creo que podrías solucionar poniendo break, así:
[gml]
global.mensaje = "La combinacion no es correcta.#Sigue probando.";
if llamada == true {
    alarm[0] = 90;
    llamada = false;
}
break;
[/gml]
518
Cita de: JohnW en Abril 26, 2016, 03:39:49 AM
Acabo de darme cuenta que en la parte del código [gml]for(var i = 0; i < array_length_1d(global.circulo); i++) {[/gml]
tenía puesto global.circulo[i] y se lo he quitado.
Lo siento, mi error.

Volviendo al tema:
Quizás el error se deba a que estás ejecutando la alarma por cada iteración del ciclo, puesto que no la has agrupado bajo el else.
El código se podría arreglar así:
[gml]
var lista = ds_list_create();
var circulo, add, n = 0;
for(var i = 0; i < array_length_1d(global.circulo); i++) {
    circulo = global.circulo;
    n += circulo;
    add = ds_list_find_index(lista, circulo);
    if add == -1
        ds_list_add(lista, circulo);
    else { //Hemos usado llaves para agrupar las acciones
        global.mensaje = "La combinacion no es correcta.#Sigue probando.";
        if llamada == true {
            alarm[0] = 90;
            llamada = false;
        }
    }
}
ds_list_destroy(lista);
if (n != 72)
    {global.mensaje = "La combinacion no es correcta.#Sigue probando.";
        alarm[0] = 90}
else
   { global.mensaje = "¡PERFECTO! Has resuelto este juego."}
[/gml]
El hecho de que llames una alarma dentro de un ciclo hace que necesites medidas especiales para evitar errores. Por ello, agregué una condición if llamada == true. Pero debes declarar esa variable como true en el <create> del mismo objeto, y volverle a asignar ese valor en la alarma.
Y me parece algo extraño que en todos los "mensajes" llames una alarma, y en el último no.

Por cierto, no es necesario usar una función string() cada vez que necesites asignar un valor de texto a una variable, esta función es para convertir números reales a cadenas.
519
El error es que estás intentando, en alguna parte del código en el evento <left pressed>, leer un array llamado global.circulos, cuando el array se llama global.circulo
520
Cita de: JohnW en Abril 26, 2016, 02:57:07 AM
1. En cada botón circulo, en el evento "Create" he puesto [gml]global.circulo[7] = 0;[/gml]
el mismo código en los 8 circulos eh con el [7].
Hmmm... No me convence. Deberías colocar ese código en un sólo objeto controlador.

Cita de: JohnW en Abril 26, 2016, 02:57:07 AM
lo puse todo en el botón de confirmar que tengo en "Left Pressed" pero me tira error porque seguramente ahí no va.
¿Qué error te da?

Cita de: JohnW en Abril 26, 2016, 02:57:07 AM
Luego me dado cuenta que en el código me pones la global.circulos como si fuera una general, pero yo esa global general no la tengo porque lo hacia indicivuales y claro al quitar todas las variables para crear la lista que tu me dijiste pues ya no me sirve ese metodo.
No te comprendo bien, el array global.circulo ya es global/general, por lo que podremos acceder a él desde cualquier objeto. Pero eso, claro, si el array existe. Por eso lo que te dije al principio, declara el array global en algún objeto controlador para evitar problemas
521
Cita de: VisualGames en Abril 25, 2016, 07:02:25 PM
Pos creo que me va a servir en unos años jeje ¿en que curso/año escolar te pasaron lo de hexadecimal???
En ninguno (hasta el momento), lo aprendí leyendo en internet.
522
Te funcionaría si usaras arrays, como te digo, que aparte de ser más flexibles ahorras memoria.
Es decir, que en vez de escribir algo como:
[gml]
global.circulo1 = 0;
global.circulo2 = 0;
global.circulo3 = 0;
...
global.circulo8 = 0;
[/gml]
Hagas:
[gml]
global.circulo[7] = 0;
[/gml]
Y cuando hagas click en un círculo, sumas así:
[gml]
//Al presionar el círculo 1:
global.circulo[0] += 1;
//Al presionar el 5
global.circulo[4] += 1;
[/gml]

Y de esa forma si te funcionaría el método que te dije
523
Hmmm... Lo que quieres es tener una serie de variables asignadas, todas con un valor X de los posibles: {2,4,6,8,10,12,14,16,18}.

Si hay alguna variable que tenga el mismo valor que la otra, dar error.
Si todas son diferentes, pero la suma de éstas no es 72, dar error.
Si todas son diferentes, y la suma de éstas sí es 72, aprobar.

(Antes que nada recomiendo que uses arrays en vez de diferentes variables para optimizar memoria)
Entonces, se me ocurre que podrías insertar los datos de las variables en una lista si este dato no existe, pero de hacerlo, saltar error.
[gml]
var lista = ds_list_create();
var circulo, add;
for(var i = 0; i < array_length_1d(global.circulos); i++) {
    circulo = global.circulos;
    add = ds_list_find_index(lista, circulo);
    if add = -1
        ds_list_add(lista, circulo);
    else
        //Error, un círculo tiene el mismo valor que otro
}
ds_list_destroy(lista);
[/gml]

Y para comprobar si la suma del valor de los círculos es 72:

[gml]
var n = 0;
for(var i = 0; i < array_length_1d(global.circulos); i++) {
    n += global.circulos;
}
if n != 72
    //Error, la suma del valor de los círculos no es 72
else
    //Aprobado, la suma del valor de los círculos es 72
[/gml]
524
Autor: NiuWeb
Versión de GM utilizada:  :GMS: Studio 1.4
Descripción: Conjunto de scripts para poder convertir de un número decimal a un binario y a un hexadecimal, y de un número binario o hexadecimal (a modo de cadena) a un número real.

Código:

Decimal a binario
[gml]
///dec_to_bin(dec);
var dec, bin;
dec = argument0;
bin = "";
while(dec > 0)
{
    bin = string(dec mod 2) + bin;
    dec = dec div 2;
}
return bin;
[/gml]
Su único argumento es el número decimal a convertir. Devuelve una cadena con el número binario.

Binario a decimal
[gml]
///bin_to_dec(bin);
var bin, len, dec;
bin = string(argument0);
len = string_length(bin);
dec = 0;

var i;
for(i = len; i >= 1; i--)
{
    dec += power(2, len - i) * real(string_char_at(bin, i));
}
return dec;
[/gml]
Su único argumento es el número binario (a modo de cadena) a convertir. Devuelve un número real.

Decimal a hexadecimal
[gml]
///dec_to_hex(dec);
var base, dec, bin;
base = "0123456789ABCDEF";
dec  = argument0;
bin  = "";
while(dec > 0)
{
    bin = string_char_at(base, (dec mod 16) + 1) + bin;
    dec = dec div 16;
}
return bin;
[/gml]
Su único argumento es el número decimal a convertir. Devuelve una cadena con el número hexadecimal.

Hexadecimal a decimal
[gml]
///hex_to_dec(hex);
var base, hex, len, dec;
base = "0123456789ABCDEF";
hex  = string(argument0);
len  = string_length(hex);
dec  = 0;

var i;
for(i = len; i >= 1; i--)
{
    dec += power(16, len - i) * (string_pos(string_char_at(hex, i), base) - 1);
}
return dec;
[/gml]
Su único argumento es el número hexadecimal (a modo de cadena) a convertir. Devuelve un número real.

Espero que le pueda ser de utilidad a alguien :D

EDIT: Scripts optimizados.
525
Autor: NiuWeb
Versión de GM utilizada:  :GMS: Studio 1.4+
Descripción: Son un conjunto de scripts que permiten hallar valores estadísticos básicos de una lista. Estos valores son: sumatoria, mediana, moda y desviación estándar. La media no la incluyo porque al tener la sumatoria y la cantidad de datos ( ds_list_size()  ) se puede obtener fácilmente. Sería desperdiciar por completo un script.

Códigos:
Todos los scripts a continuación requieren de un sólo argumento: La lista a la que queremos sacarle los datos.

Sumatoria:
[gml]
///ds_list_sumatory(list)
var list = argument0;
var count = 0;
for(var i = 0; i < ds_list_size(list); i++)
    count += real(list[| i]);
return count;
[/gml]

Mediana:
[gml]
///ds_list_median(list);
var _list = argument0;
var list = ds_list_create();
ds_list_copy(list, _list);

ds_list_sort(list, true);

var size = ds_list_size(list);
if size >= 1 {
    var iseven = (frac(size / 2)) == 0;
    var med;
   
    if (iseven) {
        med = (list[| (size/2) - 1] + list[| size/2]) / 2;
    }
    else {
        med = list[| (size-1) / 2];
    }
    ds_list_destroy(list);
    return med;
}
else return 0;
[/gml]

Moda:
[gml]
///ds_list_mode(list);
var list = argument0;
var indexes = ds_list_create();
var amounts = ds_list_create();

if ds_list_size(list) >= 1 {
    var i, a, b, c, d;
   
    for(i = 0; i < ds_list_size(list); i++) {
        a = list[| i];
        b = ds_list_find_index(indexes, a);
       
        if (b == -1) {
            ds_list_add(indexes, a);
            ds_list_add(amounts, 0);
        }
        else
            amounts[| b] ++;
    }
   
    c = 0;
   
    for(i = 0; i < ds_list_size(amounts); i++) {
        c = max(c, amounts[| i]);
        if (c == amounts[| i])
            d = i;
    }
   
    var index = indexes[| d];
    var first = amounts[| 0];
    b = true;
    for(i = 0; i < ds_list_size(amounts); i++) {
        a = amounts[| i]
        if a != first
            b = false;
    }
   
    if(b)
        index = undefined;
   
    ds_list_destroy(amounts);
    ds_list_destroy(indexes);
   
    return index;
}
else return 0;
[/gml]
Esta función devuelve la última de las modas, es decir que de una lista con los valores {1, 2, 3, 2, 4, 5, 3} se obtendrá la moda 3. Y si no hay moda (todos los valores con la misma frecuencia) devolverá <undefined>

Desviación estándar:
[gml]
///ds_list_standev(list);
var list = argument0;

var m = 0;
for(var i = 0; i < ds_list_size(list); i++) {
    m += list[| i];
}

m = m / max(ds_list_size(list), 1);

var a, b;
b = 0;
for(i = 0; i < ds_list_size(list); i++) {
    a = list[| i];
    a = a - m;
    b += power(a, 2);
   
}

b = b / max(1, ds_list_size(list));

return sqrt(b);
[/gml]

Espero le pueda ser de utilidad a alguien :D