Saludos desde una lejana galaxia! XD

Chit chat general. Habla con los MojonTwins y con los amigos de los MojonTwins. Reza a Vah-ka. Delinque. Aviso: está PROHIBIDO tirarse peos fuerte. Si les cortas el pescuezo, vale.

Moderador: na_th_an

Avatar de Usuario
na_th_an
Mensajes: 26412
Registrado: Vie, 09 Ene 2009, 12:18

Re: Saludos desde una lejana galaxia! XD

Mensajepor na_th_an » Mié, 02 Oct 2013, 08:07

Para el tema de ir cogiendo la espada se me ocurre que utilicemos scripting y la función EXTERN. En primer lugar tienes que hacer dos cosas en el motor: activar el scripting, activar la función EXTERN, y añadir el código C necesario. En la función EXTERN es donde meteremos el código C que vaya dibujando el marcador.

En config.h tendremos que activar las siguientes directivas:

Código: Seleccionar todo

#define ACTIVATE_SCRIPTING
#define SCRIPTING_DOWN
#define ENABLE_EXTERN_CODE


Además, tendremos que añadir ese "extern code". Para ello, vamos a crear un archivo dev/extern.h que contenga este código (por ahora, una función vacía. Ya la poblaremos):

Código: Seleccionar todo

// External custom code to be run from a script

void do_extern_action (unsigned char n) {
   // Add custom code here.   
}


Ahora tendremos que editar nuestro "make.bat" para que compile el script y lo incluya en el código. Para ello, descomentamos las lineas que llaman al msc al principio. Hay que tener cuidado porque el número que aparece en la llamada debe ser igual al número de pantallas total del juego. El %1 ya deberías haberlo cambiado por el nombre correcto ;):

Código: Seleccionar todo

@echo off
rem Cambia "%1" por el nombre de tu güego.
echo ### COMPILANDO SCRIPT ###
cd ..\script
msc %1.spt msc.h 24
copy *.h ..\dev
cd ..\dev
echo -------------------------------------------------------------------------------
... (etcétera)


Ahora escribiremos el script en script/%1.spt, con %1 el nombre de tu güego (el mismo nombre del archivo C principal de dev).
Como diría Rorshach: "Urm..."
Avatar de Usuario
na_th_an
Mensajes: 26412
Registrado: Vie, 09 Ene 2009, 12:18

Re: Saludos desde una lejana galaxia! XD

Mensajepor na_th_an » Mié, 02 Oct 2013, 08:14

La parte del script la vamos a plantear de la siguiente manera: vamos a guardar los tres trozos de la espada en el tileset, a partir del tile número 22, que tenemos libres. No vamos a usar el sistema automático de objetos de la churrera, por lo que puedes descomentar el #define para DEACTIVATE_OBJECTS y ahorrar algo de espacio.

Usaremos los flags para almacenar valores. En el flag 1 almacenaremos cuántos trozos de la espada tenemos: 0, 1, 2 o 3. Todos los flags se ponen a 0 al empezar el güego, así que nos viene perfecto.

Cada trozo de la espada aparecerá en una pantalla diferente. Los flags 2, 3 y 4 representarán a cada una de estas tres pantallas, y valdrán 0 si aún no hemos cogido el trozo que aparece en la misma, o 1 en caso contrario.

Aquí podemos actuar de dos formas:

- Podemos hacer que la espada siempre se coja en orden, de modo que primero se pinte el primer trozo, cuando se coja y se llegue a la siguiente pantalla se pinte el segundo trozo, y lo mismo con el tercero: sin importar en qué orden visitemos las pantallas los trozos siempre aparecerán en el mismo orden.
- Podemos hacer que a cada pantalla de las tres designadas le corresponda un trozo fijo de la espada. Así es posible que el jugador coja primero la parte del centor, o el pico.

La primera opción es más compleja de programar, así que para no complicarnos mucho vamos a hacer la segunda. Si te interesa más la primera, te daré algunas ideas.
Como diría Rorshach: "Urm..."
Avatar de Usuario
na_th_an
Mensajes: 26412
Registrado: Vie, 09 Ene 2009, 12:18

