A vueltas con el modo7

Started by Drumpi, June 09, 2010, 11:07:45 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

FreeYourMind

Logicamente es posible, si ya existe en otros div-like.

SplinterGU

veo que el ejemplo de DIV es menos preciso, eso se debe al foco, dale mas foco al de DIV y se acercara al de bennugd.

lo de 16 y 32 no te preocupes, yo lo hare, necesito tiempo y no quiero que sean funciones diferentes, en 1 semana tendre tiempo libre y lo hare.

yo queria ajustar el tema de los seteos, pero si dices que va mejor en bennu, me alegro pues, quedara asi.

que significa "afastado" ?

otra cosa, probaste el tema de que pasa cuando un objeto esta en una altura mas abajo del suelo? o sea, se corta el grafico o no?
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

Yo lo que veo son distintos valores de foco, altura y distancia, nada más.
Lo del verde del exterior también lo tiene Bennu, sólo que hay que indicar como segundo gráfico en el start_mode7 el mapa -1 en lugar de 0 (en DIV, el mapa 0 indica la usencia de este, en bennu es el -1). Sería interesante añadir al FPG un mapa de 64x64 QUE NO SEA DE COLOR PLANO para comprobar si aparece repetido en el exterior del mapa principal y SIN CORTES (lo mismo, indicar que use ese mapa como segundo gráfico en el modo7).

Supongo que el problema del modo 8bits se debe al tipo de superficie SDL donde se dibuja el modo7, que se habrá creado de 8bits en lugar del modo gráfico.

El día que se arregle lo de la altura del horizonte, lo que sería la leche sería ver algo así:
http://www.youtube.com/watch?v=rEduetMyQyk
;D ;D ;D
Ni en los sueños más húmedos, jejeje. De todas formas, mirad la primera parte de este juego, lo sencillo que es y como engancha el joio.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

no, no, yo se perfectamente por que solo dibuja en 8bits, no tengo que pensar nada, solo necesito tiempo para codificarlo.

no se que decis el horizonte, el horizonte es una variable en la estructura m7, seteala al valor que quieras.

ese juego del video tiene planos con alturas, eso no lo permite el modo 7 (creo)
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

afastado = alejado (mi portugañol me mata  ;D).

No he visto nada que me parecierá distinto en ese video Drumpi.

Lo que estaria bien seria poder controlar la inclinación del plano en vertical (no se si es posible ya), o sea, poder ponerlo como en div, o en el juego de coches del video, etc.

SplinterGU

el juego de ese video no es DIV... es de GBA
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

en DIV no se si puede eso, yo no lo recuerdo? de hacerlo, como maneja la altura? tiene un mapa adicional de alturas?
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

Se que es de GBA, estaba hablando en poder tener resultados similares con Bennu logicamente.

Funciones del Modo 7 de DIV al desnudo :):

  move_scroll()
  refresh_scroll()
  start_mode7()
  start_scroll()
  stop_mode7()
  stop_scroll()

move_scroll(<número de scroll>)

Descripción:

Fuerza a mover un scroll automático de forma inmediata. Esta es una función algo avanzada y por ello puede resultar difícil de comprender su propósito.

La función requiere como parámetro el <número de scroll> de 0 a 9 que se indicó en la función start_scroll() como primer parámetro cuando se inició el scroll.

Esta función se utiliza cuando una región de scroll se controla automáticamente, por haber definido el campo camera de la estructura scroll correspondiente con el identificador de un proceso.

El propósito es forzar a que se actualicen los valores (x0, y0, x1 y y1) de dicha estructura; si no se utiliza esta función estos valores no se actualizarán hasta la próxima imagen del juego.

Es decir, cuando un scroll se controla de forma automática y otro proceso necesita conocer antes de la próxima imagen el valor de las coordenadas de dicho scroll (normalmente para colocarse él en una posición acorde al movimiento del fondo) se debe hacer esto:

1 - Se inicia el scroll con start_scroll().

2 - Se crea el proceso que se utilizará como cámara y se pone su código identificador en el campo camera de la estructura scroll.

