Nuestro compañero Chema no está quieto!!

Tamaño: px
Comenzar la demostración a partir de la página:

Download "Nuestro compañero Chema no está quieto!!"

Transcripción

1 Nuestro compañero Chema no está quieto!! Vale. Como he estado liado y el poco tiempo que tuve lo empleé en arreglar bugs y otras cosillas menores, voy a ver si puedo ir contando cómo estoy haciendo las cosas. Alguno lo pidió, así que no se me quejen del enorme ladrillo que se avecina. Y por capítulos! Eso sí, el código que pongo sigue el formato del ensamblador del OSDK, el XA. Supongo que si no se conoce pueda despistar un poco, pero seguro que basta para hacerse una idea. Se me ha quedado algún comentario en inglés, igual que los nombres de algunas variables. Lo suelo hacer así para que la gente de Defence Force siga mejor el código. Cualquier comentario será bienvenido, claro. Allá vamos: El problema El Oric no tiene un chip de video como tal, ni ninguna capacidad hardware para manejar sprites, hacer doble búfer, modificar el área de memoria donde se almacenan la pantalla, etc. Esto hace que todo deba realizarse por software, usando el 6502 (que tampoco da para mucho) y teniendo en cuenta la organización del modo de video (donde sólo se utilizan 6 bits de cada byte), así que la actualización de los gráficos en pantalla es todo un reto. En Space:1999 ya se hace un uso intensivo del procesador para el renderizado isométrico y se actualiza sólo la zona de la pantalla donde hay movimiento. Aunque el código se podría haber optimizado más, es difícil obtener una animación rápida en cuanto hay unos pocos sprites moviéndose en la pantalla simultáneamente. En 1337 la cosa es peor porque hay que actualizar toda la pantalla (el área de juego) continuamente, no sólo por trozos: hay un campo de estrellas, hay objetos en 3D, disparos, etc. potencialmente en toda la pantalla, de modo que es inútil intentar actualizar sólo las áreas necesarias. El implementar un doble buffer aquí representa como un 30% del tiempo total de pintado (incluyendo todo el cálculo 3D), por mucha optimización que se aplique. Esto hace que a veces el framerate baje casi hasta 5 fps (aunque la mayoría del tiempo es mucho mayor). Por supuesto es posible pasar del doble búfer y utilizar otras técnicas (pintado de líneas con eor para borrar las anteriores, como hace el Elite original), pero eso produce un parpadeo, a mi juicio, muy feo. Y el resultado con doble búfer es perfectamente jugable y relativamente suave de todas formas. En Skool Daze el reto era diferente. Aquí hay muchos sprites moviéndose por toda la pantalla, pero el fondo es bastante estático, así que basta con marcar las áreas que necesitan re-dibujado y optimizar al máximo el mismo. En este caso todo el juego estaba implementado usando tiles de 6x8, así que se tiene un campo de bits que indica cuándo un tile necesita ser redibujado. En cada frame se recorre el campo y cuando se encuentra un bit a 1 se calcula el gráfico de 6x8 que se debe volcar en pantalla en esa posición. El resultado es muy bueno y no se necesita demasiada memoria extra. La cuestión es entonces: es posible tener un juego que funcione con un scroll de toda la pantalla y con varios sprites a la vez? Algo como el Uridium?. Ese era el reto. Dejar que la ULA trabaje por nosotros La respuesta inmediata a la pregunta anterior es no. Al menos no para un área grande de juego (como del 70-80% de la pantalla). O no por software. Es posible hacer un scroll lateral de la pantalla en alta resolución más o menos rápido (como hace Skool Daze), pero sólo si movemos todo el contenido en un momento dado y el juego luego sigue sobre un área fija (o sea, pasamos del doble búfer y movemos directamente el contenido de la pantalla). Eso no es lo que queremos (queremos algo continuo mientras se juega) y, además, no es visualmente suave ni permite parallax (hacer scroll a diferentes velocidades para diferentes planos). El truco aquí está en aprovecharse del modo TEXT del ORIC. Sí, el modo de texto. En ese modo la pantalla se organiza en 40 columnas y 27 filas. Cada celda contiene un byte que indica un carácter. La ULA lee el código y pinta el carácter asociado del juego de caracteres en pantalla. Es decir, hace el renderizado del bloque de 6x8 por hardware. Vale. Ese va a ser el truco. Sólo tendremos que borrar/pintar/volcar un área de 40x27 bytes como máximo, lo que puede hacerse muy rápido y la ULA hace el resto. Por supuesto tendremos que redefinir el juego de caracteres para que contenga los gráficos con los que componer todo el fondo (con la nave nodriza enemiga). Lo primero es ver de cuántos caracteres (al final serán nuestros tiles ) disponemos. Lamentablemente no tenemos 256. Los códigos por debajo del 32 son considerados por la ULA como atributos (para cambiar colores, modo de pantalla, etc). Los que tienen el bit de más peso a 1 son considerados en vídeo inverso. Así que nos quedan sólo 96. Cualquier gráfico un poquito complicado va a necesitar más. Ya tenemos un problema. Eso sí, disponemos de un juego alternativo (el LORES 1), así que ahí tenemos otros 96, pero no podemos intercalarlos de cualquier manera con el estándar porque requieren de un atributo serie para cambiar de modo. Lo que podemos hacer es disponer nuestra área de juego de modo que se alternen ambos modos en cada fila. Esto es mejor que nada. Cada fila de la pantalla, pues, comenzará por un código serie que indique el color de la tinta a usar, y otro que indique si usamos el juego de caracteres estándar o el alternativo.

2 Cada fila entonces tiene: Byte 0 Byte 1 Byte 2.. Byte 37 Byte 38 Byte 39 COLOR 8 (par)/9 (impar) Códigos de los gráficos No usados Esta técnica va a tener una desventaja clara: todo el movimiento y el scroll va a ser carácter a carácter. Se podría intentar paliar esto con un esquema complejo que realice el scroll sub-carácter sobre los gráficos, pero requeriría más tiles y tiempo de CPU, cosas de las que, en principio, no disponemos. Esto, sin embargo, lo haremos con el fondo de estrellas, como veremos más adelante. Gráficos, tiles y organización en memoria El área de juego será de 36 columnas (las dos primeras las necesitamos para los atributos y las dos últimas no las usaremos para dejarlo todo centrado) por 20 filas. El mapa de un nivel es de 256 columnas y 20 filas y contiene el dibujo de la nave nodriza. El diseño de la misma se hace en base al siguiente juego de bloques gráficos ( tiles ): Los gráficos de la fila inferior van al juego estándar (56, del 32 al 87) y los de la superior al alternativo (54). Por supuesto ciertos gráficos habrá que alinearlos debidamente en el mapa para que coincidan bien y el resultado sea correcto. Los dos bloques que quedan libres del juego alternativo se va a usar para las estrellas y las bolas de energía que pueden recogerse sobre la superficie de la nave (y que están animadas). En ambos juegos, el primer código (que es el 32) se usa para indicar que está libre (un espacio transparente, a través del cual se ven las estrellas) y el 33 para un bloque en negro pero no transparente (para las sombras de los muros). El mapa se sitúa en los últimos 5K disponibles y cada fila de 256 bloques ocupa exactamente una página, así que acceder al tile correspondiente a una coordenada global (fila, columna) es muy sencillo y rápido. Por ejemplo, para obtener el código del tile basta con acceder a la página <(fila+base)+256> indexando con X = columna. Es decir la fila es el byte alto de la dirección, siendo el bajo 0; de este modo (por ejemplo): lda fila adc #>_start_rows ; Dirección de comienzo del mapa (fila cero) sta smc_address+2 ; Modificamos el código de abajo ldx columna smc_address ; Esto es código automodificable, el byte alto de $1200 se modifica ;antes para que el lda lo haga de la dirección correcta lda $1200,x Doble búfer Nuestro doble búfer (o back buffer) tiene que contener el área visible en pantalla. La idea es simple, en cada frame borramos el búfer, pintamos todo lo necesario sobre él y lo volcamos en la pantalla. Vamos a hacerlo un poco más grande de lo necesario (que sería 36x20) para poder olvidarnos de hacer clipping al pintar, es decir, de determinar qué partes de un objeto (sprite) se ven y cuales no). Al hacerlo más grande podemos pintar siempre que el objeto sea visible (aunque sea parcialmente) y luego volcaremos sólo lo necesario. Como los sprites son como mucho de 2x2 tiles, en este caso necesitamos dos columnas y dos filas extra. En mi caso he puesto un buffer de 40x22, porque tengo una tabla para multiplicar por 40 rápidamente, aunque bien podría haberse hecho de 38x22. Vamos a ver el proceso paso a paso: Para borrar el buffer, ponemos todo el contenido al carácter 32 (espacio). Tenemos que hacerlo rápido, así que desenrollamos el bucle parcialmente. Además tengo dos etiquetas definidas para indicar las columnas que no se usan tanto por la derecha como por la izquierda (PCOLSL y PCOLSR). Hay que tener en cuenta que los bucles son más eficientes si se usan decrementos en lugar de incrementos, porque podemos chequear simplemente la bandera de cero (Z) o de signo (N): _clear_backbuffer lda #32 ldy #39-PCOLSL-PCOLSR sta _backbuffer+40*0+pcolsl,y sta _backbuffer+40*1+pcolsl,y sta _backbuffer+40*2+pcolsl,y sta _backbuffer+40*18+pcolsl,y sta _backbuffer+40*19+pcolsl,y

3 .) dey Para dibujar el fondo la cosa es simple. Tenemos una variable _inicol con la columna inicial que se ve en pantalla (se modifica al hacer scroll): _render_background ; Start drawing the background ; From _inicol onwards. ; Unrolled to get speed. ; Takes the tile code from the map ; which is organized in memory ; so that every row lies on a page ; boundary, and an indexed addressing ; with x=column, gets the tile lda #39-PCOLSL-PCOLSR adc _inicol tax ldy #39-PCOLSL-PCOLSR lda _start_rows+256*0,x sta _backbuffer+40*0+pcolsl,y lda _start_rows+256*1,x sta _backbuffer+40*1+pcolsl,y lda _start_rows+256*19,x sta _backbuffer+40*19+pcolsl,y dex dey.) Listo. Para volcar su contenido es similar. Por supuesto sólo volcamos la parte que se ve en pantalla, no sobre los atributos ni las dos columnas sin usar de la derecha. Es decir los bytes del 2 al 37. SCR_ADDR es una etiqueta con la dirección de pantalla donde queremos empezar a volcar. Sería $bb80 para empezar por la parte superior. En el juego es más abajo, porque reservamos sitio para el panel de puntuaciones. _dump_backbuffer ldy #39-PCOLSL-PCOLSR lda _backbuffer+40*0+pcolsl,y sta SCR_ADDR+40*0+PCOLSL,y lda _backbuffer+40*1+pcolsl,y sta SCR_ADDR+40*1+PCOLSL,y lda _backbuffer+40*19+pcolsl,y sta SCR_ADDR+40*19+PCOLSL,y.) dey Esta parte es MUY eficiente, así que permite hacer un scroll de todo el mapa muy rápidamente (eso sí, carácter a carácter). Basta con actualizar el valor de _inicol y lanzar las rutinas anteriores. Es una buena base. El borrado del búfer lleva 3830 ciclos, el renderizado son 8060 (incluyendo el campo de estrellas que todavía no hemos visto) y el volcado Todo ello son ciclos, menos de los que producirían 50 frames por segundo con el 6502 del ORIC a 1Mhz. Pero faltan cosas. Sobre el doble búfer hay que pintar también los diferentes sprites y, además, queremos un efecto parallax con las estrellas (que no están ni pintadas aun). Comenzaremos por lo segundo. En la próxima entrega

