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...

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

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

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

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

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

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

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

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

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

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

Microsoft Excel 97 y 2000

Microsoft Excel 97 y 2000 Microsoft Excel 97 y 2000 Trucos para la hoja de cálculo de Office Formato a texto y datos 1 Cambio del tamaño y el tipo de letra por defecto Por defecto, Excel siempre sacará el mismo tipo de letra y

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

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

... 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

Un juego de cartas: Las siete y media

Un juego de cartas: Las siete y media Un juego de cartas: Las siete y media Paula Lagares Federico Perea Justo Puerto * MaMaEuSch ** Management Mathematics for European Schools 94342 - CP - 1-2001 - DE - COMENIUS - C21 * Universidad de Sevilla

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

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

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

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

TALLER COMPUTACIÓN II

TALLER COMPUTACIÓN II Prof. Martín Ferreyra TALLER COMPUTACIÓN II MANEJO AVANZADO DE MS WORD COMBINAR CORRESPONDENCIA Combinar Correspondencia Instituto Secundario John Kennedy Unidad 2. Combinar correspondencia (I) Mediante

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

Ejercicio 1. Desarrollar un pequeño juego para practicar mecanografía.

Ejercicio 1. Desarrollar un pequeño juego para practicar mecanografía. Examen Curso 2001-2002. Convocatoria de Febrero Página 1 Ejercicio 1. Desarrollar un pequeño juego para practicar mecanografía. Este ejercicio se divide en dos partes con el fin de que el alumno no intente

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

Í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

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

TEMA 5: HOJAS DE CÁLCULO. Edición de hojas de cálculo con OpenOffice Calc

TEMA 5: HOJAS DE CÁLCULO. Edición de hojas de cálculo con OpenOffice Calc TEMA 5: HOJAS DE CÁLCULO Edición de hojas de cálculo con OpenOffice Calc Qué vamos a ver? Qué es una hoja de cálculo y para qué sirve El entorno de trabajo de OpenOffice Calc Edición básica de hojas de

Más detalles