3 - A este proceso se le debe poner una prioridad muy alta, para que se ejecute antes que el resto de los procesos (poniendo en su variable local priority un valor entero positivo como, por ejemplo, 100).

4 - Justo antes de la sentencia FRAME del bucle del proceso usado como cámara se llamará a la función move_scroll().

De esta forma se garantizará que este proceso se ejecute el primero y, justo al finalizar, actualice los valores (x0, y0, x1 y y1) de la estructura scroll, de forma que el resto de los procesos puedan utilizar estas variables ya actualizadas.

El uso más generalizado de esta función es cuando en una ventana de scroll se quieren tener más de dos planos de fondo y, para ello, se crean una serie de procesos que simulen un tercer o cuarto plano, situando sus coordenadas en función de la posición exacta del scroll en cada imagen.


refresh_scroll(<número de scroll>)

Descripción:

Esta función se utiliza cuando se ha modificado un gráfico con las funciones map_put(), map_xput(), map_block_copy() o map_put_pixel() que está siendo utilizado como fondo de una región de scroll, para actualizarlo.

La función requiere como parámetro el <número de scroll> que se especificó al iniciar el scroll con la función start_scroll().

Cuando se modifica un gráfico que está siendo utilizado como fondo de un scroll no se actualiza en pantalla automáticamente, sino que hay que llamar a esta función para ello.

Una vez modificado el gráfico permanecerá así durante el resto de la ejecución del programa, a no ser que se descargue el gráfico de memoria (con unload_fpg(), unload_map() o unload_pcx()) y se vuelva a cargar, en cuyo caso se recuperará el estado original del gráfico.

start_mode7(<número de m7>,  <fichero>, <gráfico>, <gráfico exterior>,                <número de región>, <altura del horizonte>)

Descripción:

Ésta es una función avanzada que requiere que el usuario tenga cierta soltura para poder utilizarla.

Crea una ventana de visualización de un modo 7, es decir, visualiza un gráfico tridimensionalmente en un plano abatido; para conseguir este efecto se llamará a esta función con los siguientes parámetros:

<número de m7> - Se pueden crear hasta 10 ventanas de modo 7 en pantalla, con los número del 0 al 9; si únicamente se quiere crear una, lo mejor es definir la número 0. Este número será necesario posteriormente para modificar los parámetros de la ventana, pues el sistema necesitará saber cuál de las 10 posibles ventanas de modo 7 se quiere alterar.

<fichero> - Los gráficos que se pretendan abatir en la ventana deben estar en un fichero cuyo código de fichero se debe especificar aquí, como segundo parámetro de la función. Los gráficos cargados con las funciones load_map() o load_pcx() (o creados con new_map()) se utilizarán como si pertenecieran al primer fichero (el fichero con el código 0).

<gráfico> - El tercer parámetro debe ser el código del gráfico principal que se va a abatir en la ventana y debe pertenecer al fichero anteriormente indicado.

<gráfico exterior> - Aquí se puede indicar un 0 si no se quiere que se vea ningún gráfico más allá del gráfico abatido en la perspectiva, o bien un código de gráfico del mismo fichero que se mostrará en la perspectiva más allá del gráfico principal, hasta alcanzar el horizonte. Este gráfico debe ser de un ancho y alto potencia de dos, no mayor de 8192 (estas potencias de dos son: 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096 y 8192), por ejemplo, podría ser un gráfico de 64 puntos de ancho por 32 de alto; este gráfico se mostrará también abatido.

<número de región> - Aquí se indicará la región rectangular de pantalla en la que se va a mostrar el modo 7. Si se indica 0 como número de región, se mostrará en toda la pantalla. El resto de regiones se deben definir previamente con la función define_región() (una región no es más que una zona rectangular de la pantalla).

<altura del horizonte> - Como último parámetro se indicará a cuántos puntos desde la parte superior de la ventana se quiere situar la línea del horizonte. Si la cámara se sitúa por encima del plano abatido, entonces no se mostrará nada por encima de la línea del horizonte (ese hueco se suele rellenar con otra ventana de scroll o de modo 7); en cambio si la camara se sitúa por debajo del plano, entonces no se mostrará nada por debajo de la línea del horizonte.