4 Ummm... igual esto es demasiado técnico o denso... De todas formas me parece una buena idea ir documentando estas cosas. Me sirve para repasar las rutinas y dejar por escrito qué voy haciendo. Oye, e igual alguien en un futuro lo encuentra útil. Así que seguimos con el. El campo de estrellas y el efecto parallax Es sencillo tener un campo de estrellas fijo. Basta con tener un array con las posiciones de las estrellas y pintarlo sobre el fondo. Digo sobre el fondo, porque lo hago después del bucle anterior, chequeando si hay algo o no, es decir si el backbuffer contiene un 32 (espacio) o no. De este modo me ahorro un montón de comprobaciones en el bucle anterior viendo si lo que se vuelca es un espacio o no y resulta más eficiente. Pero vamos a hacer que las estrellas hagan scroll píxel a píxel y así lograr un efecto más chulo. No nos hace falta generar estrellas para todo el mapa, sino sólo para un pequeño trozo. Cuando hagamos scroll de una columna en el mapa, la estrella lo hará un pixel y no se moverá de la posición que tiene en el mapa (basado en caracteres) hasta que no hayamos hecho esto 6 veces. Con un cálculo rápido vemos el área que hay que rellenar con estrellas: podemos hacer scroll como =216 veces (si suponemos que vemos 40 columnas, que ni eso). Esto dividido por 6 da 36. Así que tenemos que rellenar las 40 columnas que vemos, más 36; es decir 76. Como las dos últimas no se ven, en realidad son 74. Lo que tenemos entonces es un array con el número de estrellas (ahora mismo 30) que contiene su posición (x,y) en el mapa, donde x va de 0 a 73 e y de 0 a 19 y que se rellena de forma aleatoria. Como sólo existe el gráfico para el juego de caracteres alternativo, las estrellas tienen que estar en filas impares. De todo eso se encarga la rutina de generación. En realidad es más eficiente tener definidas tres tablas: dos para el puntero a la fila donde está la estrella y uno para la columna: starsx starshi starslo.dsb NSTARS.dsb NSTARS.dsb NSTARS El gráfico correspondiente a una estrella es un solo punto en la tercera fila. Lo que hacemos en cada scroll es rotar ese byte (lo que rota la estrella en todas partes donde aparece) y si hace falta actualizamos su posición X y reiniciamos. Como sólo tenemos 6 pixels por byte, no se puede usar el carry para ver si nos salimos y es algo más complicado. Por ejemplo este código hace scroll a la izquierda: ; Rotamos y miramos si nos ; hemos salido de los 6 bits menos ; significativos lda _star_tile+3 asl and #% beq update ; No nos hemos salido, nada más que hacer sta _star_tile+3 ; Nos hemos salido, movemos las estrellas y reiniciamos ; el gráfico update ; Bucle para todas las estrellas, decrementando ; su posición X ldx #NSTARS-1 dec starsx,x dex ; Ponemos el pixel 0 a 1 lda #% sta _star_tile+3 En realidad no se hace así del todo porque, para evitar errores visuales (tearing), se marca que hay que reiniciar el gráfico y se hace al final del volcado de toda la pantalla. Ya aclararemos este punto más adelante. Para pintar las estrellas, la cosa es sencilla:

5 _plot_stars ; Bucle para todas las estrellas (decrementando) ldx #NSTARS-1 ; Tomamos el puntero a la fila de la estrella y lo metemos en tmp (página cero) lda starslo,x sta tmp lda starshi,x sta tmp+1 ; Tomamos la columna de la estrella ; y comprobamos que sea visible ; si no lo es saltamos a la siguiente ldy starsx,x bmi skip cpy #39 bcs skip ; Es visible, miramos si en el backbuffer tenemos en ; la posición donde va la estrella un espacio libre o no lda (tmp),y cmp #32 bne skip ; Lo tenemos, así que ponemos el código del gráfico ; de la estrella lda #STAR_TILE sta (tmp),y skip dex.) Hasta aquí vale, pero y los marcianos? Naturalmente queremos poner naves enemigas, objetos y otras cosas. Y queremos que sean sprites con sus máscaras y poder darles animaciones, etc. Los sprites son de 2x2 caracteres, es decir: 12x16 pixeles. Los sprites por software se basan en la técnica clásica de tener por un lado el gráfico y por otro la máscara que indica la parte que ocluye el gráfico (como ceros y el resto unos). Se toma el fondo, se le hace un AND con la máscara y se aplica el gráfico con una operación OR. Por ejemplo la nave y su máscara son: Gráfico Máscara Los datos de los sprites se almacenan en arrays (vectores) que contienen cosas como la fila y columna en que están situados, su velocidad, hacia dónde miran, su estado, velocidad, etc. También, por supuesto, punteros a su gráfico y máscara actuales. Quizás es buen momento para recordar que para manejar arrays con el 6502, es más eficiente generar campos de 8 bit y ponerlos cada uno por separado. Así un puntero a un gráfico que es de 16 bits, es mejor tenerlo como dos vectores separados con la parte baja y la alta que un vector con entradas de 2 bytes. Tenemos, pues, cosas como: ; Position of sprites in the overall map sprite_cols.dsb MAX_SPRITES+1 sprite_rows.dsb MAX_SPRITES+1 ; Movement speed max_speed.dsb MAX_SPRITES+1 ; Pointers to graphic and mask data sprite_grapl.dsb MAX_SPRITES+1 sprite_graph.dsb MAX_SPRITES+1 sprite_maskl.dsb MAX_SPRITES+1 sprite_maskh.dsb MAX_SPRITES+1 Todo esto está muy bien y en alta resolución (HIRES) lo hemos hecho otras veces. La cosa es hacer esta operación lo más rápido posible, porque es el cuello de botella. Ahora bien, cómo hacemos esto cuando usamos modo texto? Pues sobre caracteres, claro. Es como si manejásemos un modo de pantalla diferente, con otro direccionamiento (que es lo que es en realidad, nada de como ).

6 La rutina básica es la que se encarga de renderizar un tile de 6x8. Necesita el código del gráfico de fondo y un par de punteros al gráfico y a la máscara. Además, como usamos dos juegos de caracteres diferentes, hay que tener en cuenta de cuál se trata. Para optimizar los punteros se modifican directamente en el código (otra vez código auto-modificable) y se usan tablas para las multiplicaciones. El resultado del renderizado va a ir en alguno de los caracteres que aún no se han usado de los 96 y que están asignados a los sprites. Luego pondremos el código de ese carácter en el back buffer en la posición correcta antes del volcado. Está claro que no podemos hacerlo sobre el original, pues modificaríamos el gráfico en sí, que puede estarse usando en otros sitios. Vamos a intentar explicar la rutina que hace esto. El tile de fondo se pasa en el registro A, el tile de destino (donde va a ir el resultado final) en el registro Y. Los punteros al gráfico y máscara ya están actualizados y el juego de caracteres utilizado se pasa en una variable de página cero (tmp3+1) como el byte alto de donde empieza dicho juego, es decir $b4 o $b8. render_tile ; Obtener el puntero a los datos gráficos para ; el carácter en A: ; $b400+(rega*8) o $b800+(rega*8) ; Multiplicamos A*8 tax lda tab_mul8_lo,x ; Guardamos modificando el código más abajo sta smc_bkg_p+1 ; Vamos con la parte alta lda tmp3+1 ; contiene $b4 o $b8 adc tab_mul8_hi,x ; Guardamos modificando el código más abajo sta smc_bkg_p+2 ; Ahora lo mismo para el destino lda tab_mul8_lo,y sta smc_dest_p+1 lda tab_mul8_hi,y ;tmp+1 adc tmp3+1 sta smc_dest_p+2 Ya tenemos los punteros preparados, ahora hay que hacer el bucle que vaya recorriendo los 8 bytes tomando el fondo, haciendo el AND con la máscara y el ORA con el gráfico y almacenando en el carácter de destino. No confundirse porque algunas etiquetas tengan un + delante: es para que sean accesibles desde otras funciones externas. El código auto-modificable es engorroso pero ahorra muchos ciclos en este tipo de cosas. ldy #7 smc_bkg_p lda $1234,y ; Esto lo acabamos de poner a la dirección correcta +smc_mask_p and $1234,y ; Esto se puso fuera, antes de llamar a la función +smc_sprite_p ora $1234,y ; Esto también smc_dest_p sta $1234,y ; Esto lo acabamos de poner a la dirección correcta dey.) Y listo. Ya tenemos el gráfico correcto en uno de los caracteres libres. En realidad estoy usando dos funciones idénticas, excepto que la segunda invierte el gráfico y la máscara antes de pintar. Esto es útil para no tener en memoria los gráficos de los objetos dos veces: una mirando a la derecha y otra a la izquierda. Para hacerlo rápido, se tiene una tabla de 64 entradas con los inversos de cada patrón de 6 bit y el bucle queda: ldy #7 smc_bkg_p lda $1234,y +smc_maski_p ldx $1234,y and inverse_table,x +smc_spritei_p

7 ldx $1234,y ora inverse_table,x smc_dest_p sta $1234,y dey Para pintar un sprite completo primero necesitamos 4 caracteres libres (dos en el juego estándar y dos en el alternativo, porque usa dos filas). Para ello se tienen unas tablas que indican el código de los caracteres a utilizar. Cada sprite tiene asociados cuatro códigos donde dibujarse sprite_tile11 (fila1, columna1), sprite_tile12 (fila1, columna2), sprite_tile21 y sprite_tile22 (ídem para la fila 2). Si un sprite puede tener asociados el 125 y el 126 para la fila 1 y también el 125 y el 126 para la fila 2, porque ambos van en juegos de caracteres diferentes. Tenemos libres del 88 al 127, lo que daría para unos 20 sprites. No está mal. Lástima que no vaya a ser así al final. Pero ya hablaremos de eso. Vamos a ver cómo se renderiza un sprite de 2x2 cuyo código (un identificador) se pasa en el registro X. La idea es: 1-Lo primero es ver si el sprite está en la zona visible (restar a su columna la columna inicial que estamos viendo y ver que está en rango). 2-Calcular el puntero a la fila del back buffer (fila_del_sprite*40+base_backbuffer). Luego pondremos la columna (menos la columna inicial) en el registro Y y accedemos al contenido por direccionamiento indirecto (Ej.: lda (puntero),y). 3-Poner los códigos de los caracteres asociados al sprite en el back buffer, guardando primero el contenido que tenían para pintar luego el fondo. render_sprite ; Lo primero colocar los caracteres donde vamos a pintar ; sobre el backbuffer ; Es el sprite visible? lda sprite_cols,x ; X es el id del sprite, para acceder a todos sus datos sec sbc _inicol adc #2 bpl okhere retme okhere cmp #39 bcs retme okthere ; Vale lo es, aprovechamos para guardar la ; posición de su columna en el backbuffer (restada la ; columna inicial _inicol) sta tmp4 ; Calcular row*40+base del backbuffer y guardar en tmp1 ; Como el backbuffer está alineado a una página, basta ; con sumar en el byte alto ldy sprite_rows,x lda tab_m40lo,y sta tmp1 lda #>_backbuffer adc tab_m40hi,y sta tmp1+1 ; Ponemos los caracteres donde vamos a pintar ; y vamos salvando los códigos que había ldy tmp4 ; Aquí teníamos la columna del sprite-columna inicial (por el scroll) lda (tmp1),y ; Contenido en esa posición sta t11+1 ; Lo guardamos (de nuevo código automodificable, ya veremos luego) lda sprite_tile11,x ; Cogemos el código asociado al sprite para ese tile sta (tmp1),y ; Lo ponemos en su sitio ; Siguiente columna de la fila 1 iny lda (tmp1),y sta t12+1 lda sprite_tile12,x sta (tmp1),y

