Mundo Maker
¡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 3766 miembros registrados.
El último usuario registrado es stranger2525.

Nuestros miembros han publicado un total de 85792 mensajes en 12216 argumentos.

[XP] Transition Updater

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP] Transition Updater

Mensaje por Wecoc el 2017-01-25, 04:49

Transition Updater es un script que reescribe el método con el que el RPG maker XP carga las transiciones. Para ello requiere dos pequeñas DLL en la carpeta principal del proyecto.

La diferencia entre usar la transición por defecto y usar la nueva es que la nueva updatea la escena destino durante la transición. No sé si os habréis percatado alguna vez en que al cambiar de mapa o al ir al menú o a cualquier escena, todo queda parado durante un momento. De hecho se nota especialmente al volver de la escena; se ven los eventos, el clima y la fog congelados hasta que la transición termina. Con ésta versión de Transition adiós problema. Lo que sí se congela es la escena previa, a eso no le veo arreglo, pero en ese caso no suele molestar tanto que se pare. Si a álguien se le ocurre algún modo puede probar de ampliar el sistema.

Podéis activar o desactivar esa opción a medio juego usando:
$game_temp.transition_update = true # Activa la transición por DLLs
$game_temp.transition_update = false # Activa la transición default

Según parece hay algunos problemas a pulir respecto a su funcionamiento en pantalla completa.
Investigaré al respecto. Si detectáis otros bugs hacédmelo saber.

Créditos: Wecoc
Versión: 1.0

Descarga: Transition Updater.zip

Screenshot.dll es una librería libre de uso que se usa en muchos proyectos de RPG maker.
Transition.dll en cambio la hice yo mismo. Pondré en el post el código cpp de ésta.

No hay que configurar nada, solo poner el script y las dll en el proyecto y probarlo.
Por favor si las transiciones se ven extrañas al usar el script contactad conmigo.
Recomiendo no usar imágenes de transición de tamaño distinto al de la pantalla del maker (640x480)

Transition.cpp:

Código:
//=======================================================================================================================
// ** Transition DLL
//-----------------------------------------------------------------------------------------------------------------------
// Author: Wecoc
//=======================================================================================================================

//  Basic RGSS Bitmap support

#include <cstdlib>
#include <ctime>
#include <ctype.h>
#include <math.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>

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;

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;

#define ASSERT(x) if(!x){DebugOut("Failed: %s: %d", #x, __LINE__);}

//-----------------------------------------------------------------------------------------------------------------------
// * Transition
//-----------------------------------------------------------------------------------------------------------------------

extern "C" __declspec (dllexport) int Transition (long bitmap_id, long src_bitmap_id, int frame, int duration, int vague) {
    // Get bitmap structures
 RGSSBMINFO *bitmap = ((RGSSBITMAP*) (bitmap_id<<1)) -> bm -> bminfo;
 RGSSBMINFO *src_bitmap = ((RGSSBITMAP*) (src_bitmap_id<<1)) -> bm -> bminfo;
 // Return false if there is a problem when retrieving data
 if((!bitmap) || (!src_bitmap)) return 0;
 // Create store variables
 LPBYTE row, src_row;
    DWORD rowsize;
    DWORD width, height;
    long x, y;
    x = 0;
    y = 0;
 // Store references to bitmap dimensions
    width  = bitmap -> infoheader -> biWidth;
    height = bitmap -> infoheader -> biHeight;
 // Initialize row variables for scanning
    rowsize = width * 4;
    row = (LPBYTE) (bitmap -> firstRow);
    src_row = (LPBYTE) (src_bitmap -> firstRow);
    // Start Loop
    for ( y = 0; y < (int) height; y++) {
        LPBYTE current_row  = row;
        LPBYTE current_src  = src_row;
        for ( x = 0; x < (int) width; x++) {
 double a = current_src[3];
            double new_a =  (a * (duration - frame) / duration); // WIP
            current_row[3] = (BYTE) new_a;
            current_row  += 4;
            current_src  += 4;
        }
        row -= rowsize;
        src_row -= rowsize;
    }
    return 1;
}