Además de la llamada a la función se deben inicializar algunos valores de la estructura global m7 para el correcto funcionamiento de la ventana. Ésta es una estructura de 10 registros (uno para cada posible ventana de modo 7) y cada registro tiene los siguientes campos:

  camera - Código identificador de la cámara
  height - Altura de la cámara
  distance - Distancia de la cámara
  horizon - Altura del horizonte
  focus - Focal de visión
  z - Plano de profundidad
  color - Color del exterior

Importante: El campo camera es imprescindible inicializarlo para que se active la ventana de modo 7 ya que, sin este campo, la ventana no puede determinar desde dónde se debe ver el plano abatido.

La cámara se situará en el plano abatido a la distancia (distance) indicada del proceso cuyo código identificador se haya puesto en camera, y mirando en su mismo ángulo (el que indique su variable local angle). La altura a la que se sitúa la cámara respecto al suelo será la indicada en el campo height.

start_scroll(<número de scroll>,  <fichero>, <gráfico>, <gráfico fondo>,                 <número de región>, <indicador de bloqueo>)

Descripción:

Esta es una función de cierta complejidad, que requiere que el usuario tenga cierta soltura (haya realizado algún programa antes) para poder utilizarla.

Crea una ventana de scroll, en la que se realizará una panorámica sobre un gráfico de fondo (el decorado del juego). Es decir, utilizando como fondo del juego un gráfico más grande que la ventana de visualización, se podrá mostrar una parte del mismo e ir desplazándolo en cualquier dirección.

Para conseguir este efecto se llamará a esta función con los siguientes parámetros:

<número de scroll> - Se pueden crear hasta 10 ventanas de scroll en pantalla, con los números del 0 al 9; si sólo se quiere crear una, lo mejor es definir la número 0. Este número será necesario posteriormente para modificar los parámetros de la ventana, pues el sistema necesitará saber cuál de las 10 posibles ventanas de scroll se quiere alterar.

<fichero> - Los gráficos que se pretendan mostrar como fondo o decorado en dicha ventana deben estar en un fichero cuyo código de fichero se debe especificar aquí, como segundo parámetro de la función. Los gráficos cargados con las funciones load_map() o load_pcx() (o creados con new_map()) se utilizarán como si pertenecieran al primer fichero (el fichero con el código 0).

<gráfico> - El tercer parámetro debe ser el código del gráfico principal que se va a mostrar como fondo en la ventana y debe pertenecer al fichero anteriormente indicado. Este gráfico suele ser el decorado principal del juego sobre el que se va a desarrollar la acción, un gráfico más grande que la ventana de visualización, que se irá desplazando en una o varias direcciones y sobre el que se situarán los gráficos del juego.

La ventana de scroll se situará inicialmente con el punto de control número 0 de este gráfico en la esquina superior izquierda, cuando se haya definido este punto en el editor gráfico.

<gráfico fondo> - Aquí se indicará un 0 si se quiere un sólo plano de scroll (un sólo gráfico de fondo), o bien otro código de gráfico si se quiere que éste aparezca como segundo plano de scroll (a mayor profundidad), detrás del plano principal. Para que se vea este plano de fondo es imprescindible que el gráfico principal (primer plano) tenga partes dibujadas con el color número 0 de la paleta, pues estas zonas transparentes serán las que permitirán ver a través de ellas el gráfico de fondo.

<número de región> - Aquí se indicará la región rectangular de pantalla en la que se va a mostrar el scroll, si se indica 0 como número de región, se mostrará en toda la pantalla. El resto de regiones se deben definir previamente con la función define_region() (una región no es más que una zona rectangular de la pantalla).

<indicador de bloqueo> - Aquí se indicará un valor que define si cada uno de los dos planos de scroll es cíclico en horizontal y vertical. Por ejemplo, un plano es cíclico en horizontal cuando al salirse del dibujo por la derecha aparece el dibujo por la izquierda. Para componer este valor se deben sumar las siguientes cantidades:

  + 1 - Si el primer plano es cíclico horizontalmente.
  + 2 - Si el primer plano es cíclico verticalmente.
  + 4 - Si el segundo plano es cíclico horizontalmente.
  + 8 - Si el segundo plano es cíclico verticalmente.