8 ; Vamos por la columna 1 de la fila 2 tya adc #39 tay lda (tmp1),y sta t21+1 lda sprite_tile21,x sta (tmp1),y ; Y la columna 2 de la fila 2 iny lda (tmp1),y sta t22+1 lda sprite_tile22,x sta (tmp1),y Vale, eso ya está. Ahora basta con renderizar los gráficos en cada uno de los cuatro caracteres. La idea es simple usando la rutina que vimos antes, pero hay algunos detalles que complican el código. Lo primero es que hay que tener en tmp3+1 $b4 o $b8 dependiendo del juego de caracteres a usar, es decir, de si la fila es par o impar. Se usa una tabla para eso y el código es: lda sprite_rows,x and #%1 tay lda base_charset_p,y sta tmp3+1 Bueno, ahora hay que obtener los punteros a los gráficos y máscara y ponerlos en el código auto-modificable de la rutina que renderiza. De nuevo dos versiones, dependiendo de si hay que invertir el gráfico, pero nada complicado. Los punteros se almacenan en tablas indexadas por el id del sprite (que sigue en el registro X): lda sprite_dir,x bmi inversed_draw ; Tomamos la dirección en la que mira el sprite ; Versión que no invierte lda sprite_maskl,x sta smc_mask_p+1 lda sprite_maskh,x sta smc_mask_p+2 lda sprite_grapl,x sta smc_sprite_p+1 lda sprite_graph,x sta smc_sprite_p+2 jmp endinvcheck ; Versión que invierte inversed_draw lda sprite_maskl,x sta smc_maski_p+1 lda sprite_maskh,x sta smc_maski_p+2 lda sprite_grapl,x sta smc_spritei_p+1 lda sprite_graph,x sta smc_spritei_p+2 endinvcheck Vale, ahora hay que cargar en A el código con el gráfico de fondo. Lo habíamos salvado antes en t11+1, t12+1, etc. no? Pues se toma aquí. Es feo, pero más rápido que usar variables intermedias o la pila. Esto se repite para los cuatro caracteres, así que basta con poner uno: ; Tomamos el código del carácter de fondo t11 lda #0 ; Aquí lo hemos guardado antes ; ahora tomamos el carácter de destino para este sprite en la posición 1,1 ldy sprite_tile11,x ; Reservamos X stx tmp3 ; Y listos para llamar, por desgracia no es tan inmediato por culpa de ; tener en cuenta la versión que invierte Esto está chapuceado, de momento.

9 pha lda sprite_dir,x bmi inverse_draw1 pla jsr render_tile jsr add8pointers ; Suma 8 a los punteros necesarios jmp t12 inverse_draw1 jsr add8pointersi ; Suma 8 a los punteros necesarios, versión invertir pla jsr render_tilei jsr sub8pointersi ; Resta 8 a los punteros necesarios ; Siguiente t12.) Hala, ahora a tomar un café que esto ha sido mortal para nuestras neuronas. Eso sí, funciona y es rápido. Toma unos 1500 ciclos de CPU renderizar un sprite en pantalla. Pero si lo implementamos así nos encontramos con un montón de efectos espantosos en pantalla: tearing, glitches gráficos, etc. Inutilizable para nada decente. Por ejemplo la siguiente imagen muestra el "tearing". Se produce porque estamos actualizando la memoria de pantalla mientras la ULA está refrescando la imagen, de forma que una parte tiene el gráfico antiguo y la otra el nuevo. Aquí se ve bastante claro (y vemos que queda horrible), pero también ocurre si actualizamos un sprite, su sombra, etc. mientras ya está parcialmente dibujado. Existe otra versión más sutil, que ocurre cuando actualizamos el contenido gráfico de un carácter y su posición, pudiendo ocurrir que en la imagen tengamos el gráfico antiguo en la posición nueva o el nuevo en la antigua. Recordemos, además que los sprites llevan parte del fondo, que puede no ser el correcto en este caso. Lidiaremos con eso más adelante. O sea que hay que librarse de ello. Para el tearing normal es algo simple: sólo hay que sincronizar con el barrido vertical del monitor para pintar mientras no se está actualizando la imagen. Un momento Eso no se puede hacer con un Oric. No hay manera de detectar esa señal sin un mod (simple, pero que poca gente tiene).

10 Bueno, pues lo haremos por software. Menos mal que Fabrice Frances ya nos dijo cómo hacerlo en su día. Sólo hay que integrarlo. Para el resto de efectos raros En fin, primero habrá que ver por qué se producen. Sincronización con el barrido vertical Para poder sincronizar con el barrido vertical necesitamos una interrupción que salte cada vez que se finalice un dibujado de la imagen (más o menos). En el ORIC no se dispone de dicha señal, pero se puede modificar el contador de la vía T1 que decide cada cuánto se envía una interrupción a la CPU. Fabrice Francés (el autor del emulador Euphoric y un monstruo de la comunidad) diseño una rutina de calibración simple para sincronizar ese contador con el barrido de pantalla. La rutina es simple: cambia el color de papel de la pantalla cuando se produce una interrupción, espera un tiempo y luego lo restaura. Si el cambio se produce en medio del dibujado de la imagen, sólo un trozo aparecerá con ese color de papel. Además la rutina lee el teclado y usa una tecla para incrementar el contador de T1 y otra para decrementarlo. Una tercera tecla sirve para salir. Comenzamos con el contador a un valor que genere interrupciones a 50Hz. Si decrementamos el contador, se producen las interrupciones en menos tiempo del que tarda el barrido y la barra se desplaza hacia arriba. Si lo incrementamos pasa lo contrario. Basta con que el usuario use las teclas para situar la barra (el trozo) de color de papel diferente al final de la pantalla (y que no se desplace) para tener las interrupciones sincronizadas con el barrido vertical. Vamos a usar esa rutina para nuestros propósitos, pero primero vamos a echar unos números. Tenemos que actualizar la memoria de pantalla (es decir, volcar nuestro back buffer) mientras la imagen no se está enviando a la TV. Creo que la tele usa modo entrelazado, así que en un barrido se actualizan 312 líneas (creo que es así, sino corregidme, por favor). En el ORIC sólo 224 de esas líneas tienen información, el resto es borde, así que tenemos: 20 ms por cuadro, 312 líneas, dan como 6,4 microsegundos por línea. El tiempo que el ORIC pinta borde es de 88 líneas ( ), o sea 5,6 milisegundos o 5600 ciclos. El volcado de nuestra área de juego duraba 6731 ciclos. Nos pasamos, pero es que no toda la pantalla es área de juego, sino solo 160 líneas (8x20). O sea que tenemos el tiempo de 152 líneas, más de 9700 ciclos. Eso está mejor. Podemos hacer que el usuario sincronice la interrupción cuando comienza el dibujado del radar y tenemos tiempo suficiente para volcar el back buffer. En el vídeo que ya os había puesto antes se ve este proceso: El código del bucle principal debe ahora hacer: jsr _clear_backbuffer jsr _render_background ; Draw the sprites over the background jsr _put_sprites ; Now let's synchronize with the vbl jsr waitirq ; Done, now we are (hopefully) on the BLANK period, dump ; the double buffer quickly jsr _dump_backbuffer La rutina waitirq simplemente espera a que se produzca una interrupción antes de volcar el back buffer, eliminando completamente el tearing. Listo! o no? Pues hay algunas cosas que decir. Lo primeo es que si hacemos un cálculo rápido con lo que nos llevaba borrar, renderizar el fondo y volcar, estábamos como en ciclos. Si pintamos, digamos, 5 ó 6 sprites nos vamos rápidamente a 7000 ciclos más. Acabamos de pasarnos de los Por muy poco que nos pasemos, perderemos una interrupción y la sincronización nos hará esperar al siguiente cuadro. Resultado: tenemos el juego a 25 cuadros por segundo. No está mal, pero sin sincronizar estaríamos fácilmente en más de 30 ó 35. Es el precio que se paga. Solo espero que no se dé el caso de emplear más de ciclos o bajamos a 16 cuadros por segundo inmediatamente. Eso sí es una pérdida. Vale, lo implementamos todo y nos ponemos a probar. Parece que todo va bien hasta que, de pronto nuestro sprite corrompe el fondo durante un cuadro y luego se arregla. Vemos que eso se da cada cierto tiempo, así como otros fallos esporádicos en los gráficos. Qué ocurre? Pues ocurre que, cuando pintamos los sprites con su máscara estamos modificando el contenido de un carácter que está en pantalla y, como está fuera del sincronizado, puedes pillarlo en medio del volcado de la imagen. Imaginemos que no ha sido pintado y resulta que nos ponemos a pintarlo en otro sitio. Lo primero que hace la rutina es colocar el carácter en el nuevo lugar, pero en el back buffer, no en pantalla. Luego procedemos a dibujarlo enmascarado con el nuevo

