Menú

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.

Menú Mostrar Mensajes

Mensajes - Clamud

#1
Hola.
¿Borraste tu mensaje o es un bug del foro? Ya no se ve el texto que estaba antes.

Puedes guardar el id de la instance que debe seguir (tal vez en un evento de colisión)
// Create
inst_seguir = noone;

// Colision
inst_seguir = other.id;

// Step
if instance_exists(inst_seguir) {
    direction = point_direction(x, y, inst_seguir.x, inst_seguir.y);
    speed = 4;
}
else {
    speed = 0;
}
#2
No entendí bien lo que quieres lograr. ¿Es como una barra de carga circular?
#3
Hola. Hice un script para calcular la posición y la velocidad  final de un objeto que se mueve con aceleración contante. Puede servir para resolver este problema.

[spoiler]
[gml]
/// array = acelerar( xi, vi, a, t, vm );
// Devuelve un array con posicion final y velocidad final

var xi = argument0; //posicion inicial
var vi = argument1; //velocidad inicial
var a = argument2; //aceleracion (debe ser positiva)
var t = argument3; //tiempo transcurrido (debe ser positivo)
var vm = argument4; //velocidad meta, es la velocidad a la que se debe acercar
var d; //desplazamiento
var v; //velocidad final
var r; //resultado
//var x; //posicion final

a *= sign(vm - vi); //signo de la aceleracion
//si v meta es mayor a v inicial, a es positiva
//si v meta es menor a v inicial, a es negativa
//si v meta es igual a v inicial, a es cero

v = vi + (a * t); //velocidad final

// si la velocidad rebasa la meta
if (abs(v - vi) > abs(vm - vi)) {
   var t1 = (vm - vi) / a; //tiempo en el que alcanza el limite
   var t2 = t - t1; //tiempo restante
   var d1 = (vi * t1) + (a * t1 * t1 / 2); //desplazamiento en el primer perido
   var d2 = vm * t2; //desplazamiento en el segundo periodo
   d = d1 + d2; //desplazamiento total
   v = vm; //velocidad final = velocidad meta
}
// si v no rebasa la meta
else d = (vi * t) + (a * t * t / 2); //desplazamiento

r[0] = xi + d; //posicion final
r[1] = v; //velocidad final
return r; //devolver resultado
[/gml]
[/spoiler]
Referencias:
https://es.wikipedia.org/wiki/Movimiento_parabólico
http://hyperphysics.phy-astr.gsu.edu/hbasees/acons.html

El script requiere 5 parámetros
xi: Posición inicial (donde inicial el movimiento)
vi: Velocidad inicial (la velocidad que lleva el objeto)
a: Aceleración (en este caso el valor de la gravedad)
t: Tiempo transcurrido (en este caso delta)
vm: Velocidad meta (para limitar la velocidad)

El script podría funcionar solo con los 4 primeros parámetros, pero en los plataformeros es necesario limitar la velocidad vertical, de lo contrario la velocidad incrementaría demasiado a causa de la gravedad. Si se mueve muy rápido podrá atravesar el piso.
La velocidad se limita dentro del script para asegurar que el desplazamiento nunca se calcule con velocidades mayores al límite.

Tu código podría quedar de esta manera (Es probable que debas modificar algunas cosas)
[gml]
//Create
delta = 0; //declarar delta, el valor se calcula en Step o Begin Step
g = 0; //gravedad, se activa cuando no hay piso
vv = 0; //velocidad vertical
vvl = 8; //velocidad vertical limite
d = 0; //desplazamiento
//dir = 0;

//Step
if(place_free(x,y+1)) { //si no hay piso
    g = 0.4; //activar la gravedad
}
else {
    g = 0; //desactivar gravedad
}
//calcular desplazamiento y velocidad provocadas por la gravedad
r = acelerar(y, vv, g, delta, vvl);
d = r[0] - y; //desplazmiento total
vv = r[1];

//mover pixel por pixel hasta colisionar
repeat (abs(d)) {
    if(place_free(x, y + sign(vv))) {
        y = y + sign(vv);
    } else {
        vv = 0;
        break;
    }
}

// saltar
if (keyboard_check_pressed(vk_space)) vv = -12;

//Begin Step
delta = (delta_time / 1000000) * 60; //calcular delta
[/gml]