Es decir, 0 si ninguno de los dos planos debe ser cíclico, 15 (1+2+4+8) si ambos planos deben ser cíclicos en ambos ejes, 12 (4+8) si únicamente debe ser cíclico el segundo plano, etc.

Cuando un gráfico (principal o de fondo) sea más pequeño que la ventana de visualización, el sistema forzará a que su plano de scroll sea cíclico pues, en caso contrario, no se podría rellenar la ventana de scroll por completo, sin repetir cíclicamente el gráfico (en mosaico).

Además de la llamada a la función se deben inicializar algunos valores de la estructura global scroll para el correcto funcionamiento de la ventana. Ésta es una estructura de 10 registros (uno para cada posible ventana de scroll) y cada registro tiene los siguientes campos:

  x0, y0 - Coordenadas del primer plano
  x1, y1 - Coordenadas del segundo plano
  z - Plano de profundidad
  camera - Código identificador de la cámara
  ratio - Velocidad relativa del segundo plano
  speed - Velocidad máxima del primer plano
  region1 - Primera región de pantalla
  region2 - Segunda región de pantalla

Hay dos formas de programar el movimiento de las ventanas de scroll:

- Manualmente, modificando en cada imagen del juego los campos x0, y0, x1 e y1 de esta estructura (las coordenadas de los planos de scroll).

- Automáticamente, para lo que se necesita el código identificador de un proceso en el campo camera de esta estructura. Siendo a partir de entonces el sistema el encargado de realizar en la ventana de scroll un seguimiento al gráfico de este proceso.

stop_mode7(<número de m7>)

Descripción:

Elimina la ventana de modo 7 cuyo número (del 0 al 9) se pasa como parámetro. Este <número de m7> es el que se indicó como primer parámetro en la función start_mode7(), es necesario debido a que pueden haber hasta 10 ventanas diferentes de modo 7, y el sistema necesita saber cuál de ellas se está finalizando.

Al eliminar una ventana de modo 7, morirán automáticamente todos los procesos que pertenezcan en exclusiva a dicha ventana, es decir, todos los procesos que tengan su variable ctype con el valor c_m7 y no se estén visualizando en ninguna otra ventana de modo 7.

Importante: Al cambiar de modo de vídeo con la función set_mode() todas las ventanas de modo 7 (y sus procesos) serán igualmente eliminadas, no siendo en este caso necesario usar esta función (stop_mode7()).


stop_scroll(<número de scroll>)

Descripción:

Elimina la ventana de scroll cuyo número (del 0 al 9) se pasa como parámetro. Este <número de scroll> es el que se indicó como primer parámetro en la función start_scroll() y es necesario debido a que puede haber hasta 10 ventanas diferentes de scroll, y el sistema necesita saber cuál de ellas se está finalizando.

Al eliminar una ventana de scroll morirán, automáticamente, todos los procesos que pertenezcan en exclusiva a dicha ventana, es decir, todos los procesos que tengan su variable ctype con el valor c_scroll y no se estén visualizando en ninguna otra ventana de scroll.

Importante: Al cambiar de modo de vídeo con la función set_mode() todas las ventanas de scroll (y sus procesos) serán igualmente eliminadas, no siendo en este caso necesario usar esta función (stop_scroll()).

SplinterGU

por que pusiste la descripcion de las funciones de scroll?

lo del grafico exterior lo podemos cambiar a 0, que se vea el color exterior tranquilamente.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

Porque te permiten saber su comportamiento, lo detalla todo y así podrás resumir para cada una las diferencias en Bennu. Esto seria muy valioso tenerlo en la documentación de Bennu, por lo menos una descripción similar pero sobre las funciones de Bennu.

SplinterGU

#70
pero que tiene que ver el scroll con el modo7?