Re: Saludos desde una lejana galaxia! XD

Mensajepor na_th_an » Mié, 02 Oct 2013, 08:17

Tendremos un código parecido para cada pantalla en la que aparece un trozo del objeto. Vamos a imaginar que en la pantalla 10 aparece el primer trozo, la empuñadura, que estaría dibujada en el tile número 22 y que queremos que aparezca en las coordenadas de tile (5, 6). Lo primero que hay que hacer es escribir una sección ENTERING SCREEN para la pantalla 10. En ella, comprobaremos si ya hemos cogido o no el trozo (mirando el flag 2), y dibujaremos o no dicho trozo. Sería algo así:

Código: Seleccionar todo

ENTERING SCREEN 10
   IF FLAG 2 = 0
   THEN
      SET TILE (5, 6) = 22
   END
END


Se ve bastante sencillo: al entrar en la pantalla 10 se ejecutará esa sección, que simplemente comprueba si flag 2 vale 0, en cuyo caso pintamos el tile 22 en la posición 5, 6. Habría que añadir un código parecido para las otras dos pantallas y trozos de la espada.
Como diría Rorshach: "Urm..."
Avatar de Usuario
na_th_an
Mensajes: 26412
Registrado: Vie, 09 Ene 2009, 12:18

Re: Saludos desde una lejana galaxia! XD

Mensajepor na_th_an » Mié, 02 Oct 2013, 08:21

Ahora hay que hacer que eso reaccione. Cuando el jugador se acerque y pulse ACCION, se ejecutará (si existe) la sección PRESS_FIRE AT SCREEN 10. Ahí tendremos que comprobar que flag 2 = 0 y que, además, estamos tocando el tile 5, 6. Si todo eso se cumple, desactivaremos el objeto en esta pantalla (poniendo el flag 2 a 1), incrementaremos nuestro contador de objetos y llamaremos a nuestra función EXTERN pasándole un 1, indicándole que hay que modificar el marcador (esto lo haremos luego). Además, tendremos que quitar el objeto de la pantalla:

Código: Seleccionar todo

PRESS_FIRE AT SCREEN 10
    IF FLAG 2 = 0
    IF PLAYER_TOUCHES 5, 6
    THEN
        SET FLAG 2 = 1
        INC FLAG 1
        EXTERN 1
        SET TILE (5, 6) = 0
    END
END


"EXTERN 1" llamará a la función do_extern_action de extern.h pasándole un 1. Posteriormente veremos qué código hay que introducir en do_extern_action para que se pinte el trozo correcto de la espada en el marcador.
Como diría Rorshach: "Urm..."
Avatar de Usuario
na_th_an
Mensajes: 26412
Registrado: Vie, 09 Ene 2009, 12:18

Re: Saludos desde una lejana galaxia! XD

Mensajepor na_th_an » Mié, 02 Oct 2013, 08:30

Para que lo de arriba funcione, el jugador está obligado a pulsar la tecla de acción (que hemos configurado para que sea "A" o ABAJO en el joystick), pero podemos hacer que la sección PRESS_FIRE se lance automáticamente. Para ello tenemos que definir lo que hemos llamado la "fire zone", que no es más que un rectángulo de la pantalla que hace que se lance el script de PRESS_FIRE automáticamente si el jugador entra en él.

Para poder usarlo hay que activar esta característica en config.h:

Código: Seleccionar todo

#define ENABLE_FIRE_ZONE


Además, hay que definir los límites de esa zona. La zona estará desactivada por defecto para cada pantalla a menos que la definamos desde el script. O sea, no hay fire zone hasta que tú la defines, y sólo tiene validez mientras no salgas de la pantalla. Esto viene genial, podemos definirla en ENTERING SCREEN 10, al final.

El rectángulo especificado x1, y1, x2, y2 se mide en pixels. Se considerará que el jugador está dentro del rectángulo si sus coordenadas lo están, o sea, solo cuenta el pixel superior izquierdo. Esto es algo confuso, pero bueno, nadie es perfecto :D

