Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

Fog of War + Lights [VXA]

Ver el tema anterior Ver el tema siguiente Ir abajo

Fog of War + Lights [VXA]

Mensaje por newold el 2016-03-09, 20:05

Con este script se consigue focos de luz personalizados (el mapeado no se ve, solo se ve donde haya focos de luz) o niebla de guerra (el mapa está cubierto y se va revelando con forme anda)

Esta es una versión preliminar, testearla y comentarme si veis fallos.

Para portar el script a otro proyecto, copiar la carpeta Files a la raiz de vuestro proyecto y en la carpeta Graphics crear una nueva carpeta que se llame Lights y ahí metereis vuestras luces. también teneis que añadir a vuestro proyecto el script que se llama Lights

Las instrucciones están dentro del script y lo que podeis configurar empieza en la línea 177

El proyecto esta hecho en rpg maker vx ace, no se si funcionará sin hacer ningún cambio en vx, para xp hay que tocar algunas cosas para hacerlo compatible

Demo:

http://www.mediafire.com/download/zwmy1g30f4wg4f2/Lights.rar

Preview (en imagenes iba a hacer un video pero de momento os conformáis con imágenes :D)
[



Para los interesados dejo el código de la dll:

Código:

// --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#include <cstdlib>
#include <ctime>
#include <ctype.h>
#define _USE_MATH_DEFINES
#include <math.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <windows.h>
#include <time.h>
// --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#define RGSSApi extern "C" __declspec(dllexport)
#define ChannelBlend_Normal(A,B)     ((int)(A))
#define ChannelBlend_Lighten(A,B)    ((int)((B > A) ? B:A))
#define ChannelBlend_Darken(A,B)     ((int)((B > A) ? A:B))
#define ChannelBlend_Multiply(A,B)   ((int)((A * B) / 255))
#define ChannelBlend_Average(A,B)    ((int)((A + B) / 2))
#define ChannelBlend_Add(A,B)        ((int)(min(255, (A + B))))
#define ChannelBlend_Subtract(A,B)   ((int)((A + B < 255) ? 0:(A + B - 255)))
#define ChannelBlend_Difference(A,B) ((int)(abs(A - B)))
#define ChannelBlend_Negation(A,B)   ((int)(255 - abs(255 - A - B)))
#define ChannelBlend_Screen(A,B)     ((int)(255 - (((255 - A) * (255 - B)) >> 8)))
#define ChannelBlend_Exclusion(A,B)  ((int)(A + B - 2 * A * B / 255))
#define ChannelBlend_Overlay(A,B)    ((int)((B < 128) ? (2 * A * B / 255):(255 - 2 * (255 - A) * (255 - B) / 255)))
#define ChannelBlend_SoftLight(A,B)  ((int)((B < 128)?(2*((A>>1)+64))*((float)B/255):(255-(2*(255-((A>>1)+64))*(float)(255-B)/255))))
#define ChannelBlend_HardLight(A,B)  (ChannelBlend_Overlay(B,A))
#define ChannelBlend_ColorDodge(A,B) ((int)((B == 255) ? B:min(255, ((A << 8 ) / (255 - B)))))
#define ChannelBlend_ColorBurn(A,B)  ((int)((B == 0) ? B:max(0, (255 - ((255 - A) << 8 ) / B))))
#define ChannelBlend_LinearDodge(A,B)(ChannelBlend_Add(A,B))
#define ChannelBlend_LinearBurn(A,B) (ChannelBlend_Subtract(A,B))
#define ChannelBlend_LinearLight(A,B)((int)(B < 128)?ChannelBlend_LinearBurn(A,(2 * B)):ChannelBlend_LinearDodge(A,(2 * (B - 128))))
#define ChannelBlend_VividLight(A,B) ((int)(B < 128)?ChannelBlend_ColorBurn(A,(2 * B)):ChannelBlend_ColorDodge(A,(2 * (B - 128))))
#define ChannelBlend_PinLight(A,B)   ((int)(B < 128)?ChannelBlend_Darken(A,(2 * B)):ChannelBlend_Lighten(A,(2 * (B - 128))))
#define ChannelBlend_HardMix(A,B)    ((int)((ChannelBlend_VividLight(A,B) < 128) ? 0:255))
#define ChannelBlend_Reflect(A,B)    ((int)((B == 255) ? B:min(255, (A * A / (255 - B)))))
#define ChannelBlend_Glow(A,B)       (ChannelBlend_Reflect(B,A))
#define ChannelBlend_Phoenix(A,B)    ((int)(min(A,B) - max(A,B) + 255))
#define ChannelBlend_Alpha(A,B,O)    ((int)(O * A + (1 - O) * B))
#define ChannelBlend_AlphaF(A,B,F,O) (ChannelBlend_Alpha(F(A,B),A,O))
// --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

// --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Rect RGSS (rect.__id__ = object)
// RECTSTRUCT * rect = ((RGSSRECT*)(object<<1))->rectvars;
// --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
typedef struct {
 DWORD unka;
 DWORD unkb;
 DWORD x; // x rect
 DWORD y; // y rect
 DWORD width; // width rect
 DWORD height; // height rect
}RECTSTRUCT;
typedef struct {
 DWORD flags;
    DWORD klass;
    void (*dmark) (void*);
    void (*dfree) (void*);
    RECTSTRUCT * rectvars;
} RGSSRECT;
// --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Color RGSS (method 1) (color.__id__ = object)
// RGSSCOLOR *color = ((RGSSCOLOR*)(object << 1));
// color->data[1] = red, color->data[2] = green, color->data[3] = blue, color->data[0] = alpha
// --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
typedef struct {
 DWORD flags;
 DWORD klass;
 void(*dmark) (void*);
 void(*dfree) (void*);
 double *data; //red is index 1, green is index 2, blue 3, alpha 0
} RGSSCOLOR;
// --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Bitmap RGSS (method 1) (bitmap.__id__ = object)
// RGSSBMINFO *bitmap = ((RGSSBITMAP*)(object << 1))->bm->bminfo;
// --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
typedef struct{
 DWORD unk1;
 DWORD unk2;
 BITMAPINFOHEADER *infoheader;
 RGSSCOLOR *firstRow;
 RGBQUAD *lastRow;
} RGSSBMINFO;
typedef struct{
 DWORD unk1;
 DWORD unk2;
 RGSSBMINFO *bminfo;
} BITMAPSTRUCT;
typedef struct{
 DWORD flags;
 DWORD klass;
 void(*dmark) (void*);
 void(*dfree) (void*);
 BITMAPSTRUCT *bm;
} RGSSBITMAP;
// --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Color RGSS (method 2)
// RGSSRGBA *color = ((RGSSRGBA*)(object << 1));
// color->red = red, color->green = green, color->blue = blue, color->alpha = alpha
// --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
typedef struct {
 unsigned char red;
 unsigned char green;
 unsigned char blue;
 unsigned char alpha;
} RGSSRGBA;
// --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Bitmap RGSS (method 2)
// --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
typedef struct{
    DWORD unk1;
    DWORD unk2;
    BITMAPINFOHEADER *infoheader;
    RGSSRGBA *firstRow;
    RGSSRGBA *lastRow;
} RGSSBMINFO2;
typedef struct{
    DWORD unk1;
    DWORD unk2;
    RGSSBMINFO2 *bminfo;
} BITMAPSTRUCT2;
typedef struct{
    DWORD flags;
    DWORD klass;
    void (*dmark) (void*);
    void (*dfree) (void*);
    BITMAPSTRUCT2 *bm;
} RGSSBITMAP2;
// --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Table RGSS (table.__id__ = object)
// TABLESTRUCT * table = ((TABLEDATA*)(object<<1))->tablevars;
// --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
typedef struct {
 DWORD unka; //0
 DWORD unkb; //0
 DWORD dimensions; // # of parameters
 DWORD xsize; // xsize
 DWORD ysize; // ysize (returns 1 if not specified)
 DWORD zsize; // zsize (returns 1 if not specified)
 DWORD total_elements; // xsize * ysize * zsize
 INT16 * data; // 1-D Array, where [x,y,z] can be found at index [x+(y*xsize)+(z*xsize*ysize)]
}TABLESTRUCT;
typedef struct {
 DWORD unk1;
 DWORD classname; // I think?
 DWORD unk3;
 DWORD unk4;
 TABLESTRUCT * tablevars;
}TABLEDATA;
// --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

// --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
int Blend(int type, int a, int b){
 switch (type) {
 case 1:
 return ChannelBlend_Lighten(a,b);
 case 2:
 return ChannelBlend_Darken(a,b);
 case 3:
 return ChannelBlend_Multiply(a,b);
 case 4:
 return ChannelBlend_Average(a,b);
 case 5:
 return ChannelBlend_Add(a,b);
 case 6:
 return ChannelBlend_Subtract(a,b);
 case 7:
 return ChannelBlend_Difference(a,b);
 case 8:
 return ChannelBlend_Negation(a,b);
 case 9:
 return ChannelBlend_Screen(a,b);
 case 10:
 return ChannelBlend_Exclusion(a,b);
 case 11:
 return ChannelBlend_Overlay(a,b);
 case 12:
 return ChannelBlend_SoftLight(a,b);
 case 13:
 return ChannelBlend_HardLight(a,b);
 case 14:
 return ChannelBlend_ColorDodge(a,b);
 case 15:
 return ChannelBlend_ColorBurn(a,b);
 case 16:
 return ChannelBlend_LinearDodge(a,b);
 case 17:
 return ChannelBlend_LinearBurn(a,b);
 case 18:
 return ChannelBlend_LinearLight(a,b);
 case 19:
 return ChannelBlend_VividLight(a,b);
 case 20:
 return ChannelBlend_PinLight(a,b);
 case 21:
 return ChannelBlend_HardMix(a,b);
 case 22:
 return ChannelBlend_Reflect(a,b);
 case 23:
 return ChannelBlend_Glow(a,b);
 case 24:
 return ChannelBlend_Phoenix(a,b);
 case 25:
 return ChannelBlend_Alpha(a,b,255);
 case 26:
 return b;
 }
}
// --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


// --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
RGSSApi BOOL draw_light2(long object, long lights_size, long *lights, long *rects,int *blend_type, int background_color){
 RGSSBMINFO *bitmap = ((RGSSBITMAP*)(object << 1))->bm->bminfo;
 RGSSCOLOR *color = ((RGSSCOLOR*)(background_color << 1));
 DWORD rowsize, srcrowsize, width, height, srcwidth, srcheight;
 LPBYTE row, srcrow;
 int x,y,i,blend;
 if (!bitmap) return false;
 width = bitmap->infoheader->biWidth;
 height = bitmap->infoheader->biHeight;
 rowsize = width * 4;
 for (i = 0; i < lights_size; i++) {
 RGSSBMINFO *src = ((RGSSBITMAP*)(lights[i] << 1))->bm->bminfo;
 RECTSTRUCT *rect = ((RGSSRECT*)(rects[i]<<1))->rectvars;
 blend = blend_type[i];
 srcrow = (LPBYTE)(src->firstRow);
 srcwidth = src->infoheader->biWidth;
 srcheight = src->infoheader->biHeight;
 srcrowsize = srcwidth * 4;
 for (y = 0; y < srcheight; y++) {
 LPBYTE thissrcrow = srcrow;
 for (x = 0; x < srcwidth; x++) {
 if (((x + rect->x >= 0 and x + rect->x < width) or (x + rect->x < 0 and x + rect->x + srcwidth > 0)) and
 ((y + rect->y >= 0 and y + rect->y < height) or (y + rect->y < 0 and y + rect->y + srcheight > 0)))
 {
 LPBYTE thisrow = (LPBYTE)(bitmap->firstRow);
 thisrow += (x + rect->x) * 4;
 thisrow -= rowsize * (y + rect->y);
 // ---------------------------------------------------------------------------------------------------
 // Blend code
 // ---------------------------------------------------------------------------------------------------
 if (blend == 0) {
 if (255 - thissrcrow[3] < thisrow[3]) {
 thisrow[3] = 255 - thissrcrow[3];
 thisrow[0] = Blend(3,thisrow[0],thissrcrow[0]);
 thisrow[1] = Blend(3,thisrow[1],thissrcrow[1]);
 thisrow[2] = Blend(3,thisrow[2],thissrcrow[2]);
 }
 }
 else {
 if (thissrcrow[3] > 5) {
 thisrow[0] = Blend(blend,thisrow[0],thissrcrow[0]);
 thisrow[1] = Blend(blend,thisrow[1],thissrcrow[1]);
 thisrow[2] = Blend(blend,thisrow[2],thissrcrow[2]);
 if (blend == 26) thisrow[3] = thissrcrow[3];
 else if (255 - thissrcrow[3] < thisrow[3]) thisrow[3] = 255 - thissrcrow[3];
 }
 }
 // ---------------------------------------------------------------------------------------------------
 }
 thissrcrow += 4;
 }
 srcrow -= srcrowsize;
 
 }
 }
}
// --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
avatar
newold
Principiante
Principiante

0/3

Créditos 1235

Gracias : 119

Volver arriba Ir abajo

Re: Fog of War + Lights [VXA]

Mensaje por Dariel Lopez el 2016-03-09, 22:59

Probé la demo y se ven muy bien los tres efectos de luces que pusiste, pero al tratar de abrir el menú de opciones del juego ocurre este error:
Script 'Lights' line 574: NoMethodError ocurred.
undefined method 'dispose' for nil:NilClass
Pero si desactivo la niebla de guerra se soluciona el error.
avatar
Dariel Lopez
Veterano
Veterano

0/3

Créditos 689

Gracias : 38

Volver arriba Ir abajo

Re: Fog of War + Lights [VXA]

Mensaje por newold el 2016-03-10, 09:07

Gracias por el informe. Me faltó una condición en esa línea y por eso salta el error, se soluciona cambiando donde pone

Código:
def dispose
      @sprite.bitmap.dispose
      @sprite.dispose
    unless @sprite_fog.nil?
      @sprite_fog.bitmap.dispose
      @sprite_fog.dispose
    end
    @cache.each_value {|bitmap| bitmap.dispose}
  end

a

Código:
def dispose
    unless @sprite.nil?
      @sprite.bitmap.dispose unless @sprite.bitmap.nil?
      @sprite.dispose
    end
    unless @sprite_fog.nil?
      @sprite_fog.bitmap.dispose unless @sprite_fog.bitmap.nil?
      @sprite_fog.dispose
    end
    @cache.each_value {|bitmap| bitmap.dispose}
  end

link actualizado con la versión del demo corregida en el post principal.
avatar
newold
Principiante
Principiante

0/3

Créditos 1235

Gracias : 119

Volver arriba Ir abajo

Re: Fog of War + Lights [VXA]

Mensaje por orochii el 2016-03-10, 13:13

Newold, lo has vuelto a hacer (aunque qué pasó con el engine aquel de plataformas con gráficos de Symphony of the Night? <\3).

Cuando pueda lo pruebo un rato y digo cómo me va.

Salir!
avatar
orochii
Reportero

0/3

Créditos 7724

Gracias : 436

Volver arriba Ir abajo

Re: Fog of War + Lights [VXA]

Mensaje por Bleuw el 2016-03-10, 20:56

Probé la demo. Y no sé si tengo que configurar algo y no me estoy fijando, pero no veo que la fogata, la cueva o la piedra iluminen.
A lo mejor me estoy comiendo algo que no veo, pude ser. Pero como sea. Te dejo la foto acá.

Spoiler:
avatar
Bleuw
Aventurero
Aventurero

0/3

Créditos 2036

Gracias : 114

Volver arriba Ir abajo

Re: Fog of War + Lights [VXA]

Mensaje por Dariel Lopez el 2016-03-10, 22:25

Para que los efectos de luces sean visibles hay que desactivar la niebla Bleuw como lo especifica el script en la línea 187: ¡¡¡CUIDADO!!! LOS MAPAS CON NIEBLA DE GUERRA DESACTIVAN LAS LUCES.
Por ejemplo solo borra de la línea 188 el mapa 1 que es el que viene en la demo y ya funcionará.
avatar
Dariel Lopez
Veterano
Veterano

0/3

Créditos 689

Gracias : 38

Volver arriba Ir abajo

Re: Fog of War + Lights [VXA]

Mensaje por Bleuw el 2016-03-10, 22:29

Ah, gracias, eso por abrirlo sin mirar bien el editor xD

No dije nada entonces.
avatar
Bleuw
Aventurero
Aventurero

0/3

Créditos 2036

Gracias : 114

Volver arriba Ir abajo

Re: Fog of War + Lights [VXA]

Mensaje por orochii el 2016-03-11, 14:30

Bueno pues, lo he probado. He hecho lo común, salvar, cargar, abrir otra escena.

El fog actual se borra al abrir el menú o cualquier cosa que suponga cambiar de escena, nada más es que me imagino andar por ahí en un laberinto explorando todo, abrir el menú para curarse, y perder todo el progreso. Aparte de eso pues está genial :^D.

Puedo decir que el impacto en performance parece ser cercano a cero. El VX Ace me corre igual de lento que siempre, xD!.

Salut!
avatar
orochii
Reportero

0/3

Créditos 7724

Gracias : 436

Volver arriba Ir abajo

Re: Fog of War + Lights [VXA]

Mensaje por newold el 2016-03-11, 19:39

ya he corregido ese fallo que mencionas orochii pero aún no he subido la versión corregida. Espero tenerlo mañana junto con un nuevo addon (linterna). Por último intentaré implementar sombras a ver que tal el perfomance con ellas :). el uso externo de la dll da un buen perfomance, con las luces activas mostrando 3 a la vez de 460x460 a mi me va a 60 frames
avatar
newold
Principiante
Principiante

0/3

Créditos 1235

Gracias : 119

Volver arriba Ir abajo

Re: Fog of War + Lights [VXA]

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.