El scroll esta bien como esta, no se haran esas chanchadas como que al hacer set_mode se eliminen los scroll (ni los m7), aca las cosas que se hacen start, se tienen que hacer stop, bennu no fomentara los malos habitos de programacion. Si es que lo pusiste por eso.

Espero, por favor, que eso se entienda.

:)
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

#71
No, DIV no maneja alturas, sólo digo que sería una posibilidad muy muy muy muy muy muy muy muy muy muy remota de mejora :D Obviamente no digo de meterlo, sólo era una broma. Y por supuesto, no tengo ni idea de cómo han logrado ese efecto, sólo se lo que se ve en el video: las alturas se limitan a modificar la posición de cada línea horizontal dibujada, en el juego a veces hace cosas muy raras si no tomas la rampa en el sentido en que se diseñó, sobre todo si tomas un cambio de rasante girando.

Y si, se puede modificar la variable de horizonte, pero no tiene ningún efecto (slainte dijo que no sabía cómo se implementaba eso).

Por cierto, acabo de toparme con algo que no me ha pasado desde que hacía burradas con el modo7: he provocado un overflow en las coordenadas. Tengo un proceso con resolution=100, y en cuanto paso la coordenada y=214500 el modo7 se me va a una posición (en el eje y) negativa. He hecho mis deberes, y sí, debe ser un overflow de una variable tipo INT interna (si multiplicamos por 10.000 coincide con el valor de MAX_INT).
No se si se puede hacer algo o es que yo soy muy bestia, pero esto limita los mapas a 2144x2144 pixels (se puede conseguir el doble si se saben usar otros modos7 con desplazamiento, pero no más).

[Pensando en voz alta]En todo caso, no se si esto que he pensado está bien, pero si en el m7 no se pueden usar valores DWORD para la posición, debería centrarse el mapa, porque no se aprovechan los valores negativos ¿o si? porque, estando en (0,0), en cuanto nos movamos un pixel hacia arriba o hacia la izquierda, la cámara pegaría un salto hasta MAX_DWORD. En mi caso no habría problemas porque limitaría el movimiento en el perímetro del nivel, pero en otros que la gente se iría de juerga por ahí pues tendrían problemas.[/pensando en voz alta]

Nada, yo sólo pregunto, está bien saber dónde está el límite (para saltármelo usando mi cabecita y lo que hay disponible ;D).
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

son dword

y bajando el resolution a 10?
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

Necesito dormir más ^^U
No sé exactamente cómo influye pero funciona, el valor de y no estaba desbordado ni por asomo, pero mira, el modo7 se "daba la vuelta" y el sprite seguía en su sitio (muy lejos en el horizonte).

De todas formas, 10 sufre del nefasto efecto del redondeo con advance, e incluso lo he notado en GBA dicho efecto (supongo que tendrían un valor de 15 o 20). Supongo que le pondré 50 para tener el doble de campo de juegos, total, la RAM no da para más.
Karma up.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

FreeYourMind

Necesito ayuda con el modo7:

primero, quiero saber en cristiano que significa cada variable:

start a mode 7 window:
Start_mode7(m7_number,file,graph,external_graph,region,horizon);

m7 structure:
Camera: - process id for the camera
Height: - height of the camera
distance: distance of the camera from the process set under camera
Focus: perspective (FOV)
z: z depth of plane
color: color used to fill outside of mode 7 plane


ni idea de lo que cambia el height, distance y horizon...

2 -

necesito crear el modo 7 en una region, o sea, quiero una tira de y tamaño en la parte debajo de la pantalla y que el modo 7 sólo empiece de esa tira hacia arriba (no quiero el modo 7 pegado a la parte de abajo de la pantalla, pero un poco mas arriba).

3 - Quiero poner el modo 7 sin repetir la textura, quiero que la textura ocupe toda la region del modo 7 y que el modo 7 no sea mas grande que la misma, asi mismo el focus tiene que enseñar la textura en su maxima calidad cuando el modo7 esta sin movimiento.

Es para simular el suelo de SF2, usando modo7, y en algunas fases este no empieza en la margen inferiror de la pantalla, pero si un poco mas arriba.