11 fondo. Si antes de volcar el back buffer toca un barrido, el gráfico pensado para la nueva posición, se va a pintar en la antigua. Ahí está el fallo. No estaría mal que nos diese tiempo a hacerlo todo en los ciclos, pero no se puede. Tampoco podemos dibujar los sprites tras detectar la interrupción, justo antes de volcar el back buffer, porque nos pasamos del tiempo que calculamos antes (9700 ciclos). Para solucionar esto hay que usar un pedazo de truco. Usar dos juegos de caracteres libres para dibujar los sprites de manera alternativa, así no corrompemos nunca el que pueda pintarse en pantalla. Lo malo es que eso nos reduce el número de sprites que podemos tener a la vez a la mitad. De 20 a 10. De todas formas pintar 10 sprites a la vez en pantalla lleva ya demasiado tiempo, así que no es tan terrible. Para los que quieren código, esto se hace justo después del jsr _reder_background, y cambia en la tabla que vimos los caracteres a usar. En la tabla aparecen inicialmente sólo pares y en cada bucle de juego se alterna con los impares: ; Update sprite tiles to use this frame ; Using two sets alternatively avoids having to draw them ; while the screen is not being refreshed, which was too ; tight when more than 5-6 sprites on screen. ; Drawback: we duplicate the tiles needed :/ lda frame_counter and #1 beq ones lda #$de ; Opcode for dec abs,x.byt $2c ones lda #$fe ; Opcode for inc abs,x sta ldx #(MAX_SPRITES+1)*4-1 inc sprite_tile11,x dex Vale, el código es algo ofuscado, pero funciona. También se deja para justo después del volcado el actualizar el gráfico de las estrellas. Eso lleva poco tiempo y cabe antes de que comience la actualización de pantalla. Si no lo hacemos aquí, no queda sincronizado con el barrido y, de nuevo, aparecen errores gráficos. El motor ya está listo. Pero quedan mogollón de cosas... Generación Procedural de la Nave Enemiga Ya tenemos el motor funcionando y el siguiente paso que vamos a ver es el diseño de las naves nodriza enemigas para cada nivel. Es algo así como el fondo donde se mueve el jugador y el resto de elementos del juego. El "mapa" del nivel ocupa 5K (256 celdas y 20 filas). Podríamos pensar en diseñar varias naves enemigas para el fondo y luego comprimir los datos. En cada nivel extraemos los datos correspondientes en la memoria y listo. Hay multitud de técnicas para guardar los datos comprimidos, y se pueden conseguir compresiones muy altas para guardar muchas pantallas o diseños. Normalmente para poder comprimir mucho, necesitamos elementos que se repitan, así que a mayor compresión, menos variedad. Supongamos que conseguimos comprimir cada nave nodriza en... yo qué se, pongamos 1K. Cuántos niveles podemos poner? Depende de la memoria libre, pero ya vemos que 10 niveles serían 10K, lo que es bastante. Y si queremos tener 50 niveles? o 70?... Nos quedamos rápidamente sin memoria. Pero hay una alternativa: la generación procedural (ver artículo en Wikipedia). La cosa es generar el contenido algorítmicamente en lugar de manualmente. La cosa es simple (y complicada a la vez). Necesitamos un generador de secuencias a partir de una semilla. Por ejemplo una implementación de la serie de Fibonacci o un generador de pseudoaleatorios. La cosa es que, para una semilla determinada se genere siempre la misma secuencia de números cada vez que llamemos a la función. Ahora podemos usar algoritmos que usen los datos generados por la función para ir construyendo el contenido. Cosas como llamar a la función y dependiendo de ciertos bits del resultado generar un bloque de un tamaño determinado, con esquinas cuadradas o en chaflán, con determinados elementos en su superficie, etc. Podemos ir llamando a la función cada vez que tengamos que decidir el tipo de contenido o su localización. Hacemos lo mismo para generar espacios entre bloques (o no), para elegir cómo los conectamos entre sí, etc. Son todo reglas que operan en base a los datos que se van generando. Como son siempre los mismos para una semilla dada, pues siempre sale la misma nave. La mayor dificultad está en ajustar el generador para que el contenido sea correcto y suficientemente variado.

