¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.
Conectarse

Recuperar mi contraseña

Temas importantes
----------------------------------------
Páginas con recursos RPG Maker
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
Afiliados
Estadísticas
Tenemos 3858 miembros registrados.
El último usuario registrado es fabianvcpz.

Nuestros miembros han publicado un total de 83028 mensajes en 11788 argumentos.
Navega con Google Chrome
[DESCARGA]

Vuelta fugaz!!

Ver el tema anterior Ver el tema siguiente Ir abajo

Vuelta fugaz!!

Mensaje por newold el 2013-06-24, 15:30

Que pasa maqueros. Estoy de vuelta fugazmente y os traigo algunas novedades de que estoy desarrollando ahora ;). Os lo dejo en un par de vídeos (disculpar por la calidad del segundo, que al ponerlo en pantalla completa se ve que no se grabó del todo bien).



El script de colisiones me resulta algo lento y me gustaría portarlo a c en una dll a ver si aumenta la velocidad de cálculo. no se si podeis echar una mano con unas dudas que tengo:

1 - ¿Cómo paso un valor decimal a la función de cálculo de la dll? En el rpg maker no me deja usar parámetros como d (double) o f (float) en la llamada Win32API a la función de la dll. Intenté una función simple de sumar dos números en c

Código:
DLLIMPORT suma (double a, double b)
{
    float a2, b2;
    return (a+b);
}

pero si hago desde el maker que me sume por ejemplo 10.5 + 1 me devuelve de resultado 11 en vez de 11.5. la dll en el maker la llamo así:
Código:
# en vez de l debería ser d o f pero da error si se usa esos parámetros
dll = Win32API.new("miDLL","suma",'ll','l')
dll.call(10.5,1) # => 11



2 - En el script uso puntos para definir las coordenadas


Código:
# ==============================================================================
class Point # by Newold
  #--------------------------------------------------------------------------
  attr_accessor   :x
  attr_accessor   :y
  #--------------------------------------------------------------------------
  def initialize(x=0,y=0)
    @x = x; @y = y
  end
  #--------------------------------------------------------------------------
end
# ==============================================================================


¿Podría pasar el punto a la función de la dll? ¿Cómo? en la dll he definido una struct para tratarla como un punto


Código:
struct point
{
    double x;
    double y;
};


se que podría convertir el punto en dos valores y pasarlos a la dll pero me gustaría pasar el punto como tal sin hacer ningún cálculo antes.


La idea es esa, codificar los cálculos de colisiones en c en la dll para ver si aumenta el rendimiento y ponerme ha crear el shooter, que sería un shooter Base para poder usarlo y crear otros. En realidad muchas colisiones se pueden calcular de formas más básicas (están añadidas en el script de colisión) pero por ejemplo un rayo láser que viaje de x a y con una inclinación m tendría que usar los cálculos más tochos del script de colisión para determinar quién o qué es alcanzado por éste (ver imágen de abajo)

avatar
newold
Principiante
Principiante

0/3

Créditos 1083

Gracias : 66

Volver arriba Ir abajo

Re: Vuelta fugaz!!

Mensaje por Wecoc el 2013-06-24, 16:57

Realmente usar dll hace que vaya más rápido, puedes estar seguro de ello, pero no se hasta qué punto es necesario. Quiero decir... usando 250 sprites en pantalla te iba un poco más lento pero no mucho, y te pregunto ¿de verdad necesitarás en algún momento poner tantos? Con 50 funcionaba perfecto y 50 sprites ya dan para mucho xDD A ver yo estoy un poco en contra de usar dll porque queda el código como más cerrado dentro del maker (da menos libertad de modificar) y porque por alguna extraña razón a veces no funcionan a todo el mundo. Pero bueno eso cada uno lo ve como quiere...

Luego sobre tus dudas no sabría muy bien cómo resolverlas porque yo solo controlo RGSS y lo justo xD lo que me sorprende es lo que dices del 10.5 + 1 = 11, yo mismo lo probé y daba 11.5. En general siempre que en una operación está implicado un float, el resultado es también un float, a no ser que le pongas luego .to_i o .to_int
avatar
Wecoc
Administrador
Administrador



Créditos 8946

Gracias : 434

Volver arriba Ir abajo

Re: Vuelta fugaz!!

Mensaje por newold el 2013-06-24, 17:26

10.5 + 1 si que da 11.5, pero si intento pasar esos valores a la dll para que los sume me devuelve 11, ya que los pasa como enteros (10 + 1) y no se como hacerle para pasarle decimales.

Te aclaro lo de las colisiones, puede que parezca que va bien con 50 sprites, pero no es el único cálculo que se haría en el shooter y no son los únicos sprites en pantalla. Pongamos que empieza a salir enemigos andando por la pantalla que estarían chequeando a cada frame si están cerca tuyo para atacarte. le ponemos un tope de 50 enemigos a la vez. Ahora habría que añadir balas que serían disparadas por el prota, cada bala tiene que comprobar colisión con cada enemigo en pantalla. podríamos añadir además que algún tipo de enemigo disparara balas contra el prota, más sprites para chequear. Además, al matar enemigos pueden salir x cantidad de monedas de oro y/o armas. Cada una de estas monedas/armas deberían comprobar la proximidad del prota a cada frame para ser "cogidas" por éste. Ahí tenemos un montón de sprites a la vez chequeando cada uno coordenadas y diferentes tipos de iteraciones de cada sprite (que si ataca, si es golpeado, si anda...), y si le dejo los cálculos al script del maker empiezan a caer los frames que da gusto :) por eso la idea de pasarlo a la dll, pero si no encuentro la forma de pasar decimales a la dll no saldrían los cálculos acertados :(.

Quiero añadir un tope de 50 enemigos a la vez, 30 balas del prota a la vez, 10-20 balas de enemigos, entre 50 y 100 items caidos en el suelo (monedas de oro y armas). Así que sumando me puedo plantar en 200 sprites y a ese nivel el maker se resiente thumbdown
avatar
newold
Principiante
Principiante

0/3

Créditos 1083

Gracias : 66

Volver arriba Ir abajo

Re: Vuelta fugaz!!

Mensaje por orochii el 2013-06-25, 00:12

En el primer caso, es posible que el problema sea por los argumentos, mira ésto a ver si te resuelve algo (según leí, hay diferencia entre l y L por ejemplo).
http://stackoverflow.com/questions/3327430/in-rubys-win32api-new-isnt-l-the-same-as-i-and-what-about-n-or-p

El segundo caso... creo que sería mejor pasar los parámetros, y que los coja un constructor al otro lado, haga los cálculos con la clase, y te tire el resultado de vuelta. No estoy seguro si se podrán pasar clases de un lado a otro (para pasar un string ya es suficiente lío xD).
Aunque, hablando del string, se podría hacer parecido. Que es pasando un puntero. Quizá explote xD, quiza no.

Salut,
OZ
avatar
orochii
Caballero Shiro
Caballero Shiro

0/3

Créditos 6333

Gracias : 318

http://ragnarokrproject.com/

Volver arriba Ir abajo

Re: Vuelta fugaz!!

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


Permisos de este foro:
No puedes responder a temas en este foro.