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

796
Cita de: vitail en Febrero 12, 2015, 11:02:20 PM
Gracias ya entendi los whiles pero lo del

if(vsp < 10){}

aplica con -10 y 10?
Aplicaría con -10, porque -10 es menor a 10, pero 10 no es menor que 10, en este caso no aplicaría. Pero fíjate que la última línea de todo el código es

y += vsp

Así que en realidad no importa si aplica a 10 o valores mayores a 10, por que en ese momento, el jugador ya va cayendo hacia abajo (es decir, con gravedad), y en todos los plataformeros, siempre se impone un límite a la velocidad de caída. Eso hace el código del if, impone un límite a la velocidad de caída (después de 10, ya no se aumenta más vsp)
797
if(vsp < 10)
    {
        vsp += grav;//Esto no lo entiendo tanto la verdad
    }

Esto es la gravedad del personaje. La velocidad del salto es -7, pero no puedes hacer que salte por siempre hacia arriba, al momento de saltar, debe entrar en juego la gravedad para que vaya cayendo. A vsp(negativa) se le va sumando 0.5 de la gravedad, lo que va haciendo que en cada paso vsp sea -6.5, luego -6, luego -5.5, etc.

if(place_meeting(x + hsp,y,obj_solid))//Este y los whiles no los entiendo
{
    while(!place_meeting(x + sign(hsp),y,obj_solid))
    {
        x += sign(hsp)
    }
    hsp = 0;//Esto no entiendo pq esta aca ya que deberia de no poder moverse
}