12 Las semillas de cada nivel se generan a partir de la inicial del nivel anterior. Así podemos ir a un nivel determinado sin más que llamar a una función las veces que haga falta y luego llamar al generador. Esta misma técnica la usaba Elite (y se importó para 1337) para generar todo el universo del juego. Ahí sí que era complicado, porque el contenido era muy rico y complejo. Aquí es algo más simple, pero suficiente para dar dolor de cabeza al programador. Aquí vemos un ejemplo de cómo el generador va construyendo la base de la nave. Fue un primer intento que implementé en Matlab para probar, pero está bien para ver cómo funciona la cosa (sólo una parte, porque el completo ocupaba mucho): El generador implementado en el juego es ligeramente diferente y ocupa ahora mismo 2559 bytes. Tiene algún fallo menor, pero está casi completo al 100%. No está mal. Con menos de 3K tenemos para generar, en principio, infinitos niveles, aunque no puedo asegurar que la secuencia no se acabe repitiendo. Probablemente el juego se quede en un número de niveles máximo del orden de 100. Además es bastante rápido, así que el usuario no nota ningún retardo entre niveles por su causa. Dejamos aquí este tema. Si alguien quiere más detalles técnicos o aclaraciones en algún punto, que lo pida. Yo encantado. En la próxima edición a ver si empezamos a hablar de los enemigos y la IA. La IA de los enemigos El esquema para implementar el movimiento de los enemigos es bastante sencillo. La idea es algo parecido a la "multitarea cooperativa" de antaño: en cada instante se recorren todos los enemigos activos y se invoca a una función que implementa su IA. Estas funciones deben realizar el trabajo en pasos de manera que cuando se las llame, hagan un par de cálculos, modifiquen lo que sea necesario y retornen lo antes posible para que el sistema pase a la siguiente. Cada enemigo debe tener entonces un área de datos donde almacenar su estado (su "contexto"). Como es costumbre en máquinas basadas en 6502, es mejor tener vectores de bytes (uno por dato, o dos por dato si los son de 16 bit), en lugar de todo en un bloque (como sería una estructura en C) para acceder más rápidamente. Creo que esto ya lo comenté antes. En este juego este área de datos está formado por lo siguiente: ; Posición en el mapa sprite_cols.dsb MAX_SPRITES+1 sprite_rows.dsb MAX_SPRITES+1 ; Comando principal de la IA pcommand_l.dsb MAX_SPRITES+1 pcommand_h.dsb MAX_SPRITES+1 ; Comando adicional de la IA ccommand_l.dsb MAX_SPRITES+1 ccommand_h.dsb MAX_SPRITES+1 ; Variable interna (su uso depende de la función ejecutada) sprite_var1.dsb MAX_SPRITES+1 ; Estado de animación o paso en el algoritmo anim_state.dsb MAX_SPRITES+1 ; Velocidad de reacción del enemigo ; Una máscara para aplicar al número de frame actual (que es un byte que se incrementa en cada cuadro) ; se hace un AND entre ambos para ver si se ejecuta el comando (Z=0) o se retorna sin hacer nada (Z!=0) reac_speed.dsb MAX_SPRITES+1 ; Velocidad de movimiento máxima. max_speed.dsb MAX_SPRITES+1 ; Punteros al gráfico y máscara actuales sprite_grapl.dsb MAX_SPRITES+1 sprite_graph.dsb MAX_SPRITES+1 sprite_maskl.dsb MAX_SPRITES+1 sprite_maskh.dsb MAX_SPRITES+1 ; Dirección del movimiento: 0=parado, >0 a la derecha, <0 a la izquerda sprite_dir.dsb MAX_SPRITES+1 ; Estado del enemigo: 0=inactivo 1=normal 2=explotando sprite_status.dsb MAX_SPRITES+1 ; Velocidad de movimiento actual (es un índice a una tabla de velocidades, para implementar

13 aceleraciones, deceleraciones speedp.dsb MAX_SPRITES+1 ; Movimiento arriba o abajo <0 arriba, or >0 abajo, 0 sin movimiento speedv.dsb MAX_SPRITES+1 ; Tipo de enemigo sprite_type.dsb MAX_SPRITES+1 Parece muy complicado, pero los datos van saliendo de manera natural al ir implementando. Lo más importante son los punteros a los comandos de la IA. Yo estoy usando dos (que llamo continuo y principal), porque me dan más flexibilidad (ahora mismo hablo de eso). Cuando queremos que un enemigo realice una función determinada (por ejemplo perseguir al jugador o simplemente explotar), se instala la dirección de la función adecuada en esos punteros. En cada cuadro, entonces, el motor recorre los enemigos mirando a ver lo que tiene que hacer de este modo (el código es un resumen de lo que hay implementado, para dejar solo lo importante): ;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Move the sprites ;;;;;;;;;;;;;;;;;;;;;;;;;;; move_sprites ldx #MAX_SPRITES ; Está el enemigo activo? lda sprite_status,x beq skip ; Miramos si tiene un comando continuo y saltamos a esa rutina si es así ; Se hace con código automodificable lda ccommand_h,x beq noccommand sta smc_jmpc+2 lda ccommand_l,x sta smc_jmpc+1 smc_jmpc jsr $1234 noccommand ; Miramos si tiene un comando primario y saltamos a esa rutina si es así ; Se hace con código automodificable lda pcommand_h,x beq noprimcommand sta smc_jmp+2 lda pcommand_l,x sta smc_jmp+1 smc_jmp jsr $1234 +noprimcommand Hasta aquí es fácil, porque sólo se mira si la parte alta del puntero es diferente de cero (no se tienen comandos en direcciones debajo de $00ff porque es la página cero) y, si no lo es, entonces hay un comando al que saltar con jsr. Generalmente yo pongo en los comandos primarios cosas como el seguir al jugador o moverse de izquierda a derecha, y en los secundarios o continuos cosas como la animación del enemigo, pero acabo mezclándolos más o menos según me interesa. El tenerlos separados me permite simplemente combinar cosas. Tras esto el motor sigue con el movimiento del enemigo. Para sincronizar el movimiento tengo una variable llamada frame_bit que parte de un valor y va rotando el 1 en cada cuadro. Así un enemigo que se mueva cada cuadro (lo más rápido permitido) tiene una velocidad en binario de , uno que se mueva cada dos cuadros , etc. Esto lo tuve que hacer para evitar que dos naves moviéndose a la misma velocidad lo hicieran en cuadros alternos, porque el resultado era visualmente horroroso. ; Comprueba si debe moverse según su velocidad que, recordemos, es una tabla... ldy speedp,x lda tab_speedh,y ;... que contiene máscaras para asociar al frame_bit and frame_bit beq nomoveh ; Vale,toca moverlo. Esto es simplemente sumarle el valor de la variable sprite_dir (dirección) a la variable sprite_cols (columna actual) lda sprite_cols,x

14 adc sprite_dir,x sta sprite_cols,x nomoveh ; Ahora el movimiento vertical ; mucho más simple, sólo arriba o abajo ; pero cada dos frames, que sino es demasiado rápido lda frame_counter and #%1 bne skip ; Como antes, sumamos la velocidad, comprobando que no nos ; salimos de la pantalla. lda speedv,x beq skip adc sprite_rows,x bmi skipv cmp #20-1 bcs skipv sta sprite_rows,x skipv ; Hecho, a por el siguiente: hasta el X=0 (inclusive) dex Bueno, en realidad se hacen algunos apaños con el movimiento para el jugador, porque hay algunos detalles que tener en cuenta, pero son cosas menores. Y aquí estamos hablando de la IA. Veamos un ejemplo sencillo: un movimiento lateral que se invierte al llegar al borde. El id del objeto a tratar viene siempre en el registro X. Podemos implementarlo con una función como ésta: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Primary command for the simplest ; back and forth movement. When near ; the edge, turn around ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; move_lateral_and_back ldy sprite_cols,x lda sprite_dir,x bmi checkleft cpy #250 bcs turn checkleft cpy #6 bcc turn.) Este es muy simple, ni acelera, ni varía la dirección ni nada, pero puede ser base para otros más complejos. Otro ejemplo: animación en cuatro cuadros. La idea es, dependiendo de la velocidad de animación que queramos, ir cambiando los punteros de gráfico y máscara entre cuatro posibles. Además mantenemos el estado de animación en la variable del objeto anim_state: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Generic 4 frame animation ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gen_fourframe ; Es el momento de animar? lda frame_counter and #%11 ; solo cada cuatro cuadros beq doit retme doit ; lo es, actualiza anim_state (solo importan los dos bits bajos) y los punteros a gráfico y máscara inc anim_state,x

15 lda anim_state,x and #%11 beq restoreg ; Avanza un frame lda sprite_grapl,x adc #32 sta sprite_grapl,x bcc nocarry inc sprite_graph,x nocarry lda sprite_maskl,x adc #32 sta sprite_maskl,x bcc nocarry2 inc sprite_maskh,x nocarry2 restoreg ; Vuelve a poner el primer gráfico sec lda sprite_grapl,x sbc #(32*3) sta sprite_grapl,x bcs noborrow dec sprite_graph,x noborrow sec lda sprite_maskl,x sbc #(32*3) sta sprite_maskl,x bcs noborrow2 dec sprite_maskh,x noborrow2.) Y así. Por supuesto en este juego hay comportamientos complejos: desde naves que intentan esquivar tus disparos, que se mueven en círculos a tu alrededor, que intentan chocar contigo... hasta cosas como el Eye of the Beholder que, si está cerrado se mueve lateralmente pero cuando estás cerca se abre y comienza a perseguirte para chocar contigo hasta que te alejas y vuelve a cerrarse. Y algunos otros que no desvelo, para que los descubráis jugando ;) El sistema es suficientemente flexible como para que la explosión de los enemigos sea un comando de este tipo, pero también el que hace la nave del jugador al cambiar de dirección e incluso hay una para los disparos (el normal y el super-shot). Cuando es necesario se instala y a correr. Vamos a ver con más detalle el que hace explotar una nave. Cuando queremos hacerlo, cargamos en el registro Y el id (índice en los arrays) del enemigo y llamamos a la siguiente función: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Instala el comando para ; hacer explotar la nave cuyo ; ID se pasa en el registro Y ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; explode_ship ; Prepara el comando lda #<do_explode sta pcommand_l,y lda #>do_explode sta pcommand_h,y ; Elimina cualquier comando continuo lda #0 sta ccommand_h,y ; Detener el movimiento sta speedv,y lda #8 sta speedp,y

16 ; Preparar punteros a los gráficos ; de la explosión lda #<_sprite_explosion sta sprite_grapl,y lda #>_sprite_explosion sta sprite_graph,y lda #<_mask_explosion sta sprite_maskl,y lda #>_mask_explosion sta sprite_maskh,y ; Indicamos que está explotando lda #IS_EXPLODING ora sprite_status,y sta sprite_status,y ; Colocamos el estado de animación al inicial (cero) lda #0 sta anim_state,y ; Hacemos sonar la explosión lda #EXPLODE jmp _PlaySfx ; Esto salta y retorna de esta función Esta es la parte que lo instala e inicializa. Seguido está el comando en sí que se ejecuta por el sistema: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Punto de entrada para el comando ; que hace que un enemigo explote ; El objeto tratado viene en el registro X ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; do_explode ; Ajuste de velocidad (solo cada dos frames) lda frame_counter and #%1 beq doit doit lda anim_state,x cmp #7 bcc next_step ; Si el anim_state es 7, hemos ; terminado la secuencia. ; Si no se trata del jugador podemos ; crear un item. Sino borramos el objeto lda sprite_status beq delete_object ; No es el jugador, salta a crear item y retorna ; La función crear item puede no crearlo ; en cuyo caso salta a delete_object (más abajo) jmp create_item ; Borramos un objeto +delete_object ; Vaciamos los comandos y variables asociadas lda #0 sta pcommand_h,x sta sprite_status,x sta anim_state,x sta speedv,x sta speedp,x ; decrementamos los enemigos actuales y retornamos dec waveobjects next_step ; No hemos acabado, siguiente paso de la animación ; incrementar punteros y estado de animación inc anim_state,x lda sprite_grapl,x adc #32 sta sprite_grapl,x

17 bcc nocarry inc sprite_graph,x nocarry lda sprite_maskl,x adc #32 sta sprite_maskl,x bcc nocarry2 inc sprite_maskh,x nocarry2.) A que es sencillo? Al menos conceptualmente. Si queréis más sobre la programación de IAs en estos juegos, algo más complejo y variado os recomiendo la de Skool Daze. Esa sí que es complicada, sólo hay que ver las cosas que hacen los personajes durante el juego. En este caso intenté reproducir la del juego original. Escribí los detalles en el foro de Defence-Force (aunque está en inglés, creo que esta IA de lo mejorcito que he visto): La IA en Skool Daze (en inglés) : Y esto es todo. Si hay alguna duda o queréis que aclare algún punto, decídmelo y edito o posteo más detalles. Qué me queda por contar? No sé si alguien estará interesado en cómo se hace la música o los efectos de sonido (me tuve que implementar un motor simple para esto) o si me queda algún detalle del juego que os interese...

GAME MAKER JUEGO DE LABERINTOS

GAME MAKER JUEGO DE LABERINTOS GAME MAKER JUEGO DE LABERINTOS Objetivo El objetivo del juego va a ser el de coger los diamantes que se encuentren en la pantalla para poder pasar a la siguiente. A medida que aumente el nivel del juego,

Más detalles

Capítulo 0. Introducción.

Capítulo 0. Introducción. Capítulo 0. Introducción. Bueno, por fin está aquí el esperado (espero!!) Capítulo Cero del Tutorial de Assembler. En él estableceremos algunos conceptos que nos serán de utilidad a lo largo del Tutorial.

Más detalles

Colección de Juegos. Pantalla Inicial

Colección de Juegos. Pantalla Inicial Colección de Juegos Vamos a crear una aplicación que contenga un par de juegos diferentes. Empecemos con dos juegos diferentes: Pong y Pintar. Para tener dos juegos diferentes unificados en una aplicación,

Más detalles

Vamos a crear nuestro primer juego en el que tendremos que coger la comida que esta protegida por los gatos

Vamos a crear nuestro primer juego en el que tendremos que coger la comida que esta protegida por los gatos Atrapa la tarta Vamos a crear nuestro primer juego en el que tendremos que coger la comida que esta protegida por los gatos Instrucciones (Controla el movimiento del ratón con las teclas flecha derecha,

Más detalles

Módulo II - Excel. Identificando tipos de datos... 2. Introduciendo datos en las celdas... 3. Llenando automáticamente las celdas...

Módulo II - Excel. Identificando tipos de datos... 2. Introduciendo datos en las celdas... 3. Llenando automáticamente las celdas... Módulo II - Excel Índice Identificando tipos de datos... 2 Introduciendo datos en las celdas... 3 Llenando automáticamente las celdas... 4 Seleccionando un rango de celdas... 5 Seleccionando una fila o

Más detalles

Programación Gráfica 2D ( IV ) Tilemapping.

Programación Gráfica 2D ( IV ) Tilemapping. Autor: Sergio Hidalgo serhid@wired-weasel.com Introducción Programación Gráfica 2D ( IV ) Tilemapping. Con el último tutorial ya terminé de explicar el funcionamiento de SDL y la programación gráfica en

Más detalles

Algoritmos. Autor: José Ángel Acosta Rodríguez

Algoritmos. Autor: José Ángel Acosta Rodríguez Autor: 2006 ÍNDICE Página Índice 1 Problema 1. Movimiento de figuras geométricas.2 Problema 2. Conversión decimal a binario....3 Problema 3. Secuencias binarias..4 Problema 4. Conversión a binario a octal...

Más detalles

PROYECTOS PASO A PASO PARA SCRATCH

PROYECTOS PASO A PASO PARA SCRATCH PROYECTOS PASO A PASO PARA SCRATCH PROYECTO 1:( Persona bailando). 1) Abrimos el programa SCRATCH ( En linux normalmente se encuentra en la barra de menúsaplicaciones-programación-scratch).una vez abierto

Más detalles

PROCESSING SEMANA 1. PROYECTO RED SNAKE. SERPIENTE ROJA. IES Sefarad. Departamento de Tecnología

PROCESSING SEMANA 1. PROYECTO RED SNAKE. SERPIENTE ROJA. IES Sefarad. Departamento de Tecnología PROCESSING SEMANA 1. PROYECTO RED SNAKE. SERPIENTE ROJA IES Sefarad. Departamento de Tecnología qué es? LENGUAJE DE PROGRAMACIÓN para qué sirve? un idioma con normas de escritura y palabras propias para

Más detalles

Un título para esto. Un título para esto. Ignacio J. Blanco. zircacona@gmail.com

Un título para esto. Un título para esto. Ignacio J. Blanco. zircacona@gmail.com Ignacio J. Blanco zircacona@gmail.com 1 Copyright (c) 2009 Ignacio J. Blanco Medina. Se concede permiso para copiar, distribuir y/o modificar este documento bajo los términos de la Licencia de Documentación

Más detalles

Aprendiendo el uso de CmapTools Primera parte

Aprendiendo el uso de CmapTools Primera parte Aprendiendo el uso de CmapTools Primera parte La ventaja de usar un software específico para dibujar los mapas conceptuales, es que permite mover los conceptos, flechas y enlaces a través del espacio de

Más detalles

La ventana de Microsoft Excel

La ventana de Microsoft Excel Actividad N 1 Conceptos básicos de Planilla de Cálculo La ventana del Microsoft Excel y sus partes. Movimiento del cursor. Tipos de datos. Metodología de trabajo con planillas. La ventana de Microsoft

Más detalles

Ministerio de Educación. Base de datos en la Enseñanza. Open Office. Módulo 3: Edición de formularios

Ministerio de Educación. Base de datos en la Enseñanza. Open Office. Módulo 3: Edición de formularios Ministerio de Educación Base de datos en la Enseñanza. Open Office Módulo 3: Edición de formularios Instituto de Tecnologías Educativas 2011 Edición de formularios Una vez creado el formulario nos pueden

Más detalles

QUÉ ES ILLUSTRATOR? Acerca de Adobe Illustrator

QUÉ ES ILLUSTRATOR? Acerca de Adobe Illustrator QUÉ ES ILLUSTRATOR? Acerca de Adobe Illustrator Illustrator es un programa de vectores. Su principal uso es para hacer ilustraciones, caricaturas, diagramas, gráficos y logotipos. A diferencia de las fotografías

Más detalles

SCRATCH APRENDE A PROGRAMAR JUGANDO

SCRATCH APRENDE A PROGRAMAR JUGANDO SCRATCH APRENDE A PROGRAMAR JUGANDO Creando personajes y dándoles movimiento: Los personajes que podemos incluir en nuestro juego los podemos elegir de la galería de Scratch, descargarlos de Internet (

Más detalles

Insertar o crear tablas. Insertar una tabla. Crear una tabla. Usar plantillas de tabla. Utilizar el menú Tabla. Utilizar el comando Insertar tabla

Insertar o crear tablas. Insertar una tabla. Crear una tabla. Usar plantillas de tabla. Utilizar el menú Tabla. Utilizar el comando Insertar tabla Insertar o crear tablas Insertar una tabla En Microsoft Office Word 2007 se puede insertar una tabla eligiendo un diseño entre varias tablas con formato previo (rellenas con datos de ejemplo) o seleccionando

Más detalles

DIAGRAMAS DE FLUJO: DFD

DIAGRAMAS DE FLUJO: DFD DIAGRAMAS DE FLUJO: DFD DFD es un programa de libre disposición para ayuda al diseño e implementación de algoritmos expresados en diagramas de flujo (DF). Además incorpora opciones para el depurado de

Más detalles

Draw. Dibujo vectorial

Draw. Dibujo vectorial Ministerio de Educación, Cultura y Deporte Draw. Dibujo vectorial Profundización Introducción Instituto Nacional de Tecnologías Educativas y de Formación del Profesorado 2012 Draw. Open Office Inicio Objetivos

Más detalles

Curso de Visual Basic 6.0 - Lección 1 Area Interactiva - www.areaint.com

Curso de Visual Basic 6.0 - Lección 1 Area Interactiva - www.areaint.com LECCIÓN 6 En esta lección vamos a familiarizarnos con las estructuras de repetición, las cuales nos sirven para realizar una misma instrucción un número determinado de veces o indeterminado dependiendo

Más detalles

Curso POWERPOINT 97. Introducción

Curso POWERPOINT 97. Introducción Curso POWERPOINT 97 Introducción El curso PowerPoint 97 está destinado a aquellos alumnos que necesiten crear presentaciones que informen de la evolución de un proyecto. PowerPoint es un programa de edición

Más detalles

Scrolling DURACIÓN: PERÍODOS DE CUATRO CLASES

Scrolling DURACIÓN: PERÍODOS DE CUATRO CLASES Scrolling Un nuevo paso podemos darlo observando la técnica en el caso de esos juegos en los que los fondos se desplazan a medida que el jugador avanza. Una muestra la puedes ver dentro del propio Pilas,

Más detalles

Unidad 1. La información

Unidad 1. La información Unidad 1. La información En esta unidad aprenderás: Los conceptos básicos de la informática. Cómo se representa la información dentro del ordenador. Las unidades de información. 1.1 Conceptos básicos Informática.

Más detalles

La definición de digital es toda información representada por una serie de pulsos eléctricos discretos basados en un sistema binario (ceros y unos).

La definición de digital es toda información representada por una serie de pulsos eléctricos discretos basados en un sistema binario (ceros y unos). Tratamiento de la Imagen Digital Qué es la imagen digital? La definición de digital es toda información representada por una serie de pulsos eléctricos discretos basados en un sistema binario (ceros y

Más detalles

Creación de páginas Web FrontPage

Creación de páginas Web FrontPage Creación de páginas Web FrontPage 1.- Introducción Las páginas web están basadas en lo que se llama el hipertexto. En el hipertexto no hace falta seguir el documento de forma lineal, sino que se establecen

Más detalles

Práctica 1 - Pista de Carreras 12407 - Programación II

Práctica 1 - Pista de Carreras 12407 - Programación II 1. Introducción Práctica 1 - Pista de Carreras 12407 - Programación II En esta práctica el objetivo es implementar una matriz de adyacencia para el juego Pista de Carreras. Con tal fin, primero hay que

Más detalles

Tratamiento de la Imagen Digital

Tratamiento de la Imagen Digital Tratamiento de la Imagen Digital Qué es la imagen digital? La definición de digital es toda información representada por una serie de pulsos electricos discretos basados en un sistema binario (ceros y

Más detalles

Unidad 2. Repaso a conceptos básicos de Word

Unidad 2. Repaso a conceptos básicos de Word Unidad 2. Repaso a conceptos básicos de Word Objetivos de la unidad: En esta unidad aprenderemos a seleccionar palabras, párrafos y páginas para poder mover su contenido o repetirlo en otro lugar, tanto

Más detalles

Fuente: http://www.kzgunea.net

Fuente: http://www.kzgunea.net APRENDE A NAVEGAR INTERNET EXPLORER El navegador Internet Explorer ya lo tenemos integrado en el Sistema Operativo, en sus diferentes versiones desde Windows 95, por lo cual no tendremos que instalarlo.

Más detalles

En el menú Ver, podemos visualizar de distinta forma un mismo documento:

En el menú Ver, podemos visualizar de distinta forma un mismo documento: MICROSOFT WORD Al iniciar Word aparece una pantalla inicial como ésta. En la parte superior se encuentra, en color azul, la barra del título, en la que muestra el nombre del documento sobre el que estamos

Más detalles

Centro de Profesorado Luisa Revuelta (Córdoba) TEMA 6 TABLAS Y GRÁFICOS EN IMPRESS

Centro de Profesorado Luisa Revuelta (Córdoba) TEMA 6 TABLAS Y GRÁFICOS EN IMPRESS Centro de Profesorado Luisa Revuelta (Córdoba) TEMA 6 TABLAS Y GRÁFICOS EN IMPRESS Antes que nada tenemos que hablar de la distinción entre tabla y hoja de cálculo. Una tabla es una estructura formada

Más detalles

HERRAMIENTAS PARA CREAR

HERRAMIENTAS PARA CREAR LECTURA 3: DIBUJO Debemos quedarnos con la idea según la cual cuando dibujamos objetos en Flash se generan vectores (también llamados formas) correspondientes a las curvas y rectas que trazamos. Las formas

Más detalles

Unidad 2: El sistema operativo. Trabajo sin conexión.

Unidad 2: El sistema operativo. Trabajo sin conexión. Unidad 2: El sistema operativo. Trabajo sin conexión. Un sistema operativo es un conjunto de programas de control que actúa como intermediario entre el usuario y el hardware de un sistema informático,

Más detalles

Hilos en Java. Crear un Hilo. Detener un hilo. Fuente: http://www.chuidiang.com/java/hilos/hilos_java.php

Hilos en Java. Crear un Hilo. Detener un hilo. Fuente: http://www.chuidiang.com/java/hilos/hilos_java.php Fuente: http://www.chuidiang.com/java/hilos/hilos_java.php Hilos en Java A veces necesitamos que nuestro programa Java realice varias cosas simultáneamente. Otras veces tiene que realizar una tarea muy

Más detalles

Tutorial Introducción al análisis y visualización de datos utilizando una planilla de cálculo Autor: Pablo Poggi (pmpoggi@gmail.

Tutorial Introducción al análisis y visualización de datos utilizando una planilla de cálculo Autor: Pablo Poggi (pmpoggi@gmail. Tutorial Introducción al análisis y visualización de datos utilizando una planilla de cálculo Autor: Pablo Poggi (pmpoggi@gmail.com) 1. Introducción Las planillas de cálculo son documentos compuestos de

Más detalles

Para iniciar Excel es posible realizarlo de varias maneras, una de ellas es: Desde el menú Inicio.

Para iniciar Excel es posible realizarlo de varias maneras, una de ellas es: Desde el menú Inicio. Alexander Siniscalchi Agosto 2005 Introducción Este documento está adaptado al curso de Excel que se dicta a estudiantes que se inician con poco o ningún conocimiento de las herramientas de hojas de cálculos,

Más detalles

DISPLAYS DE CRISTAL LIQUIDO

DISPLAYS DE CRISTAL LIQUIDO DISPLAYS DE CRISTAL LIQUIDO INDICE MANUAL DE REFERENCIA DEL LCD 1.- INTRODUCCION 2.- CARACTERISTICAS DEL DISPLAY 2.1.- Aspecto físico 2.2.- Alimentación 2.3.- Los caracteres del LCD 2.4.- La memoria del

Más detalles

Curso de Formación del Programa Un negocio Una Web. - MÓDULO 2 -

Curso de Formación del Programa Un negocio Una Web. - MÓDULO 2 - 1 Curso de Formación del Programa Un negocio Una Web. - MÓDULO 2-1. Secciones 1.1. Visión general y ordenación. 1.2. Como editar sección ya creada. 1.3. Como buscar una sección. 1.4. Como borrar una sección.

Más detalles

Diseño de Moda Informatizado UNIDAD DIDÁCTICA 4 GRÁFICOS VECTORIALES

Diseño de Moda Informatizado UNIDAD DIDÁCTICA 4 GRÁFICOS VECTORIALES UNIDAD DIDÁCTICA 4 GRÁFICOS VECTORIALES 59 60 UNIDAD DIDÁCTICA 4 GRÁFICOS VECTORIALES 1.- GRÁFICO VECTORIAL DEFINICIÓN DE VECTORES CARACTERÍSTICAS DE LOS GRÁFICOS VECTORIALES VENTAJAS Y LIMITACIONES DE

Más detalles

COLEGIO ANTARES INFORMÁTICA BÁSICA GUÍA DE TRABAJO 1 GRADO SEPTIMO

COLEGIO ANTARES INFORMÁTICA BÁSICA GUÍA DE TRABAJO 1 GRADO SEPTIMO Página 1 de 17 Módulo de Formación: Unidad de aprendizaje 3: Resultado de Aprendizaje: Transcribir Los Documentos De Acuerdo Con Las Normas Vigentes Crear, diseñar, dar formato y editar un documento a

Más detalles

Powerpoint es un programa incluido en la suite de Microsoft Office, que nos ofrece la posibilidad de crear presentaciones profesionales.

Powerpoint es un programa incluido en la suite de Microsoft Office, que nos ofrece la posibilidad de crear presentaciones profesionales. Qué es Powerpoint 2010? Powerpoint es un programa incluido en la suite de Microsoft Office, que nos ofrece la posibilidad de crear presentaciones profesionales. El entorno de trabajo En la siguiente imagen

Más detalles

PRIMERA PARTE LAS PRIMERAS PLANILLAS

PRIMERA PARTE LAS PRIMERAS PLANILLAS PRIMERA PARTE LAS PRIMERAS PLANILLAS El objetivo de este capítulo es tener una primera aproximación al programa. Conocerle la cara: cómo se ve, para qué sirve, cuáles son y cómo se usan las principales

Más detalles

SIMULADOR DE SISTEMAS DE EVENTOS DISCRETOS

SIMULADOR DE SISTEMAS DE EVENTOS DISCRETOS SIMULADOR DE SISTEMAS DE EVENTOS DISCRETOS MANUAL DE USUARIO 1.1 Introducción. El simulador de sistemas de eventos discretos está compuesto por dos aplicaciones: el Simulador de redes de Petri y el Simulador

Más detalles

Tema 5 Repertorios de instrucciones: Modos de direccionamiento y formato

Tema 5 Repertorios de instrucciones: Modos de direccionamiento y formato Tema 5 Repertorios de instrucciones: Modos de direccionamiento y formato Bibliografía: William Stallings Organización y Arquitectura de computadores 5ta. Edition. Editorial Pearson Educación.- Objetivos:

Más detalles

Unidad I. 1.1 Sistemas numéricos (Binario, Octal, Decimal, Hexadecimal)

Unidad I. 1.1 Sistemas numéricos (Binario, Octal, Decimal, Hexadecimal) Unidad I Sistemas numéricos 1.1 Sistemas numéricos (Binario, Octal, Decimal, Hexadecimal) Los computadores manipulan y almacenan los datos usando interruptores electrónicos que están ENCENDIDOS o APAGADOS.

Más detalles

Creación, configuración, formato y visualización de una presentación en Power Point

Creación, configuración, formato y visualización de una presentación en Power Point Módulo 3 Herramientas de Cómputo Creación, configuración, formato y visualización de una presentación en Power Point Cómo crear una diapositiva nueva? Para crear una diapositiva nueva tienes que ir al

Más detalles

Ministerio de Educación. Base de datos en la Enseñanza. Open Office. Módulo 3: Controles de formulario

Ministerio de Educación. Base de datos en la Enseñanza. Open Office. Módulo 3: Controles de formulario Ministerio de Educación Base de datos en la Enseñanza. Open Office Módulo 3: Controles de formulario Instituto de Tecnologías Educativas 2011 Controles de formulario El control más habitual de un formulario

Más detalles

CASO PRÁCTICO HERRAMIENTAS DE BASES DE DATOS EN EXCEL

CASO PRÁCTICO HERRAMIENTAS DE BASES DE DATOS EN EXCEL CASO PRÁCTICO HERRAMIENTAS DE BASES DE DATOS EN EXCEL Nuestra empresa es una pequeña editorial que maneja habitualmente su lista de ventas en una hoja de cálculo y desea poder realizar un análisis de sus

Más detalles

Este programa mueve cada motor de forma independiente, y cuando termina una línea pasa a la siguiente.

Este programa mueve cada motor de forma independiente, y cuando termina una línea pasa a la siguiente. 1 Programa 1 Utilizando el icono añadimos un movimiento a por cada línea de programa. Podremos usar 8 posibles líneas de programa (Base, Hombro, Codo, Muñeca, Pinza, Salida 1, Salida 2 y línea en blanco).

Más detalles

Manual de instrucciones My Custom Design

Manual de instrucciones My Custom Design Manual de instrucciones My Custom Design Lea este documento antes de utilizar la máquina. Recomendamos que tenga este documento a mano por si necesita consultarlo más adelante. Introducción Gracias por

Más detalles

ÍNDICE WORD 2007. 2da. Parte

ÍNDICE WORD 2007. 2da. Parte ÍNDICE WORD 2007 2da. Parte PÁG. 02 05 08 12 13 15 16 17 18 19 20 22 25 TEMAS 27- Tabla de Ilustraciones 28- Índice 29- Tablas 30- Viñetas 31- Numeraciones 32- Esquemas. Esquemas numerados 33- Secciones.

Más detalles

(O cómo dar vidilla a las afotos )

(O cómo dar vidilla a las afotos ) MEJORA SELECTIVA DEL CONTRASTE LOCAL (O cómo dar vidilla a las afotos ) Introducción A veces tenemos fotos a las que nos gustaría darles más punch, pero no sabemos exactamente cómo (salvando dar un puñetazo

Más detalles

ESCUELA DE EL LIBRO DE URANTIA EN INTERNET MANUAL DEL ALUMNO

ESCUELA DE EL LIBRO DE URANTIA EN INTERNET MANUAL DEL ALUMNO ESCUELA DE EL LIBRO DE URANTIA EN INTERNET MANUAL DEL ALUMNO 1. Introducción 2. Primera semana introducción 3. Lectura y envío de respuestas a las preguntas 4. Semana de discusión 5. Semana de resumen

Más detalles

Para ponerlo en funcionamiento deberemos realizar los siguientes pasos:

Para ponerlo en funcionamiento deberemos realizar los siguientes pasos: Curso de Macros en Excel Nivel intermedio Como escribir una macro utilizando el Editor de Visual Basic. Como ejecutar una macro. Macros con libros. Movernos por un libro. Elementos repetidos Comparación

Más detalles

Módulo I - Excel. Conociendo la aplicación de Excel... 2. Abriendo una planilla de Excel... 2. Entendiendo el concepto de Libro, hoja y celda...

Módulo I - Excel. Conociendo la aplicación de Excel... 2. Abriendo una planilla de Excel... 2. Entendiendo el concepto de Libro, hoja y celda... Módulo I - Excel Índice Conociendo la aplicación de Excel... 2 Abriendo una planilla de Excel... 2 Entendiendo el concepto de Libro, hoja y celda... 3 Creando el primer libro... 4 Saliendo de Excel...

Más detalles

Crear anuncios en Facebook

Crear anuncios en Facebook Crear anuncios en Facebook Hola, voy a hablar de lo que son los anuncios de Facebook, voy a hablar de cómo generar más Me Gustas en una página de Facebook, utilizando Facebook Ads. Esto lo puedes hacer

Más detalles

huellasolar OPENPLATFORM (guía de usuario V1.0) 1. QUÉ ES LA PLATAFORMA ABIERTA DE HUELLASOLAR? 2 3. CUENTAS GRATUITAS Y CUENTAS BUSINESS 2

huellasolar OPENPLATFORM (guía de usuario V1.0) 1. QUÉ ES LA PLATAFORMA ABIERTA DE HUELLASOLAR? 2 3. CUENTAS GRATUITAS Y CUENTAS BUSINESS 2 huellasolar OPENPLATFORM (guía de usuario V1.0) 1. QUÉ ES LA PLATAFORMA ABIERTA DE HUELLASOLAR? 2 3. CUENTAS GRATUITAS Y CUENTAS BUSINESS 2 CUENTAS GRATUITAS 2 CUENTAS BUSINESS 2 4. DANDO FORMATO A LOS

Más detalles

Depende La ejecución condicional

Depende La ejecución condicional Depende La ejecución condicional Descripción de la sesión En esta sesión se introduce el uso de la ejecución condicional cuando lo que se quiere hacer depende de alguna condición. También se introducen

Más detalles

Programación de juegos en BASIC Sinclair I

Programación de juegos en BASIC Sinclair I ------------------------------------------------------------------------------------------------------------------------ Programación de juegos en BASIC Sinclair I Aracnav paso a paso Creando un juego

Más detalles

Práctica 1: Sencillo Juego en Ensamblador

Práctica 1: Sencillo Juego en Ensamblador Práctica 1: Sencillo Juego en Ensamblador El objetivo de esta práctica es aprender a programar usando el ensamblador 8086 y, en particular, aprender a utilizar las interrupciones de la BIOS y de MSDOS

Más detalles

TEMA II.- PROGRAMACIÓN CON EL CROCODILE TECHNOLOGY.

TEMA II.- PROGRAMACIÓN CON EL CROCODILE TECHNOLOGY. TEMA II.- PROGRAMACIÓN CON EL CROCODILE TECHNOLOGY. I. Introducción Aunque todavía no hemos introducido concepto alguno de programación si nos interesa primeramente conocer el manejo de las herramientas

Más detalles

2ª edición. Escrito por Javier Mairena - www.javiermairena.net

2ª edición. Escrito por Javier Mairena - www.javiermairena.net Programación de videojuegos en ActionScript 3 Tofu Hunter 2 2ª edición Escrito por Javier Mairena - www.javiermairena.net Tofu Hunter 2 Javier Mairena www.javiermairena.net Advertencia: Cómo hacer y cómo

Más detalles

Repaso y Atajos... 3. Fórmulas Matemáticas... 3. Funciones... 4. Comentarios... 4. Llenando celdas automáticamente... 5

Repaso y Atajos... 3. Fórmulas Matemáticas... 3. Funciones... 4. Comentarios... 4. Llenando celdas automáticamente... 5 EXCEL INTERMEDIO 1 Índice Repaso y Atajos... 3 Fórmulas Matemáticas... 3 Funciones.... 4 Comentarios... 4 Llenando celdas automáticamente.... 5 Atajos del botón derecho del mouse... 5 Formatear general...

Más detalles

Vamos a abrir la película natura.fla contenida en la carpeta Curso Flash/ejemplos para observar detalles de su línea de tiempo.

Vamos a abrir la película natura.fla contenida en la carpeta Curso Flash/ejemplos para observar detalles de su línea de tiempo. Capítulo 11 Animaciones 11.1 La animación con Flash P ara crear animación en una película Flash, se modifica el contenido de fotogramas sucesivos. Flash ofrece dos maneras de crear secuencias de animación:

Más detalles

1. UNA PÁGINA WEB SENCILLA

1. UNA PÁGINA WEB SENCILLA { 1 } Índice 1. UNA PÁGINA WEB SENCILLA... 3 2. PROPIEDADES DE LA PÁGINA... 4 3. COLORES EN UNA PÁGINA WEB... 5 4. LÍNEAS HORIZONTALES... 6 5. AÑADIR UNA IMAGEN... 7 6. USAR ENLACES... 8 7. INSERTAR TABLAS...

Más detalles

Edición básica. Contenido TECNOLOGÍA WORD

Edición básica. Contenido TECNOLOGÍA WORD Contenido 1. Desplazarse por un documento... 2 2. Seleccionar... 4 3. Eliminar... 5 4. Deshacer y rehacer... 6 5. Copiar, cortar y pegar... 7 6. Opciones de pegado... 8 7. Buscar... 8 8. Buscar y reemplazar...

Más detalles

Paso 1 de 18. Paso 2 de 18. Guía de aprendizaje de Flash CS5 Tutorial 12 - Vídeo y TLF

Paso 1 de 18. Paso 2 de 18. Guía de aprendizaje de Flash CS5 Tutorial 12 - Vídeo y TLF Guía de aprendizaje de Flash CS5 Tutorial 12 - Vídeo y TLF Paso 1 de 18 En este tutorial vamos a experimentar con las nuevas posibilidades que ofrece el trabajo con vídeo en Flash y el nuevo motor de texto

Más detalles

Karel y Recursión. I. Entendiendo la Recursión

Karel y Recursión. I. Entendiendo la Recursión I. Entendiendo la Recursión Karel y Recursión Recursión es la forma en la cual se especifica un proceso basado en su propia definición. Siendo un poco más precisos, y para evitar el aparente círculo sin

Más detalles

Bloques Repetitivos: Iteración

Bloques Repetitivos: Iteración Fuente: www.appinventor.org Traducción hecha con Google Traductor y mejorada por mi: piatticarlos@gmail.com Bloques Repetitivos: Iteración Una cosa para la que los ordenadores son buenos es la repetición

Más detalles

2. El Constructor por dentro

2. El Constructor por dentro 2. El Constructor por dentro 1. Introducción Si, después de analizar las características de estas dos grandes herramientas de autor, te has decido por el Constructor, bienvenid@, vamos a empezar un viaje

Más detalles

El Ábaco. Descripción. Para qué sirve?

El Ábaco. Descripción. Para qué sirve? El Ábaco El ábaco es un instrumento que sirve para facilitar al alumno el aprendizaje del concepto de sistema posicional de numeración (en cualquier base), cómo se forman las distintas unidades que lo

Más detalles

Práctica 1. Introducción al matlab

Práctica 1. Introducción al matlab Práctica 1. Introducción al matlab Estadística Facultad de Física Objetivos Puesta en marcha de matlab Entrada y salida de datos Manejo de matrices Representaciones gráficas sencillas 1 matlab matlab es

Más detalles

Condicionales. (Programando con tarjetas) Meta: Esta clase introduce los condicionales, especialmente bucles y sentencias if. RESUMEN: OBJETIVO:

Condicionales. (Programando con tarjetas) Meta: Esta clase introduce los condicionales, especialmente bucles y sentencias if. RESUMEN: OBJETIVO: 10 NOMBRE DE LA CLASE: Condicionales (Programando con tarjetas) Duración: 45-60 minutos : Preparación: 2 minutos Meta: Esta clase introduce los condicionales, especialmente bucles y sentencias if. RESUMEN:

Más detalles

IMÁGENES. Existen una serie de formatos de imagen más recomendables que otros para ser introducidos en una página web.

IMÁGENES. Existen una serie de formatos de imagen más recomendables que otros para ser introducidos en una página web. IMÁGENES Todas las páginas web acostumbran a tener un cierto número de imágenes, que permiten mejorar su apariencia, o dotarla de una mayor información visual. Existen una serie de formatos de imagen más

Más detalles

Experimento 6 LA CONSERVACIÓN DE LA ENERGÍA Y EL TEOREMA DEL TRABAJO Y LA ENERGÍA. Objetivos. Teoría

Experimento 6 LA CONSERVACIÓN DE LA ENERGÍA Y EL TEOREMA DEL TRABAJO Y LA ENERGÍA. Objetivos. Teoría Experimento 6 LA CONSERVACIÓN DE LA ENERGÍA Y EL TEOREMA DEL TRABAJO Y LA ENERGÍA Objetivos 1. Definir las energías cinética, potencial y mecánica. Explicar el principio de conservación de la energía mecánica

Más detalles

glucosa Documentation

glucosa Documentation glucosa Documentation Release 0.1 Hugo Ruscitti / Enrique Porta December 11, 2013 Contents 1 Introducción 3 1.1 Motivación................................................ 3 1.2 Instalación................................................

Más detalles

Animación cuadro por cuadro con Monkey Jam

Animación cuadro por cuadro con Monkey Jam Animación cuadro por cuadro con Monkey Jam Consideraciones Iniciales El Guión Animar es, ni más ni menos, contar una historia. Por eso, para que la animación sea un éxito, se recomienda crear el guión

Más detalles

Operación de Microsoft Word

Operación de Microsoft Word Trabajar con tablas Las tablas permiten organizar la información y crear atractivos diseños de página con columnas paralelas de texto y gráficos. Las tablas pueden utilizarse para alinear números en columnas

Más detalles

Centro de Profesorado Luisa Revuelta (Córdoba) TEMA 10 OPCIONES AVANZADAS

Centro de Profesorado Luisa Revuelta (Córdoba) TEMA 10 OPCIONES AVANZADAS Centro de Profesorado Luisa Revuelta (Córdoba) TEMA 10 OPCIONES AVANZADAS 1.- CONTROL DE LA EJECUCIÓN Una vez que ya hemos aprendido a crear presentaciones, vamos a configurarlas para que al ejecutarla

Más detalles

Administración de memoria: Funciones y operaciones

Administración de memoria: Funciones y operaciones Administración de memoria: Funciones y operaciones Facultad de Ingeniería, UNAM Instituto de Investigaciones Económicas, UNAM Índice Introducción 1 Introducción 2 3 4 5 El administrador de memoria Es otra

Más detalles

Manual básico de utilización de Windows

Manual básico de utilización de Windows Manual básico de utilización de Windows INDICE 1. El escritorio de Windows 2. Ver icono Mi PC en el escritorio 3. Mi PC 4. Crear carpetas y accesos directos 5. Buscar archivos en el PC 6. Papelera de reciclaje

Más detalles

Funcionamiento del sistema de autentificación en PHP

Funcionamiento del sistema de autentificación en PHP Sistema de autentificación PHP Cómo realizar un sistema de autentificación en PHP, en el que los usuarios deban introducir nombre y contraseña para que puedan visualizar las páginas de una aplicación con

Más detalles

Autocad. Dibujo en 2d y 3d (3/4)

Autocad. Dibujo en 2d y 3d (3/4) Autocad. Dibujo en 2d y 3d (3/4) Autor: Julian Pérez Zamora 1 Presentación del curso Autocad. Este curso online está diseñado, para que cualquier persona sin ningún conocimiento de Autocad pueda seguirlo

Más detalles

Desarrollo de Aplicaciones con App Inventor. Wings: Vuela sin estrellarte contra las rocas

Desarrollo de Aplicaciones con App Inventor. Wings: Vuela sin estrellarte contra las rocas Desarrollo de Aplicaciones con App Inventor Wings: Vuela sin estrellarte contra las rocas UCLM 2 Descripción del juego El funcionamiento del juego es similar al famosamente conocido Flappy Bird, aunque

Más detalles

Faes Farma Suite para ipad es la herramienta diseñada específicamente para ayudar a los visitadores médicos en su labor diaria.

Faes Farma Suite para ipad es la herramienta diseñada específicamente para ayudar a los visitadores médicos en su labor diaria. Faes Farma Suite para ipad es la herramienta diseñada específicamente para ayudar a los visitadores médicos en su labor diaria. Esta herramienta le permitirá llevar un seguimiento continuo de su trabajo,

Más detalles

NEOBOOK. Aplicaciones Multimedia

NEOBOOK. Aplicaciones Multimedia MINISTERIO DE EDUCACIÓN Y CIENCIA SECRETARÍA GENERAL DE EDUCACIÓN DIRECCIÓN GENERAL DE EDUCACIÓN, FORMACIÓN PROFESIONAL E INNOVACIÓN EDUCATIVA CENTRO NACIONAL DE INFORMACIÓN Y COMUNICACIÓN EDUCATIVA NEOBOOK.

Más detalles

Manual de OpenOffice Impress

Manual de OpenOffice Impress Manual de OpenOffice Impress. Capítulo 3. Trabajando con imágenes y autoformas 1 Manual de OpenOffice Impress Capítulo 3: Trabajando con imágenes y autoformas Este material es una adaptación del curso

Más detalles

Sección 1.1 Presentaciones con diapositivas

Sección 1.1 Presentaciones con diapositivas Sección 1.1 Presentaciones con diapositivas Las presentaciones nos permiten comunicar información, ideas y conceptos de una forma atractiva e interesante. Son muchos los ámbitos donde se utilizan presentaciones:

Más detalles

EDICION DE PRESENTACIONES CON POWERPOINT 2007

EDICION DE PRESENTACIONES CON POWERPOINT 2007 EDICION DE PRESENTACIONES CON POWERPOINT 2007 1. Qué es POWERPOINT? Microsoft Office PowerPoint 2007 es una aplicación que permite la creación de presentaciones gráficas, al estilo de diapositivas que

Más detalles

más información sobre este tema, consultar la sección Plantillas de documento )

más información sobre este tema, consultar la sección Plantillas de documento ) Manejo básico y edición de documentos Word es un procesador de textos, o lo que es lo mismo, un programa para manejar documentos. Las tareas más importantes relacionadas con la edición de un documento,

Más detalles

FUNDAMENTOS DE INFORMATICA

FUNDAMENTOS DE INFORMATICA FUNDAMENTOS DE INFORMATICA TEMAS QUE SE TRATARÁN: Arquitectura Interna Sistemas Operativos Programación en Visual Basic Bases de Datos Redes e Internet 1 FUNDAMENTOS DE INFORMATICA Tema 1: Arquitectura

Más detalles

Software de Presentaciones

Software de Presentaciones Software de Presentaciones El contenido de esta práctica consistirá en el diseño de una presentación que será utilizada para conocer un nuevo producto comercializado por una empresa (de la que tu tendrás

Más detalles

Manual Sugar 0.88 para XO 1.5

Manual Sugar 0.88 para XO 1.5 para XO 1.5 para 1.5 Índice Introducción... 4 Vista Hogar... 4 Ícono de la XO... 5 Ícono de la Actividad... 6 Modo de Vistas... 7 Vista de favoritos... 7 Modo Libre... 7 Vista en Lista... 8 Vista Vecindario...

Más detalles

... Formas alternativas de escribir un texto. Columnas. anfora CAPÍTULO 4

... Formas alternativas de escribir un texto. Columnas. anfora CAPÍTULO 4 CAPÍTULO 4. Formas alternativas de escribir un texto........ Columnas Para fijar columnas se posiciona el Punto de Inserción donde se desee que comiencen las columnas, o bien se selecciona el texto que

Más detalles

Unidad 1: El Cuadro de control de Excel

Unidad 1: El Cuadro de control de Excel Unidad 1: El Cuadro de control de Excel 1,0 Introducción Excel nos ayuda a comprender los datos mejor al disponerlos en celdas (que forman filas y columnas) y usando fórmulas para realizar los cálculos

Más detalles

Planos de ejecución en Velneo V7

Planos de ejecución en Velneo V7 Planos de ejecución en Velneo V7 Por Jesús Arboleya Introducción 3 Arquitectura Cliente/Servidor 4 1. Objetos que siempre se ejecutan en el servidor 5 2. Objetos que siempre se ejecutan en el cliente 6

Más detalles

Manual Básico de Word 2007. Contenido

Manual Básico de Word 2007. Contenido Contenido Introducción... 5 Partes principales del programa... 5 Crear documentos... 7 Abrir documentos nuevos en blanco... 7 Abrir documentos ya guardados... 8 Guardar documentos... 9 Guardar un documento

Más detalles

FOTOGRAFÍA DIGITAL Y RETOQUE FOTOGRÁFICO

FOTOGRAFÍA DIGITAL Y RETOQUE FOTOGRÁFICO 1 FOTOGRAFÍA DIGITAL Y RETOQUE FOTOGRÁFICO Las capas son como hojas de acetato transparentes que se combinan unas sobre otras para formar una nueva imagen. En cada hoja de acetato se puede trabajar independientemente

Más detalles

Lápiz que dibuja mágicamente

Lápiz que dibuja mágicamente 1 Clase 2: Sin repetir y sin Soplar Estructuras de control: Repetición Objeto: Lápiz Lápiz que dibuja mágicamente La propuesta es dibujar diferentes formas geométricas utilizando el lápiz (el objeto puede

Más detalles

Curso Completo de Electrónica Digital

Curso Completo de Electrónica Digital CURSO Curso Completo de Electrónica Digital Departamento de Electronica y Comunicaciones Universidad Pontifica de Salamanca en Madrid Prof. Juan González Gómez Capítulo 3 ALGEBRA DE BOOLE 3.1. Introducción

Más detalles

Ic-Prog PARA PROGRAMAR MICROCONTROLADORES PIC 16F84 y 16F876.

Ic-Prog PARA PROGRAMAR MICROCONTROLADORES PIC 16F84 y 16F876. Ic-Prog PARA PROGRAMAR MICROCONTROLADORES PIC 16F84 y 16F876. Prof: Bolaños D. En unión del hardware adecuado, el software IC-PROG permite programar gran cantidad de dispositivos electrónicos. Esta guía

Más detalles