EMPLEO NTIC`S II SEGUNDO SEMESTRE

EMPLEO NTIC`S II SEGUNDO SEMESTRE UNIVERSIDAD TECNICA DE AMBATO FACULTAD DE CONTABILIDAD Y AUDITORIA EMPLEO NTIC`S II SEGUNDO SEMESTRE Ing. Luz Perez SEMESTRE MARZO JULIO 2009 EXCEL Excel es un programa del tipo Hoja de Cálculo que permite

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

Qué es y para qué sirve Excel2007?

Qué es y para qué sirve Excel2007? Excel es un programa del tipo Hoja de Cálculo que permite realizar operaciones con números organizados en una cuadrícula. Es útil para realizar desde simples sumas hasta cálculos de préstamos hipotecarios.

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

Cierre y Apertura de ejercicio. Gestión - Contabilidad

Cierre y Apertura de ejercicio. Gestión - Contabilidad Cierre y Apertura de ejercicio. Gestión - Contabilidad Cliente : Cooperativa Madrileña de Ferreteros, soc. coop. Referencia : I-3-PC-02 / 000041 Asunto : Cierre y apertura de ejercicio. Gestión Contabilidad

Más detalles

TEMA 5. PROCESAMIENTO DE TEXTOS.

TEMA 5. PROCESAMIENTO DE TEXTOS. TEMA 5. PROCESAMIENTO DE TEXTOS. Entrar en Microsoft Word En este tema vamos a utilizar el procesador de textos Microsoft Word. Para entrar en dicha herramienta podemos utilizar el acceso que hay en el

Más detalles

Creación de Funciones de Conducción

Creación de Funciones de Conducción Creación de Funciones de Conducción Requerimientos Para el desarrollo de esta actividad se requiere que: Contemos con un robot BoeBot armado con placa Arduino. Repetición En estos momentos habremos notado

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

COLEGIO APUNTES ACCESS

COLEGIO APUNTES ACCESS COLEGIO APUNTES ACCESS Índice Introducción al Access... 3 Conocimientos básicos... 6 Tablas... 7 Formularios... 10 Consultas... 12 Consultas de eliminación... 15 Consulta de actualización... 15 Informes...

Más detalles

C APÍTULO 1 Gestión de documentos

C APÍTULO 1 Gestión de documentos C APÍTULO 1 Gestión de documentos En este capítulo encontrará unas sencillas indicaciones para cocripción somera del entorno de trabajo de Word, así como una referencia rápida a las funciones de las teclas

Más detalles

En cualquier caso, tampoco es demasiado importante el significado de la "B", si es que lo tiene, lo interesante realmente es el algoritmo.

En cualquier caso, tampoco es demasiado importante el significado de la B, si es que lo tiene, lo interesante realmente es el algoritmo. Arboles-B Características Los árboles-b son árboles de búsqueda. La "B" probablemente se debe a que el algoritmo fue desarrollado por "Rudolf Bayer" y "Eduard M. McCreight", que trabajan para la empresa

Más detalles

- Se puede liberar memoria, espacio, etc. manualmente en nuestro propio ordenador.

- Se puede liberar memoria, espacio, etc. manualmente en nuestro propio ordenador. 1 Curso de Internet a distancia para sacerdotes, religiosos y religiosas Material de apoyo para las teleclases - Viernes, 2 diciembre 2011 Vea los vídeos resúmenes en: www.medioscan.es y www.teleiglesia.es

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

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 Excel 2010 Rangos y tablas Teoría 3. Rangos y tablas... 1. Contenido... 1. Operaciones con rangos... 2. Copia de un rango...

Curso Excel 2010 Rangos y tablas Teoría 3. Rangos y tablas... 1. Contenido... 1. Operaciones con rangos... 2. Copia de un rango... RANGOS Y TABLAS Los rangos y tablas en Excel son la base de los tipos de libros más usados, como listados, bases de datos, resúmenes estadísticos, etc. En las últimas versiones se ha ido dando cada vez

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

Ejemplos de conversión de reales a enteros

Ejemplos de conversión de reales a enteros Ejemplos de conversión de reales a enteros Con el siguiente programa se pueden apreciar las diferencias entre las cuatro funciones para convertir de reales a enteros: program convertir_real_a_entero print

Más detalles

Joomla!: La web en entornos educativos. Capítulos 7 y 8

Joomla!: La web en entornos educativos. Capítulos 7 y 8 Joomla!: La web en entornos educativos Capítulos 7 y 8 Material actualizado a septiembre de 2012 Índice Índice de contenido 7. Menús...109 7.1. Introducción...109 7.2. Gestión de menús...109 7.3. Gestión

Más detalles

Ministerio de Educación. Diseño de Presentaciones en la Enseñanza. Módulo 10: Plantillas y estilos

Ministerio de Educación. Diseño de Presentaciones en la Enseñanza. Módulo 10: Plantillas y estilos Ministerio de Educación Diseño de Presentaciones en la Enseñanza Módulo 10: Plantillas y estilos Instituto de Tecnologías Educativas 2011 Diseño de Presentaciones en la Enseñanza (OpenOffice) Plantillas

Más detalles

2) Con velocidad razonable (ni demasiado rápido.. ni aburrido)

2) Con velocidad razonable (ni demasiado rápido.. ni aburrido) 1 2 3 1) Explicar ordenadamente (explicar primero lo más importante, luego seguir en orden explicando lo siguiente que corresponda en orden de importancia..) 2) Con velocidad razonable (ni demasiado rápido..

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

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

MÓDULO 2: Manejar las ventanas de Windows. Antes de comenzar

MÓDULO 2: Manejar las ventanas de Windows. Antes de comenzar MÓDULO 2: Manejar las ventanas de Windows Antes de comenzar El funcionamiento de Windows está relacionado con su nombre, ventanas. El funcionamiento de las ventanas en Windows se mantiene invariable a

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

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

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

Barrido progresivo frente al barrido entrelazado

Barrido progresivo frente al barrido entrelazado Barrido progresivo frente al barrido entrelazado En la actualidad, existen dos técnicas diferentes disponibles para interpretar el vídeo: barrido entrelazado y barrido progresivo (progressive scan e interlaced).

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

SIMULADOR DE REDES DE PETRI ASINCRONICAS

SIMULADOR DE REDES DE PETRI ASINCRONICAS SIMULADOR DE REDES DE PETRI ASINCRONICAS MANUAL DE USUARIO 1.1 Introducción. Los puntos que se tratarán serán los siguientes: La ventana principal: o Menús. o Barra de herramientas de control. o Barra

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

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

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

UNIDAD 1. LOS NÚMEROS ENTEROS.

UNIDAD 1. LOS NÚMEROS ENTEROS. UNIDAD 1. LOS NÚMEROS ENTEROS. Al final deberás haber aprendido... Interpretar y expresar números enteros. Representar números enteros en la recta numérica. Comparar y ordenar números enteros. Realizar

Más detalles

IES Los Albares (Dep. de Tecnología) MSWLogo nivel 1

IES Los Albares (Dep. de Tecnología) MSWLogo nivel 1 INTRODUCCIÓN MSWLogo es un lenguaje de programación que nos permite construir programas que pueden ser ejecutados por el ordenador. Estos programas están formados por una sucesión de órdenes o instrucciones

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

MICROSOFT POWER POINT

MICROSOFT POWER POINT MICROSOFT POWER POINT QUE ES POWER POINT Y PARA QUÉ SIRVE Power Point es el programa más popular para crear presentaciones gráficas, utilizado también para crear de una forma rápida y profesional transparencias,

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

CURSO 2010-2011 TECNOLOGÍA TECNOLOGÍA 4º ESO TEMA 5: Lógica binaria. Tecnología 4º ESO Tema 5: Lógica binaria Página 1

CURSO 2010-2011 TECNOLOGÍA TECNOLOGÍA 4º ESO TEMA 5: Lógica binaria. Tecnología 4º ESO Tema 5: Lógica binaria Página 1 Tecnología 4º ESO Tema 5: Lógica binaria Página 1 4º ESO TEMA 5: Lógica binaria Tecnología 4º ESO Tema 5: Lógica binaria Página 2 Índice de contenido 1. Señales analógicas y digitales...3 2. Código binario,

Más detalles

Un comité de la organización ANSI (American National Standards Institute) aborda la problemática del almacenamiento de datos para su procesamiento en

Un comité de la organización ANSI (American National Standards Institute) aborda la problemática del almacenamiento de datos para su procesamiento en 15/05/2012 1 Un comité de la organización ANSI (American National Standards Institute) aborda la problemática del almacenamiento de datos para su procesamiento en aplicaciones informáticas en 1975. 2 Como

Más detalles

Este es un ejemplo muy sencillo, un esquema de empleados que trabajan en proyectos, en una relación muchos a muchos.

Este es un ejemplo muy sencillo, un esquema de empleados que trabajan en proyectos, en una relación muchos a muchos. 28/04/2012 La teoría de la normalización va perdiendo peso con el paso de los años como herramienta de diseño de bases de datos relacionales en favor de modelos de datos más ricos en su representación,

Más detalles

CURSO BÁSICO PARA TOCAR EL PIANO. 1. Introducción. Capítulo siguiente: 2 - Las claves

CURSO BÁSICO PARA TOCAR EL PIANO. 1. Introducción. Capítulo siguiente: 2 - Las claves CURSO BÁSICO PARA TOCAR EL PIANO 1. Introducción Capítulo siguiente: 2 - Las claves Aunque tenemos dos manos, existe solo un juego de teclas. Si tocamos de izquierda a derecha estas teclas, notaremos que

Más detalles

***EXPLICACIÓN DEL PROGRAMA:***

***EXPLICACIÓN DEL PROGRAMA:*** El sistema de búsqueda de la salida por el microbot se basará en medidas del nivel acústico de ultrasonidos en las calles de cada cruce. La utilización de ultrasonidos en lugar de sonidos de una frecuencia

Más detalles

2_trabajar con calc I

2_trabajar con calc I Al igual que en las Tablas vistas en el procesador de texto, la interseccción de una columna y una fila se denomina Celda. Dentro de una celda, podemos encontrar diferentes tipos de datos: textos, números,

Más detalles

- Realizar procesamientos adicionales en función del estado de distintos dispositivos, como alocuciones o avisos sonoros.

- Realizar procesamientos adicionales en función del estado de distintos dispositivos, como alocuciones o avisos sonoros. 1. DESCRIPCIÓN DEL SISTEMA CENTRAL El sistema central para New Roulette es un equipo encargado de recopilar la información de todos los dispositivos (maquinas, progresivo y ruleta) con dos propósitos:

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

1. Las escaleras en Revit

1. Las escaleras en Revit 1. Las escaleras en Revit Las escaleras son elementos en Revit que no necesariamente deben estar ancladas o alojadas a un objeto determinado. Este permite diferentes combinaciones para obtener cualquier

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

MANUAL USUARIO. English User Manual

MANUAL USUARIO. English User Manual MANUAL USUARIO English User Manual 1. PANTALLA INCIAL (HOME) Desde esta pantalla se puede acceder a todos los apartados de la aplicación seleccionando cada uno de los diferentes iconos. Podremos seleccionar

Más detalles

Señal de petición de Interrupción

Señal de petición de Interrupción Consideren una tarea que require tomar caracteres desde un teclado y mostrarlos en la pantalla de un monitor. La tasa de transferencia desde un teclado a un computador está limitado por la velocidad del

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

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

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

El Escritorio. En el escritorio tenemos iconos que permiten abrir el programa correspondiente.

El Escritorio. En el escritorio tenemos iconos que permiten abrir el programa correspondiente. El Escritorio Primera pantalla que nos aparecerá una vez se haya cargado el Sistema Operativo con el cual vamos a trabajar, en nuestro caso será el escritorio de Windows XP. Este escritorio es muy similar

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 crear una lista como la anterior, primero escribe la información, y después selecciona el texto y aplícale el formato de viñetas.

Para crear una lista como la anterior, primero escribe la información, y después selecciona el texto y aplícale el formato de viñetas. Módulo 3 Herramientas de Cómputo Listas, tabulaciones, columnas y cuadros de texto Listas En muchas ocasiones es necesario que enumeres diferentes elementos en tus documentos. Word no sólo reconoce números

Más detalles

UTILIZACIÓN DE UNA CUENTA DE CORREO ELECTRÓNICO (NUEVO) Acceso al correo electrónico

UTILIZACIÓN DE UNA CUENTA DE CORREO ELECTRÓNICO (NUEVO) Acceso al correo electrónico Acceso al correo electrónico Pasamos ahora a lo que sería usar la cuenta de correo que nos hicimos en la clase anterior. Lo primero que hacemos es entrar en la página web de Yahoo y localizar el icono

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

Índice 1/ 34. 1- Tu primera encuesta

Índice 1/ 34. 1- Tu primera encuesta Índice 1- Tu primera encuesta 1/ 34 2- Planificación previa Qué voy a preguntar? A quién voy a preguntar? Qué voy a hacer con los datos? Cómo los voy a presentar? 3- Recogemos los datos 4- Procesamos los

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

Unidad 1. Introducción. Elementos de Excel

Unidad 1. Introducción. Elementos de Excel 1 Unidad 1. Introducción. Elementos de Excel Excel es un programa del tipo Hoja de Cálculo que permite realizar operaciones con números organizados en una cuadrícula. Es útil para realizar desde simples

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

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

Guía de Hootsuite. mini guía para montar tu tienda en bigcartel

Guía de Hootsuite. mini guía para montar tu tienda en bigcartel Guía de Hootsuite mini guía para montar tu tienda en bigcartel Cómo montar tu tienda en BigCartel Bigcartel es una plataforma que tiene varios precios y modalidades: De los cero euros a los 8, 18 o 28

Más detalles

CASO PRAÁ CTICO ANAÁ LISIS DE ESTADOS FINANCIEROS

CASO PRAÁ CTICO ANAÁ LISIS DE ESTADOS FINANCIEROS CASO PRAÁ CTICO ANAÁ LISIS DE ESTADOS FINANCIEROS Deseamos realizar un análisis comparativo de las cuentas consolidadas de dos empresas, concretamente TELEFÓNICA e INDITEX para determinar si responden

Más detalles

Programa diseñado y creado por 2014 - Art-Tronic Promotora Audiovisual, S.L.

Programa diseñado y creado por 2014 - Art-Tronic Promotora Audiovisual, S.L. Manual de Usuario Programa diseñado y creado por Contenido 1. Acceso al programa... 3 2. Opciones del programa... 3 3. Inicio... 4 4. Empresa... 4 4.2. Impuestos... 5 4.3. Series de facturación... 5 4.4.

Más detalles

Prácticas guiadas para el diseño gráfico con Gimp 2.0

Prácticas guiadas para el diseño gráfico con Gimp 2.0 Prácticas guiadas para el diseño gráfico con Gimp 2.0 Luis Escandell Gómez Enero de 2.007 1 Práctica 1 - Diseño Gráfico con Gimp Introducción a Gimp GIMP es el Programa de Manipulación de Imágenes GNU

Más detalles

CURSO RÁPIDO DE PHOTOSHOP APLICADO AL SLOT

CURSO RÁPIDO DE PHOTOSHOP APLICADO AL SLOT CURSO RÁPIDO DE PHOTOSHOP APLICADO AL SLOT Ricard Garrós http://elartedelphotoshop.blogspot.com/ & http://www.fusky.es CURSO RÁPIDO DE PHOTOSHOP APLICADO AL SLOT Como os adelanté en el anterior capítulo

Más detalles

MANUAL PARA EL USO DE WIX

MANUAL PARA EL USO DE WIX MANUAL PARA EL USO DE WIX CREA TU PROPIO SITIO WEB CON FACILIDAD ALEX PENSO ROMERO Qué es Wix y de que nos sirve? Wix es un editor online que permite crear y publicar un sitio web en flash indexado en

Más detalles

Si no tenemos ningún sistema cargado trabajaremos desde el paso 2

Si no tenemos ningún sistema cargado trabajaremos desde el paso 2 Cómo formatear un disco duro? Nadie está a salvo de un formateo, ya sea por virus, desconfiguraciones y hasta por tener un equipo nuevo, pero al fin y al cabo el proceso sigue siendo el mismo. Desafortunadamente,

Más detalles

Microsoft Word 2010. Los formatos son las características que le asignamos a cualquier carácter, a un conjunto de caracteres o a otros elementos.

Microsoft Word 2010. Los formatos son las características que le asignamos a cualquier carácter, a un conjunto de caracteres o a otros elementos. Microsoft Word 2010 Estilos y Formatos A continuación les voy a explicar como utilizar los estilos y formatos en Word, pero antes de esto necesitamos tener en claro que son los estilos y que son los formatos.

Más detalles

PRÁCTICAS DE GESTIÓN GANADERA:

PRÁCTICAS DE GESTIÓN GANADERA: PRÁCTICAS DE GESTIÓN GANADERA: MANEJO DE HOJA DE CÁCULO (EXCEL) 1. INTRODUCCIÓN AL MANEJO DE EXCEL La pantalla del programa consta de una barra de herramientas principal y de una amplia cuadrícula compuesta

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

ESPAÑOL. Tableta Digital. Manual del Usuario. Windows 2000 / XP / Vista

ESPAÑOL. Tableta Digital. Manual del Usuario. Windows 2000 / XP / Vista Tableta Digital Manual del Usuario Windows 2000 / XP / Vista 1 I. Información General 1. Vista General Bienvenido al mundo de las tabletas digitales! Puede descubrir qué fácil es controlar su ordenador

Más detalles

Universidad de la Frontera

Universidad de la Frontera Universidad de la Frontera Facultad de Ingeniería, Ciencias y Admistración Departamento de Matemática Actividad Didáctica: El Abaco TALLER # 2 - Sistema Decimal El ábaco es uno de los recursos más antiguos

Más detalles