Si nuestro trozo de la espada está en (5, 6), su posición en píxels es (5*16, 6*16) = (80, 96). Manejando un poco la colisión por rectángulos, nos daremos cuenta de que el jugador y el trozo de la espada colisionarán si la X del jugador está entre 80-15 y 80+15 y la Y está entre 96-15 y 96+15 (hazte un dibujito y lo verás). Por lo tanto, nuestro rectángulo deberá definirse desde (65, 81) hasta (95, 111). Nuestro ENTERING SCREEN 10 quedará así:

Código: Seleccionar todo

ENTERING SCREEN 10
    IF FLAG 2 = 0
    THEN
        SET TILE (5, 6) = 22
        SET_FIRE_ZONE 65, 81, 95, 111
    END
END


Con esto, cuando el jugador entre en ese rectángulo (o sea, esté tocando el trozo de la espada) se ejecutará automáticamente la sección PRESS_FIRE AT SCREEN 10 sin que el jugador tenga que tocar la tecla "acción".
Como diría Rorshach: "Urm..."
Avatar de Usuario
na_th_an
Mensajes: 26412
Registrado: Vie, 09 Ene 2009, 12:18

Re: Saludos desde una lejana galaxia! XD

Mensajepor na_th_an » Mié, 02 Oct 2013, 08:30

Vete rumiando un poco toda esta info, y luego seguimos :)
Como diría Rorshach: "Urm..."
Avatar de Usuario
D_Skywalk
Mensajes: 352
Registrado: Mar, 01 Oct 2013, 13:36

Re: Saludos desde una lejana galaxia! XD

Mensajepor D_Skywalk » Mié, 02 Oct 2013, 11:38

Voy a ello! :wan:

:ymca:
David Skywalker
Weblog: http://david.dantoine.org
Avatar de Usuario
na_th_an
Mensajes: 26412
Registrado: Vie, 09 Ene 2009, 12:18

Re: Saludos desde una lejana galaxia! XD

Mensajepor na_th_an » Mié, 02 Oct 2013, 11:41

:tits: :tits:
Como diría Rorshach: "Urm..."
Avatar de Usuario
D_Skywalk
Mensajes: 352
Registrado: Mar, 01 Oct 2013, 13:36

Re: Saludos desde una lejana galaxia! XD

Mensajepor D_Skywalk » Mié, 02 Oct 2013, 12:23

Todo comprendido perfectamente, he de añadir que me parece una maravilla el sistema de scripting, potentísimo!
Y como bien dices el límite es la imaginación ^^_

Me gusta más la forma sencilla de coger la espada y lo dicho, todo comprendido perfectamente :D

Voy a hacer pruebecitas! :corchoneta:
David Skywalker
Weblog: http://david.dantoine.org
Avatar de Usuario
na_th_an
Mensajes: 26412
Registrado: Vie, 09 Ene 2009, 12:18

Re: Saludos desde una lejana galaxia! XD

Mensajepor na_th_an » Mié, 02 Oct 2013, 12:38

Vale, pues lo único que nos queda es ver cómo modificar el marcador desde la funcion EXTERN. Lo haremos llamando a la función del motor que dibuja un tile. Como los trozos de la espada los tienes en el tileset, desde la función do_extern_action en extern.h llamaremos a la función del motor draw_coloured_tile:

Código: Seleccionar todo

void draw_coloured_tile (unsigned char x, unsigned char y, unsigned char t);


Que dibuja el tile "t" en las posiciones de caracter x e y. Dependiendo del valor que reciba do_extern_action pintaremos cada trozo de la espada en su sitio correcto. Desde el script llamaremos EXTERN 1, EXTERN 2 o EXTERN 3 desde cada código de recoger cada parte para que actualice el marcador correctamente.

Pero ahora tengo lío :D
Como diría Rorshach: "Urm..."

Volver a “General”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 4 invitados