extern "C" __declspec (dllexport) int TransitionEX (long bitmap_id, long src_bitmap_id, long desc_bitmap_id, int frame, int duration, int vague) {
    // Get bitmap structures
 RGSSBMINFO *bitmap = ((RGSSBITMAP*) (bitmap_id<<1)) -> bm -> bminfo;
 RGSSBMINFO *src_bitmap = ((RGSSBITMAP*) (src_bitmap_id<<1)) -> bm -> bminfo;
    RGSSBMINFO *desc_bitmap = ((RGSSBITMAP*) (desc_bitmap_id<<1)) -> bm -> bminfo;
 // Return false if there is a problem when retrieving data
 if((!bitmap) || (!src_bitmap) || (!desc_bitmap)) return 0;
 // Create store variables
 LPBYTE row, src_row, desc_row;
    DWORD rowsize;
    DWORD width, height;
    long x, y;
    x = 0;
    y = 0;
 // Store references to bitmap dimensions
    width  = bitmap -> infoheader -> biWidth;
    height = bitmap -> infoheader -> biHeight;
 // Initialize row variables for scanning
    rowsize = width * 4;
    row = (LPBYTE) (bitmap -> firstRow);
    src_row = (LPBYTE) (src_bitmap -> firstRow);
    desc_row = (LPBYTE) (desc_bitmap -> firstRow);
    // Start Loop
    for ( y = 0; y < (int) height; y++) {
        LPBYTE current_row  = row;
        LPBYTE current_src  = src_row;
        LPBYTE current_desc = desc_row;
        for ( x = 0; x < (int) width; x++) {
 double a = current_src[3];
            double d =  (a * (duration - frame) / duration); // WIP
            double gray = current_desc[1];
            if ((255 - gray) >= d) {
                if (vague > 0) {
                    double n = 255 * ((255 - gray) - d) / (vague / 2);
                    if (n > 255) {
                        current_row[3] = 0;
                    } else {
                        current_row[3] = 255 - n;
                    }
                } else {
                    current_row[3] = 0;
                }
            }
            current_row  += 4;
            current_src  += 4;
            current_desc += 4;
        }
        row -= rowsize;
        src_row -= rowsize;
        desc_row -= rowsize;
    }
    return 1;
}

Hay dos comandos, Transition se usa para transiciones planas y TransitionEX para transiciones con imagen.

Preguntas frecuentes:

P- ¿Entonces cual es la utilidad del script?
R- Puede considerarse un bugfix del programa, en cierto modo.

P- ¿Da más lag que el sistema normal?
R- Un poco sí, pero no mucho. No debería dar demasiados problemas en ese sentido. El script incluye la opción de usar el nuevo tipo solo en mapa (recomendado) o también a lo largo de las escenas. El segundo caso sí puede notarse un relentimiento al cambiar de escena.

P- ¿Sirve para resoluciones de pantalla distintas de 640x480?
R- Las DLL sí pero el script no. Aún así no es difícil adaptarlo al tamaño de la ventana de tu proyecto. Solo hay que cambiar ésta línea:
snp.call(0, 0, 640, 480, "transition.png", window.call, 2)

P- ¿Se puede adaptar para VX o VX Ace?
R- A quien entienda de scripts para esos programas no creo que le cueste adaptarlo. Desgraciadamente no es mi caso, ni siquiera tengo esos programas.

P- ¿Se puede adaptar para MV?
R- No.

P- ¿Tener que usar DLLs a parte hará que el proyecto pese mucho más?
R- En absoluto, una pesa 112 KB y la otra 33 KB. Tampoco debería haber problemas para empaquetar el proyecto, pero de ese tema no entiendo mucho.

P- ¿Eso se podría usar para crear nuevos efectos de transición, con movimiento o efectos de zoom...?
R- No directamente... Pero en cierto modo la base para hacer eso es parecida a la que usa el script. Ya hay scripts que hacen esas cosas, pero hacerlos compatibles a éste es muy complejo.

P- ¿Updatear durante la transición no da problemas por ejemplo al ir al menú y salir muy rápido?
R- No porque el Input no funciona durante la transición.
avatar
Wecoc
Administrador
Administrador



Créditos 9370

Gracias : 517

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.