Aquí el "truco" es que en el primer place_meeting se está usando x+hsp, que es lo mismo que (x + 5) para verificar si hay colisión contra la pared. Pero en el segundo place_meeting se usa (x + sign(hsp), que es lo mismo que (x+1) (en el caso de moverse a la derecha)

Suponiendo que se presiona la tecla DERECHA, lo que hace el código de arriba, en lenguaje simple es "si estoy a una distancia de 5 pixeles de la pared (a la derecha), voy verificando que no haya colisión a la derecha (de UNO EN UNO, PIXEL, POR PIXEL) y si no la hay, me voy moviendo (DE UNO EN UNO) hasta topar con la pared. Ojo que en el ciclo while, se pueden dar hasta 5 "pasitos", todos en el mismo STEP porque es un ciclo. Como al final, el código del ciclo ya movió al jugador hasta ponerlo exactamente junto a la pared, pues ya no tiene caso mover más al jugador, porque precísamente, ya llegó a la pared, por eso al final está la orden hsp = 0

La misma explicación de arriba se usa para la parte final del código, sólo que esa se usa para colocar al jugador sobre el piso, por eso usa  vsp e y  en lugar de hsp y x

Ah y la verdad, LA MISMA idea de este script se puede aplicar usando las "horribles" variables hspeed, vspeed y gravity y funcionaría igual.
798
Gracias por compartir los resultados, Mega G.

¿Puedo preguntar en qué consisten los 4000 objetos? ¿Son todos enemigos, items y NPCs? Al final, la máxima makera de usar los menos posibles objetos parece cierta, aunque cuando se habla de eso, siempre se trata de la ejecución del juego, y en este caso, el problema es en la carga, antes de que se comience a jugar.

105MB es una cantidad bastante corta y manejable a mi entender, no tengo idea de qué haga que cargar 60 mB se tarde 5 segundos y 105 MB se tarde más de dos minutos (aunque tampoco sé cuánta RAM libre tiene tu dispositivo, pero supongo que debería tener más de 100MB).
799
Cita de: woolf7 en Febrero 12, 2015, 07:55:02 AM
solo que el rebote vertical me falla un poco, en vez de rebotar hacia arriba o abajo se me dezplaza hacia los lados, no se cual es el error,
La condición del if no es correcta en los dos últimos casos:

if (obj_jefe.y < obj_nave.x){
   with(obj_nave){y+=64}


Del lado izquierdo del signo "menor que" se está evaluando Y, pero del lado derecho se está usando una variable X. Como decimos por acá, "es como comparar peras con manzanas". Fíjate que en las dos primeras condiciones sí se compara x con x de manera correcta.
800
Cita de: Mega G en Febrero 12, 2015, 02:04:24 AM
Después de asignar un grupo de textura a cada sprite (juntando los de cada tipo en plan: los de combates, los de mazmorras, los de gente de las ciudades y demás) y hacer grupos también para el sonido, no ha ocurrido absolutamente nada :(
Se supone que los grupos de textura deberían organizarse por nivel o room. Es decir, que lo ideal es que en un room/escenario/nivel GMS consulte la menor cantidad de páginas de textura. Entre más páginas consulte (lo que se conoce como texture swaps), el desempeño del juego se podrá ver afectado. Dicho de otra manera, lo que se DEBE EVITAR es que los recursos gráficos de un mismo nivel estén muy "fragmentados" o "dispersos" entre muchas páginas distintas.

No sé si así es como organizaste las páginas de textura y de todas formas, no sé cuánto podrá afectar o no para eliminar el problema.

Cita de: Mega G en Febrero 12, 2015, 02:04:24 AM
Para hacer otra prueba puedo borrar todos los objetos y dejar los justos para que cuando el juego cargue se pueda ver algo.
Creo que sería bueno que midieras el uso de CPU y de RAM usado por el juego en
a) La versión con pocos objetos
b) Ir agregando objetos y/o rooms para ver si se dispara el consumo de RAM o el de CPU o el de ambos y saber si lo provocan los objetos, los fondos, u otra cosa.

Voy mas a que es cuestión de RAM que de CPU, pero es sólo una suposición. ¿Será que los 4000 objetos afectan a pesar que se corre una sola habitación a la vez?
801
Interesante, parece entonces que GMS crea todas las páginas de textura del juego al comienzo, y parece que se trata de un proceso relativamente exigente(dependiendo del número de gráficos y su tamaño). De ser así, para los que andamos con la idea de hacer juegos medianos o grandes, sería casi obligatorio ponerse a ordenar grupos de texturas.

Bueno, al igual que Wadk, esperaré los resultados de las pruebas, Mega G. Ojalá sean buenos resultados.
802
Pues con razón no funciona. Deberías instalar la versión early access más reciente. Es gratuita y no tiene ninguna limitación para hacer juegos para windows. Yo no tengo GM8, tengo GM8.1, y me parece que los archivos no son compatibles. No sé si una versión gm81 te valga
803
No es necesario recurrir a más objetos. Sólo modificando el comportamiento de los objetos que ya existen, se puede hacer lo que buscas.

Se puede declarar una variable "espera" en el objeto master.

CREATE
[gml]espera = 0[/gml]

Cada objeto generado tendría su propia alarma de 20 steps, si tras cumplirse ese limite, el usuario no hizo click, pues se termina el juego, pero si el usuario sí hizo click, se hace
EVENTO MOUSE LEFT PRESSED de los objetos generados
[gml]if (obj_master.espera == false)
{
      obj_master.alarm[11] = 20              //Activar la alarma de espera del objeto master
      obj_master.generar = 0                   //No ejecutar el script de generación
}[/gml]

en ALARM[11] del objeto master:
[gml]
generar = 1
alarm[0] = 1
espera = 0
[/gml]

Cosas más, cosas menos, en esencia, en esto consistiría la modificación. El código para terminar el juego habría que sacarlo de la alarma[0] del objeto master pues esa alarma ya  sólo se encarga de generar objetos, y los propios objetos son los que revisan si se termina el juego o no.
804
Disculpa, no había visto que usas GM8 en lugar de studio. El ejemplo lo hice en la versión early access de GMS. Acabo de bajar el proyecto del enlace de arriba, y lo he probado en la versión 1.4.1522 de GMS y funciona sin problemas:
[spoiler][/spoiler]

¿Qué versión de GMS estás usando?
805
Preguntas y respuestas / Re:Cómo abro un fichero gmz?
Febrero 10, 2015, 08:01:36 PM
Cita de: kaliman777 en Febrero 10, 2015, 05:43:55 PM
Gracias Clamud, justo voy revisando un manual de GM Studio a ver cómo me va. Por ahora me tira errores en códigos que no le veo errores por ejemplo:
for (var j=0; i<5; j+=15)
Me dice error en el 0 de la j "expression or symbol no espected"

En el código, la variable j se declara como variable local dentro del mismo ciclo. Esto no se puede hacer en GM8.1 y anteriores, por lo que la declaración se debe hacer antes del ciclo
var j;
for (j=0; i<5; j+=15)
806
Aquí te dejo un ejemplo. El ejemplo está hecho de manera que cada 20 steps se genera un objeto al azar, y si el usuario no destruyó el objeto anterior, el juego lo destruye antes de crear el nuevo(No había visto que mencionaste que si el usuario deja pasar un objeto bueno, el juego se termina). No sé que función tiene el objeto X, yo le puse la misma función que el objeto D, es decir, los objetos D y X son malos, si les disparas, se termina el juego.

Todo el código de los if y el azar lo meti a un script, que se ejecuta en la alarma[0] del objeto master.
http://www.mediafire.com/download/tvi42d2421roc7o/Generacion_random.gmz

Para que el juego se termine si el usuario deja pasar un objeto bueno, hay que cambiar el código de la alarma de esto
[gml]
if  instance_exists(target)
{
    with (target)
        instance_destroy()
}[/gml]

a esto:[gml]
if  instance_exists(target)
{
    generar = 0
     muere = 1
}[/gml]
807
Esto debería servir:
[gml]
if instance_exists(obj_player)
   image_angle = point_direction(x, y, obj_player.x, obj_player.y)
[/gml]
808
Cita de: arcangelcaos en Febrero 09, 2015, 11:27:25 PM
Siento seguir dando el follón, pero se me a caído el mundo encima  :'( :'( :'(al no poder usar esos sprites. Pero es la propia admod  o google la que te cancela, o si no denuncia no te cancelan??
Si cojos eso sprites y los modifico algo, por ejemplo, les cambio el pelo, o les quito una bufanda, o les estilizo la espada, etcc. Pueden seguir denunciándome??
Llevo todo el día intentado encontrar algún programa que se me adapte a mi forma de dibujar, y nada.
No tengo idea si la compañia de videojuegos es la que inicia la denuncia o si es google. Me imagino que es la compañia de videojuegos, porque en principio google no puede saber si tienes el permiso de usar los sprites o no lo tienes. Estas son conjeturas mías, quizás no sea así. Y no, generalmente, si algo tiene copyrght, significa que no se puede modificar total o parcialmente sin consentimiento,

Sobre lo de usar huesos, no puedo darte sugerencias, ya que a mi no me gusta usar ese tipo de animación en gráficos 2D, pero en el enlace que puse arriba, algunos usuarios comentan que anime studio o after effects traen soporte para ese tipo de animaciones.

Edit: Acabo de recordar que hay un editor de sprites que trae soporte para huesos, y me parece que es más barato que anime studio o after effects

http://www.brashmonkey.com/
809
Cita de: DarkKRuleR en Febrero 09, 2015, 09:07:34 PM
Y lo más raro, esque las ocho son igual a la ÚLTIMA. Este código lo tengo en step, press tecla, para cambiar la textura

No es raro, es normal, eso es lo que hace tu código. Como en el último código que pusiste, no hay una orden para limpiar la surface antes de dibujar en ella, pues todo se dibuja empalmado, y sólo se ve lo último que se dibujó, que es la subimagen 7 (si es que esa subimagen ocupa toda la superficie del sprite y no tiene áreas transparentes)

Si todos los sprites son del mismo tamaño y todos tienen el mismo origen y todos son completamente opacos, entonces siempre se va a ver el último que se dibuje en la surface (antes de dibujar la surface en draw).


Creo que ya sé lo que está pasando y ya  recordé por qué te mencioné que usaras el debugger para ver el id de la textura. Quizás me equivoque, pero el problema es que estás usando la función
surface_get_texture(surface_id); Cada que dibujas algo en la textura, usas distintas variables para almacenar el ÍNDICE de la textura. Tú vas dibujando distintas cosas en la surface, pero lo que se guarda en esas variables ES SIEMPRE LO MISMO, EL ÍNDICE DE TEXTURA, QUE SIEMPRE ES LA MISMA TEXTURA, POR LO TANTO LAS 8 VARIABLES CONTIENEN UN PUNTERO (COMO LO INDICA EL MANUAL) QUE ES EL MISMO SIEMPRE, Y CUANDO USAS ESE PUNTERO EN DRAW, SE DIBUJA LO MISMO, ES DECIR, LO ÚLTIMO QUE SE DIBUJÓ EN LA TEXTURA.


Solución (SI ES QUE MI RAZONAMIENTO ESTÁ BIEN): no guardar un puntero en las variables, guardar una textura distinta en cada una.

810
Pero (si es que no me equivoco) no se puede. El código que pusiste no usa lista alguna, usa un arreglo carton[i,j]. Por lo que no es posible usar ds_list_sort. O para usarlo, se tendrían que volcar los valores del arreglo a una lista y ya después usar ds_list_sort.

Aquí dejo un ejemplo del cartón bingo. Cada que se hace click izquierdo, se generan nuevos números. No sé si es así como lo querías, pero así yo entendí: que los números fueran aleatorios, pero que el número de la casilla siguiente siempre fuera mayor al de la casilla anterior.
http://www.mediafire.com/download/bcpb7wh9eby2j7h/bingo.gmz

Para volcar los valores de un arreglo a la lista:
[gml]
var i,j;
for (j=0; j<3; j+=1)
{
    for (i=0; i<5; i+=1)
    {
        ds_list_add(lista_bingo, carton[i, j])
    }
}[/gml]
En este caso, el arreglo es de 3 renglones X 5 columnas, pero cambiando los valores se ajustaría a cualquier tablero/arreglo bidimensional