Aquí puedes ver un ejemplo de funcionamiento del script. Presiona espacio para cambiar los fps. A veces debes hacer clic en Reload para que funcione correctamente.
#4
Las variables simples y los arrays se borran automáticamente.
Pero debes borrar las estructuras de datos que ya no vas a utilizar y ocupan un espacio de memoria independiente de las instancias, como ds_list (y otras ds_*), surfaces, modelos 3D, etc.
#5
Tal vez no estás borrando las instancias u otros datos que generas durante la ejecución del juego. Usa el debugger para ver con detalle las instancias.
Para optimizar un poco puedes cambiar algunas instancias por partículas.

Sí me he preguntado cómo hacer object pooling, pero no lo he implementado. Nunca he creado algo en GM que genere muchas instancias, pero sí hice una prueba de plataformero con usa sola instancia.
Una forma de implementar el pooling puede ser esta: Las instancias que no tienen un comportamiento complejo pueden cambiarse por una instancia que guarda los valores en ds_lists o en otras estructuras de datos. Usa loops para ir modificando todas las variables y para dibujar los sprites correspondientes a cada "instancia" personalizada.
#6
Normalmente GM8.1 deja de funcionar después de unos minutos de uso. Lo que hago es cerrarlo y abrirlo otra vez. ¿A tí nunca te funciona?
#7
Hola. Hice un ejemplo en GMLive.
La idea es usar la función make_color_hsv para obtener un color que varía ligeramente en cada step.
En el ejemplo se asigna background_color, pero también se puede dibujar un imagen con el color cambiado.
[gml]
// Create
room_speed = 60;
background_colour = c_black;

hue1 = 0; //rojo
hue2 = 64; //verde
delta = 0.5; //cambio en cada step
nuevoHue = hue1; //inicia en rojo

// Step
//calcular nuevo hue
nuevoHue += delta; //sumar delta
if (nuevoHue > hue2) {//no rebasar este valor
    nuevoHue = hue2;
    delta *= -1; //invertir dirección
}
if (nuevoHue < hue1) {//no rebasar este valor
    nuevoHue = hue1;
    delta *= -1; //invertir dirección
}

// hacer nuevo color
kolor = make_colour_hsv(nuevoHue, 200, 255);
background_colour = kolor;
[/gml]
#8
Puedes usar la función collision_line
#9
Preguntas y respuestas / Re: Guardar partidas
Septiembre 16, 2021, 07:46:02 PM
Puedes usar un objeto que revise en una alarma si la música está sonando

https://manual.yoyogames.com/#t=Drag_And_Drop%2FDrag_And_Drop_Reference%2FAudio%2FIf_Audio_Is_Playing.htm
#10
¿Cómo funciona ese script que está usando?
#11
Preguntas y respuestas / Re: instancias sonido
Septiembre 08, 2021, 05:04:08 AM
Debes guardar el id de la instancia de audio y detener solo esa instancia
[gml]
audioInst = audio_play_sound(sonido, 1, false);
audio_stop_sound(audioInst);
[/gml]
#12
El mensaje de error indica que se está leyendo un valor undefined, es decir, que no has escrito un valor en la posición de la grid que quieres leer
#13
Preguntas y respuestas / Re: enemigo que vuele
Agosto 27, 2021, 05:45:10 PM
Recordé un artículo sobre hacer la animación de moscas volando usando curvas de Lissajous (pero no pude encontrar el artículo). La misma técnica se puede aplicar aquí.
https://es.wikipedia.org/wiki/Curva_de_Lissajous

El murciélago sigue su trayectoria alrededor de un punto central, y el punto central a su vez sigue al jugador.
Hice un ejemplo en GMLive.
#14
Preguntas y respuestas / Re: render final
Agosto 05, 2021, 03:55:42 AM
#15
Existen muchas formas de programar ese comportamiento. Algunas ideas las puedes obtener de la competencia GIA_01
https://www.comunidadgm.org/guerra-de-ias-(gia)/gia_01-la-carrera-de-los-droides/

La complejidad del código depende de la complejidad de las rutas que debe seguir el personaje. Muestra ejemplos de los nivles.

Puedes encontrar muchos artículos en internet buscando "platformer pathfinding". Aquí hay algunas ideas
https://zackbellgames.com/2015/02/16/pathfinding-pt-2/
Powered by EzPortal
SMF spam blocked by CleanTalk