home *** CD-ROM | disk | FTP | other *** search
/ MASPC 1 / MASPC_1.iso / Demos / Demo DIV / DATA / HELP / HELP.DIV next >
Encoding:
Text File  |  1997-12-01  |  787.6 KB  |  21,475 lines

  1.  
  2. # ─────────────────────────────────────────────────────────────────
  3.  
  4. # Los saltos de línea simples son ignorados,
  5. # los saltos de dos o más líneas se interpretan
  6. # como saltos de párrafo.
  7.  
  8. # Los comentarios sólo pueden comenzar con un
  9. # carácter '#' en la primera columna de una línea.
  10.  
  11. # Lista de comandos disponibles
  12.  
  13. # Texto en negrita:
  14. #   {texto a resaltar}
  15.  
  16. # Definición de un término: (la línea anterior debe estar en blanco)
  17. #   {.N,título}
  18. #   texto ...
  19.  
  20. # Referencia a un término:
  21. #   {#N,texto}
  22.  
  23. # Imagen: (N:código dentro de figuras.div (fpg), C:centrado 0, 1 o 2)
  24. #   {+N,C}
  25.  
  26. # Final de la imagen (se debe indicar para todas las imágenes)
  27. #   {-}
  28.  
  29. # Carácter '{' o '}':
  30. #   {{} o {}}
  31.  
  32. # Linea separatoria:
  33. #   {/}
  34.  
  35. # Salto de línea simple:
  36. #   ·  (shift+3)
  37.  
  38. # Texto de lenguaje.div:
  39. #   {@N}
  40.  
  41. # ─────────────────────────────────────────────────────────────────────────────
  42. # Enlace informativo de que una referencia todavía no se ha definido
  43. # ─────────────────────────────────────────────────────────────────────────────
  44.  
  45. {.0,Enlace del hipertexto inválido}
  46. Ver: {#3,Indice} - {#4,Glosario} - {#1,Ayuda}{/}
  47.  
  48. Error: No hay ninguna página de ayuda asociada a este enlace.
  49.  
  50. # ─────────────────────────────────────────────────────────────────────────────
  51. # Ayuda sobre como usar el sistema de ayuda
  52. # ─────────────────────────────────────────────────────────────────────────────
  53.  
  54. {.1,Cómo usar el sistema de ayuda.}
  55. Ver: {#3,Indice} - {#4,Glosario}{/}
  56.  
  57. Esta ayuda se maneja con el ratón, principalmente, si bien se pueden
  58. usar también los cursores y las teclas de Re.Pág. y Av.Pág. cuando la ventana
  59. esté seleccionada. Las ventanas están seleccionadas cuando su barra de título
  60. aparece con letras blancas sobre fondo azul, mientras que si no están seleccionadas aparecen
  61. con letras negras sobre fondo gris. Para seleccionar una ventana basta con
  62. pulsar con el ratón sobre la misma.
  63.  
  64. A la derecha aparece una barra de desplazamiento con dos flechas en sus extremos,
  65. pulsando con el ratón sobre ellas el texto de la ayuda se desplazará hacia arriba y hacia
  66. abajo. También se puede pulsar sobre la propia barra de desplazamiento desplazándose,
  67. en este caso, el texto de página en página.
  68.  
  69. Inmediatamente debajo de la barra de desplazamiento aparece un botón liso, sin
  70. ningún dibujo, que sirve para modificar el tamaño de la ventana de ayuda; se puede
  71. aumentar o disminuir el número de líneas que aparecen en la ventana de ayuda
  72. manteniendo el ratón pulsado sobre este botón y moviendo, a la vez, el ratón
  73. hacia arriba y hacia abajo.
  74.  
  75. Dentro de la ayuda pueden aparecen ilustraciones, texto y ejemplos.
  76.  
  77. {Las ilustraciones} pueden variar su color ligeramente según qué paleta de colores
  78. esté activada en cada momento.
  79.  
  80. {El texto} aparece en tres colores diferentes, negro, {gris} y {#1,blanco}.
  81. El texto principal de la ayuda aparece en color {negro}, en color {gris} aparecen
  82. aquellos textos que se han querido resaltar por algún motivo especial, normalmente,
  83. por ser información especialmente relevante, y en {blanco} irán los textos
  84. que hacen referencia a otro término de la ayuda. Por su parte, el cursor aparece como una
  85. mano al pasar sobre estos textos y si se pulsa con el ratón sobre ellos, se
  86. visualizará la ayuda correspondiente al término sobre el que se ha pulsado.
  87. {Los ejemplos} son programas o partes de programas que aparecen en la ayuda
  88. para demostrar la forma de utilizar alguna de las capacidades
  89. del lenguaje de programación. Todos ellos comienzan con una línea del tipo
  90. 'Programa ejemplo:' en color blanco; para extraer el ejemplo de la
  91. ventana de ayuda basta con pulsar con el ratón sobre dicha línea.
  92. Estos programas pueden ser ejecutados con la tecla {F10} y para
  93. finalizar su ejecución se deben pulsar las teclas {ALT}+{X}.
  94.  
  95. {/}
  96.  
  97. {Importante:} Se puede volver siempre a la página anterior de ayuda pulsando la tecla
  98. {Backspace} (la tecla de borrado situada sobre la tecla {Enter}).
  99.  
  100. # ─────────────────────────────────────────────────────────────────────────────
  101. # Indice general
  102. # ─────────────────────────────────────────────────────────────────────────────
  103.  
  104. {.3,Indice general.}
  105. Ver: {#1290,Teclas} - {#1250,Menús} - {#1261,Dibujo} - {#1249,Lenguaje}{/}
  106.  
  107. {#1,Ayuda sobre la ayuda.}·
  108.  
  109. {#1300,Respuestas a preguntas comunes.}·
  110.  
  111. {Ayuda sobre los comandos de teclado.}
  112.  
  113.   {#1291,Comandos en el entorno gráfico}·
  114.   {#1292,Comandos comunes en los juegos}·
  115.   {#1293,Comandos en el trazador de programas}·
  116.   {#1294,Comandos en el editor de programas}·
  117.   {#1295,Comandos en el editor gráfico}·
  118.  
  119. {Ayuda sobre el sistema de menús.}
  120.  
  121.   {#1251,Menú de programas}·
  122.   {#1252,Menú de edición}·
  123.   {#1253,Menú de paletas}·
  124.   {#1254,Menú de mapas}·
  125.   {#1255,Menú de ficheros}·
  126.   {#1256,Menú de fuentes}·
  127.   {#1257,Menú de sonidos}·
  128.   {#1258,Menú de sistema}·
  129.  
  130.   {#1259,Opción de ayuda}·
  131.   {#1260,Trazador de programas}·
  132.  
  133. {Ayuda sobre el editor gráfico.}
  134.  
  135.   {#1262,Conceptos generales}·
  136.   {#1263,Paletas de colores}·
  137.   {#1264,Color transparente}·
  138.   {#1265,Controles básicos}·
  139.   {#1266,Iconos genéricos}·
  140.   {#1267,Gamas de colores}·
  141.   {#1268,Utilización de máscaras de color}·
  142.  
  143.   {#1270,Barras de punteado y lápiz}·
  144.   {#1271,Barras para líneas y multilíneas}·
  145.   {#1272,Barras para curvas y multicurvas}·
  146.   {#1273,Barras de rectángulos y círculos}·
  147.   {#1274,Barra de spray}·
  148.   {#1275,Barra de relleno}·
  149.   {#1276,Barra de edición de bloques}·
  150.   {#1277,Barra de deshacer}·
  151.   {#1278,Barra de texto}·
  152.   {#1279,Barra de puntos de control}·
  153.  
  154.   {#1280,Edición de animaciones}·
  155.   {#1281,Trucos y técnicas avanzadas de dibujo}·
  156.  
  157. {Ayuda sobre el lenguaje de programación.}
  158.  
  159.   {#4,Glosario de términos.}·
  160.   {#1000,Sintaxis de un programa.}·
  161.   {#1017,Relación de sentencias.}·
  162.   {#1032,Lista de funciones.}·
  163.  
  164.   {#1202,Constantes predefinidas.}·
  165.   {#1200,Datos globales predefinidos.}·
  166.   {#1201,Datos locales predefinidos.}·
  167.  
  168.   {#1035,Expresiones aritméticas.}·
  169.   {#1037,Condiciones lógicas.}·
  170.  
  171.   {#1176,Códigos del teclado.}·
  172.  
  173.  
  174. # ─────────────────────────────────────────────────────────────────────────────
  175. # Glosario de términos
  176. # ─────────────────────────────────────────────────────────────────────────────
  177.  
  178. {.4,Glosario de términos.}
  179. Ver: {#3,Indice} - {#1,Ayuda}{/}
  180.  
  181. {#1045,!}·
  182. {#1046,!=}·
  183. {#1047,"}·
  184. {#1048,%}·
  185. {#1049,%=}·
  186. {#1050,&}·
  187. {#1051,&&}·
  188. {#1052,&=}·
  189. {#1047,'}·
  190. {#1053,(}·
  191. {#1053,)}·
  192. {#1054,*}·
  193. {#1002,*/}·
  194. {#1055,*=}·
  195. {#1056,+}·
  196. {#1057,++}·
  197. {#1058,+=}·
  198. {#1059,,}·
  199. {#1060,-}·
  200. {#1061,--}·
  201. {#1062,-=}·
  202. {#1063,->}·
  203. {#1063,.}·
  204. {#1064,..}·
  205. {#1065,/}·
  206. {#1002,/*}·
  207. {#1002,//}·
  208. {#1066,/=}·
  209. {#1067,:}·
  210. {#1068,;}·
  211. {#1069,<}·
  212. {#1070,<<}·
  213. {#1071,<<=}·
  214. {#1072,<=}·
  215. {#1046,<>}·
  216. {#1073,=}·
  217. {#1072,=<}·
  218. {#1074,==}·
  219. {#1075,=>}·
  220. {#1076,>}·
  221. {#1075,>=}·
  222. {#1077,>>}·
  223. {#1078,>>=}·
  224. {#1079,[}·
  225. {#1079,]}·
  226. {#1080,^}·
  227. {#1081,^=}·
  228. {#1082,^^}·
  229. {#1083,|}·
  230. {#1084,|=}·
  231. {#1083,||}·
  232. {#1176,_códigos de teclas}·
  233. {#100,abs()}·
  234. {#101,advance()}·
  235. {#1161,all_text}·
  236. {#1162,all_sound}·
  237. {#1051,AND}·
  238. {#1129,angle}·
  239. {#1109,ascii}·
  240. {#1086,BEGIN}·
  241. {#1120,bigbro}·
  242. {#1026,BREAK}·
  243. {#1175,c_0 ... c_9}·
  244. {#1169,c_m7}·
  245. {#1167,c_screen}·
  246. {#1168,c_scroll}·
  247. {#1087,CASE}·
  248. {#102,change_sound()}·
  249. {#103,clear_screen()}·
  250. {#1030,CLONE}·
  251. {#1134,cnumber}·
  252. {#104,collision()}·
  253. {#1171,complete_dump}·
  254. {#1174,complete_restore}·
  255. {#1004,CONST}·
  256. {#1027,CONTINUE}·
  257. {#105,convert_palette()}·
  258. {#1122,ctype}·
  259. {#1031,DEBUG}·
  260. {#1088,DEFAULT}·
  261. {#106,define_region()}·
  262. {#107,delete_text()}·
  263. {#1114,dump_type}·
  264. {#1089,DUP}·
  265. {#1090,ELSE}·
  266. {#1091,END}·
  267. {#108,end_fli()}·
  268. {#109,exit()}·
  269. {#110,fade()}·
  270. {#111,fade_off()}·
  271. {#112,fade_on()}·
  272. {#1107,fading}·
  273. {#1152,false}·
  274. {#1117,father}·
  275. {#113,fget_angle()}·
  276. {#114,fget_dist()}·
  277. {#1131,file}·
  278. {#1127,flags}·
  279. {#1025,FOR}·
  280. {#1029,FRAME}·
  281. {#115,frame_fli()}·
  282. {#1043,FROM}·
  283. {#1164,g_height}·
  284. {#1163,g_wide}·
  285. {#1165,g_x_center}·
  286. {#1166,g_y_center}·
  287. {#116,get_angle()}·
  288. {#117,get_dist()}·
  289. {#118,get_distx()}·
  290. {#119,get_disty()}·
  291. {#120,get_id()}·
  292. {#121,get_joy_button()}·
  293. {#122,get_joy_position()}·
  294. {#123,get_pixel()}·
  295. {#124,get_point()}·
  296. {#125,get_real_point()}·
  297. {#1006,GLOBAL}·
  298. {#1126,graph}·
  299. {#126,graphic_info()}·
  300. {#1133,height}·
  301. {#1092,ID}·
  302. {#1020,IF}·
  303. {#1014,IMPORT}·
  304. {#127,is_playing_cd()}·
  305. {#1103,joy (STRUCT)}·
  306. {#1111,joy_filter}·
  307. {#1112,joy_status}·
  308. {#128,key()}·
  309. {#129,let_me_alone()}·
  310. {#130,load()}·
  311. {#131,load_fnt()}·
  312. {#132,load_fpg()}·
  313. {#174,load_map()}·
  314. {#133,load_pal()}·
  315. {#134,load_pcm()}·
  316. {#1007,LOCAL}·
  317. {#1024,LOOP}·
  318. {#1150,m320x200 ... m1024x768}·
  319. {#1102,m7 (STRUCT)}·
  320. {#135,map_block_copy()}·
  321. {#136,map_get_pixel()}·
  322. {#137,map_put()}·
  323. {#138,map_put_pixel()}·
  324. {#139,map_xput()}·
  325. {#1178,max_int}·
  326. {#1115,max_process_time}·
  327. {#1177,min_int}·
  328. {#1048,MOD}·
  329. {#1100,mouse (STRUCT)}·
  330. {#140,move_scroll()}·
  331. {#141,move_text()}·
  332. {#142,near_angle()}·
  333. {#1172,no_restore}·
  334. {#1045,NOT}·
  335. {#1085,OFFSET}·
  336. {#1083,OR}·
  337. {#143,out_region()}·
  338. {#1170,partial_dump}·
  339. {#1173,partial_restore}·
  340. {#1179,pi}·
  341. {#144,play_cd()}·
  342. {#1079,POINTER}·
  343. {#145,pow()}·
  344. {#1121,priority}·
  345. {#1008,PRIVATE}·
  346. {#1016,PROCESS}·
  347. {#1003,PROGRAM}·
  348. {#146,put()}·
  349. {#147,put_pixel()}·
  350. {#148,put_screen()}·
  351. {#149,rand()}·
  352. {#150,rand_seed()}·
  353. {#152,refresh_scroll()}·
  354. {#1130,region}·
  355. {#1023,REPEAT}·
  356. {#1116,reserved}·
  357. {#153,reset_fli()}·
  358. {#175,reset_sound()}·
  359. {#1135,resolution}·
  360. {#1113,restore_type}·
  361. {#1028,RETURN}·
  362. {#154,roll_palette()}·
  363. {#1156,s_freeze}·
  364. {#1160,s_freeze_tree}·
  365. {#1153,s_kill}·
  366. {#1157,s_kill_tree}·
  367. {#1155,s_sleep}·
  368. {#1159,s_sleep_tree}·
  369. {#1154,s_wakeup}·
  370. {#1158,s_wakeup_tree}·
  371. {#155,save()}·
  372. {#1110,scan_code}·
  373. {#1101,scroll (STRUCT)}·
  374. {#156,set_fps()}·
  375. {#157,set_mode()}·
  376. {#178,set_volume()}·
  377. {#1104,setup (STRUCT)}·
  378. {#1093,SETUP_PROGRAM}·
  379. {#1108,shift_status}·
  380. {#158,signal()}·
  381. {#1128,size}·
  382. {#1094,SIZEOF()}·
  383. {#1119,smallbro}·
  384. {#1118,son}·
  385. {#159,sound()}·
  386. {#160,sqrt()}·
  387. {#161,start_fli()}·
  388. {#162,start_mode7()}·
  389. {#163,start_scroll()}·
  390. {#1095,STEP}·
  391. {#164,stop_cd()}·
  392. {#165,stop_mode7()}·
  393. {#166,stop_scroll()}·
  394. {#167,stop_sound()}·
  395. {#1012,STRUCT}·
  396. {#1021,SWITCH}·
  397. {#168,system()}·
  398. {#1106,text_z}·
  399. {#1105,timer[]}·
  400. {#1096,TO}·
  401. {#1151,true}·
  402. {#1042,TYPE}·
  403. {#177,unload_fnt()}·
  404. {#169,unload_fpg()}·
  405. {#176,unload_map()}·
  406. {#170,unload_pcm()}·
  407. {#1097,UNTIL}·
  408. {#1022,WHILE}·
  409. {#171,write()}·
  410. {#172,write_int()}·
  411. {#1123,x}·
  412. {#1132,xgraph}·
  413. {#1082,XOR}·
  414. {#173,xput()}·
  415. {#1124,y}·
  416. {#1125,z}·
  417.  
  418. # ─────────────────────────────────────────────────────────────────────────────
  419. # Funciones
  420. # ─────────────────────────────────────────────────────────────────────────────
  421.  
  422. {.100,abs()}
  423. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  424.  
  425. {abs(}<expresión>{)}
  426.  
  427. {Retorna:}
  428.  
  429. El {valor absoluto} de la expresión.
  430.  
  431. {Descripción:}
  432.  
  433. Calcula el valor absoluto de la expresión pasada como parámetro, es decir,
  434. si el resultado de la expresión es negativo lo cambiará de signo,
  435. si es positivo lo dejará igual.
  436.  
  437. {#9999,Programa ejemplo:}
  438. PROGRAM ejemplo_abs;
  439.  
  440. GLOBAL
  441.     valores[15];
  442.     n;
  443.  
  444. BEGIN
  445.     FROM n=0 TO 15;
  446.         valores[n]=rand(-1000, 1000);
  447.         write_int(0, 0, n*10,0, offset valores[n]);
  448.     END
  449.     write(0, 0, 192, 0, "Pulse [ESPACIO] para ejecutar la función abs()");
  450.     LOOP
  451.         IF (key(_space))
  452.             FROM n=0 TO 15;
  453.  
  454.                 valores[n] = abs(valores[n]); // Hallamos el valor absoluto
  455.  
  456.             END
  457.         END
  458.         FRAME;
  459.     END
  460. END
  461. {-}
  462.  
  463. Este programa imprimirá en pantalla una lista de valores que pueden ser
  464. positivos o negativos, cuando se pulse la barra espaciadora le aplicará
  465. la función {abs()} a todos estos valores, dejándolos todos positivos.
  466.  
  467. {/}Ver: {#1035,Expresión}
  468.  
  469. # ─────────────────────────────────────────────────────────────────────────────
  470.  
  471. {.101,advance()}
  472. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  473.  
  474. {advance(}<distancia>{)}
  475.  
  476. {Descripción:}
  477.  
  478. Avanza el proceso en su ángulo (el que indique la variable local {#1129,angle})
  479. tantos puntos como indique la {expresión} (distancia) pasada como parámetro.
  480.  
  481. La distancia puede ser también un número negativo, con lo cual el gráfico
  482. del proceso avanzará (sus coordenadas {#1123,x} e {#1124,y}) en la dirección contraria
  483. a su ángulo.
  484.  
  485. {#9999,Programa ejemplo:}
  486. PROGRAM ejemplo_advance;
  487. BEGIN
  488.     load_fpg("help\help.fpg");
  489.     put_screen(0, 1);
  490.     graph=101;
  491.     x=160;
  492.     y=100;
  493.     write(0, 0, 0, 0, "Use los cursores para cambiar la dirección.");
  494.     LOOP
  495.         IF (key(_right)) angle-=10000; END
  496.         IF (key(_left)) angle+=10000; END
  497.  
  498.         advance(2); // Avanzamos dos puntos el proceso
  499.  
  500.         FRAME;
  501.     END
  502. END
  503. {-}
  504.  
  505. Este ejemplo dibujará un triángulo en pantalla que avanzará en la dirección
  506. especificada en la variable local predefinida {#1129,angle} utilizando esta función.
  507.  
  508. Se recuerda que el ángulo se especifica en milésimas de grado.
  509.  
  510. Se podrá modificar la variable {#1129,angle} usando las teclas de los cursores
  511. (sumando y restando 10000, es decir, 10 grados).
  512.  
  513. {/}
  514.  
  515. Esta función equivale siempre a las dos siguientes sentencias:
  516.  
  517.   {x+=get_distx(angle,} <distancia>{);}·
  518.   {y+=get_disty(angle,} <distancia>{);}·
  519.  
  520. Es decir, esta función únicamente modifica las coordenadas del proceso.
  521. Cabe la posibilidad de utilizar las dos sentencias anteriores cuando se
  522. quiera que el proceso avance en un ángulo diferente al que indica su variable
  523. {#1129,angle}; esto resultará útil cuando se quiera que el gráfico del proceso
  524. avance en una dirección sin rotarse.
  525.  
  526. Por ejemplo, para conseguir que un proceso avance 8 puntos en una dirección (que se
  527. podría tener en una variable privada como {angle2}) pero rotado hacia
  528. otra dirección, (la indicada en {#1129,angle}), se utilizarían las sentencias:
  529.  
  530.   {x+=get_distx(angle2, 8);}·
  531.   {y+=get_disty(angle2, 8);}·
  532.  
  533. {/}Ver: {#1044,Uso de ángulos en el lenguaje} - {#118,get_distx()} - {#119,get_disty()}
  534.  
  535. # ─────────────────────────────────────────────────────────────────────────────
  536.  
  537. {.102,change_sound()}
  538. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  539.  
  540. {change_sound(}<canal>{,} <volumen>{,} <frecuencia>{)}
  541.  
  542. {Descripción:}
  543.  
  544. Para utilizar esta función es imprescindible tener una tarjeta de sonido
  545. instalada en el ordenador compatible 100% con las tarjetas de la familia
  546. {Sound Blaster} (tm) o {Gravis Ultrasound} (tm).
  547.  
  548. Esta función tiene sentido utilizarla sólo tras la función {#159,sound()}
  549. que es la utilizada para emitir sonidos.
  550.  
  551. {Change_sound()} modifica un sonido que está sonando por uno de los {canales},
  552. estableciendo nuevamente su {volumen} y su {frecuencia}.
  553.  
  554. El {canal} es el {código de canal} que devuelve la función {#159,sound()} cuando
  555. es llamada; pueden sonar hasta 16 canales a la vez, con el mismo sonido o
  556. con diferentes sonidos, por lo tanto, cada vez que se emite un sonido se
  557. hará, posiblemente, por un canal diferente.
  558.  
  559. Cada {canal} tiene establecidos en todo momento su nivel de volumen y de
  560. frecuencia.
  561.  
  562. El {volumen} es un valor entre {0} (volumen mínimo) y {512} (volumen máximo)
  563. que determina la potencia con la que se escuchará el sonido de dicho canal.
  564.  
  565. La {frecuencia} es un valor que afecta a la velocidad a la que se oye el
  566. sonido por el canal, es decir, controla lo grave o agudo que se emite el sonido.
  567. Este valor oscila entre {0} (grave) y {512} (agudo).
  568.  
  569. {#9999,Programa ejemplo:}
  570. PROGRAM ejemplo_change_sound;
  571.  
  572. PRIVATE
  573.     frecuencia=256;     // Valor medio (0..512)
  574.     volumen=256;        // Valor medio (0..512)
  575.  
  576.     id_sonido;
  577.     canal;
  578.  
  579. BEGIN
  580.     load_fpg("help\help.fpg");
  581.     put_screen(0, 1);
  582.  
  583.     id_sonido = load_pcm("help\help.pcm", 1);
  584.     canal = sound(id_sonido, volumen, frecuencia);
  585.  
  586.     write(0, 0, 0, 0, "Presione derecha o izquierda para cambiar la frecuencia.");
  587.     write_int(0, 0, 10, 0, offset frecuencia);
  588.     write(0, 0, 20, 0, "Presione arriba o abajo para cambiar el volumen.");
  589.     write_int(0, 0, 30, 0, offset volumen);
  590.     LOOP
  591.  
  592.         // Cambia el sonido
  593.         change_sound(canal, volumen, frecuencia);
  594.  
  595.         IF (key(_right)) frecuencia++; END
  596.         IF (key(_left)) frecuencia--; END
  597.         IF (key(_up)) volumen++; END
  598.         IF (key(_down)) volumen--; END
  599.         FRAME;
  600.     END
  601.  
  602. END
  603. {-}
  604.  
  605. En el ejemplo se carga y se emite un sonido (contenido en el archivo
  606. {help.pcm}). Dentro del bucle principal del programa se cambia
  607. la frecuencia y el volumen de este sonido con la función {change_sound()};
  608. para modificar estos valores se utilizan las teclas de los cursores.
  609.  
  610. {/}Ver: {#134,load_pcm()} - {#159,sound()} - {#170,unload_pcm()} - {#1104,STRUCT setup}
  611.  
  612. # ─────────────────────────────────────────────────────────────────────────────
  613.  
  614. {.103,clear_screen()}
  615. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  616.  
  617. {clear_screen()}
  618.  
  619. {Descripción:}
  620.  
  621. Borra el fondo de la pantalla, es decir, los gráficos que se hubieran puesto en ella con
  622. las funciones {#146,put()}, {#173,xput()}, {#147,put_pixel()} y {#148,put_screen()}.
  623.  
  624. {#9999,Programa ejemplo:}
  625. PROGRAM ejemplo_clear_screen;
  626. BEGIN
  627.     load_fpg("help\help.fpg");
  628.     put_screen(0, 1);
  629.     write(0, 0, 0, 0, "Presione [ESPACIO] para que se borre la pantalla.");
  630.     write(0, 0, 10, 0, "Presione [ENTER] para volver a visualizarla.");
  631.     graph=100;
  632.     x=160;
  633.     y=100;
  634.     LOOP
  635.         IF (key (_space))
  636.  
  637.             clear_screen(); // Borra el gráfico de fondo de la pantalla
  638.  
  639.         END
  640.         IF (key (_enter)) put_screen(0, 1); END
  641.         FRAME;
  642.     END
  643. END
  644. {-}
  645.  
  646. En el ejemplo se visualiza una pantalla de fondo con la función {#148,put_screen()}.
  647. Al pulsar la barra espaciadora, se borra dicha pantalla.
  648.  
  649. Pulsando la tecla {Enter}, se vuelve a visualizar la pantalla de fondo.
  650.  
  651. Se puede observar cómo el gráfico del proceso (una bola que aparece en el
  652. centro) no desaparece al utilizar la función {clear_screen()}, ya que
  653. ésta únicamente borra el fondo de pantalla.
  654.  
  655. {/}Ver: {#146,put()} - {#173,xput()} - {#147,put_pixel()} - {#148,put_screen()}
  656.  
  657. # ─────────────────────────────────────────────────────────────────────────────
  658.  
  659. {.104,collision()}
  660. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  661.  
  662. {collision(}<tipo de proceso>{)}
  663.  
  664. {Retorna:}
  665.  
  666. El {#1039,código identificador} de un proceso o {0}.
  667.  
  668. {Descripción:}
  669.  
  670. Ésta es la función del lenguaje {para detectar choques} entre gráficos.
  671.  
  672. Comprueba si el proceso actual (el que ejecutó esta función) colisiona con
  673. uno del tipo indicado como parámetro. Es decir, comprueba si los gráficos
  674. de ambos procesos están, al menos, parcialmente superpuestos.
  675.  
  676. En caso de producirse una colisión devolverá el {#1039,código identificador}
  677. del proceso con el que está chocando el proceso actual. En caso contrario la
  678. función devolverá siempre {0}.
  679.  
  680. Si el proceso actual colisiona con varios procesos del tipo que se ha
  681. especificado, la función {collision()} devolverá el resto de los
  682. identificadores en las sucesivas llamadas que se realicen a la misma.
  683.  
  684. Para obtener, de esta forma, todos los {#1039,códigos identificadores} de los procesos
  685. que colisionan con el actual no se debe utilizar la sentencia {#1029,FRAME}
  686. entre dos llamadas consecutivas a la sentencia {collision()}. En el caso de
  687. ejecutar un proceso una sentencia {#1029,FRAME}, esta función volverá a
  688. retornar todos los {#1039,códigos identificadores} de procesos colisionantes
  689. desde el primero.
  690.  
  691. Algo similar sucede si se ejecuta una llamada a la función especificando un
  692. tipo de proceso diferente; si tras esto se vuelven a detectar las colisiones
  693. con el tipo anterior, esta función también volverá a retornar todos los
  694. códigos desde el primero.
  695.  
  696. Cuando se quieren obtener los {#1039,códigos identificadores} de los procesos
  697. de un tipo determinado aunque no se produzca ninguna colisión con
  698. ellos, se debe llamar a la función {#120,get_id()}.
  699.  
  700. Si lo que se pretende es comprobar la cercanía entre dos procesos sin que
  701. necesariamente colisionen sus gráficos, entonces se deberá emplear la
  702. función {#117,get_dist()}.
  703.  
  704. {#9999,Programa ejemplo:}
  705. PROGRAM ejemplo_collision;
  706.  
  707. PRIVATE
  708.     id2;
  709.  
  710. BEGIN
  711.     load_fpg("help\help.fpg");
  712.     put_screen(0, 1);
  713.     graph=100;
  714.     x=160;
  715.     y=100;
  716.     proceso_móvil(80, 50, 101);
  717.     LOOP
  718.         delete_text(all_text);
  719.         write(0, 160, 0, 1, "Use los cursores para mover el triángulo");
  720.  
  721.         id2 = collision(TYPE proceso_móvil); // Se detecta la colisión
  722.  
  723.         IF (id2<>0)
  724.             write(0, 160, 200, 7, "¡ DETECTADA COLISION !");
  725.         END
  726.         FRAME;
  727.     END
  728. END
  729.  
  730. PROCESS proceso_móvil(x, y, graph);
  731.  
  732. BEGIN
  733.     LOOP
  734.         IF (key(_right)) angle-=10000; END
  735.         IF (key(_left)) angle+=10000; END
  736.         IF (key(_up)) advance(4); END
  737.         FRAME;
  738.     END
  739. END
  740. {-}
  741.  
  742. En este ejemplo se visualiza una pelota en el centro de la pantalla
  743. como gráfico del programa principal.
  744. Luego se crea un proceso de nombre {proceso_móvil} con el dibujo de un
  745. triángulo controlable con las teclas de los cursores.
  746.  
  747. El programa principal llamará a la función {collision()} para comprobar
  748. si su gráfico (el círculo) colisiona con el gráfico del proceso de tipo {proceso_móvil}
  749. (el triángulo). El resultado de la función se guarda en la variable privada
  750. {id2} del programa principal; este valor será {0} cuando no se produzca la
  751. colisión y el {#1039,código identificador} de {proceso_móvil} cuando sí.
  752.  
  753. Los códigos identificadores de los procesos son siempre números impares,
  754. que en el lenguaje se evalúan como condiciones verdaderas (y los números
  755. pares se corresponden con condiciones que resultan falsas), luego en el programa
  756. anterior se podría haber cambiado la sentencia:
  757.  
  758.   {IF (id2<>0)} ... {END}
  759.  
  760. Por la siguiente:
  761.  
  762.   {IF (id2)} ... {END}
  763.  
  764. Para más información al respecto ver: {#1037,Definición de una condición.}
  765.  
  766. {/}
  767.  
  768. Cuando en el programa se esté visualizando el puntero del ratón (asignando
  769. el código del gráfico correspondiente en la {#1100,estructura mouse}), es
  770. posible ver si éste choca con el proceso actual utilizando esta función,
  771. por ejemplo, de la siguiente forma:
  772.  
  773.   {IF (collision(TYPE mouse))}·
  774.       // El proceso colisiona con el puntero del ratón·
  775.   {END}·
  776.  
  777. Al detectarse la colisión con el puntero del ratón no se hará con la
  778. totalidad del gráfico utilizado como puntero, sino únicamente con el
  779. {#1136,punto de control} principal (el número 0) del mismo, denominado
  780. usualmente como el "punto caliente" ({hotspot}) del ratón.
  781.  
  782. {/}
  783.  
  784. Esta función sirve para detectar colisiones entre gráficos de pantalla
  785. o de una ventana de scroll.
  786.  
  787. No es posible utilizar esta función para detectar colisiones con
  788. procesos que no tengan gráfico (un código válido asignado a su variable
  789. {#1126,graph}) o entre gráficos de una ventana de modo-7 (con su variable
  790. {#1122,ctype} asignada al valor {#1169,c_m7}).
  791.  
  792. Es, por tanto, {imprescindible} que tanto el proceso actual como el del tipo
  793. que se especifica tengan definido un gráfico.
  794.  
  795. Para detectar colisiones entre gráficos de una ventana de modo-7 se debe
  796. utilizar la función {#117,get_dist()} para detectar de esta forma cuándo
  797. la distancia entre los dos procesos es menor a la que se estipule como
  798. {distancia de choque}.
  799.  
  800. {/}Ver: {#120,get_id()} - {#117,get_dist()} - {#1042,Tipos de procesos} - {#1038,Formas de obtener el código identificador}
  801.  
  802. # ─────────────────────────────────────────────────────────────────────────────
  803.  
  804. {.105,convert_palette()}
  805. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  806.  
  807. {convert_palette(}<fichero>{,} <gráfico>{,} <OFFSET nueva_paleta>{)}
  808.  
  809. {Descripción:}
  810.  
  811. Transforma el mapa de color del {<gráfico>} del {<fichero>} indicado.
  812.  
  813. El {<}{#1085,offset}{ nueva_paleta>} es la dirección dentro de la memoria del ordenador
  814. de una tabla de 256 valores donde se indicará el nuevo orden de los colores del
  815. gráfico.
  816.  
  817. Si la tabla con la nueva paleta fuera como se muestra a continuación:
  818.  
  819.   nueva_paleta[255]=0, 1, 2, 3, 4, ... , 254, 255;
  820.  
  821. el gráfico no sufriría ninguna transformación. Si, por ejemplo, en la posición
  822. 3 de la tabla anterior (nueva_paleta[3]) se pusiera un 16 (en lugar de un 3),
  823. al llamar a esta función con el {#1085,offset} de dicha tabla, se sustituiría en el
  824. gráfico el color 3 por el color 16.
  825.  
  826. Los gráficos cargados con la función {#174,load_map()} se utilizarán como
  827. si pertenecieran al primer fichero (el fichero con el código 0).
  828.  
  829. Si un proceso quisiera cambiar los colores de su propio gráfico, se debería
  830. construir igualmente una tabla con el nuevo orden de los colores y, después,
  831. llamar a la función con los parámetros:
  832.  
  833.   {convert_palette(file, graph, }<OFFSET nueva_paleta>{)}
  834.  
  835. A continuación se muestra un programa que cambia los colores de su gráfico
  836. de esta forma utilizando sus variables locales predefinidas {#1131,file} y
  837. {#1126,graph}.
  838.  
  839. {#9999,Programa ejemplo:}
  840. PROGRAM ejemplo_convert_palette;
  841.  
  842. PRIVATE
  843.     nueva_paleta[255];
  844.     contador;
  845.  
  846. BEGIN
  847.     load_fpg("help\help.fpg");
  848.     put_screen(0, 1);
  849.  
  850.     FROM contador=1 TO 255;
  851.         nueva_paleta[contador]=(contador+16) MOD 256;
  852.     END
  853.  
  854.     graph=100;
  855.     x=160;
  856.     y=100;
  857.  
  858.     write (0, 160, 0, 1, "Pulse [ESPACIO] para cambiar los colores de la bola");
  859.     LOOP
  860.         IF (scan_code==_space)
  861.  
  862.             // Convertimos la paleta del gráfico número 100 (bola)
  863.             convert_palette(file, graph, offset nueva_paleta);
  864.  
  865.         END
  866.         FRAME;
  867.     END
  868. END
  869. {-}
  870.  
  871. En primer lugar, {se crea una tabla con el nuevo orden de los colores}
  872. de la paleta. El color número 0 (transparente) no se sustituirá por ninguno
  873. (nueva_paleta[0] valdrá siempre 0) y el resto de los colores (del 1 al 255)
  874. se sustituirán por el color que está 16 posiciones más arriba en la paleta
  875. (el 1 por el 17, el 2 por el 18, etc.). Los últimos 16 colores se sustituirán
  876. por los 16 primeros (al realizar la operación {MOD 256} se truncan los valores,
  877. es decir, 256 pasará a 0, 257 a 1, etc.).
  878.  
  879. Después, dentro del bucle principal del programa se ejecutará la función
  880. {convert_palette()} de modo que cambie los colores del gráfico del programa
  881. (una bola) cada vez que se pulse la barra espaciadora.
  882.  
  883. {/}Ver: {#133,load_pal()} - {#154,roll_palette()}
  884.  
  885. # ─────────────────────────────────────────────────────────────────────────────
  886.  
  887. {.106,define_region()}
  888. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  889.  
  890. {define_region(}<número de región>{,} <x>{,} <y>{,}<ancho> {,}<alto> {)}
  891.  
  892. {Descripción:}
  893.  
  894. Define una nueva región de visualización dentro de la pantalla (algo así
  895. como una ventana). Las regiones son zonas rectangulares de la pantalla dentro
  896. de las cuales se visualizarán unos determinados procesos, ventanas de scroll
  897. o de modo-7.
  898.  
  899. El {número de región} debe ser entre 1 y 31. Se pueden definir hasta 31 regiones
  900. diferentes de pantalla que después podrán asignarse a diferentes procesos
  901. (fijando su variable local {#1130,region} al nuevo número) como su ventana de
  902. visualización, o bien utilizarse como marco para una ventana de scroll o
  903. de modo-7 indicándolo en el parámetro correspondiente de las funciones
  904. {#163,start_scroll()} o {#162,start_mode7()}.
  905.  
  906. La {región número 0} no se debe redefinir, pues será siempre la pantalla
  907. completa, una ventana en las coordenadas (0, 0) y del ancho y alto de la pantalla.
  908. Ésta es la región en la que se visualizarán por defecto todos los procesos,
  909. ya que su variable local {#1130,region} siempre vale 0 por defecto.
  910.  
  911. {#9999,Programa ejemplo:}
  912. PROGRAM ejemplo_define_region;
  913.  
  914. PRIVATE
  915.     contador;
  916.  
  917. BEGIN
  918.     load_fpg("help\help.fpg");
  919.     put_screen(0, 1);
  920.  
  921.     define_region(1, 0, 0, 160, 200);   // Definimos la región 1
  922.     define_region(2, 160, 0, 160, 200); // Definimos la región 2
  923.  
  924.     write(0, 0, 0, 0, "Región 1");
  925.     write(0, 320, 0, 2, "Región 2");
  926.  
  927.     FROM contador=1 TO 20;
  928.         proceso_móvil(rand(0, 319), rand(0, 159), rand(-8, 8), rand(-8, 8), rand(1, 2));
  929.     END
  930. END
  931.  
  932. PROCESS proceso_móvil(x, y, incremento_x, incremento_y, region);
  933.  
  934. BEGIN
  935.     graph=100;
  936.     LOOP
  937.         IF (x<0 OR x>320) incremento_x=-incremento_x; END
  938.         IF (y<0 OR y>200) incremento_y=-incremento_y; END
  939.         x+=incremento_x;
  940.         y+=incremento_y;
  941.         FRAME;
  942.     END
  943. END
  944. {-}
  945.  
  946. Primero se definen dos regiones como divisiones laterales de la pantalla.
  947. Luego, se crean con un bucle 20 procesos de tipo {proceso_móvil} en coordenadas
  948. y desplazamiento aleatorios, en una de las dos regiones.
  949.  
  950. Se puede observar en su ejecución cómo cada proceso se ve únicamente en
  951. una de las dos mitades de la pantalla (sólo en su región).
  952.  
  953. {/}Ver: {#143,out_region()} - {#163,start_scroll()} - {#162,start_mode7()} - {#1130,Variable region}
  954.  
  955. # ─────────────────────────────────────────────────────────────────────────────
  956.  
  957. {.107,delete_text()}
  958. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  959.  
  960. {delete_text(}<identificador del texto>{)}
  961.  
  962. {Descripción:}
  963.  
  964. Borra un texto definitivamente de la pantalla si se especifica como parámetro
  965. el {identificador del texto}, que es un código numérico que devuelven las
  966. funciones {#171,write()} y {#172,write_int()} cuando se les pide que escriban un texto.
  967.  
  968. Si se especifica como parámetro {#1161,all_text} se borrarán todos los textos
  969. de pantalla.
  970.  
  971. {#9999,Programa ejemplo:}
  972. PROGRAM ejemplo_delete_text;
  973.  
  974. PRIVATE
  975.     identificador_texto;
  976.  
  977. BEGIN
  978.     write(0, 160, 10, 1, "Pulse [ENTER] para hacer aparecer el texto superior.");
  979.     LOOP
  980.         identificador_texto=write(0, 160, 0, 1, "Pulse [ESPACIO] para hacer desaparecer este texto.");
  981.         WHILE (NOT key(_space))
  982.             FRAME;
  983.         END
  984.  
  985.         delete_text(identificador_texto); // Borramos el texto
  986.  
  987.         WHILE (NOT key(_enter))
  988.             FRAME;
  989.         END
  990.     END
  991. END
  992. {-}
  993.  
  994. En el ejemplo anterior, se imprimen dos textos en pantalla. Cuando
  995. se pulsa la barra espaciadora se borra uno de ellos con la función {delete_text()},
  996. y cuando se pulsa la tecla Enter hacemos que vuelva a aparecer, imprimiéndolo otra vez
  997. con la función {#171,write()}, la cual nos devuelve el identificador del texto.
  998.  
  999. {/}Ver: {#171,write()} - {#172,write_int()} - {#141,move_text()}
  1000.  
  1001. # ─────────────────────────────────────────────────────────────────────────────
  1002.  
  1003. {.108,end_fli()}
  1004. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  1005.  
  1006. {end_fli()}
  1007.  
  1008. {Descripción:}
  1009.  
  1010. Finaliza una animación {FLI/FLC} visualizada en pantalla y libera la memoria
  1011. del ordenador que estaba ocupando.
  1012.  
  1013. Las animaciones {FLI/FLC} se inician con la función {#161,start_fli()}.
  1014.  
  1015. Sólamente es posible tener una animación cargada en la memoria del
  1016. ordenador.
  1017.  
  1018. {#9999,Programa ejemplo:}
  1019. PROGRAM ejemplo_end_fli;
  1020. BEGIN
  1021.     LOOP
  1022.         start_fli("help\help.fli", 0, 0);
  1023.         WHILE (frame_fli()<>0)
  1024.             FRAME;
  1025.         END
  1026.  
  1027.         end_fli(); // Descargamos la animacion de la memoria
  1028.  
  1029.     END
  1030. END
  1031. {-}
  1032.  
  1033. En primer lugar, en el ejemplo, se carga la animación con la función
  1034. {#161,start_fli()} y entonces se muestra la misma con {#115,frame_fli()}
  1035. hasta que acaba (cuando esta última función devuelve un 0). En ese
  1036. momento se descarga de memoria utilizando {end_fli()}.
  1037.  
  1038. El programa continúa repitiendo esta operación (de carga y descarga de la
  1039. animación {FLI/FLC}) indefinidamente.
  1040.  
  1041. No es necesario que la animación haya finalizado para poder descargarla
  1042. de memoria.
  1043.  
  1044. {/}Ver: {#161,start_fli()} - {#115,frame_fli()} - {#153,reset_fli()}
  1045.  
  1046. # ─────────────────────────────────────────────────────────────────────────────
  1047.  
  1048. {.109,exit()}
  1049. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  1050.  
  1051. {exit(}<mensaje>{,} <código de retorno>{)}
  1052.  
  1053. {Descripción:}
  1054.  
  1055. Termina el juego matando todos los procesos de forma inmediata y regresando
  1056. al sistema operativo (o al entorno DIV) con un {mensaje} y un {código numérico}
  1057. (el indicado en la expresión del segundo parámetro).
  1058.  
  1059. El mensaje es un texto entre comillas que aparecerá cuando finalice el juego
  1060. como mensaje de despedida para el jugador.
  1061.  
  1062. El {código de retorno} es válido para el uso de programas externos a
  1063. DIV Games Studio (como ficheros de proceso por lotes BAT), para determinar
  1064. la acción que se debe realizar tras ejecutarse el juego.
  1065.  
  1066. Cuando se utiliza la función {exit()} no es necesario haber descargado
  1067. previamente ningún recurso, como ficheros, mapas, sonidos, etc., ya que
  1068. el sistema finaliza de forma automática todos los recursos.
  1069.  
  1070. {#9999,Programa ejemplo:}
  1071. PROGRAM ejemplo_exit;
  1072. BEGIN
  1073.     write(0, 160, 0, 1, "Pulsa [ESPACIO] para acabar el programa.");
  1074.     LOOP
  1075.         IF (key (_space))
  1076.             fade_off();
  1077.  
  1078.             exit("Gracias por usarme!", 0); // Salimos del programa
  1079.  
  1080.         END
  1081.         FRAME;
  1082.     END
  1083. END
  1084. {-}
  1085.  
  1086. En el ejemplo se imprime un mensaje y luego se espera a que se pulse la
  1087. barra espaciadora para salir del programa con la función {exit()}.
  1088.  
  1089. El uso de la función {#111,fade_off()} para apagar la pantalla no resulta
  1090. necesario.
  1091.  
  1092. {/}
  1093.  
  1094. Todos los programas terminarán su ejecución si se pulsa la combinación
  1095. de teclas {[ALT]+[X]} en cualquier momento; esto resulta similar a
  1096. forzar la ejecución de la función {exit()}, sólo que sin mensaje y con
  1097. el código de retorno 0.
  1098.  
  1099. {/}Ver: {#129,let_me_alone()} - {#111,fade_off()}
  1100.  
  1101. # ─────────────────────────────────────────────────────────────────────────────
  1102.  
  1103. {.110,fade()}
  1104. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  1105.  
  1106. {fade(}<% red>{,} <% green>{,} <% blue>{,} <velocidad>{)}
  1107.  
  1108. {Descripción:}
  1109.  
  1110. Inicia un fundido de los colores de la paleta del juego hasta que se alcancen
  1111. los porcentajes de visualización (desde 0% hasta 200%) de las componentes
  1112. {red} (rojo), {green} (verde) y {blue} (azul) que se indican como parámetros.
  1113.  
  1114. El último parámetro indica la velocidad a la que se va a realizar el fundido
  1115. de colores, normalmente se define un número desde 1 (muy lentamente) hasta
  1116. 10 (muy rápidamente).
  1117.  
  1118. Si se indica como velocidad un número mayor o igual que 64, el fundido se
  1119. realizará de forma instantánea.
  1120.  
  1121. El fundido se irá realizando gradualmente en las sucesivas visualizaciones
  1122. del juego (en los siguientes fotogramas).
  1123.  
  1124. Si se ponen las tres componentes a 0 se hará un fundido a negro, si se ponen
  1125. a 200 se hará un fundido a blanco, y si se ponen a 100 se recuperarán los
  1126. colores originales de la paleta del juego.
  1127.  
  1128. Un valor inferior a 100 en una componente apagará su color, mientras que un valor superior
  1129. a 100, saturará el color.
  1130.  
  1131. Se recuerda que el fundido no se realiza al ejecutarse la función {fade()},
  1132. sino en las siguientes sentencias {#1029,FRAME}. Mientras se está realizando
  1133. un fundido la variable global predefinida {#1107,fading} valdrá {cierto}
  1134. (un número impar que en este caso será 1) y cuando se termine el fundido
  1135. (se alcancen finalmente los valores de visualización de color establecidos),
  1136. esta variable pasará a valer {falso} (un numero par, el número 0).
  1137.  
  1138. {#9999,Programa ejemplo:}
  1139. PROGRAM ejemplo_fade;
  1140. BEGIN
  1141.     load_fpg("help\help.fpg");
  1142.     put_screen(0, 1);
  1143.     write (0, 0, 0, 0, "Pulsa [ESPACIO] para ir realizando los efectos.");
  1144.     LOOP
  1145.         IF (NOT fading AND key(_space))
  1146.  
  1147.             fade(rand(0, 200), rand(0, 200), rand(0, 200), 5);
  1148.  
  1149.         END
  1150.         FRAME;
  1151.     END
  1152. END
  1153. {-}
  1154.  
  1155. En el ejemplo se carga una pantalla como fondo y se imprime un mensaje;
  1156. después, cada vez que se pulse la barra espaciadora, si no se está
  1157. realizando un fundido ({IF (NOT fading ...}), se iniciará uno con la
  1158. función {fade()} con las tres componentes de color elegidas al azar
  1159. entre 0% y 200% (con la función {#149,rand()}) y a velocidad 5.
  1160.  
  1161. {/}Ver: {#1107,fading} - {#111,fade_off()} - {#112,fade_on()} - {#133,load_pal()}
  1162.  
  1163. # ─────────────────────────────────────────────────────────────────────────────
  1164.  
  1165. {.111,fade_off()}
  1166. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  1167.  
  1168. {fade_off()}
  1169.  
  1170. {Descripción:}
  1171.  
  1172. Realiza un fundido de los colores de la pantalla a negro. Se detiene el juego
  1173. tal y como está hasta que la pantalla quede negra por completo. Realizar un
  1174. fundido a negro se denomina {apagar la pantalla}.
  1175.  
  1176. Para volver a encender la pantalla (deshacer el fundido a negro) se utiliza
  1177. la función {#112,fade_on()}.
  1178.  
  1179. {#9999,Programa ejemplo:}
  1180. PROGRAM ejemplo_fade_off;
  1181. BEGIN
  1182.     load_fpg("help\help.fpg");
  1183.     put_screen(0, 1);
  1184.     write (0, 0, 0, 0, "Pulsa [ESPACIO] para apagar y encender la pantalla.");
  1185.     LOOP
  1186.         WHILE (NOT key(_space))
  1187.             FRAME;
  1188.         END
  1189.  
  1190.         fade_off(); // Apagamos la pantalla
  1191.  
  1192.         fade_on();
  1193.     END
  1194. END
  1195. {-}
  1196.  
  1197. En el ejemplo se pone una pantalla de fondo y después se espera
  1198. a que se pulse la barra espaciadora para apagar y encender la pantalla.
  1199.  
  1200. La función {#110,fade()} puede realizar esta misma función sin detener
  1201. el programa o a distintas velocidades, además de poder realizar otros
  1202. efectos de paleta más avanzados.
  1203.  
  1204. {/}Ver: {#110,fade()} - {#112,fade_on()}
  1205.  
  1206. # ─────────────────────────────────────────────────────────────────────────────
  1207.  
  1208. {.112,fade_on()}
  1209. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  1210.  
  1211. {fade_on()}
  1212.  
  1213. {Descripción:}
  1214.  
  1215. Realiza un fundido de los colores de pantalla hasta su situación natural.
  1216. En las sucesivas visualizaciones del juego (al llegar la sentencia {#1029,FRAME})
  1217. los colores irán recuperando su visibilidad hasta verse perfectamente.
  1218. A esta acción se la denomina {encender la pantalla}.
  1219.  
  1220. Para apagar la pantalla (hacer un fundido a negro) se utiliza
  1221. la función {#111,fade_off()}.
  1222.  
  1223. {#9999,Programa ejemplo:}
  1224. PROGRAM ejemplo_fade_off;
  1225. BEGIN
  1226.     load_fpg("help\help.fpg");
  1227.     put_screen(0, 1);
  1228.     write (0, 0, 0, 0, "Pulsa [ESPACIO] para apagar y encender la pantalla.");
  1229.     LOOP
  1230.         WHILE (NOT key(_space))
  1231.             FRAME;
  1232.         END
  1233.         fade_off();
  1234.  
  1235.         fade_on(); // Se enciende la pantalla
  1236.  
  1237.     END
  1238. END
  1239. {-}
  1240.  
  1241. En el primer ejemplo se pone una pantalla de fondo y después se espera a que
  1242. se pulse la barra espaciadora para apagar y encender la pantalla.
  1243.  
  1244. La función {#110,fade()} puede realizar esta misma función a distintas
  1245. velocidades, además de poder realizar otros efectos de paleta más avanzados.
  1246.  
  1247. {/}
  1248.  
  1249. Todos los juegos realizan de forma automática un {fade_on()} al comienzo
  1250. de la ejecución.
  1251.  
  1252. {/}Ver: {#110,fade()} - {#111,fade_off()}
  1253.  
  1254. # ─────────────────────────────────────────────────────────────────────────────
  1255.  
  1256. {.113,fget_angle()}
  1257. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  1258.  
  1259. {fget_angle(}<x0>{,} <y0>{,} <x1>{,} <y1>{)}
  1260.  
  1261. {Retorna:}
  1262.  
  1263. El ángulo entre dos puntos.
  1264.  
  1265. {Descripción:}
  1266.  
  1267. Devuelve el ángulo que hay desde el {punto 0} (x0, y0) hasta el {punto 1}
  1268. (x1, y1).
  1269.  
  1270. Se recuerda que el ángulo se especifica en milésimas de grado. La función
  1271. devuelve siempre un valor entre{ -180000} y {180000} (un ángulo entre -180 y
  1272. 180 grados).
  1273.  
  1274. Como coordenadas de ambos puntos (x0, y0, x1, y1) se puede especificar
  1275. cualquier expresión numérica válida.
  1276.  
  1277. {#9999,Programa ejemplo:}
  1278. PROGRAM ejemplo_fget_angle;
  1279.  
  1280. PRIVATE
  1281.     coordenada_x0, coordenada_y0;
  1282.     coordenada_x1, coordenada_y1;
  1283.     resultado;
  1284.     fichero1;
  1285.  
  1286. BEGIN
  1287.     fichero1=load_fpg("help\help.fpg");
  1288.     write(0, 0, 0, 0, "Coordenadas punto 1");
  1289.     write(0, 0, 10, 0, "X:");
  1290.     write_int(0, 20, 10, 0, offset coordenada_x0);
  1291.     write(0, 0, 20, 0, "Y:");
  1292.     write_int(0, 20, 20, 0, offset coordenada_y0);
  1293.     write(0, 0, 40, 0, "Coordenadas punto 2");
  1294.     write(0, 0, 50, 0, "X:");
  1295.     write_int(0, 20, 50, 0, offset coordenada_x1);
  1296.     write(0, 0, 60, 0, "Y:");
  1297.     write_int(0, 20, 60, 0, offset coordenada_y1);
  1298.     write(0, 0, 80, 0, "Angulo del punto 1 al punto 2:");
  1299.     write_int(0, 0, 90, 0, offset resultado);
  1300.     write(0, 0, 200, 6, "Pulsa [ESPACIO] para hallar otros dos puntos.");
  1301.     LOOP
  1302.         clear_screen();
  1303.         coordenada_x0=rand(0, 319);
  1304.         coordenada_y0=rand(0, 199);
  1305.         coordenada_x1=rand(0, 319);
  1306.         coordenada_y1=rand(0, 199);
  1307.         put(fichero1,200,coordenada_x0, coordenada_y0);
  1308.         put(fichero1,200,coordenada_x1, coordenada_y1);
  1309.  
  1310.         //Hallamos el ángulo entre los dos puntos
  1311.         resultado = fget_angle(coordenada_x0, coordenada_y0, coordenada_x1, coordenada_y1);
  1312.  
  1313.         scan_code=0;
  1314.         WHILE (scan_code<>_space)
  1315.             FRAME;
  1316.         END
  1317.     END
  1318. END
  1319. {-}
  1320.  
  1321. En el ejemplo, después de poner los mensajes necesarios, se hallan las
  1322. coordenadas {x} e {y} de dos puntos hallados al azar y se guardan en las
  1323. variables destinadas para ello, calculando con la función {fget_angle()}
  1324. el ángulo entre dichos puntos. Cada vez que se pulse la barra espaciadora
  1325. se repetirá el proceso.
  1326.  
  1327. La función {#116,get_angle()} se utiliza para obtener el {ángulo de un proceso
  1328. a otro}, en lugar de entre dos puntos.
  1329.  
  1330. La función {#114,fget_dist()} se utiliza para obtener la {distancia entre dos
  1331. puntos}, en lugar del ángulo.
  1332.  
  1333. {/}Ver: {#1044,Uso de ángulos en el lenguaje} - {#116,get_angle()} - {#114,fget_dist()}
  1334.  
  1335. # ─────────────────────────────────────────────────────────────────────────────
  1336.  
  1337. {.114,fget_dist()}
  1338. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  1339.  
  1340. {fget_dist(}<x0>{,} <y0>{,} <x1>{,} <y1>{)}
  1341.  
  1342. {Retorna:}
  1343.  
  1344. La distancia entre dos puntos.
  1345.  
  1346. {Descripción:}
  1347.  
  1348. Devuelve la distancia que hay desde el {punto 0} (x0, y0) hasta el {punto 1}
  1349. (x1, y1).
  1350.  
  1351. Como coordenadas de ambos puntos (x0, y0, x1, y1) se puede especificar
  1352. cualquier expresión numérica válida.
  1353.  
  1354. {#9999,Programa ejemplo:}
  1355. PROGRAM ejemplo_fget_dist;
  1356.  
  1357. PRIVATE
  1358.     coordenada_x0, coordenada_y0;
  1359.     coordenada_x1, coordenada_y1;
  1360.     resultado;
  1361.     fichero1;
  1362.  
  1363. BEGIN
  1364.  
  1365.     fichero1=load_fpg("help\help.fpg");
  1366.     write(0, 0, 0, 0, "Coordenadas punto 1");
  1367.     write(0, 0, 10, 0, "X:");
  1368.     write_int(0, 20, 10, 0, offset coordenada_x0);
  1369.     write(0, 0, 20, 0, "Y:");
  1370.     write_int(0, 20, 20, 0, offset coordenada_y0);
  1371.     write(0, 0, 40, 0, "Coordenadas punto 2");
  1372.     write(0, 0, 50, 0, "X:");
  1373.     write_int(0, 20, 50, 0, offset coordenada_x1);
  1374.     write(0, 0, 60, 0, "Y:");
  1375.     write_int(0, 20, 60, 0, offset coordenada_y1);
  1376.     write(0, 0, 80, 0, "Distancia entre el punto 1 y el punto 2");
  1377.     write_int(0, 0, 90, 0, offset resultado);
  1378.     write(0, 0, 200, 6, "Pulsa [ESPACIO] para hallar otra distancia.");
  1379.     LOOP
  1380.         clear_screen();
  1381.         coordenada_x0=rand(0, 319);
  1382.         coordenada_y0=rand(0, 199);
  1383.         coordenada_x1=rand(0, 319);
  1384.         coordenada_y1=rand(0, 199);
  1385.         put(fichero1,200,coordenada_x0, coordenada_y0);
  1386.         put(fichero1,200,coordenada_x1, coordenada_y1);
  1387.  
  1388.         //Hallamos la distancia que hay entre los dos puntos
  1389.         resultado = fget_dist(coordenada_x0, coordenada_y0, coordenada_x1, coordenada_y1);
  1390.  
  1391.         scan_code=0;
  1392.         WHILE (scan_code<>_space)
  1393.             FRAME;
  1394.         END
  1395.     END
  1396. END
  1397. {-}
  1398.  
  1399. En el ejemplo, después de poner los mensajes necesarios se guardan las
  1400. coordenadas de dos puntos hallados aleatoriamente en las variables
  1401. definidas para tal efecto, obteniendo la distancia entre ellos con la
  1402. función {fget_dist()}. Cada vez que se pulse la barra espaciadora se
  1403. repetirá el proceso.
  1404.  
  1405. La función {#116,get_dist()} se utiliza para obtener la {distancia de un proceso
  1406. a otro}, en lugar de entre dos puntos.
  1407.  
  1408. La función {#114,fget_angle()} se utiliza para obtener el {ángulo entre dos
  1409. puntos}, en lugar de la distancia.
  1410.  
  1411. {/}
  1412.  
  1413. Esta función se puede utilizar para detectar choques entre procesos por
  1414. proximidad entre ellos, si bien suele utilizarse para ello la función
  1415. {#104,collision()} que detecta cuando dos procesos tienen sus gráficos
  1416. superpuestos.
  1417.  
  1418. Por ejemplo, con los procesos visualizados dentro de una ventana de modo-7
  1419. (ver {#162,start_mode7()}) no se puede utilizar la función {#104,collision()}
  1420. debiéndose obtener la distancia entre los procesos (normalmente con
  1421. {#116,get_dist()}) para comprobar si chocan (si su distancia es menor que
  1422. una determinada).
  1423.  
  1424. {/}Ver: {#117,get_dist} - {#113,fget_angle} - {#104,collision()}
  1425.  
  1426. # ─────────────────────────────────────────────────────────────────────────────
  1427.  
  1428. {.115,frame_fli()}
  1429. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  1430.  
  1431. {frame_fli()}
  1432.  
  1433. {Retorna:}
  1434.  
  1435. {Cierto} si la animación continúa y {falso} si ha terminado.
  1436.  
  1437. {Descripción:}
  1438.  
  1439. Muestra la siguiente imagen de una animación {FLI/FLC} iniciada con la función
  1440. {#161,start_fli()}. Esta función devuelve {0} si terminó ya la animación.
  1441.  
  1442. Durante la ejecución del programa, únicamente se podrá ejecutar una animación
  1443. {FLI/FLC} a la vez, es decir, no se podrán tener dos animaciones ejecutándose
  1444. al mismo tiempo.
  1445.  
  1446. La imagen de la animación se verá sólo en la siguiente imagen del juego
  1447. (cuando llegue la sentencia {#1029,FRAME}), por lo que si se realiza un
  1448. bucle, dentro del cual se llama a la función {frame_fli()} pero no a la
  1449. sentencia {#1029,FRAME}, no se visualizará la animación en pantalla.
  1450.  
  1451. {#9999,Programa ejemplo:}
  1452. PROGRAM ejemplo_frame_fli;
  1453. BEGIN
  1454.     start_fli("help\help.fli", 0, 0);
  1455.     LOOP
  1456.  
  1457.         frame_fli(); // Mostramos la siguiente imagen
  1458.  
  1459.         FRAME;
  1460.     END
  1461. END
  1462. {-}
  1463.  
  1464. En el ejemplo, se carga la animación {FLI/FLC} y luego se ejecuta indefinidamente
  1465. con la función {frame_fli()}.
  1466.  
  1467. {/}Ver: {#161,start_fli()} - {#153,reset_fli()} - {#108,end_fli()}
  1468.  
  1469. # ─────────────────────────────────────────────────────────────────────────────
  1470.  
  1471. {.116,get_angle()}
  1472. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  1473.  
  1474. {get_angle(}<código identificador>{)}
  1475.  
  1476. {Retorna:}
  1477.  
  1478. El ángulo hacia otro proceso.
  1479.  
  1480. {Descripción:}
  1481.  
  1482. Devuelve el ángulo desde el proceso actual (el que llamó a esta función) hasta
  1483. el proceso cuyo {#1039,código identificador} se le pasa como parámetro.
  1484.  
  1485. Ver {#1038,formas de obtener el código identificador}, para más información.
  1486.  
  1487. Se recuerda que el ángulo se especifica en milésimas de grado. La función
  1488. devuelve siempre un valor entre{ -180000} y {180000} (un ángulo entre -180 y
  1489. 180 grados).
  1490.  
  1491. {#9999,Programa ejemplo:}
  1492. PROGRAM ejemplo_get_angle;
  1493.  
  1494. PRIVATE
  1495.     ángulo_resultante;
  1496.     identificador_proceso;
  1497.  
  1498. BEGIN
  1499.     load_fpg("help\help.fpg");
  1500.     put_screen(0, 1);
  1501.     graph=100;
  1502.     x=160;
  1503.     y=100;
  1504.  
  1505.     identificador_proceso = proceso_móvil(80, 50, 101);
  1506.  
  1507.     write(0, 160, 200, 7, "Use los cursores para mover el triángulo.");
  1508.     write(0, 0, 0, 0, "Angulo desde la bola hacia el triángulo:");
  1509.     write_int(0, 0, 10, 0, offset ángulo_resultante);
  1510.     LOOP
  1511.  
  1512.         // Hallamos el ángulo entre los dos procesos
  1513.         ángulo_resultante = get_angle(identificador_proceso);
  1514.  
  1515.         FRAME;
  1516.     END
  1517. END
  1518.  
  1519. PROCESS proceso_móvil(x, y, graph);
  1520. BEGIN
  1521.     LOOP
  1522.         IF (key(_right)) angle-=10000; END
  1523.         IF (key(_left)) angle+=10000; END
  1524.         IF (key(_up)) advance(4); END
  1525.         FRAME;
  1526.     END
  1527. END
  1528. {-}
  1529.  
  1530. Al inicio se pone el fondo de pantalla y el programa principal define
  1531. su gráfico como una bola situada en el centro de la pantalla.
  1532.  
  1533. Despúes, se crea un proceso del tipo {proceso_móvil} del cual se coge el
  1534. {#1039,código identificador}, que se puede controlar con
  1535. los cursores.
  1536.  
  1537. Dentro del bucle principal se calcula y muestra continuamente en pantalla
  1538. el ángulo entre los dos procesos.
  1539.  
  1540. La función {#113,fget_angle()} se utiliza para obtener el {ángulo entre dos
  1541. puntos}, en lugar de entre dos procesos. Si el {#1039,código identificador}
  1542. del proceso se tiene, por ejemplo, en una variable denominada {id2}, entonces
  1543. la llamada a la función:
  1544.  
  1545.     {get_angle(id2)}
  1546.  
  1547. Sería equivalente a:
  1548.  
  1549.     {fget_angle(x, y, id2.x, id2.y)}
  1550.  
  1551. Obtener el ángulo desde las coordenadas (x, y) del proceso actual, hasta las
  1552. coordenadas (x, y) del proceso cuyo {#1039,código identificador} es {id2}.
  1553.  
  1554. La función {#117,get_dist()} se utiliza para obtener la {distancia hasta otro
  1555. proceso}, en lugar del ángulo.
  1556.  
  1557. {/}Ver: {#1044,Uso de ángulos en el lenguaje} - {#113,fget_angle()} - {#117,get_dist()}
  1558.  
  1559. # ─────────────────────────────────────────────────────────────────────────────
  1560.  
  1561. {.117,get_dist()}
  1562. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  1563.  
  1564. {get_dist(}<código identificador>{)}
  1565.  
  1566. {Retorna:}
  1567.  
  1568. La distancia hasta otro proceso.
  1569.  
  1570. {Descripción:}
  1571.  
  1572. Devuelve la distancia desde el proceso actual (el que llamó a esta función) hasta
  1573. el proceso cuyo {#1039,código identificador} se le pasa como parámetro.
  1574.  
  1575. Ver {#1038,formas de obtener el código identificador}, para más información.
  1576.  
  1577. Si el proceso ha definido su variable local {#1135,resolution} es importante
  1578. que el proceso hasta el que se quiere obtener la distancia la tenga definida
  1579. al mismo valor. Es decir, si ambos procesos manejan las coordenadas en
  1580. centésimas en lugar de unidades (con {#1135,resolution}=100), la distancia
  1581. entre ambos también se obtendrá en centésimas, pero si el valor de dicha
  1582. variable difiere en ambos procesos, el resultado de la función {get_dist()}
  1583. carecerá de sentido.
  1584.  
  1585. {#9999,Programa ejemplo:}
  1586. PROGRAM ejemplo_get_dist;
  1587.  
  1588. PRIVATE
  1589.     distancia_resultante;
  1590.     identificador_proceso;
  1591.  
  1592. BEGIN
  1593.     load_fpg("help\help.fpg");
  1594.     put_screen(0, 1);
  1595.     graph=100;
  1596.     x=160;
  1597.     y=100;
  1598.  
  1599.     identificador_proceso = proceso_móvil(80, 50, 101);
  1600.  
  1601.     write(0, 160, 200, 7, "Use los cursores para mover el triángulo.");
  1602.     write(0, 0, 0, 0, "Distancia desde la bola hasta el triángulo:");
  1603.     write_int(0, 0, 10, 0, offset distancia_resultante);
  1604.     LOOP
  1605.  
  1606.         // Hallamos la distancia entre los dos procesos
  1607.         distancia_resultante = get_dist(identificador_proceso);
  1608.  
  1609.         FRAME;
  1610.     END
  1611. END
  1612.  
  1613. PROCESS proceso_móvil(x, y, graph)
  1614. BEGIN
  1615.     LOOP
  1616.         IF (key(_right)) angle-=10000; END
  1617.         IF (key(_left)) angle+=10000; END
  1618.         IF (key(_up)) advance(4); END
  1619.         FRAME;
  1620.     END
  1621. END
  1622. {-}
  1623.  
  1624. Al inicio se pone el fondo de pantalla y el programa principal define
  1625. su gráfico como una bola situada en el centro de la pantalla.
  1626.  
  1627. Despúes se crea un proceso del tipo {proceso_móvil} del cual se coge el
  1628. {#1039,código identificador}, que se puede controlar con
  1629. los cursores.
  1630.  
  1631. Dentro del bucle principal se calcula y muestra continuamente en pantalla
  1632. la distancia entre los dos procesos.
  1633.  
  1634. La función {#114,fget_dist()} se utiliza para obtener la {distancia entre dos
  1635. puntos}, en lugar de entre dos procesos. Si el {#1039,código identificador}
  1636. del proceso se tiene, por ejemplo, en una variable denominada {id2}, entonces
  1637. la llamada a la función:
  1638.  
  1639.     {get_dist(id2)}
  1640.  
  1641. Sería equivalente a:
  1642.  
  1643.     {fget_dist(x, y, id2.x, id2.y)}
  1644.  
  1645. Obtener la distancia desde las coordenadas (x, y) del proceso actual hasta las
  1646. coordenadas (x, y) del proceso cuyo {#1039,código identificador} es {id2}.
  1647.  
  1648. La función {#116,get_angle()} se utiliza para obtener el {ángulo hasta otro
  1649. proceso}, en lugar de la distancia.
  1650.  
  1651. {/}
  1652.  
  1653. Esta función se puede utilizar para detectar choques entre procesos por
  1654. proximidad entre ellos, aunque se suele utilizar para ello la función
  1655. {#104,collision()} que detecta cuándo dos procesos tienen sus gráficos
  1656. superpuestos.
  1657.  
  1658. Por ejemplo, con los procesos visualizados dentro de una ventana de modo-7
  1659. (ver {#162,start_mode7()}) no se puede utilizar la función {#104,collision()}
  1660. debiéndose obtener la distancia entre los procesos para comprobar si chocan
  1661. (si su distancia es menor que una determinada).
  1662.  
  1663. {/}Ver: {#114,fget_dist()} - {#116,get_angle()} - {#118,get_distx()} - {#119,get_disty()}
  1664.  
  1665. # ─────────────────────────────────────────────────────────────────────────────
  1666.  
  1667. {.118,get_distx()}
  1668. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  1669.  
  1670. {get_distx(}<ángulo>{,} <distancia>{)}
  1671.  
  1672. {Retorna:}
  1673.  
  1674. El desplazamiento horizontal del vector (ángulo, distancia).
  1675.  
  1676. {Descripción:}
  1677.  
  1678. Devuelve distancia horizontal (en el eje de la coordenada {x}) a partir del
  1679. ángulo y {distancia} (sobre ese ángulo) pasados como parámetros. Es decir,
  1680. devuelve la distancia que recorre en horizontal el vector formado por el
  1681. ángulo y {longitud} (distancia o módulo del vector) indicados.
  1682.  
  1683. Se recuerda que el ángulo se especifica en milésimas de grado y como
  1684. distancia se puede especificar cualquier expresión numérica válida.
  1685.  
  1686. La función utilizada para calcular la distancia vertical, en lugar de la
  1687. horizontal, es {#119,get_disty()}.
  1688.  
  1689. {#9999,Programa ejemplo:}
  1690. PROGRAM ejemplo_get_distx;
  1691.  
  1692. GLOBAL
  1693.     distancia;
  1694.     distancia_horizontal;
  1695.     distancia_vertical;
  1696.  
  1697. BEGIN
  1698.     load_fpg("help\help.fpg");
  1699.     put_screen(0, 3);
  1700.     write(0, 160, 200, 7, "Utilice los cursores para mover el triángulo.");
  1701.     write(0, 0, 0, 0, "Distancia horizontal:");
  1702.     write_int(0, 0, 10, 0, offset distancia_horizontal);
  1703.     graph=101;
  1704.     LOOP
  1705.         IF (key(_up)) distancia+=2; END
  1706.         IF (key(_down)) distancia-=2; END
  1707.         IF (key(_right)) angle-=2000; END
  1708.         IF (key(_left)) angle+=2000; END
  1709.  
  1710.         // Calculamos la distancia horizontal
  1711.         distancia_horizontal = get_distx(angle, distancia);
  1712.  
  1713.         distancia_vertical = get_disty(angle, distancia);
  1714.         x=160+distancia_horizontal;
  1715.         y=100+distancia_vertical;
  1716.         FRAME;
  1717.     END
  1718. END
  1719. {-}
  1720.  
  1721. En el ejemplo se pone como fondo de la pantalla una gráfica circular,
  1722. sobre la que se manejará con los cursores un triángulo, modificando
  1723. su distancia y ángulo al centro de la gráfica.
  1724.  
  1725. El programa calcula la distancia horizontal y vertical para emplazar el
  1726. triángulo a partir de las coordenadas del centro de pantalla
  1727. (160, 100), mostrándose en todo momento la distancia horizontal en la esquina
  1728. superior izquierda.
  1729.  
  1730. {/}
  1731.  
  1732. Si se quiere avanzar las coordenadas del proceso una {distancia} en un
  1733. ángulo determinado, se pueden utilizar las siguientes sentencias:
  1734.  
  1735.   {x+=get_distx(}<ángulo>{,} <distancia>{);}·
  1736.   {y+=get_disty(}<ángulo>{,} <distancia>{);}·
  1737.  
  1738. Si el ángulo en el que se quiere mover el proceso es el que tiene en su
  1739. variable local {#1129,angle}, entonces esta misma operación se podría
  1740. realizar con la función {#101,advance()} de la siguiente forma:
  1741.  
  1742.   {advance(}<distancia>{);}
  1743.  
  1744. {/}
  1745.  
  1746. La función {get_distx()} equivale a calcular el {coseno} del ángulo y
  1747. multiplicarlo por la {distancia}.
  1748.  
  1749. {/}Ver: {#1044,Uso de ángulos en el lenguaje} - {#119,get_disty()} - {#101,advance()}
  1750.  
  1751. # ─────────────────────────────────────────────────────────────────────────────
  1752.  
  1753. {.119,get_disty()}
  1754. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  1755.  
  1756. {get_disty(}<ángulo>{,} <distancia>{)}
  1757.  
  1758. {Retorna:}
  1759.  
  1760. El desplazamiento vertical del vector (ángulo, distancia).
  1761.  
  1762. {Descripción:}
  1763.  
  1764. Devuelve distancia vertical (eje de la coordenada {y}) a partir del ángulo y
  1765. {distancia} (sobre ese ángulo) pasados como parámetros. Es decir,
  1766. devuelve la distancia que recorre en vertical el vector formado por el
  1767. ángulo y {longitud} (distancia) indicados.
  1768.  
  1769. Se recuerda que el ángulo se especifica en milésimas de grado y como
  1770. distancia se puede especificar cualquier expresión numérica válida.
  1771.  
  1772. La función utilizada para calcular la distancia horizontal, en lugar de la
  1773. vertical, es {#119,get_distx()}.
  1774.  
  1775. {#9999,Programa ejemplo:}
  1776. PROGRAM ejemplo_get_disty;
  1777.  
  1778. GLOBAL
  1779.     distancia;
  1780.     distancia_horizontal;
  1781.     distancia_vertical;
  1782.  
  1783. BEGIN
  1784.     load_fpg("help\help.fpg");
  1785.     put_screen(0, 3);
  1786.     write(0, 160, 200, 7, "Utilice los cursores para mover el triángulo.");
  1787.     write(0, 0, 0, 0, "Distancia vertical:");
  1788.     write_int(0, 0, 10, 0, offset distancia_vertical);
  1789.     graph=101;
  1790.     LOOP
  1791.         IF (key(_up)) distancia+=2; END
  1792.         IF (key(_down)) distancia-=2; END
  1793.         IF (key(_right)) angle-=2000; END
  1794.         IF (key(_left)) angle+=2000; END
  1795.  
  1796.         // Calculamos la distancia vertical
  1797.         distancia_vertical = get_disty(angle, distancia);
  1798.  
  1799.         distancia_horizontal = get_distx(angle, distancia);
  1800.         x=160+distancia_horizontal;
  1801.         y=100+distancia_vertical;
  1802.         FRAME;
  1803.     END
  1804. END
  1805. {-}
  1806.  
  1807. En el ejemplo se pone como fondo de la pantalla una gráfica circular,
  1808. sobre la que se manejará con los cursores un triángulo, modificando
  1809. su distancia y ángulo al centro de la gráfica.
  1810.  
  1811. El programa calcula la distancia horizontal y vertical para emplazar el
  1812. triángulo a partir de las coordenadas del centro de pantalla
  1813. (160, 100), mostrándose en todo momento la distancia vertical en la esquina
  1814. superior izquierda.
  1815.  
  1816. {/}
  1817.  
  1818. Si se quiere avanzar las coordenadas del proceso una {distancia} en un
  1819. ángulo determinado, se pueden utilizar las siguientes sentencias:
  1820.  
  1821.   {x+=get_distx(}<ángulo>{,} <distancia>{);}·
  1822.   {y+=get_disty(}<ángulo>{,} <distancia>{);}·
  1823.  
  1824. Si el ángulo en el que se quiere mover el proceso es el que tiene en su
  1825. variable local {#1129,angle}, entonces esta misma operación se podría
  1826. realizar con la función {#101,advance()} de la siguiente forma:
  1827.  
  1828.   {advance(}<distancia>{);}
  1829.  
  1830. {/}
  1831.  
  1832. La función {get_disty()} equivale a calcular el {seno} del ángulo y multiplicarlo
  1833. por la {distancia}, cambiando este resultado de signo, debido a que el
  1834. eje {Y} de pantalla avanza hacia abajo (de manera contraria a la función seno).
  1835.  
  1836. {/}Ver: {#1044,Uso de ángulos en el lenguaje} - {#118,get_distx()} - {#101,advance()}
  1837.  
  1838. # ─────────────────────────────────────────────────────────────────────────────
  1839.  
  1840. {.120,get_id()}
  1841. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  1842.  
  1843. {get_id(}<tipo de proceso>{)}
  1844.  
  1845. {Retorna:}
  1846.  
  1847. El {#1039,código identificador} de un proceso o {0}.
  1848.  
  1849. {Descripción:}
  1850.  
  1851. Comprueba si hay procesos del tipo especificado activos. En caso afirmativo,
  1852. esta función devolverá el {#1039,código identificador} de uno de ellos y,
  1853. en el caso contrario, devolverá un 0.
  1854.  
  1855. Si existen varios procesos del tipo que se ha
  1856. especificado, la función {get_id()} devolverá el resto de los
  1857. identificadores en las sucesivas llamadas que se realicen a la misma.
  1858.  
  1859. Una vez se hayan devuelto todos los {#1039,códigos identificadores}, la función
  1860. devolverá 0, hasta que se vuelva a ejecutar una sentencia {#1029,FRAME}, momento
  1861. a partir del cual esta función devolverá, de nuevo, todos los códigos
  1862. identificadores de los procesos del tipo indicado.
  1863.  
  1864. Para obtener de esta forma todos los {#1039,códigos identificadores} de los
  1865. procesos no se debe utilizar la sentencia {#1029,FRAME}
  1866. entre dos llamadas consecutivas a la sentencia {get_id()}. En el caso de
  1867. ejecutar una sentencia {#1029,FRAME}, esta función volverá a
  1868. retornar todos los {#1039,códigos identificadores} de procesos desde el primero.
  1869.  
  1870. Algo similar sucede si se ejecuta una llamada a la función especificando un
  1871. tipo de proceso diferente; si tras esto se vuelven a pedir identificadores
  1872. del tipo de proceso anterior, esta función también los volverá a retornar todos
  1873. desde el primero.
  1874.  
  1875. {#9999,Programa ejemplo:}
  1876. PROGRAM ejemplo_get_id;
  1877.  
  1878. PRIVATE
  1879.     identificador_proceso;
  1880.     contador;
  1881.  
  1882. BEGIN
  1883.     load_fpg("help\help.fpg");
  1884.     put_screen(0, 1);
  1885.     FROM contador=1 TO 20;
  1886.         proceso_móvil(rand(0, 319), rand(0, 199), 101);
  1887.     END
  1888.     LOOP
  1889.         FROM contador=1 TO 20;
  1890.  
  1891.             // Cogemos los identificadores de los procesos
  1892.             identificador_proceso = get_id(TYPE proceso_móvil);
  1893.  
  1894.             identificador_proceso.angle+=rand(-5000, 5000);
  1895.         END
  1896.         FRAME;
  1897.     END
  1898. END
  1899.  
  1900. PROCESS proceso_móvil(x, y, graph);
  1901. BEGIN
  1902.     LOOP
  1903.         FRAME;
  1904.     END
  1905. END
  1906. {-}
  1907.  
  1908. En el ejemplo, después de cargar el fichero de gráficos y poner la pantalla
  1909. de fondo, se crean 20 procesos tipo {proceso_móvil} con sus posiciones
  1910. elegidas aleatoriamente y un triángulo como su gráfico.
  1911.  
  1912. Estos procesos únicamente ejecutarán sentencias {#1029,FRAME} dentro de
  1913. un bucle, para visualizarse.
  1914.  
  1915. Desde el programa principal se van cogiendo los identificadores de los procesos
  1916. tipo {proceso_móvil} con la función {get_id()} (guardándolos en la variable
  1917. {identificador_proceso}) y utilizándolos para modificarles el ángulo (su
  1918. variable local {#1129,angle}).
  1919.  
  1920. Al disponer del {#1039,código identificador} de un proceso se pueden
  1921. consultar o modificar sus variables locales (como {#1129,angle} en este ejemplo)
  1922. o bien enviar señales al proceso con la función {#158,signal()}.
  1923.  
  1924. {/}
  1925.  
  1926. La función {#104,collision()} sirve para obtener los {#1039,códigos identificadores}
  1927. de procesos de un tipo determinado que, además, colisionen (choquen) con el
  1928. proceso actual.
  1929.  
  1930. {/}Ver: {#1038,Formas de obtener el código identificador} - {#1042,Tipos de procesos} - {#1039,Códigos identificadores}
  1931.  
  1932. # ─────────────────────────────────────────────────────────────────────────────
  1933.  
  1934. {.121,get_joy_button()}
  1935. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  1936.  
  1937. {get_joy_button(}<número de botón>{)}
  1938.  
  1939. {Retorna:}
  1940.  
  1941. {Cierto} (1) si el botón está pulsado, {Falso} (0) si no lo está.
  1942.  
  1943. {Descripción:}
  1944.  
  1945. Esta función requiere como parámetro el número de botón del joystick
  1946. (de 0 a 3), y devuelve {cierto} (un valor numérico impar) si está pulsado en
  1947. ese momento.
  1948.  
  1949. Si el botón no está pulsado, la función devuelve {falso}
  1950. (un valor numérico par).
  1951.  
  1952. Algunos joystick únicamente tienen 2 botones; en este caso serán los botones
  1953. número 0 y 1. En ordenadores con dos joystick conectados, el segundo joystick
  1954. tendrá los botones número 2 y 3.
  1955.  
  1956. {#9999,Programa ejemplo:}
  1957. PROGRAM ejemplo_get_joy_button;
  1958.  
  1959. PRIVATE
  1960.     contador;
  1961.     botones[3];
  1962.  
  1963. BEGIN
  1964.     write(0, 160, 200, 7," Pulse los botones del joystick.");
  1965.     write(0, 0, 0, 0, "Botones (0..3):");
  1966.     write_int(0, 100, 0, 0, offset botones[0]);
  1967.     write_int(0, 120, 0, 0, offset botones[1]);
  1968.     write_int(0, 140, 0, 0, offset botones[2]);
  1969.     write_int(0, 160, 0, 0, offset botones[3]);
  1970.     LOOP
  1971.         FROM contador=0 TO 3;
  1972.  
  1973.             // Cogemos el valor del botón del joystick
  1974.             botones[contador] = get_joy_button(contador);
  1975.  
  1976.         END
  1977.         FRAME;
  1978.     END
  1979. END
  1980. {-}
  1981.  
  1982. Se imprime un mensaje explicativo en la parte inferior y el estado
  1983. de los cuatro posibles botones en la parte superior; después, el programa
  1984. se queda dentro de un bucle actualizando continuamente el estado de los
  1985. cuatro botones con la función {get_joy_button()}.
  1986.  
  1987. {/}
  1988.  
  1989. Hay otras formas de utilizar el joystick. La más sencilla es utilizar
  1990. la estructura {#1103,joy}, ya que en ésta hay cuatro registros que
  1991. indican continuamente el estado de los botones del joystick.
  1992.  
  1993. {/}Ver: {#122,get_joy_position()} - {#1103,Estructura joy}
  1994.  
  1995. # ─────────────────────────────────────────────────────────────────────────────
  1996.  
  1997. {.122,get_joy_position()}
  1998. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  1999.  
  2000. {get_joy_position(}<número de eje>{)}
  2001.  
  2002. {Retorna:}
  2003.  
  2004. La posición del eje del joystick.
  2005.  
  2006. {Descripción:}
  2007.  
  2008. Esta función devuelve la coordenada en la que se encuentra el eje indicado
  2009. (con un número del {0} al {3}) del joystick analógico.
  2010.  
  2011. Eje {0} - Eje {X} principal.·
  2012. Eje {1} - Eje {Y} principal.·
  2013. Eje {2} - Eje {X} secundario.·
  2014. Eje {3} - Eje {Y} secundario.·
  2015.  
  2016. La coordenada del joystick puede variar en función del tipo de joystick y del
  2017. ordenador en el que se ejecute, aún así es un número que suele variar entre
  2018. {4} y {200}, aproximadamente.
  2019.  
  2020. Los ejes {principal} y {secundario} pueden estar integrados en un solo joystick,
  2021. en algunos casos (mandos de vuelo con un {hat}, {pedales}, etc.). En ordenadores
  2022. que tengan dos joystick conectados, el eje principal será el joystick 1 y el
  2023. secundario el 2.
  2024.  
  2025. {#9999,Programa ejemplo:}
  2026. PROGRAM ejemplo_get_joy_position;
  2027.  
  2028. PRIVATE
  2029.     eje_joystick[3];
  2030.     contador;
  2031.  
  2032. BEGIN
  2033.     write (0, 160, 200, 7, "Mueva el joystick");
  2034.     write (0, 0, 0, 0, "Coordenada X principal.");
  2035.     write_int(0, 0, 10, 0, offset eje_joystick[0]);
  2036.     write (0, 0, 40, 0, "Coordenada Y principal.");
  2037.     write_int(0, 0, 50, 0, offset eje_joystick[1]);
  2038.     write (0, 0, 80, 0, "Coordenada X secundaria.");
  2039.     write_int(0, 0, 90, 0, offset eje_joystick[2]);
  2040.     write (0, 0, 120, 0, "Coordenada Y secundaria.");
  2041.     write_int(0, 0, 130, 0, offset eje_joystick[3]);
  2042.     LOOP
  2043.         FROM contador=0 TO 3;
  2044.  
  2045.             // Cogemos el valor de los ejes del joystick
  2046.             eje_joystick[contador] = get_joy_position(contador);
  2047.  
  2048.         END
  2049.         FRAME;
  2050.     END
  2051. END
  2052. {-}
  2053.  
  2054. Primero se imprimen los mensajes y, después, el programa
  2055. se queda dentro de un bucle actualizando de forma continua el estado de los
  2056. cuatro ejes con la función {get_joy_button()} (que, en este caso, se
  2057. guardan en la tabla privada {eje_joystick}).
  2058.  
  2059. {/}
  2060.  
  2061. Hay otras formas de utilizar el joystick. La más sencilla es utilizar
  2062. la estructura {#1103,joy} cuando no se requiera una lectura analógica
  2063. del joystick (sus coordenadas), es decir, cuando baste con saber si el
  2064. joystick está en el centro, a la derecha, abajo, etc.
  2065.  
  2066. {/}Ver: {#121,get_joy_button()} - {#1103,Estructura joy}
  2067.  
  2068. # ─────────────────────────────────────────────────────────────────────────────
  2069.  
  2070. {.123,get_pixel()}
  2071. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  2072.  
  2073. {get_pixel(}<x>{,} <y>{)}
  2074.  
  2075. {Retorna:}
  2076.  
  2077. El color del punto (0..255).
  2078.  
  2079. {Descripción:}
  2080.  
  2081. Devuelve el color que tiene el punto del {fondo de la pantalla}
  2082. que está en las coordenadas indicadas como parámetros.
  2083.  
  2084. El número devuelto es el orden dentro de la paleta de colores activa en el
  2085. programa, entre 0 y 255, ya que las paletas tienen 256 colores.
  2086.  
  2087. El punto se toma únicamente del dibujo de fondo de la pantalla, sin tener en
  2088. cuenta los gráficos de los procesos, textos, regiones de scroll, etc., es
  2089. decir, sólo se leerán los colores puestos por las funciones {#146,put()},
  2090. {#173,xput()}, {#147,put_pixel()} y {#148,put_screen()}.
  2091.  
  2092. {#9999,Programa ejemplo:}
  2093. PROGRAM ejemplo_get_pixel;
  2094.  
  2095. PRIVATE
  2096.     color_punto;
  2097.  
  2098. BEGIN
  2099.     load_fpg("help\help.fpg");
  2100.     put_screen(0, 2);
  2101.     mouse.graph=200;
  2102.     write (0, 0, 190, 0, "Color del punto del fondo de pantalla:");
  2103.     write_int(0, 256, 190, 0, offset color_punto);
  2104.     LOOP
  2105.  
  2106.         // Cogemos el color del punto del fondo de la pantalla
  2107.         color_punto = get_pixel(mouse.x, mouse.y);
  2108.  
  2109.         FRAME;
  2110.     END
  2111. END
  2112. {-}
  2113.  
  2114. En el ejemplo, se pone el fondo de pantalla con la función {#148,put_screen},
  2115. como una serie de cuadrículas de distintos colores y se asigna una cruz como
  2116. puntero del ratón.
  2117.  
  2118. Después se mostrará en la parte inferior de la pantalla el color que está
  2119. en la posición señalada con el ratón, leyendo éste con la función {get_pixel()}
  2120. en cada iteración del bucle principal del programa.
  2121.  
  2122. {/}Ver: {#147,put_pixel()} - {#136,map_get_pixel()} - {#138,map_put_pixel()} - {#124,get_point()}
  2123.  
  2124. # ─────────────────────────────────────────────────────────────────────────────
  2125.  
  2126. {.124,get_point()}
  2127. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  2128.  
  2129. {get_point(}<fichero>{,} <gráfico>{,} <número>{,} <OFFSET x>{,} <OFFSET y>{)}
  2130.  
  2131. {Retorna:}
  2132.  
  2133. La posición del punto de control (en las variables cuyo {#1085,offset} se
  2134. indica como los dos últimos parámetros).
  2135.  
  2136. {Descripción:}
  2137.  
  2138. Esta función devuelve donde se situó en un {gráfico} (del {fichero} indicado)
  2139. el punto de control cuyo {número} se indica como tercer parámetro.
  2140.  
  2141. Un {#1136,punto de control} es un punto que se puede definir en el
  2142. editor de gráficos (herramienta de dibujo), en la opción habilitada para
  2143. dicha función.
  2144.  
  2145. La función necesita la {dirección} (que se obtiene con el operador {#1085,offset})
  2146. en la memoria del ordenador {de dos variables} en las que devolverá la posición
  2147. {x} e {y} del punto de control.
  2148.  
  2149. Los gráficos cargados con la función {#174,load_map()} se utilizarán como
  2150. si pertenecieran al primer fichero (el fichero con el código 0).
  2151.  
  2152. {#9999,Programa ejemplo:}
  2153. PROGRAM ejemplo_get_point;
  2154.  
  2155. GLOBAL
  2156.     fichero1;
  2157.     punto=1;
  2158.     x_punto;
  2159.     y_punto;
  2160.  
  2161. BEGIN
  2162.     fichero1=load_fpg("help\help.fpg");
  2163.     put_screen(0, 4);
  2164.     graph=101;
  2165.     LOOP
  2166.         IF (fget_dist(x, y, x_punto, y_punto)<6)
  2167.             IF (punto++==50) punto=1; END
  2168.         END
  2169.  
  2170.         // Cogemos el punto de control
  2171.         get_point(fichero1, 4,punto, offset x_punto, offset y_punto);
  2172.  
  2173.         angle=fget_angle(x, y, x_punto, y_punto);
  2174.         advance(6);
  2175.         FRAME;
  2176.     END
  2177. END
  2178. {-}
  2179.  
  2180. En el ejemplo se pone como fondo un dibujo con un circuito que
  2181. recorre la pantalla; este dibujo (el gráfico {4} del fichero) tiene definidos
  2182. 50 {#1136,puntos de control} (del 1 al 50) a lo largo del recorrido del circuito.
  2183.  
  2184. El proceso principal aparece como un triángulo que va recorriendo el circuito.
  2185.  
  2186. Esto se consigue teniendo en la variable {punto} el número del punto de control
  2187. al que se debe dirigir el triángulo, en un principio el punto número 1.
  2188.  
  2189. Las coordenadas de cada punto de control, obtenidas con la función {get_point()},
  2190. se guardan en las variables {x_punto} e {y_punto} y sirven para que el proceso
  2191. se dirija hacia esa posición con las funciones {#113,fget_angle()}
  2192. (para obtener en la variable {angle} el ángulo hacia el punto) y
  2193. {#101,advance()} (para avanzar 6 puntos en esa dirección).
  2194.  
  2195. Cuando se está cerca del punto de control, lo que se comprueba con la
  2196. función {#114,fget_dist()}, es si se incrementa el número de punto, para
  2197. dirigir el triángulo hacia el siguiente (cuando se haya alcanzado el punto
  2198. número 50, se volverá al 1).
  2199.  
  2200. {/}
  2201.  
  2202. Esta función devuelve las coordenadas exactas en las que fue colocado
  2203. ese punto de control dentro del gráfico, sin importar cómo esté dicho
  2204. gráfico ahora (escalado, rotado, etc.). Para poder obtener la posición
  2205. de un punto de control en un gráfico escalado, rotado, etc. y relativa
  2206. a las coordenadas de pantalla (y no del gráfico original) se debe
  2207. emplear la función {#125,get_real_point()}.
  2208.  
  2209. Es decir, esta última función devuelve dónde está en un momento determinado
  2210. un punto de control, y {get_point()} devuelve dónde fue emplazado originalmente.
  2211.  
  2212. {/}Ver: {#1136,Puntos de control} - {#125,get_real_point()} - {#123,get_pixel()}
  2213.  
  2214. # ─────────────────────────────────────────────────────────────────────────────
  2215.  
  2216. {.125,get_real_point()}
  2217. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  2218.  
  2219. {get_real_point(}<número>{,} <OFFSET x>{,} <OFFSET y>{)}
  2220.  
  2221. {Retorna:}
  2222.  
  2223. Las coordenadas actuales del punto de control (en las variables cuyo
  2224. {#1085,offset} se indica como los dos últimos parámetros).
  2225.  
  2226. {Descripción:}
  2227.  
  2228. Esta función devuelve donde está en ese instante un punto de control
  2229. del gráfico del proceso actual en el sistema de coordenadas utilizado por
  2230. el propio proceso (ver variable local {#1122,ctype}), evaluando la ubicación
  2231. original del punto, las coordenadas actuales del proceso, su tamaño, ángulo,
  2232. etc.
  2233.  
  2234. Un {#1136,punto de control} es un punto que se puede definir en el
  2235. editor de gráficos (herramienta de dibujo), en la opción habilitada
  2236. para dicha función.
  2237.  
  2238. La función necesita la {dirección} (que se obtiene con el operador {#1085,offset})
  2239. en la memoria del ordenador {de dos variables} en las que devolverá la posición
  2240. {x} e {y} del punto de control.
  2241.  
  2242. Los gráficos cargados con la función {#174,load_map()} se utilizarán como
  2243. si pertenecieran al primer fichero (el fichero con el código 0).
  2244.  
  2245. {#9999,Programa ejemplo:}
  2246. PROGRAM ejemplo_get_real_point;
  2247.  
  2248. PRIVATE
  2249.     punto;
  2250.     x_punto;
  2251.     y_punto;
  2252.  
  2253. BEGIN
  2254.     load_fpg("help\help.fpg");
  2255.     graph=4;
  2256.     x=160;
  2257.     y=100;
  2258.     LOOP
  2259.         FROM punto=1 TO 50;
  2260.  
  2261.             // Cogemos las coordenadas de donde está ahora el punto de control
  2262.             get_real_point(punto, offset x_punto, offset y_punto);
  2263.  
  2264.             proceso_marcador(x_punto, y_punto, 200);
  2265.         END
  2266.         angle+=1000;
  2267.         FRAME;
  2268.     END
  2269. END
  2270.  
  2271. PROCESS proceso_marcador(x, y, graph);
  2272. BEGIN
  2273.     FRAME;
  2274. END
  2275. {-}
  2276.  
  2277. En el ejemplo se define cómo gráfico del proceso principal un circuito que
  2278. recorre la pantalla. Este gráfico tiene definidos 50 {#1136,puntos de control}
  2279. (del 1 al 50).
  2280.  
  2281. El programa se queda en un bucle dentro del cual va rotando este gráfico
  2282. (sumándole un grado con la sentencia {angle+=1000;}) y creando 50 procesos
  2283. en forma de cruz, una en cada uno de los puntos de control del gráfico.
  2284.  
  2285. Se puede comprobar cómo la posición relativa de los puntos de control no
  2286. varía aunque el gráfico del circuito rote.
  2287.  
  2288. {/}
  2289.  
  2290. Esta función se suele utilizar para tener localizados algunos puntos
  2291. importantes de un gráfico. Por ejemplo, si se ha definido un proceso cuyo
  2292. gráfico es un hombre con una pistola que pueda escalarse, rotarse o realizar
  2293. diversas animaciones, podría definirse un punto de control en la punta
  2294. del cañón de la pistola para saber en cada momento de dónde deben salir
  2295. las balas en caso de que dispare.
  2296.  
  2297. Si el gráfico original estaba dentro de una región de scroll (ver
  2298. {#163,start_scroll()}) las coordenadas devueltas también serán relativas
  2299. a dicha región de scroll.
  2300.  
  2301. {/}
  2302.  
  2303. La función {#124,get_point()} devuelve dónde fue emplazado originalmente
  2304. un punto de control en el gráfico, en lugar de su posición actual,
  2305. como {get_real_point()}.
  2306.  
  2307. {/}Ver: {#1136,Puntos de control} - {#124,get_point()} - {#123,get_pixel()}
  2308.  
  2309. # ─────────────────────────────────────────────────────────────────────────────
  2310.  
  2311. {.126,graphic_info()}
  2312. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  2313.  
  2314. {graphic_info(}<fichero>{,} <gráfico>{,} <información>{)}
  2315.  
  2316. {Retorna:}
  2317.  
  2318. La información solicitada sobre el gráfico.
  2319.  
  2320. {Descripción:}
  2321.  
  2322. Devuelve la información que se le solicita de un {gráfico} de un {fichero}.
  2323.  
  2324. Información:
  2325.  
  2326. {g_wide} - La función devolverá el {ancho original} de dicho gráfico si se pone
  2327. g_wide como tercer parámetro.
  2328.  
  2329. {g_height} - La función devolverá el {alto original} del gráfico.
  2330.  
  2331. {g_x_center} - La función devolverá la {coordenada x} del centro del gráfico.
  2332.  
  2333. {g_y_center} - La función devolverá la {coordenada y} del centro del gráfico.
  2334.  
  2335. Los gráficos cargados con la función {#174,load_map()} se utilizarán como
  2336. si pertenecieran al primer fichero (el fichero con el código 0).
  2337.  
  2338. {#9999,Programa ejemplo:}
  2339. PROGRAM ejemplo_graphic_info;
  2340.  
  2341. PRIVATE
  2342.     fichero1;
  2343.     alto;
  2344.     ancho;
  2345.     x_centro;
  2346.     y_centro;
  2347.  
  2348. BEGIN
  2349.     fichero1=load_fpg("help\help.fpg");
  2350.     put_screen(fichero1, 1);
  2351.     graph=100;
  2352.     x=160;
  2353.     y=100;
  2354.  
  2355.     // Cogemos la información sobre el alto del gráfico
  2356.     alto = graphic_info(fichero1, 100, g_height);
  2357.  
  2358.     // Cogemos la información sobre el ancho del gráfico
  2359.     ancho = graphic_info(fichero1, 100, g_wide);
  2360.  
  2361.     // Cogemos la información sobre la coordenada x del centro del gráfico
  2362.     x_centro = graphic_info(fichero1, 100, g_x_center);
  2363.  
  2364.     // Cogemos la información sobre la coordenada y del centro del gráfico
  2365.     y_centro = graphic_info(fichero1, 100, g_y_center);
  2366.  
  2367.     write(0, 0, 0, 0, "Altura del gráfico:");
  2368.     write_int(0, 0, 10, 0, offset alto);
  2369.     write(0, 0, 20, 0, "Ancho del gráfico:");
  2370.     write_int(0, 0, 30, 0, offset ancho);
  2371.     write(0, 0, 40, 0, "Centro horizontal del gráfico:");
  2372.     write_int(0, 0, 50, 0, offset x_centro);
  2373.     write(0, 0, 60, 0, "Centro vertical del gráfico:");
  2374.     write_int(0, 0, 70, 0, offset y_centro);
  2375.     LOOP
  2376.         FRAME;
  2377.     END
  2378. END
  2379. {-}
  2380.  
  2381. En el ejemplo se solicita información sobre el gráfico número 100 del
  2382. fichero {help.fpg}, que es una bola de 32 puntos por 32 puntos y con el
  2383. centro en (16, 16).
  2384.  
  2385. Para obtener esta información será necesario llamar 4 veces a la función
  2386. {graphic_info()}, ya que cada vez devuelve un solo valor, en función
  2387. del tercer parámetro de llamada (<información>).
  2388.  
  2389. {/}Ver: {#1163,g_wide} - {#1164,g_height} - {#1165,g_x_center} - {#1166,g_y_center}
  2390.  
  2391. # ─────────────────────────────────────────────────────────────────────────────
  2392.  
  2393. {.127,is_playing_cd()}
  2394. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  2395.  
  2396. {is_playing_cd()}
  2397.  
  2398. {Retorna:}
  2399.  
  2400. {Cierto} (1) si está sonando el CD, o {falso} (0) si no está sonando.
  2401.  
  2402. {Descripción:}
  2403.  
  2404. Esta función sirve para poder determinar si el CD está tocando una canción.
  2405.  
  2406. Devuelve {Cierto} (un número impar) si el CD está tocando una canción, en
  2407. caso contrario devuelve {Falso} (un número par).
  2408.  
  2409. Su uso más generalizado es para poder tocar una canción indefinidamente
  2410. como se muestra en el siguiente ejemplo.
  2411.  
  2412. {#9999,Programa ejemplo:}
  2413. PROGRAM ejemplo_is_playing_cd;
  2414. BEGIN
  2415.     play_cd(1, 0);
  2416.     LOOP
  2417.  
  2418.         IF (NOT is_playing_cd()) // Comprueba si ya ha finalizado la canción
  2419.  
  2420.             play_cd(1, 0);
  2421.         END
  2422.         FRAME;
  2423.     END
  2424. END
  2425. {-}
  2426.  
  2427. El ejemplo anterior (para el cual se necesita tener un {Compact disc} de
  2428. música en el cargador de {CD-ROM}) utiliza la función {#144,play_cd()} para
  2429. hacer sonar la primera canción del disco.
  2430.  
  2431. Después, en un bucle, se comprueba si dicha canción ha terminado de sonar para
  2432. volver a lanzarla.
  2433.  
  2434. {/}
  2435.  
  2436. El volumen de reproducción de cd-audio se puede controlar con la
  2437. estructura {#1104,setup} y la función {#178,set_volume()}.
  2438.  
  2439. {/}Ver: {#144,play_cd()} - {#164,stop_cd()} - {#178,set_volume()} - {#1104,Estructura setup}
  2440.  
  2441. # ─────────────────────────────────────────────────────────────────────────────
  2442.  
  2443. {.128,key()}
  2444. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  2445.  
  2446. {key(}<código de tecla>{)}
  2447.  
  2448. {Retorna:}
  2449.  
  2450. {Cierto} (1) si la tecla está pulsada y {falso} (0) si no lo está.
  2451.  
  2452. {Descripción:}
  2453.  
  2454. Devuelve {cierto} (un número impar) si la tecla, indicada como parámetro,
  2455. está pulsada en ese momento; en caso contrario devuelve {falso} (un número
  2456. par).
  2457.  
  2458. Normalmente el parámetro de entrada será el nombre de la tecla con el
  2459. símbolo {_} (subrayado) delante; por ejemplo, para leer la tecla [{A}] se
  2460. debe llamar a la función como {key(_a)}.
  2461.  
  2462. Acceda a los {#1176,códigos de las teclas} para ver la lista completa de
  2463. códigos de teclado que pueden utilizarse como parámetro de la función {key()}.
  2464.  
  2465. {#9999,Programa ejemplo:}
  2466. PROGRAM ejemplo_key;
  2467. BEGIN
  2468.     LOOP
  2469.         delete_text(all_text);
  2470.  
  2471.         IF (key(_space)) // Comprobamos si está pulsada la barra espaciadora
  2472.  
  2473.             write(0, 0, 0, 0, "Está pulsando la tecla [ESPACIO].");
  2474.         ELSE
  2475.             write(0, 0, 0, 0, "No está pulsando la tecla [ESPACIO].");
  2476.         END
  2477.         FRAME;
  2478.     END
  2479. END
  2480. {-}
  2481.  
  2482. En el ejemplo se imprime un mensaje u otro dependiendo de que la barra
  2483. espaciadora esté o no pulsada.
  2484.  
  2485. {/}
  2486.  
  2487. Hay tres variables globales predefinidas que también pueden utilizarse
  2488. para el control del teclado; éstas son:
  2489.  
  2490. {#1110,scan_code} - Código de la última tecla que se ha pulsado; éste
  2491. es un valor numérico que se corresponde directamente con las constantes
  2492. de {#1176,códigos de teclas} utilizadas como parámetros de la función {key()}.
  2493.  
  2494. {#1109,ascii} - Código ASCII de la última tecla pulsada.
  2495.  
  2496. {#1108,shift_status} - variable que indica un número en función de las
  2497. teclas especiales o de bloqueo (shift, alt, control, ...) que estén pulsadas
  2498. en dicho momento.
  2499.  
  2500. {/}Ver: {#1176,Códigos de teclas} - {#1110,scan_code} - {#1109,ascii} - {#1108,shift_status}
  2501.  
  2502. # ─────────────────────────────────────────────────────────────────────────────
  2503.  
  2504. {.129,let_me_alone()}
  2505. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  2506.  
  2507. {let_me_alone()}
  2508.  
  2509. {Descripción:}
  2510.  
  2511. Envía una señal {#1153,s_kill} a todos los procesos, excepto el que ejecutó
  2512. esta función, lo que eliminará a todos los procesos menos el actual.
  2513.  
  2514. Esta función se utiliza, generalmente, desde el proceso principal, cuando
  2515. ha finalizado una partida, para eliminar todos los procesos (disparos,
  2516. enemigos, etc.) que quedarán activos, y recuperar el control del programa.
  2517.  
  2518. Una llamada a {let_me_alone()} se podría sustituir siempre por una serie
  2519. de llamadas a la función {#158,signal()} con la señal {#1153,s_kill}, pero para
  2520. ello se deberían conocer los tipos de los procesos que se quieren
  2521. eliminar, o bien, sus {#1039,códigos identificadores}.
  2522.  
  2523. {#9999,Programa ejemplo:}
  2524. PROGRAM ejemplo_let_me_alone;
  2525. BEGIN
  2526.     load_fpg("help\help.fpg");
  2527.     proceso_nulo(160, 100, 100);
  2528.     write (0, 160, 0, 1, "Pulse [ESPACIO] para eliminar el proceso");
  2529.     WHILE (NOT key (_space))
  2530.         FRAME;
  2531.     END
  2532.  
  2533.     let_me_alone(); // Se elimina el resto de los procesos
  2534.  
  2535.     LOOP
  2536.         FRAME;
  2537.     END
  2538. END
  2539.  
  2540. PROCESS proceso_nulo(x, y, graph)
  2541. BEGIN
  2542.     LOOP
  2543.         FRAME;
  2544.     END
  2545. END
  2546. {-}
  2547.  
  2548. En el ejemplo, después de crear un proceso de tipo {proceso_nulo}, se espera
  2549. a la pulsación de la barra espaciadora para utilizar la función {let_me_alone()}
  2550. la cual elimina todos los procesos que hubiera (menos el principal, que es el que
  2551. llamó a la función); en este caso se eliminará el proceso de tipo {proceso_nulo}.
  2552.  
  2553. {/}
  2554.  
  2555. Para poder comprobar los procesos que hay activos en un programa en un
  2556. determinado momento se debe acceder al trazador (o debugger) pulsando
  2557. la tecla [{F12}].
  2558.  
  2559. {/}
  2560.  
  2561. La función {#109,exit()} sirve para terminar un programa de forma inmediata,
  2562. retornando al sistema.
  2563.  
  2564. {/}Ver: {#109,exit()} - {#158,signal()}
  2565.  
  2566. # ─────────────────────────────────────────────────────────────────────────────
  2567.  
  2568. {.130,load()}
  2569. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  2570.  
  2571. {load(}<nombre de archivo>{,} <OFFSET dato>{)}
  2572.  
  2573. {Descripción:}
  2574.  
  2575. Carga un bloque de datos de un archivo en el disco a la memoria del programa.
  2576.  
  2577. Para ello la función requiere el {nombre del archivo} y el desplazamiento
  2578. dentro de la memoria del ordenador de la variable, tabla o estructura
  2579. guardada en el disco (el desplazamiento del dato se puede obtener con
  2580. operador {#1085,OFFSET}).
  2581.  
  2582. Se debe especificar el desplazamiento del mismo dato que se especificó al
  2583. guardar el archivo con la función {#155,save()}.
  2584.  
  2585. Los nombres de archivo se pueden dar especificando una ruta de acceso, {que
  2586. debe ser la misma que la utilizada con la función} {#155,save()} para guardar
  2587. el archivo. No obstante {no es necesario} especificar una ruta.
  2588.  
  2589. Es importante que el archivo que se pretende cargar se haya creado
  2590. anteriormente, pues se producirá un error si se intenta cargar un archivo
  2591. que no existe (si bien éste puede ser ignorado y continuar la ejecución del
  2592. programa).
  2593.  
  2594. {#9999,Programa ejemplo:}
  2595. PROGRAM ejemplo_load;
  2596.  
  2597. PRIVATE
  2598.     tabla[9];
  2599.     contador;
  2600.  
  2601. BEGIN
  2602.     write (0, 0, 0, 0, "Pulse [ENTER] para borrar los datos.");
  2603.     write (0, 0, 10, 0, "Pulse [ESPACIO] para cargar los datos del disco");
  2604.     write (0, 0, 30, 0, "Valores actuales de los datos:");
  2605.     FROM contador=0 TO 9;
  2606.         tabla[contador]=rand(0, 100);
  2607.         write_int(0, 0, 40+(contador*10), 0, offset tabla[contador]);
  2608.     END
  2609.     save("help\help.dat", offset tabla, sizeof(tabla));
  2610.     LOOP
  2611.         IF (key(_enter))
  2612.             FROM contador=0 TO 9;
  2613.                 tabla[contador]=0;
  2614.             END
  2615.         END
  2616.         IF (key(_space))
  2617.  
  2618.             load("help\help.dat", offset tabla); // Se cargan los datos del disco
  2619.  
  2620.         END
  2621.         FRAME;
  2622.     END
  2623. END
  2624. {-}
  2625.  
  2626. Al inicio del ejemplo se crea una tabla de 10 posiciones (del 0 al 9)
  2627. con valores aleatorios. Esta tabla se graba en el disco con la función
  2628. {#155,save()}.
  2629.  
  2630. Cuando se pulsa la tecla ENTER se borran los valores de la tabla (se ponen
  2631. a 0 las 10 posiciones).
  2632.  
  2633. Cuando se pulsa la barra espaciadora se cargan los valores de la tabla
  2634. del disco con la función {load()}.
  2635.  
  2636. {/}Ver: {#155,save()} - {#1094,sizeof()}
  2637.  
  2638. # ─────────────────────────────────────────────────────────────────────────────
  2639.  
  2640. {.131,load_fnt()}
  2641. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  2642.  
  2643. {load_fnt(}<nombre de archivo>{)}
  2644.  
  2645. {Retorna:}
  2646.  
  2647. El {código de la fuente} cargada.
  2648.  
  2649. {Descripción:}
  2650.  
  2651. Carga un archivo con una nueva fuente de caracteres (*.FNT) del disco
  2652. (un "font" con un nuevo juego de caracteres gráficos).
  2653.  
  2654. La función devuelve el {código de fuente} que puede ser utilizado por
  2655. las funciones {#171,write()} y {#172,write_int()} para escribir un texto.
  2656.  
  2657. Se puede especificar la ruta de acceso al archivo con la fuente, no obstante,
  2658. si el archivo con la fuente de letra se ha generado en el directorio por
  2659. defecto (\FNT) no será necesario.
  2660.  
  2661. El archivo con la nueva fuente se tiene que haber creado con la paleta de
  2662. color del juego para que se visualice correctamente; en caso contrario
  2663. aparecerán los colores cambiados.
  2664.  
  2665. {#9999,Programa ejemplo:}
  2666. PROGRAM ejemplo_load_fnt;
  2667.  
  2668. PRIVATE
  2669.     fuente1;
  2670.  
  2671. BEGIN
  2672.  
  2673.     fuente1=load_fnt("help\help.fnt"); // Se carga la fuente para el texto
  2674.  
  2675.     write(0, 160, 0, 1, "Texto escrito con la fuente del sistema.");
  2676.     write(fuente1, 160, 10, 1, "FUENTE DEL ARCHIVO EN DISCO");
  2677.     LOOP
  2678.         FRAME;
  2679.     END
  2680. END
  2681. {-}
  2682.  
  2683. En el ejemplo se carga una fuente con la función {load_fnt()}, y después se
  2684. escriben dos textos con fuentes diferentes. El primero con la fuente del
  2685. sistema y el segundo, con la fuente cargada del archivo {help.fnt}.
  2686.  
  2687. {/}
  2688.  
  2689. Para descargar de la memoria del ordenador la fuente cargada (liberando
  2690. el espacio ocupado en memoria por ésta) se debe utilizar la función
  2691. {#177,unload_fnt()}, pasando como parámetro el {código de fuente}.
  2692.  
  2693. {No es necesario} descargar la fuente con esta última función a no ser
  2694. que se necesite el espacio ocupado para cargar más gráficos o fuentes, ya
  2695. que el sistema liberará la fuente automáticamente al finalizar el programa.
  2696.  
  2697. {/}Ver: {#177,unload_fnt()} - {#171,write()} - {#171,write_int()} - {#133,load_pal()}
  2698.  
  2699. # ─────────────────────────────────────────────────────────────────────────────
  2700.  
  2701. {.132,load_fpg()}
  2702. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  2703.  
  2704. {load_fpg(}<nombre de archivo>{)}
  2705.  
  2706. {Retorna:}
  2707.  
  2708. Retorna el {código del fichero} cargado.
  2709.  
  2710. {Descripción:}
  2711.  
  2712. Carga un archivo con un fichero (*.FPG) del disco. Se entiende por un
  2713. fichero, una librería (o colección) de gráficos.
  2714.  
  2715. Un archivo FPG con una librería de gráficos puede contener desde ningún
  2716. gráfico hasta 999 gráficos. Cada uno ellos incluidos en la librería
  2717. tendrá un código numérico, el {código de gráfico}, que es un número entre
  2718. {1} y {999} que se utiliza para identificar el gráfico dentro del fichero.
  2719.  
  2720. Es posible cargar tantos ficheros de gráficos como sea necesario, siempre que
  2721. quede memoria disponible (para cargar varios ficheros se debe llamar varias
  2722. veces a esta función).
  2723.  
  2724. La función devuelve el {código de fichero}, que puede ser utilizado por
  2725. múltiples funciones que requieren un gráfico, para lo cual se les debe
  2726. indicar el {código de fichero} en el que está el gráfico y el {código de
  2727. gráfico} dentro del fichero.
  2728.  
  2729. Se puede especificar la ruta de acceso al archivo con el fichero de gráficos,
  2730. no obstante, si el fichero está en el directorio por defecto (\FPG) no será
  2731. necesario.
  2732.  
  2733. {/}
  2734.  
  2735. Cuando se han cargado diferentes ficheros se debe tener en cuenta que si
  2736. estos tienen paletas diferentes, se debe activar cada una de ellas previamente
  2737. con la función {#133,load_pal()}, indicando el nombre del fichero (FPG) como
  2738. parámetro, antes de utilizar los gráficos del mismo.
  2739.  
  2740. {#9999,Programa ejemplo:}
  2741. PROGRAM ejemplo_load_fpg;
  2742.  
  2743. PRIVATE
  2744.     fichero1;
  2745.  
  2746. BEGIN
  2747.  
  2748.     fichero1 = load_fpg("help\help.fpg"); // Se  carga el fichero de gráficos
  2749.  
  2750.     put_screen(fichero1, 1); // Utilizamos el gráfico 1 del fichero
  2751.     write(0, 160, 0, 1, "Fichero de gráficos cargado con éxito");
  2752.     LOOP
  2753.         FRAME;
  2754.     END
  2755. END
  2756. {-}
  2757.  
  2758. En el ejemplo, se carga el fichero de gráficos que se va usar en el programa
  2759. con la función {load_fpg()} y, después, se utiliza el gráfico número 1 del
  2760. mismo para ponerlo como fondo en la pantalla (con la función {#148,put_screen()}).
  2761.  
  2762. {/}
  2763.  
  2764. La función {#169,unload_fpg()} permite liberar la memoria del ordenador utilizada
  2765. por el fichero de gráficos cuando ya no se va a utilizar más, y para ello
  2766. requiere también el {codigo de fichero} para saber qué fichero es el que se
  2767. quiere descargar de memoria.
  2768.  
  2769. {No es necesario descargar el fichero de memoria} antes de finalizar el
  2770. programa, ya que el sistema lo hará de forma automática.
  2771.  
  2772. {/}Ver: {#169,unload_fpg()} - {#174,load_map()} - {#133,load_pal()} - {#1131,file}
  2773.  
  2774. # ─────────────────────────────────────────────────────────────────────────────
  2775.  
  2776. {.133,load_pal()}
  2777. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  2778.  
  2779. {load_pal(}<nombre de archivo>{)}
  2780.  
  2781. {Descripción:}
  2782.  
  2783. Carga una paleta de color de disco (de un archivo PAL, FPG, MAP o FNT) con
  2784. la definición de los {256 colores} que se visualizan en pantalla.
  2785.  
  2786. A partir de ese momento el juego se verá con la correspondencia de colores
  2787. que indica dicha paleta.
  2788.  
  2789. Si en el momento de cargar la paleta el programa tenía asignada ya otra
  2790. diferente, entonces se realizará un fundido de los colores de la pantalla
  2791. a negro para después ir introduciendo, en los siguientes fotogramas del
  2792. juego, la nueva paleta de color de forma gradual.
  2793.  
  2794. Se puede especificar la ruta de acceso al archivo con la paleta;
  2795. no obstante, si el fichero está en el directorio por defecto (que dependiendo del
  2796. tipo de archivo éste será: \PAL, \FPG, \MAP o \FNT) no será necesario.
  2797.  
  2798. El programa leerá la paleta automáticamente del primero de estos tipos
  2799. de archivos que se carguen en el programa, aunque no se utilice la función
  2800. {load_pal()}. Luego, esta función se utiliza cuando el programa usa
  2801. varias paletas diferentes para cambiar de una a otra.
  2802.  
  2803. {#9999,Programa ejemplo:}
  2804. PROGRAM ejemplo_load_pal;
  2805. BEGIN
  2806.     load_fpg("help\help.fpg");
  2807.     put_screen(0, 1);
  2808.     write(0, 160, 0, 1, "Pulse [ESPACIO] para cargar una paleta diferente.");
  2809.     write(0, 160, 10, 1, "Pulse [ENTER] para cargar la paleta original.");
  2810.     LOOP
  2811.         IF (key(_space))
  2812.  
  2813.             load_pal("help\help.pal"); // Se carga una paleta de un fichero .pal
  2814.  
  2815.         END
  2816.         IF (key(_enter))
  2817.  
  2818.             load_pal("help\help.fpg");  // Se carga una paleta de un fichero .fpg
  2819.  
  2820.         END
  2821.         FRAME;
  2822.     END
  2823. END
  2824. {-}
  2825.  
  2826. En el ejemplo, al inicio se carga un fichero de gráficos, se pone un fondo
  2827. de pantalla y se imprimen los mensajes necesarios.
  2828.  
  2829. En el bucle principal del programa se carga una paleta diferente (de {help.pal})
  2830. cuando se pulsa la barra espaciadora y la paleta original (de {help.fpg})
  2831. al pulsar la tecla ENTER.
  2832.  
  2833. {/}
  2834.  
  2835. Una paleta no se puede descargar de la memoria del ordenador, ya que ésta
  2836. no ocupa espacio en la memoria.
  2837.  
  2838. {/}Ver: {#174,load_map()} - {#132,load_fpg()} - {#131,load_fnt()}
  2839.  
  2840. # ─────────────────────────────────────────────────────────────────────────────
  2841.  
  2842. {.134,load_pcm()}
  2843. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  2844.  
  2845. {load_pcm(}<nombre de archivo>{,} <cíclico>{)}
  2846.  
  2847. {Retorna:}
  2848.  
  2849. El {código del sonido} cargado.
  2850.  
  2851. {Descripción:}
  2852.  
  2853. Carga un efecto de sonido de un archivo PCM del disco. Se debe indicar el
  2854. nombre del archivo con el efecto de sonido como primer parámetro y en
  2855. <cíclico>, como segundo parámetro, {1} si es un sonido que se debe tocar
  2856. repitiéndose indefinidamente, o {0} si debe sonar sólo una vez (cuando se
  2857. solicite con la función {#159,sound()}).
  2858.  
  2859. La función devuelve el {código del sonido} que debe ser utilizado por
  2860. la función {#159,sound()} para hacer que suene por un canal dicho sonido.
  2861.  
  2862. Se puede especificar la ruta de acceso al archivo con el sonido, no obstante,
  2863. si el sonido está en el directorio por defecto (\PCM) no será necesario.
  2864.  
  2865. {#9999,Programa ejemplo:}
  2866. PROGRAM ejemplo_load_pcm;
  2867.  
  2868. PRIVATE
  2869.     id_sonido;
  2870.  
  2871. BEGIN
  2872.  
  2873.     id_sonido = load_pcm("help\help.pcm", 0); // Carga un sonido del disco duro
  2874.  
  2875.     write(0, 160, 0, 1, "Presione [ESPACIO] para ejecutar el sonido.");
  2876.     LOOP
  2877.         IF (scan_code==_space)
  2878.             sound(id_sonido, 100, 256);
  2879.         END
  2880.         FRAME;
  2881.     END
  2882. END
  2883. {-}
  2884.  
  2885. En el ejemplo primeramente se carga un sonido con la función {load_pcm()}.
  2886. Luego, en el bucle principal, cada vez que se pulsa la barra espaciadora se
  2887. ejecuta dicho sonido con la función {#159,sound()}.
  2888.  
  2889. {/}
  2890.  
  2891. La función {#170,unload_pcm()} permite liberar la memoria del ordenador utilizada
  2892. por el sonido cuando ya no se va a utilizar más y, para ello,
  2893. requiere también el {codigo del sonido} para saber qué sonido es el que se
  2894. quiere descargar de memoria.
  2895.  
  2896. {No es necesario descargar el sonido de memoria} antes de finalizar el
  2897. programa, ya que el sistema lo hará de forma automática.
  2898.  
  2899. {/}Ver: {#170,unload_pcm()} - {#159,sound()} - {#102,change_sound()} - {#1104,Estructura setup}
  2900.  
  2901. # ─────────────────────────────────────────────────────────────────────────────
  2902.  
  2903. {.135,map_block_copy()}
  2904. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  2905.  
  2906. {map_block_copy(}<fichero>{,} <gráfico destino>{,} <x destino>{,} <y destino>{,}
  2907.                  <gráfico origen>{,} <x>{,} <y>{,} <ancho>{,} <alto>{)}
  2908.  
  2909. {Descripción:}
  2910.  
  2911. La función {map_block_copy()} permite transferir un bloque rectangular
  2912. de un gráfico a otro.
  2913.  
  2914. El gráfico del cual se toma la región rectangular se
  2915. denomina <gráfico origen> y el {gráfico destino} es en el que se copiará
  2916. dicho bloque, es decir, esta función permite copiar un trozo de un gráfico
  2917. (origen) a otro (destino). Los parámetros son, por orden, los siguientes:
  2918.  
  2919. {<fichero>} - Ambos gráficos deben provenir del mismo fichero de gráficos.
  2920. Como primer parámetro se debe especificar el {código del fichero} (ver
  2921. {#132,load_fpg()}). Los gráficos cargados con la función {#174,load_map()}
  2922. se utilizarán como si pertenecieran al primer fichero (el fichero con el
  2923. código 0).
  2924.  
  2925. {<gráfico destino>} - {código del gráfico} en el que se va a poner el bloque.
  2926.  
  2927. {<x destino>, <y destino>} - coordenadas ({x}, {y}) en las que se quiere poner
  2928. el bloque dentro del gráfico destino.
  2929.  
  2930. {<gráfico origen>} - {código del gráfico} del que se va a tomar el bloque.
  2931.  
  2932. {<x>, <y>} - coordenadas de {inicio} del bloque dentro del gráfico origen.
  2933.  
  2934. {<ancho>, <alto>} - {dimensiones} del bloque que se va a transferir.
  2935.  
  2936. Esta función modificará el gráfico indicado, pero sólo la copia del mismo
  2937. que se ha cargado en la memoria del ordenador. El gráfico original, que
  2938. está en el archivo {FPG} o {MAP} del disco, {permanecerá inalterado}.
  2939. Por ello si se quiere en un momento del juego recuperar el estado original
  2940. del gráfico se tiene que descargar de memoria (con {#169,unload_fpg()} o
  2941. {#176,unload_map()}) y después volverlo a cargar.
  2942.  
  2943. {#9999,Programa ejemplo:}
  2944. PROGRAM ejemplo_map_block_copy;
  2945.  
  2946. PRIVATE
  2947.     x_destino, y_destino;
  2948.     x_origen, y_origen;
  2949.     ancho, alto;
  2950.     fichero1;
  2951.  
  2952. BEGIN
  2953.     fichero1=load_fpg("help\help.fpg");
  2954.     graph=1;
  2955.     x=160;
  2956.     y=100;
  2957.     LOOP
  2958.         x_destino=rand(0, 320);
  2959.         y_destino=rand(0, 200);
  2960.         ancho=rand(1, 32);
  2961.         alto=rand(1, 32);
  2962.         x_origen=rand(0, 32-ancho);
  2963.         y_origen=rand(0, 32-alto);
  2964.  
  2965.         map_block_copy(fichero1, 1, x_destino, y_destino, 100, x_origen, y_origen, ancho, alto);
  2966.  
  2967.         FRAME;
  2968.         angle+=1000;
  2969.     END
  2970. END
  2971. {-}
  2972.  
  2973. En el ejemplo, después de cargar el fichero de gráficos y poner uno (
  2974. el gráfico número 1) el centro de pantalla va rotando contínuamente.
  2975. En el bucle principal, se va copiando el gráfico de una bola (el gráfico
  2976. número 100) dentro del gráfico destino (el número 1) en unas coordenadas
  2977. elegidas aleatoriamente.
  2978.  
  2979. {/}
  2980.  
  2981. Cuando se ponga un gráfico en otro que se esté utilizando como fondo
  2982. para una región de scroll, éste no aparecerá automáticamente en pantalla
  2983. a no ser que se utilice la función {#152,refresh_scroll()}.
  2984.  
  2985. {/}Ver: {#139,map_xput()} - {#137,map_put()} - {#138,map_put_pixel()}
  2986.  
  2987. # ─────────────────────────────────────────────────────────────────────────────
  2988.  
  2989. {.136,map_get_pixel()}
  2990. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  2991.  
  2992. {map_get_pixel(}<fichero>{,} <gráfico>{,} <x>{,} <y>{)}
  2993.  
  2994. {Retorna:}
  2995.  
  2996. El color del punto (0..255).
  2997.  
  2998. {Descripción:}
  2999.  
  3000. Permite obtener, como valor de retorno de la función, el color de un punto
  3001. determinado de un gráfico. Para ello requiere el <código del fichero> en el
  3002. que se encuentra el gráfico, el <código del gráfico> dentro del fichero y
  3003. las coordenadas ({x}, {y}) del punto del gráfico cuyo color se quiere obtener.
  3004.  
  3005. Los gráficos cargados con la función {#174,load_map()} se utilizarán como
  3006. si pertenecieran al primer fichero (el fichero con el código 0).
  3007.  
  3008. {#9999,Programa ejemplo:}
  3009. PROGRAM ejemplo_map_get_pixel;
  3010.  
  3011. PRIVATE
  3012.     fichero1;
  3013.     figura;
  3014.  
  3015. BEGIN
  3016.     fichero1=load_fpg("help\help.fpg");
  3017.     put_screen(0, 7);
  3018.     mouse.graph=200;
  3019.     write(0, 0, 0, 0, "FIGURA:");
  3020.     write_int(0, 42, 0, 0, offset figura);
  3021.     LOOP
  3022.  
  3023.         // Cogemos el color del punto del mapa del bits
  3024.         figura = map_get_pixel(fichero1, 8, mouse.x, mouse.y);
  3025.  
  3026.         FRAME;
  3027.     END
  3028. END
  3029. {-}
  3030.  
  3031. En el ejemplo se pone como fondo de pantalla una imagen con 6 figuras
  3032. geométricas diferentes, todas ellas del mismo color, y el gráfico del
  3033. ratón se define como una pequeña cruz.
  3034.  
  3035. La imagen de fondo se corresponde directamente con otro gráfico, el
  3036. número 8 del fichero, el cual tiene las mismas figuras aunque cada una
  3037. de un color diferente (la primera de color 1, la segunda de color 2, etc.).
  3038.  
  3039. En el bucle principal se tomará un color de este segundo gráfico con la
  3040. función {map_get_pixel()}, de las coordenadas que indique el cursor del
  3041. ratón.
  3042.  
  3043. En la esquina superior izquierda de la pantalla el valor obtenido con
  3044. la función, que es un número del 1 al 6 que indica el número de figura.
  3045.  
  3046. {/}
  3047.  
  3048. Esta función se suele utilizar para la detección de zonas dentro de gráficos.
  3049. Esta técnica se denomina {mapas de durezas} y consiste en utilizar dos
  3050. gráficos diferentes, uno con el dibujo en sí y otro con las zonas a detectar
  3051. pintadas de diferentes colores.
  3052.  
  3053. Por ejemplo, en un juego de naves se podrían pintar en este {mapa de durezas}
  3054. las zonas que le quitan energía a la nave cuando pasa por ellas con un color
  3055. (por ejemplo, el color 32); después se obtendría el color del {mapa de durezas}
  3056. sobre el que está la nave, y si es 32, se le restaría energía.
  3057.  
  3058. Es decir, habría dos dibujos diferentes: uno en colores, que es el dibujo
  3059. de fondo por el que se mueve la nave en el juego (el visible), y otro,
  3060. el {mapa de durezas} que se utilizaría únicamente para obtener colores
  3061. de él con la función {map_get_pixel()} y, de esta forma, identificar la
  3062. zona del dibujo original sobre el que está la nave.
  3063.  
  3064. {/}Ver: {#123,get_pixel()} - {#138,map_put_pixel()}
  3065.  
  3066. # ─────────────────────────────────────────────────────────────────────────────
  3067.  
  3068. {.137,map_put()}
  3069. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  3070.  
  3071. {map_put(}<fichero>{,} <gráfico destino>{,} <gráfico origen>{,} <x>{,} <y>{)}
  3072.  
  3073. {Descripción:}
  3074.  
  3075. Pone un gráfico en otro. El gráfico que se va a copiar se denomina
  3076. <gráfico origen> y el {gráfico destino} es en el que se copiará el origen,
  3077. es decir, esta función permite copiar un gráfico (origen) a otro (destino).
  3078.  
  3079. Ambos gráficos deben estar en el mismo fichero. Los parámetros son, por
  3080. orden, los siguientes:
  3081.  
  3082. {<fichero>} - {código del fichero} con la librería de gráficos que contiene
  3083. a ambos. Los gráficos cargados con la función {#174,load_map()} se utilizarán como
  3084. si pertenecieran al primer fichero (el fichero con el código 0).
  3085.  
  3086. {<gráfico destino>} - {código del gráfico} en el que se va a poner el otro.
  3087.  
  3088. {<gráfico origen>} - {código del gráfico} que va a ser copiado en el destino.
  3089.  
  3090. {<x>, <y>} - {coordenadas dentro del gráfico destino} donde se desea poner el
  3091. gráfico origen. En estas coordenadas es donde se situará el centro (o
  3092. {#1136,punto de control} número 0) del gráfico origen.
  3093.  
  3094. Esta función modificará el gráfico indicado, pero sólo la copia del mismo
  3095. que se ha cargado en la memoria del ordenador. El gráfico original, que
  3096. está en el archivo {FPG} o {MAP} del disco, {permanecerá inalterado}.
  3097. Por ello si se quiere en un momento del juego recuperar el estado original
  3098. del gráfico se tiene que descargar de memoria (con {#169,unload_fpg()} o
  3099. {#176,unload_map()}) y después volverlo a cargar.
  3100.  
  3101. {#9999,Programa ejemplo:}
  3102. PROGRAM ejemplo_map_put;
  3103.  
  3104. PRIVATE
  3105.     x_destino;
  3106.     y_destino;
  3107.     fichero1;
  3108.  
  3109. BEGIN
  3110.     fichero1=load_fpg("help\help.fpg");
  3111.     graph=1;
  3112.     x=160;
  3113.     y=100;
  3114.     LOOP
  3115.         x_destino=rand(0, 320);
  3116.         y_destino=rand(0, 200);
  3117.  
  3118.         map_put(fichero1, 1, 100, x_destino, y_destino);
  3119.  
  3120.         angle+=1000;
  3121.         FRAME;
  3122.     END
  3123. END
  3124. {-}
  3125.  
  3126. En el ejemplo se pone el gráfico número 1 en el centro de la pantalla.
  3127.  
  3128. En cada paso del bucle principal se gira este gráfico y se
  3129. pone, con la función {map_put()}, un gráfico número 100 (una bola) dentro
  3130. del gráfico 1 (el gráfico central).
  3131.  
  3132. {/}
  3133.  
  3134. La función {#139,map_xput()} es una versión un poco más compleja de la
  3135. función {map_put()}, pero con muchas más posibilidades, pues permite, además,
  3136. poner gráficos rotados, escalados, espejados y transparentes.
  3137.  
  3138. Para poner una parte de un gráfico en otro (en lugar de poner el gráfico
  3139. completo) se debe utilizar la función {#135,map_block_copy()}.
  3140.  
  3141. {/}
  3142.  
  3143. {Nota:} Cuando se utilice la función {map_put()} (o cualquier otra similar)
  3144. para modificar un gráfico que se está utilizando como fondo de una ventana
  3145. de {scroll}, puede que el gráfico puesto no aparezca de forma inmediata en
  3146. pantalla; para solventar este problema se debe utilizar la función
  3147. {#152,refresh_scroll()}.
  3148.  
  3149. {/}Ver: {#139,map_xput()} - {#138,map_put_pixel()} - {#152,refresh_scroll()} - {#135,map_block_copy()}
  3150.  
  3151. # ─────────────────────────────────────────────────────────────────────────────
  3152.  
  3153. {.138,map_put_pixel()}
  3154. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  3155.  
  3156. {map_put_pixel(}<fichero>{,} <gráfico>{,} <x>{,} <y>{,} <color>{)}
  3157.  
  3158. {Descripción:}
  3159.  
  3160. Permite modificar el color de un punto determinado de un gráfico.
  3161. Para ello requiere el <código del fichero> en el
  3162. que se encuentra el gráfico, el <código del gráfico> dentro del fichero y
  3163. las coordenadas ({x}, {y}) del punto cuyo <color> se quiere establecer.
  3164.  
  3165. Los gráficos cargados con la función {#174,load_map()} se utilizarán como
  3166. si pertenecieran al primer fichero (el fichero con el código 0).
  3167.  
  3168. Esta función modificará el gráfico indicado, pero sólo la copia del mismo
  3169. que se ha cargado en la memoria del ordenador. El gráfico original, que
  3170. está en el archivo {FPG} o {MAP} del disco, {permanecerá inalterado}.
  3171. Por ello si se quiere en un momento del juego recuperar el estado original
  3172. del gráfico se tiene que descargar de memoria (con {#169,unload_fpg()} o
  3173. {#176,unload_map()}) y después volverlo a cargar.
  3174.  
  3175. {#9999,Programa ejemplo:}
  3176. PROGRAM ejemplo_map_put_pixel;
  3177. PRIVATE
  3178.     fichero1;
  3179.     coord_x;
  3180.     coord_y;
  3181.     color;
  3182.  
  3183. BEGIN
  3184.     fichero1=load_fpg("help\help.fpg");
  3185.     graph=5;
  3186.     x=160;
  3187.     y=100;
  3188.     size=180;
  3189.     LOOP
  3190.         coord_x=rand(0, 199);
  3191.         coord_y=rand(0, 199);
  3192.         color=rand(0, 15);
  3193.  
  3194.         // Se ponen puntos en el gráfico número 5 del fichero1
  3195.         map_put_pixel(fichero1, 5, coord_x, coord_y, color);
  3196.  
  3197.         angle+=2000;
  3198.         FRAME;
  3199.     END
  3200. END
  3201. {-}
  3202.  
  3203. En el ejemplo, se pone el gráfico número 5 en el centro de la pantalla
  3204. rotando contínuamente; este gráfico es un fondo completamente negro,
  3205. por ello inicialmente no se verá nada en pantalla.
  3206.  
  3207. Pero después, en cada paso del bucle se ponen en él puntos de un color
  3208. elegido al azar entre el 0 y el 15 (grises) en unas coordenadas
  3209. también elegidas al azar.
  3210.  
  3211. Estos puntos se ponen usando la función {map_put_pixel()}.
  3212.  
  3213. Se puede observar cómo parece que hay cada vez más puntos girando en
  3214. pantalla cuando, en realidad, lo único que gira es el gráfico número 5.
  3215.  
  3216. {/}
  3217.  
  3218. Para poner un gráfico completo en otro, y no sólo en un punto, se pueden
  3219. utilizar las funciones {#137,map_put()} o {#139,map_xput()}, y para poner
  3220. sólo una parte de un gráfico en otro se puede utilizar la función
  3221. {#135,map_block_copy()}.
  3222.  
  3223. {/}
  3224.  
  3225. {Nota:} Cuando se utilice la función {map_put_pixel()} para poner un punto
  3226. en un gráfico que se está utilizando como fondo de una ventana
  3227. de {scroll}, puede que el punto puesto no aparezca de forma inmediata en
  3228. pantalla; para solventar este problema se debe utilizar la función
  3229. {#152,refresh_scroll()}.
  3230.  
  3231. {/}Ver: {#137,map_put()} - {#139,map_xput()} - {#152,refresh_scroll()} - {#135,map_block_copy()}
  3232.  
  3233. # ─────────────────────────────────────────────────────────────────────────────
  3234.  
  3235. {.139,map_xput()}
  3236. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  3237.  
  3238. {map_xput(}<fichero>{,} <gráfico destino>{,} <gráfico origen>{,} <x>{,} <y>{,}
  3239.            <angle>{,} <size>{,} <flags>{)}
  3240.  
  3241. {Descripción:}
  3242.  
  3243. Versión extendida de la función {#137,map_put()}.
  3244.  
  3245. Pone un gráfico en otro. El gráfico que se va a copiar se denomina
  3246. <gráfico origen> y el {gráfico destino} es en el que se copiará el origen,
  3247. es decir, esta función permite copiar un gráfico (origen) a otro (destino).
  3248.  
  3249. Ambos gráficos deben estar en el mismo fichero. Los parámetros son, por
  3250. orden, los siguientes:
  3251.  
  3252. {<fichero>} - {código del fichero} con la librería de gráficos que contiene
  3253. a ambos. Los gráficos cargados con la función {#174,load_map()} se utilizarán como
  3254. si pertenecieran al primer fichero (el fichero con el código 0).
  3255.  
  3256. {<gráfico destino>} - {código del gráfico} en el que se va a poner el otro.
  3257.  
  3258. {<gráfico origen>} - {código del gráfico} que va a ser copiado en el destino.
  3259.  
  3260. {<x>, <y>} - coordenadas dentro del gráfico destino donde se desea poner el
  3261. gráfico origen. En estas coordenadas es donde se copiará el gráfico origen
  3262. a partir de su esquina superior izquierda.
  3263.  
  3264. {<angle>} - ángulo (en milésimas de grados) en el que se copiará el gráfico origen,
  3265. el ángulo normal es {0}.
  3266.  
  3267. {<size>} - tamaño (en porcentaje) en el que se copiará el gráfico original, el
  3268. tamaño normal es {100}.
  3269.  
  3270. {<flags>} - Indica los espejados y transparencias con los que se copiará el gráfico
  3271. original en el destino; los valores son:
  3272.  
  3273.  {0}-Gráfico normal.·
  3274.  {1}-Espejado horizontal.·
  3275.  {2}-Espejado vertical.·
  3276.  {3}-Espejado horizontal y vertical (180°).·
  3277.  {4}-Gráfico transparente.·
  3278.  {5}-Transparente y espejado horizontal.·
  3279.  {6}-Transparente y espejado vertical.·
  3280.  {7}-Transparente, espejado horizontal y vertical.·
  3281.  
  3282. Esta función modificará el gráfico indicado, pero sólo la copia del mismo
  3283. que se ha cargado en la memoria del ordenador. El gráfico original, que
  3284. está en el archivo {FPG} o {MAP} del disco, {permanecerá inalterado}.
  3285. Por ello, si se quiere en un momento del juego recuperar el estado original
  3286. del gráfico se tiene que descargar de memoria (con {#169,unload_fpg()} o
  3287. {#176,unload_map()}) y después volverlo a cargar.
  3288.  
  3289. {#9999,Programa ejemplo:}
  3290. PROGRAM ejemplo_map_xput;
  3291. PRIVATE
  3292.     x_destino;
  3293.     y_destino;
  3294.     fichero1;
  3295.     ángulo1;
  3296.     tamaño1;
  3297.     banderas1;
  3298.  
  3299. BEGIN
  3300.     fichero1=load_fpg("help\help.fpg");
  3301.     graph=1;
  3302.     x=160;
  3303.     y=100;
  3304.     LOOP
  3305.         x_destino=rand(0, 319);
  3306.         y_destino=rand(0, 199);
  3307.         ángulo1=rand(-pi, pi);
  3308.         tamaño1=rand(10, 200);
  3309.         banderas1=rand(0, 7);
  3310.  
  3311.         map_xput(fichero1, 1, 101, x_destino, y_destino, ángulo1, tamaño1, banderas1);
  3312.  
  3313.         angle+=2000;
  3314.         FRAME;
  3315.     END
  3316. END
  3317. {-}
  3318.  
  3319. En el ejemplo, se pone el gráfico 1 en el centro de la pantalla rotando
  3320. contínuamente (este gráfico es un fondo decorativo en grises).
  3321.  
  3322. En cada paso del bucle se pondrá dentro de él otro gráfico con forma
  3323. de triángulo (con el número 100). Este gráfico se pondrá con coordenadas,
  3324. ángulo, tamaño y banderas (ver variable {#1127,flags}) elegidas
  3325. de forma aleatoria.
  3326.  
  3327. Se puede observar cómo en el gráfico de fondo van apareciendo contínuamente
  3328. triángulos de color marrón con diferentes efectos aplicados.
  3329.  
  3330. {/}
  3331.  
  3332. La función {map_xput()} es una versión un poco más compleja de la
  3333. función {#137,map_put()}, siendo ésta más fácil de utilizar cuando no se
  3334. requiera poner gráficos rotados, escalados, espejados y transparentes.
  3335.  
  3336. Para poner una parte de un gráfico en otro (en lugar de poner el gráfico
  3337. completo) se debe utilizar la función {#135,map_block_copy()}.
  3338.  
  3339. {/}
  3340.  
  3341. {Nota:} Cuando se utilice la función {map_xput()} (o cualquier otra similar)
  3342. para modificar un gráfico que se está utilizando como fondo de una ventana
  3343. de {scroll}, puede que el gráfico puesto no aparezca de forma inmediata en
  3344. pantalla; para solventar este problema se debe utilizar la función
  3345. {#152,refresh_scroll()}.
  3346.  
  3347. {/}Ver: {#137,map_put()} - {#138,map_put_pixel()} - {#152,refresh_scroll()} - {#135,map_block_copy()}
  3348.  
  3349. # ─────────────────────────────────────────────────────────────────────────────
  3350.  
  3351. {.140,move_scroll()}
  3352. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  3353.  
  3354. {move_scroll(}<número de scroll>{)}
  3355.  
  3356. {Descripción:}
  3357.  
  3358. Fuerza a mover un scroll automático de forma inmediata. Esta es una función
  3359. algo avanzada y por ello puede resultar difícil de comprender su propósito.
  3360.  
  3361. La función requiere como parámetro el <número de scroll> de 0 a 9 que se
  3362. indicó en la función {#163,start_scroll()} como primer parámetro cuando
  3363. se inició el scroll.
  3364.  
  3365. Esta función se utiliza cuando una región de scroll se controla
  3366. automáticamente, por haber definido el campo {camera} de la
  3367. {#1101,estructura scroll} correspondiente con el identificador de un
  3368. proceso.
  3369.  
  3370. El propósito es forzar a que se actualicen los valores ({x0}, {y0}, {x1} y {y1})
  3371. de dicha estructura; si no se utiliza esta función estos valores no se
  3372. actualizarán hasta la próxima imagen del juego.
  3373.  
  3374. Es decir, cuando un scroll se controla de forma automática y otro proceso
  3375. necesita conocer antes de la próxima imagen el valor de las coordenadas
  3376. de dicho scroll (normalmente para colocarse él en una posición acorde al
  3377. movimiento del fondo) se debe hacer esto:
  3378.  
  3379. {1} - Se inicia el scroll con {#163,start_scroll()}.
  3380.  
  3381. {2} - Se crea el proceso que se utilizará como cámara y se pone su
  3382. {#1039,código identificador} en el campo {camera} de la {#1101,estructura
  3383. scroll}.
  3384.  
  3385. {3} - A este proceso se le debe poner una prioridad muy alta, para que
  3386. se ejecute antes que el resto de los procesos (poniendo en su variable
  3387. local {#1121,priority} un valor entero positivo como, por ejemplo, 100).
  3388.  
  3389. {4} - Justo antes de la sentencia {#1029,FRAME} del bucle del proceso usado
  3390. como cámara se llamará a la función {move_scroll()}.
  3391.  
  3392. De esta forma se garantizará que este proceso se ejecute el primero y, justo
  3393. al finalizar, actualice los valores ({x0}, {y0}, {x1} y {y1}) de la
  3394. {#1101,estructura scroll}, de forma que el resto de los procesos puedan
  3395. utilizar estas variables ya actualizadas.
  3396.  
  3397. El uso más generalizado de esta función es cuando en una ventana de scroll
  3398. se quieren tener más de dos planos de fondo y, para ello, se crean una serie
  3399. de procesos que simulen un tercer o cuarto plano, situando sus coordenadas
  3400. en función de la posición exacta del scroll en cada imagen. A continuación
  3401. se muestra un programa que lo hace.
  3402.  
  3403. {#9999,Programa ejemplo:}
  3404. PROGRAM ejemplo_move_scroll;
  3405.  
  3406. PRIVATE
  3407.     fichero1;
  3408.     contador;
  3409.  
  3410. BEGIN
  3411.     set_fps(100, 0);
  3412.     fichero1=load_fpg("help\help.fpg");
  3413.     start_scroll(0, fichero1, 103, 102, 0, 15);
  3414.     scroll.camera=id;
  3415.     priority=100;
  3416.     FROM contador=-2000 TO 2000 step 100;
  3417.         proceso_móvil(contador);
  3418.     END
  3419.     write(0, 160, 0, 1, "Utilice cursor derecha e izquierda para moverse");
  3420.     graph=101;
  3421.     ctype=c_scroll;
  3422.     LOOP
  3423.         if (key(_right))
  3424.             x+=2;
  3425.             flags=0;
  3426.         END
  3427.         if (key(_left))
  3428.             x-=2;
  3429.             flags=1;
  3430.         END
  3431.  
  3432.         move_scroll(0); // Actualiza la estructura scroll[]
  3433.  
  3434.         FRAME;
  3435.     END
  3436. END
  3437.  
  3438. PROCESS proceso_móvil(x_scroll)
  3439. BEGIN
  3440.     ctype=c_scroll;
  3441.     z=100;
  3442.     graph=104;
  3443.     LOOP
  3444.         x=x_scroll-scroll.x0;
  3445.         FRAME;
  3446.     END
  3447. END
  3448. {-}
  3449.  
  3450. Este ejemplo inicia un scroll a pantalla completa con dos planos y después
  3451. mueve un triángulo hacia la derecha e izquierda con los cursores; este
  3452. proceso será la cámara del scroll, centrándose la visión en el mismo de
  3453. forma automática (al poner {scroll.camera=}{#1092,id}{;}).
  3454.  
  3455. Pero, además, crea un total de 40 procesos (de -2000 hasta 2000, cada 100 puntos)
  3456. con el dibujo de una banda vertical de colores que se moverán como si fueran
  3457. un tercer plano de scroll (procesos de tipo {proceso_móvil}).
  3458.  
  3459. Para ello, es importante que su {z} sea superior al resto de los procesos
  3460. ({z=100;}) y que la prioridad del proceso que controla la cámara sea mayor
  3461. ({priority=100;}) y este último utilice la función {move_scroll()} antes
  3462. de cada imagen ({FRAME;}).
  3463.  
  3464. Los procesos que simula el tercer plano ({proceso_móvil}), sitúan su
  3465. coordenada {x} en función de la {x del scroll} y su posición original.
  3466.  
  3467. La diferencia es que si no se hubiera utilizado {move_scroll()}, al
  3468. utilizar los procesos la variable {scroll.x0} sin actualizar, se moverían
  3469. con un cierto retraso que restaría verosimilitud al juego.
  3470.  
  3471. {/}Ver: {#163,start_scroll()} - {#1101,Estructura scroll} - {#1121,priority} - {#1125,z}
  3472.  
  3473. # ─────────────────────────────────────────────────────────────────────────────
  3474.  
  3475. {.141,move_text()}
  3476. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  3477.  
  3478. {move_text(}<identificador del texto>{,} <x>{,} <y>{)}
  3479.  
  3480. {Descripción:}
  3481.  
  3482. Mueve un texto a otras coordenadas de pantalla. Se especifica como parámetro
  3483. el {identificador del texto} que es un código numérico que devuelve las
  3484. funciones {#171,write()} y {#172,write_int()} cuando se les pide que escriban
  3485. un texto, y las coordenadas ({x}, {y}) de pantalla a las que se debe mover el
  3486. texto.
  3487.  
  3488. El {código de centrado} especificado en el {#171,write()} o {#172,write_int()}
  3489. se mantendrá cuando se utilice esta función.
  3490.  
  3491. Las coordenadas especificadas son siempre relativas a la pantalla y pueden
  3492. estar dentro o fuera de la misma. Para modificar la {coordenada z de los
  3493. textos} (el plano de profundidad en el que aparecen) se debe utilizar la
  3494. variable global {#1106,text_z}.
  3495.  
  3496. {#9999,Programa ejemplo:}
  3497. PROGRAM ejemplo_move_text;
  3498.  
  3499. PRIVATE
  3500.     id_texto1;
  3501.     id_texto2;
  3502.     coord_x;
  3503.     coord_y;
  3504.     ángulo1;
  3505.  
  3506. BEGIN
  3507.     id_texto1=write(0, 160, 100, 4, "TEXTO EN MOVIMIENTO");
  3508.     id_texto2=write(0, 160, 100, 4, "MUEVA EL RATON");
  3509.     LOOP
  3510.         coord_x=160+get_distx(ángulo1, 100);
  3511.         coord_y=100+get_disty(ángulo1, 90);
  3512.  
  3513.         // Movemos los textos
  3514.         move_text(id_texto1, coord_x, coord_y);
  3515.         move_text(id_texto2, mouse.x, mouse.y);
  3516.  
  3517.         ángulo1+=1000;
  3518.         FRAME;
  3519.     END
  3520. END
  3521. {-}
  3522.  
  3523. En el ejemplo se imprimen dos texto con la función {#171,write()} en
  3524. el centro de la pantalla. Esta función nos devuelve los identificadores
  3525. de dichos textos, que se guardan en las variables {id_texto1} e {id_texto2}.
  3526.  
  3527. En cada paso de bucle, se mueve el primer el texto por una trayectoria
  3528. circular que se consigue incrementando un ángulo ({ángulo1}) y utilizando
  3529. las funciones {#118,get_distx()} y {#119,get_disty()}. El segundo texto
  3530. se situará en las coordenadas del puntero del ratón.
  3531.  
  3532. Ambos textos se mueven en cada imagen mediante la función {move_text()}.
  3533.  
  3534. {/}
  3535.  
  3536. Para borrar un texto definitivamente también se requiere el {identificador
  3537. del texto}, y se debe utilizar para ello la función {#107,delete_text()}.
  3538.  
  3539. {/}Ver: {#171,write()} - {#172,write_int()} - {#107,delete_text()}
  3540.  
  3541. # ─────────────────────────────────────────────────────────────────────────────
  3542.  
  3543. {.142,near_angle()}
  3544. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  3545.  
  3546. {near_angle(}<ángulo>{,} <ángulo final>{,} <incremento>{)}
  3547.  
  3548. {Retorna:}
  3549.  
  3550. Un nuevo ángulo más próximo al ángulo final.
  3551.  
  3552. {Descripción:}
  3553.  
  3554. Acerca un ángulo a otro en el incremento dado. La función devuelve el nuevo
  3555. ángulo.
  3556.  
  3557. Se utiliza cuando se quiere que un ángulo (<ángulo>) varíe gradualmente
  3558. hasta convertirse en otro (<ángulo final>); para ello, la función necesita
  3559. el ángulo original, el {ángulo final} y el {incremento} angular que se
  3560. le va a ir sumando o restando al ángulo original.
  3561.  
  3562. Se recuerda que todos los ángulos se especifican en milésimas de grado. El
  3563. {incremento} angular no es más que un ángulo pequeño, como pudiera ser un
  3564. grado ({1000}) o cinco ({5000}).
  3565.  
  3566. {#9999,Programa ejemplo:}
  3567. PROGRAM ejemplo_near_angle;
  3568.  
  3569. PRIVATE
  3570.     ángulo2;
  3571.  
  3572. BEGIN
  3573.     load_fpg("help\help.fpg");
  3574.     put_screen(0, 1);
  3575.     mouse.graph=200;
  3576.     graph=101;
  3577.     write(0, 160, 200, 7, "Mueva el cursor del ratón");
  3578.     LOOP
  3579.         ángulo2=fget_angle(x, y, mouse.x, mouse.y);
  3580.  
  3581.         // Acerca el ángulo actual al final en 10 grados como máximo
  3582.         angle = near_angle(angle, ángulo2, 10000);
  3583.  
  3584.         advance(6);
  3585.         FRAME;
  3586.     END
  3587. END
  3588. {-}
  3589.  
  3590. En el ejemplo se define el cursor del ratón como una pequeña cruz que el
  3591. usuario puede mover.
  3592.  
  3593. El programa principal define su gráfico como un triángulo ({graph=101;})
  3594. que, en cada iteración del bucle, obtiene el ángulo hacia el cursor del
  3595. ratón con la función {#113,fget_angle()}; después modifica su ángulo
  3596. para que se acerque un máximo de 10 grados (10000) hacia el ángulo del
  3597. cursor, utilizando la función {near_angle()} y, por último, avanza 6 puntos
  3598. en esa dirección utilizando la función {#101,advance()}.
  3599.  
  3600. Se puede observar cómo el triángulo persigue contínuamente al cursor del
  3601. ratón sin realizar ningún giro brusco (de más de 10 grados).
  3602.  
  3603. {/}Ver: {#1044,Uso de ángulos en el lenguaje} - {#1129,angle} - {#116,get_angle()} - {#113,fget_angle()}
  3604.  
  3605. # ─────────────────────────────────────────────────────────────────────────────
  3606.  
  3607. {.143,out_region()}
  3608. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  3609.  
  3610. {out_region(}<código identificador>{,} <número de región>{)}
  3611.  
  3612. {Retorna:}
  3613.  
  3614. {Cierto} si el proceso está fuera de la región o {Falso} en caso contrario.
  3615.  
  3616. {Descripción:}
  3617.  
  3618. Esta función determina si un proceso está fuera de una región de pantalla,
  3619. para ello la función requiere el {#1039,código identificador} del proceso
  3620. y un número de región.
  3621.  
  3622. Las regiones de pantalla se pueden definir con la función {#106,define_region()}
  3623. y son, simplemente, zonas rectangulares de pantalla.
  3624.  
  3625. La región número {0} no se puede definir ya que será siempre la pantalla completa,
  3626. por lo tanto, si se especifica un {0} como segundo parámetro esta función determina
  3627. si un proceso está fuera de la pantalla (si no se ve).
  3628.  
  3629. En el caso de que el gráfico del proceso esté fuera de la región especificada
  3630. la función devuelve {Cierto} (un número impar); en cambio si el gráfico se ve,
  3631. aunque sea parcialmente, en dicha región, la función devuelve {Falso} (cualquier
  3632. número par).
  3633.  
  3634. El proceso cuyo {#1039,código identificador} se indica debe tener definido
  3635. correctamente su gráfico (normalmente en su variable {#1026,graph}) pues,
  3636. de lo contrario, el sistema advertirá un error ya que si el proceso
  3637. no tiene un gráfico, no se pueden calcular las dimensiones del mismo.
  3638.  
  3639. {#9999,Programa ejemplo:}
  3640. PROGRAM ejemplo_out_region;
  3641. BEGIN
  3642.     load_fpg("help\help.fpg");
  3643.     put_screen(0, 1);
  3644.     y=100;
  3645.     x=160;
  3646.     graph=101;
  3647.     LOOP
  3648.         advance(8);
  3649.  
  3650.         IF (out_region(id, 0)) // Se comprueba si se sale de pantalla
  3651.  
  3652.             x=160;
  3653.             y=100;
  3654.             angle=rand(-pi, pi);
  3655.         END
  3656.         FRAME;
  3657.     END
  3658. END
  3659. {-}
  3660.  
  3661. En el ejemplo se pone un gráfico de fondo y el programa principal
  3662. crea un gráfico en el centro de la pantalla con un ángulo aleatorio
  3663. y en forma de triángulo.
  3664.  
  3665. En cada paso del bucle el triángulo avanza y se comprueba si ha salido
  3666. de la pantalla (region 0) con la función {out_region()}. Si ha salido
  3667. de pantalla se pone otra vez en el centro con otro ángulo elegido
  3668. nuevamente al azar.
  3669.  
  3670. {/}Ver: {#106,define_region()} - {#1130,region} - {#1039,Codigos identificadores}
  3671.  
  3672. # ─────────────────────────────────────────────────────────────────────────────
  3673.  
  3674. {.144,play_cd()}
  3675. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  3676.  
  3677. {play_cd(}<número de pista>{,} <modo>{)}
  3678.  
  3679. {Descripción:}
  3680.  
  3681. Comienza a tocar una pista de cd-audio. Se debe indicar el número de pista (de
  3682. 1 al número de canciones que tenga el cd) y el modo es como sigue:
  3683.  
  3684. {Modo.}
  3685.  
  3686.  {0} - Tocar la canción y pararse después.·
  3687.  {1} - Tocar esa canción y después las siguientes.·
  3688.  
  3689. {#9999,Programa ejemplo:}
  3690. PROGRAM ejemplo_play_cd;
  3691. BEGIN
  3692.     write(0, 160, 0, 1, "Pulse [ESPACIO] para poner el CD en marcha.");
  3693.     LOOP
  3694.         IF (scan_code==_space)
  3695.  
  3696.             play_cd(1, 1); // Se pone la 1ª canción y después las demás.
  3697.  
  3698.         END
  3699.         FRAME;
  3700.     END
  3701. END
  3702. {-}
  3703.  
  3704. El ejemplo anterior (para el cual se necesita tener un {Compact disc} de
  3705. música en el cargador de {CD-ROM}) se pone un mensaje informativo y en cada
  3706. iteración del bucle se comprueba si se pulsó la barra espaciadora para poner
  3707. la primera canción con la función {play_cd()}
  3708.  
  3709. {/}
  3710.  
  3711. Para conseguir que una canción suene indefinidamente, se debe implementar
  3712. un bucle utilizando la función {#127,is_playing_cd()} para determinar cuándo
  3713. ha acabado la canción.
  3714.  
  3715. El volumen de reproducción del cd-audio se puede controlar con la
  3716. estructura {#1104,setup} y la función {#178,set_volume()}.
  3717.  
  3718. {/}Ver: {#127,is_playing_cd()} - {#164,stop_cd()} - {#178,set_volume()} - {#1104,Estructura setup}
  3719.  
  3720. # ─────────────────────────────────────────────────────────────────────────────
  3721.  
  3722. {.145,pow()}
  3723. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  3724.  
  3725. {pow(}<expresión>{,} <expresión>{)}
  3726.  
  3727. {Retorna:}
  3728.  
  3729. La primera expresión {elevada} a la segunda.
  3730.  
  3731. {Descripción:}
  3732.  
  3733. Calcula el resultado de elevar la primera expresión a la segunda.
  3734.  
  3735. Por ejemplo, {pow(3, 2)} devolverá {9}, que es {3} elevado al cuadrado,
  3736. es decir, {3²}, o {3*3}.
  3737.  
  3738. {#9999,Programa ejemplo:}
  3739. PROGRAM ejemplo_pow;
  3740. GLOBAL
  3741.     valores[15];
  3742.     n;
  3743. BEGIN
  3744.     FROM n=0 TO 15;
  3745.         valores[n]=rand(-100, 100);
  3746.         write_int(0, 0, n*10, 0, offset valores[n]);
  3747.     END
  3748.     write(0, 0, 192, 0, "Pulse [ESPACIO] para elevar estos números al cuadrado");
  3749.     LOOP
  3750.         IF (scan_code==_space)
  3751.             FROM n=0 TO 15;
  3752.  
  3753.                 valores[n] = pow(valores[n], 2); // Se eleva al cuadrado.
  3754.  
  3755.             END
  3756.         END
  3757.         FRAME;
  3758.     END
  3759. END
  3760. {-}
  3761.  
  3762. Este programa imprimirá en pantalla una lista de números aleatoriamente
  3763. escogidos entre -100 y 100. Cuando se pulse la barra espaciadora se elevarán
  3764. dichos número al cuadrado.
  3765.  
  3766. Se debe tener en cuenta que en el lenguaje {sólo se pueden manejar números
  3767. enteros dentro del rango} ({#1177,min_int} ... {#1178,max_int}) por lo que,
  3768. cuando el resultado de la función deba exceder dicho rango, {se
  3769. mostrarán resultados incorrectos}. En este caso, el sistema no advertirá de
  3770. ningún error, por lo que se deben extremar las precauciones.
  3771.  
  3772. {/}Ver: {#1035,Expresión}
  3773.  
  3774. # ─────────────────────────────────────────────────────────────────────────────
  3775.  
  3776. {.146,put()}
  3777. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  3778.  
  3779. {put(}<fichero>{,} <gráfico>{,} <x>{,} <y>{)}
  3780.  
  3781. {Descripción:}
  3782.  
  3783. Pone un gráfico en el fondo de la pantalla. La función requiere el {código de
  3784. fichero} en el que está el gráfico, el {código del gráfico} dentro del mismo
  3785. fichero y las coordenadas ({x}, {y}) en las que se desea poner el gráfico.
  3786.  
  3787. Los gráficos cargados con la función {#174,load_map()} se utilizarán como
  3788. si pertenecieran al primer fichero (el fichero con el código 0).
  3789.  
  3790. Si no se especificó el centro del gráfico (estableciendo su {#1136,punto de control}
  3791. número 0 desde la herramienta de dibujo), las coordenadas se referirán a la
  3792. posición de pantalla en la que se situará {el centro} del gráfico.
  3793.  
  3794. Los gráficos impresos de esta forma en el fondo de la pantalla estarán en la
  3795. visualización del juego {por debajo de todos los procesos, regiones de scroll,
  3796. textos, etc.}
  3797.  
  3798. Si se desea que un gráfico esté por encima de otros se debe {crear
  3799. como un nuevo proceso} y fijar su variable {#1125,z} con la prioridad de impresión
  3800. del mismo.
  3801.  
  3802. Para borrar el fondo de la pantalla se debe utilizar la función {#103,clear_screen()}.
  3803.  
  3804. {#9999,Programa ejemplo:}
  3805. PROGRAM ejemplo_put;
  3806.  
  3807. PRIVATE
  3808.     fichero1;
  3809.     coord_x;
  3810.     coord_y;
  3811.  
  3812. BEGIN
  3813.     fichero1=load_fpg("help\help.fpg");
  3814.     LOOP
  3815.         coord_x=rand(0, 319);
  3816.         coord_y=rand(0, 199);
  3817.  
  3818.         put(fichero1, 100, coord_x, coord_y); // Se pone el gráfico 100.
  3819.  
  3820.         FRAME;
  3821.     END
  3822. END
  3823. {-}
  3824.  
  3825. En el ejemplo se carga el fichero con los gráficos y en cada iteración
  3826. de bucle se pone el gráfico número 100 (una bola) con la función {put()} en
  3827. coordenadas aleatorias (elegidas al azar con la función {#149,rand()}).
  3828.  
  3829. {/}
  3830.  
  3831. Si el gráfico que se quiere poner es simplemente una pantalla de fondo,
  3832. resulta más sencillo utilizar la función {#148,put_screen()}, ya que ésta
  3833. no requiere las coordenadas de pantalla pues centrará el gráfico en la
  3834. misma de forma automática.
  3835.  
  3836. {/}
  3837.  
  3838. La función {#173,xput()} es una versión un poco más compleja de la
  3839. función {put()} pero con muchas más posibilidades, ya que permite, además,
  3840. poner gráficos rotados, escalados, espejados y transparentes.
  3841.  
  3842. Para poner un gráfico en otro (en lugar del fondo de la pantalla)
  3843. se deben utilizar las funciones {#137,map_put()} o {#139,map_xput()}.
  3844.  
  3845. {/}Ver: {#148,put_screen()} - {#173,xput()} - {#137,map_put()} - {#139,map_xput()} - {#147,put_pixel()}
  3846.  
  3847. # ─────────────────────────────────────────────────────────────────────────────
  3848.  
  3849. {.147,put_pixel()}
  3850. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  3851.  
  3852. {put_pixel(}<x>{,} <y>{,} <color>{)}
  3853.  
  3854. {Descripción:}
  3855.  
  3856. Establece el {color} del punto situado en las coordenadas ({x}, {y})
  3857. del fondo de la pantalla. Es decir, pone un punto del color indicado en las
  3858. coordenadas indicadas.
  3859.  
  3860. Los puntos impresos con esta función en el fondo de la pantalla estarán en la
  3861. visualización del juego {por debajo de todos los procesos, regiones de scroll,
  3862. textos, etc.}
  3863.  
  3864. Si se desea visualizar un punto que esté por encima de otros gráficos se debe
  3865. crear un nuevo proceso y asignarle como gráfico el dibujo de un punto (en su
  3866. variable {#1126,graph}) y fijar su variable {z} con la prioridad de
  3867. impresión del mismo.
  3868.  
  3869. Para borrar el fondo de la pantalla se debe utilizar la función {#103,clear_screen()}.
  3870.  
  3871. {#9999,Programa ejemplo:}
  3872. PROGRAM ejemplo_put_pixel;
  3873.  
  3874. PRIVATE
  3875.     x_punto;
  3876.     y_punto;
  3877.     color;
  3878.  
  3879. BEGIN
  3880.     LOOP
  3881.         x_punto=rand(0, 319);
  3882.         y_punto=rand(0, 199);
  3883.         color=rand(0, 15);
  3884.  
  3885.         // Se ponen puntos en el fondo de la pantalla aleatoriamente
  3886.         put_pixel(x_punto, y_punto, color);
  3887.  
  3888.         FRAME;
  3889.     END
  3890. END
  3891. {-}
  3892.  
  3893. En el ejemplo, en cada paso del bucle se ponen puntos con la función
  3894. {put_pixel()} con coordenadas y color elegidos al azar con la función
  3895. {#149,rand()}.
  3896.  
  3897. {/}
  3898.  
  3899. Para leer el color que tiene un determinado punto del fondo de la pantalla
  3900. se debe utilizar la función {#123,get_pixel()}, que devolverá un número entre
  3901. 0 y 255 correspondiente al orden del color dentro de la paleta.
  3902.  
  3903. Para poner un gráfico en pantalla, en lugar de un simple punto se debe
  3904. utilizar la función {#146,put()}.
  3905.  
  3906. También es posible establecer el color de un punto en un determinado gráfico
  3907. en lugar del fondo de la pantalla, lo que se puede hacer con {#138,map_put_pixel()}.
  3908.  
  3909. {/}Ver: {#123,get_pixel()} - {#146,put()} - {#138,map_put_pixel()} - {#136,map_get_pixel()}
  3910.  
  3911. # ─────────────────────────────────────────────────────────────────────────────
  3912.  
  3913. {.148,put_screen()}
  3914. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  3915.  
  3916. {put_screen(}<fichero>{,} <gráfico>{)}
  3917.  
  3918. {Descripción:}
  3919.  
  3920. Establece el fondo de la pantalla. La función requiere el {código de
  3921. fichero} en el que está el gráfico, y el propio {código del gráfico}
  3922. que se desea imprimir en el fondo de la pantalla dentro del fichero.
  3923.  
  3924. Los gráficos cargados con la función {#174,load_map()} se utilizarán como
  3925. si pertenecieran al primer fichero (el fichero con el código 0).
  3926.  
  3927. La función no requiere ninguna coordenada como parámetro, pues si el gráfico
  3928. es de un tamaño (en puntos) diferente al de la pantalla simplemente se
  3929. imprimirá centrado en la misma.
  3930.  
  3931. Para borrar el fondo de la pantalla se debe utilizar la función {#103,clear_screen()}.
  3932.  
  3933. {#9999,Programa ejemplo:}
  3934. PROGRAM ejemplo_put_screen;
  3935.  
  3936. PRIVATE
  3937.     fichero1;
  3938.  
  3939. BEGIN
  3940.     fichero1=load_fpg("help\help.fpg");
  3941.  
  3942.     put_screen(fichero1, 1); // Se pone el gráfico 1 como fondo.
  3943.  
  3944.     LOOP
  3945.         FRAME;
  3946.     END
  3947. END
  3948. {-}
  3949.  
  3950. En el ejemplo se carga el fichero de gráficos y se pone un gráfico
  3951. de fondo (que está metido en el fichero con el código de gráfico número 1)
  3952. con la función {#148,put_screen()}.
  3953.  
  3954. {/}
  3955.  
  3956. Si se quiere imprimir un gráfico en una parte concreta de la pantalla o un
  3957. gráfico {que no aparezca centrado}, se puede utilizar para ello la función
  3958. {#146,put()}. La función {#173,xput()} permite, además, imprimir gráficos
  3959. rotados, escalados, espejados y/o transparentes en cualquier región de
  3960. pantalla.
  3961.  
  3962. {/}Ver: {#146,put()} - {#173,xput()} - {#147,put_pixel()} - {#103,clear_screen()}
  3963.  
  3964. # ─────────────────────────────────────────────────────────────────────────────
  3965.  
  3966. {.149,rand()}
  3967. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  3968.  
  3969. {rand(}<valor mínimo>{,} <valor máximo>{)}
  3970.  
  3971. {Retorna:}
  3972.  
  3973. Un valor numérico aleatorio.
  3974.  
  3975. {Descripción:}
  3976.  
  3977. Devuelve un número aleatorio (escogido al azar) entre el {valor mínimo} y
  3978. el {valor máximo}, ambos incluidos.
  3979.  
  3980. Esta función se suele utilizar para establecer todos los parámetros que se
  3981. quiere que varíen en un juego de una partida a otra; por ejemplo, se pueden
  3982. inicializar las coordenadas de un enemigo con números aleatorios, para que
  3983. en cada partida pueda aparecer en una posición diferente.
  3984.  
  3985. Otra utilidad de esta función es cuando se quiere que una acción no suceda
  3986. siempre, sino que tenga una cierta probabilidad de suceder; esto se suele
  3987. implementar con una sentencia del tipo:
  3988.  
  3989.   {IF (rand(0, 100)<25)}·
  3990.      { // Acción ...}·
  3991.   {END}·
  3992.  
  3993. En este caso la {acción} se realizaría con un promedio del 25 por ciento de las
  3994. veces que se ejecutara la sentencia {#1020,IF}, ya que, al obtener un número
  3995. al azar entre 0 y 100, éste sólo sería un número menor que 25, aproximadamente
  3996. una cuarta parte de las ocasiones.
  3997.  
  3998. {#9999,Programa ejemplo:}
  3999. PROGRAM ejemplo_rand;
  4000.  
  4001. PRIVATE
  4002.     tabla[15];
  4003.     contador;
  4004.  
  4005. BEGIN
  4006.     write (0, 0, 192, 0, "Pulse [ESPACIO] para hallar valores aleatorios.");
  4007.     FROM contador=0 TO 15;
  4008.         write_int(0, 0, contador*10, 0, offset tabla[contador]);
  4009.     END
  4010.     LOOP
  4011.         IF (scan_code==_space)
  4012.             FROM contador=0 TO 15;
  4013.  
  4014.                 // Se eligen valores aleatorios entre -100 y 100
  4015.                 tabla[contador] = rand(-100, 100);
  4016.  
  4017.             END
  4018.         END
  4019.         FRAME;
  4020.     END
  4021. END
  4022. {-}
  4023.  
  4024. En el ejemplo se crea una tabla con 16 datos (del 0 al 15). En cada
  4025. iteración del bucle principal se comprueba si se ha pulsado la barra
  4026. espaciadora, en cuyo caso se rellenan los 16 datos de la tabla con
  4027. valores aleatorios entre -100 y 100, elegidos con la función {rand()}.
  4028.  
  4029. {/}
  4030.  
  4031. Por defecto, en cada ejecución del programa los valores que devuelva la
  4032. función {rand()} serán completamente diferentes. Si se quiere que la
  4033. serie de números sea siempre una misma, se puede utilizar para ello la
  4034. función {#150,rand_seed()} especificando un número, tras el cual la
  4035. serie de números que devuelva la función {rand()} estará siempre
  4036. predeterminada.
  4037.  
  4038. {/}Ver: {#150,rand_seed()}
  4039.  
  4040. # ─────────────────────────────────────────────────────────────────────────────
  4041.  
  4042. {.150,rand_seed()}
  4043. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  4044.  
  4045. {rand_seed(}<valor numérico>{)}
  4046.  
  4047. {Descripción:}
  4048.  
  4049. Esta función establece una semilla para el generador de números aleatorios
  4050. (los números que genera la función {#149,rand()}).
  4051.  
  4052. Si se establece una semilla, que puede ser cualquier número entero dentro del
  4053. rango ({#1177,min_int} ... {#1178,max_int}), todos los números que genere
  4054. la función {#149,rand()} serán los mismos en cada ejecución del programa.
  4055. Es decir, tras establecerse una semilla de origen, la función {#149,rand()} devolverá
  4056. una serie de números predeterminada para dicha semilla.
  4057.  
  4058. {#9999,Programa ejemplo:}
  4059. PROGRAM ejemplo_rand_seed;
  4060.  
  4061. PRIVATE
  4062.     tabla[15];
  4063.     contador;
  4064.  
  4065. BEGIN
  4066.     write (0, 0, 184, 0, "Pulse [ENTER] para introducir 1234 como semilla.");
  4067.     write (0, 0, 192, 0, "Pulse [ESPACIO] para hallar valores aleatorios.");
  4068.     FROM contador=0 TO 15;
  4069.         write_int(0, 0, contador*10, 0, offset tabla[contador]);
  4070.     END
  4071.     LOOP
  4072.         IF (scan_code==_space)
  4073.             FROM contador=0 TO 15;
  4074.                 tabla[contador] = rand(-100, 100);
  4075.             END
  4076.         END
  4077.         IF (scan_code==_enter)
  4078.  
  4079.             rand_seed(1234); // Se introduce semilla para aleatorios.
  4080.  
  4081.         END
  4082.         FRAME;
  4083.     END
  4084. END
  4085. {-}
  4086.  
  4087. En el ejemplo se crea una tabla con 16 datos (del 0 al 15). En cada iteración
  4088. del bucle principal, cada vez que se pulse la barra espaciadora se rellenarán
  4089. los datos con valores aleatorios entre -100 y 100 (elegidos con la función
  4090. {#149,rand()}).
  4091.  
  4092. Y cuando se pulse la tecla ENTER, entonces se definirá la semilla de los
  4093. números aleatorios con la función {rand_seed()} como 1234.
  4094.  
  4095. Se puede observar cómo cada vez que se pulsa la tecla ENTER, luego, al pulsar
  4096. la barra espaciadora, siempre se obtiene la misma serie de números aleatorios
  4097. (17, 94, -38, ...). Para cada semilla posible; ésta serie será diferente.
  4098.  
  4099. {/}Ver: {#149,rand()}
  4100.  
  4101. # ─────────────────────────────────────────────────────────────────────────────
  4102.  
  4103. {.152,refresh_scroll()}
  4104. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  4105.  
  4106. {refresh_scroll(}<número de scroll>{)}
  4107.  
  4108. {Descripción:}
  4109.  
  4110. Esta función se utiliza cuando se ha modificado un gráfico con las funciones
  4111. {#137,map_put()}, {#139,map_xput()}, {#135,map_block_copy()} o {#138,map_put_pixel()} que
  4112. está siendo utilizado como {fondo de una región de scroll}, para actualizarlo.
  4113.  
  4114. La función requiere como parámetro el <número de scroll> que se especificó
  4115. al iniciar el scroll con la función {#163,start_scroll()}.
  4116.  
  4117. Cuando se modifica un gráfico que está siendo utilizado como fondo de un
  4118. scroll no se actualiza en pantalla automáticamente, sino que hay que llamar a esta
  4119. función para ello.
  4120.  
  4121. Una vez modificado el gráfico permanecerá así durante el resto de la
  4122. ejecución del programa, a no ser que se descargue el gráfico de memoria
  4123. (con {#169,unload_fpg()} o {#176,unload_map()}) y se vuelva a cargar, en
  4124. cuyo caso se recuperará el estado original del gráfico.
  4125.  
  4126. {#9999,Programa ejemplo:}
  4127. PROGRAM ejemplo_refresh_scroll;
  4128.  
  4129. BEGIN
  4130.     load_fpg("help\help.fpg");
  4131.     start_scroll(0, 0, 103, 102, 0, 15);
  4132.     scroll.camera=id;
  4133.     write(0, 160, 192, 7, "Pulse [ENTER] para poner un gráfico en el scroll.");
  4134.     write(0, 160, 200, 7, "Pulse [ESPACIO] para actualizar scroll.");
  4135.     LOOP
  4136.         IF (scan_code==_enter)
  4137.            map_put(0, 103, 100, rand(16, 48), rand(16, 48));
  4138.         END
  4139.         IF (scan_code==_space)
  4140.  
  4141.             refresh_scroll(0); // Refrescamos el scroll 0.
  4142.  
  4143.         END
  4144.         x+=2;
  4145.         y+=1;
  4146.         FRAME;
  4147.     END
  4148. END
  4149. {-}
  4150.  
  4151. En el ejemplo se crea el scroll (número 0) como un scroll de dos planos:
  4152. el primero con el gráfico número 103 y el plano de fondo con el gráfico número 102.
  4153.  
  4154. Dentro del bucle principal se imprimirá una bola sobre el gráfico 103 (primer
  4155. plano del scroll) cuando se pulse la tecla ENTER. Pero éste no aparecerá
  4156. en pantalla a no ser que se espere a que el scroll entre poco a poco en
  4157. pantalla (con el gráfico 103 ya modificado), o bien se pulse la barra
  4158. espaciadora, en cuyo caso la llamada a la función {refresh_scroll()}
  4159. actualizará la ventana del scroll con el gráfico ya modificado.
  4160.  
  4161. Si en el ejemplo anterior se hubiera llamado a la función {refresh_scroll()}
  4162. justo a continuación de {#137,map_put()}, los gráficos impresos sobre el
  4163. primer plano aparecerían instantáneamente al pulsar la barra espaciadora.
  4164.  
  4165. En el ejemplo, cada vez que se imprime una bola aparecen muchas; esto es
  4166. debido a que el gráfico 103 utilizado como primer plano en el scroll
  4167. es un gráfico pequeño y se muestra varias veces, en mosaico, para rellenar
  4168. toda la zona de scroll.
  4169.  
  4170. {/}
  4171.  
  4172. {Nota:} Se puede observar que si el gráfico que se imprime está en unas
  4173. coordenadas fuera de pantalla, no será necesario llamar a esta función ya
  4174. que las partes del scroll que van entrando en pantalla se van refrescando
  4175. automáticamente.
  4176.  
  4177. {/}Ver: {#163,start_scroll()} - {#140,move_scroll()} - {#1101,Estructura scroll}
  4178.  
  4179. # ─────────────────────────────────────────────────────────────────────────────
  4180.  
  4181. {.153,reset_fli()}
  4182. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  4183.  
  4184. {reset_fli()}
  4185.  
  4186. {Descripción:}
  4187.  
  4188. Esta función {rebobina} hasta el principio una animación {FLI/FLC} que se
  4189. inició con la función {#161,start_fli()}.
  4190.  
  4191. Tras llamar a esta función, la animación se volverá a mostrar completa
  4192. desde el principio (para visualizar cada fotograma de la animación se debe
  4193. llamar a la función {#115,frame_fli()}).
  4194.  
  4195. La utilidad de esta función reside en poder parar una animación y, sin
  4196. descargarla ({#108,end_fli()}) y volverla a cargar, volver a repetirla
  4197. desde el principio.
  4198.  
  4199. Si una animación se quiere tocar indefinidamente, volviendo a empezar cuando
  4200. llegue al final, entonces {no es necesario utilizar esta función}, ya que
  4201. esto se hará de forma automática con {#115,frame_fli()}, si se sigue llamando
  4202. una vez haya terminado la animación.
  4203.  
  4204. Sólo es posible tener una animación a la vez, por lo que no es necesario
  4205. especificar ningún parámetro para esta función.
  4206.  
  4207. {#9999,Programa ejemplo:}
  4208. PROGRAM ejemplo_reset_fli;
  4209. BEGIN
  4210.     start_fli("help\help.fli", 0, 0);
  4211.     write(0, 160, 0, 1, "Pulse [ESPACIO] para reiniciar la animación.");
  4212.     LOOP
  4213.         frame_fli();
  4214.         IF (scan_code==_space)
  4215.  
  4216.             reset_fli(); // Se inicializa la animación
  4217.  
  4218.         END
  4219.         FRAME;
  4220.     END
  4221. END
  4222. {-}
  4223.  
  4224. En el ejemplo se carga una animación con la función {#161,start_fli()} y
  4225. después se toca indefinidamente con la función {#115,frame_fli()}.
  4226.  
  4227. En el bucle se comprueba si se ha pulsado la barra espaciadora, y si está
  4228. pulsada se reinicializa con la función {reset_fli()}.
  4229.  
  4230. {/}Ver: {#161,start_fli()} - {#115,frame_fli()} - {#108,end_fli()}
  4231.  
  4232. # ─────────────────────────────────────────────────────────────────────────────
  4233.  
  4234. {.154,roll_palette()}
  4235. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  4236.  
  4237. {roll_palette(}<color inicial>{,} <número de colores>{,} <incremento>{)}
  4238.  
  4239. {Descripción:}
  4240.  
  4241. Rota una gama de colores de la paleta. Esta función sirve para crear efectos
  4242. de movimiento en gráficos estáticos, como el efecto del agua corriendo.
  4243.  
  4244. Para utilizar esta función se deben crear primero gráficos que utilicen
  4245. una gama de colores consecutivos de la paleta original, en un ciclo perpetuo,
  4246. por ejemplo, los colores del {0} al {15}, pintando algo con los colores
  4247. 0, 1, 2, 3, ... , 14, 15, 0, 1, 2, ...
  4248.  
  4249. Después, hay que tener cuidado de que dichos colores no sean utilizados por
  4250. otros gráficos que vayan a aparecer en pantalla al mismo tiempo, si no se
  4251. quiere también el efecto en ellos.
  4252.  
  4253. El {incremento} (tercer parámetro) suele ser {1} para realizar la rotación
  4254. en un sentido y{ -1} para realizarla en el otro, pero se pueden utilizar otros
  4255. valores para realizar el ciclo de colores a más velocidad.
  4256.  
  4257. Para realizar un ciclo de los colores del {0} al {15} se especificaría {0}
  4258. como <color inicial> y {16} como <número de colores>.
  4259.  
  4260. {#9999,Programa ejemplo:}
  4261. PROGRAM ejemplo_roll_palette;
  4262. BEGIN
  4263.     load_fpg("help\help.fpg");
  4264.     put_screen(0, 2);
  4265.     write(0, 160, 0, 1, "Pulse [ESPACIO] para rotar la paleta entera.");
  4266.     LOOP
  4267.         IF (scan_code==_space)
  4268.  
  4269.             roll_palette(0, 256, 1); // Se rotan los 256 colores.
  4270.  
  4271.         END
  4272.         FRAME;
  4273.     END
  4274. END
  4275. {-}
  4276.  
  4277. En el ejemplo se pone como fondo una pantalla multicolor y dentro del bucle
  4278. principal del programa se rotarán los 256 colores de la paleta cada vez que
  4279. se pulse la barra espaciadora.
  4280.  
  4281. {/}
  4282.  
  4283. Si se quiere determinar la paleta con la que se debe realizar el ciclo de
  4284. color, se debe cargar ésta de un archivo con la función {#133,load_pal()}.
  4285.  
  4286. {/}
  4287.  
  4288. Para realizar otros efectos de paleta, sin sustituir unos colores por otros
  4289. en ciclos, se debe utilizar la función {#110,fade()} que permite realizar
  4290. múltiples fundidos y saturaciones de color a diferentes velocidades.
  4291.  
  4292. Existen dos versiones simplificadas de esta última función que permiten
  4293. realizar un fundido a negro ({#111,fade_off()}) y deshacerlo ({#112,fade_on()}).
  4294.  
  4295. {/}Ver: {#133,load_pal()} - {#110,fade()} - {#111,fade_off()} - {#112,fade_on()}
  4296.  
  4297. # ─────────────────────────────────────────────────────────────────────────────
  4298.  
  4299. {.155,save()}
  4300. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  4301.  
  4302. {save(}<nombre de archivo>{,} <OFFSET dato>{,} <sizeof(dato)>{)}
  4303.  
  4304. {Descripción:}
  4305.  
  4306. Graba un bloque de datos desde la memoria del programa a un archivo en el disco
  4307. para recuperarlos después, cuando se requiera, con la función {#130,load()}.
  4308.  
  4309. Para ello, la función requiere el {nombre del archivo}, el desplazamiento dentro
  4310. de la memoria del ordenador de la variable, tabla o estructura guardada en
  4311. el disco (el desplazamiento del dato se obtiene con {#1085,OFFSET} {<nombre del dato>})
  4312. y el número de posiciones de memoria que ocupa dicho dato (lo que se puede obtener
  4313. con {#1094,sizeof}{(<nombre del dato>)}).
  4314.  
  4315. Es posible guardar varios datos (variables, tablas o estructuras) si estos
  4316. se han definido dentro de la misma sección ({#1006,GLOBAL}, {#1007,LOCAL}
  4317. o {#1008,PRIVATE}) y de forma consecutiva; en este caso se debe indicar
  4318. como {segundo parámetro} el {#1085,OFFSET} del primer dato, y como {tercer
  4319. parámetro} la suma de los {#1094,sizeof()} de todos los datos.
  4320.  
  4321. No es necesario especificar una ruta de acceso junto al nombre de archivo.
  4322.  
  4323. {#9999,Programa ejemplo:}
  4324. PROGRAM ejemplo_load;
  4325.  
  4326. PRIVATE
  4327.     tabla[9];
  4328.     contador;
  4329.  
  4330. BEGIN
  4331.     write (0, 0, 0, 0, "Pulse [ENTER] para borrar los datos.");
  4332.     write (0, 0, 10, 0, "Pulse [ESPACIO] para cargar los datos del disco");
  4333.     write (0, 0, 30, 0, "Valores actuales de los datos:");
  4334.     FROM contador=0 TO 9;
  4335.         tabla[contador]=rand(0, 100);
  4336.         write_int(0, 0, 40+(contador*10), 0, offset tabla[contador]);
  4337.     END
  4338.  
  4339.     save("help\help.dat", offset tabla, sizeof(tabla)); // Se graba el archivo.
  4340.  
  4341.     LOOP
  4342.         IF (key(_enter))
  4343.             FROM contador=0 TO 9;
  4344.                 tabla[contador]=0;
  4345.             END
  4346.         END
  4347.         IF (key(_space))
  4348.             load("help\help.dat", offset tabla);
  4349.         END
  4350.         FRAME;
  4351.     END
  4352. END
  4353. {-}
  4354.  
  4355. Al inicio del ejemplo se crea una tabla de 10 posiciones (del 0 al 9)
  4356. con valores aleatorios. Esta tabla se graba en el disco con la función
  4357. {save()}.
  4358.  
  4359. Cuando se pulsa la tecla ENTER se borran los valores de la tabla (se ponen
  4360. a 0 las 10 posiciones).
  4361.  
  4362. Cuando se pulsa la barra espaciadora se cargan los valores de la tabla
  4363. del disco con la función {#130,load()}.
  4364.  
  4365. {/}
  4366.  
  4367. Para grabar en el mismo archivo {tabla[9]} y la variable {contador} se
  4368. debería haber llamado a la función {save()} de la siguiente forma:
  4369.  
  4370.   {save("help\help.dat", offset tabla, sizeof(tabla)+sizeof(contador));}
  4371.  
  4372. No variando la instrucción de carga ({load("help\help.dat", offset tabla);}), ya
  4373. que ésta no requiere el número de datos.
  4374.  
  4375. El valor devuelto por {#1094,sizeof()} para cualquier variable (como {contador})
  4376. será siempre 1, y para una tabla el número de posiciones de la misma, luego
  4377. la sentencia de grabación podría ponerse como (teniendo en cuenta que se
  4378. van a grabar 11 datos, 10 de la tabla y 1 de la variable):
  4379.  
  4380.   {save("help\help.dat", offset tabla, 11);
  4381.  
  4382. {/}Ver: {#130,load()} - {#1085,OFFSET} - {#1094,sizeof()}
  4383.  
  4384. # ─────────────────────────────────────────────────────────────────────────────
  4385.  
  4386. {.156,set_fps()}
  4387. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  4388.  
  4389. {set_fps(}<nº de imágenes por segundo>{,} <nº de saltos permitidos>{)}
  4390.  
  4391. {Descripción:}
  4392.  
  4393. Esta función es la que regula la velocidad a la que van los juegos; define
  4394. el número de imágenes por segundo que se mostrarán del juego (el número de
  4395. fotogramas por segundo).
  4396.  
  4397. Por defecto la visualización se regulará a 18 imágenes por segundo, lo cual
  4398. quiere decir que si un proceso se mueve un punto por cada imagen ({FRAME}),
  4399. éste se moverá en pantalla a una velocidad de 18 puntos por segundo.
  4400.  
  4401. Esta función puede fijar el número de imágenes por segundo ({FPS}, Frames
  4402. Per Second) desde {4} como mínimo hasta {200} como máximo; en general no
  4403. son necesarias más de 24 imágenes por segundo para conseguir un movimiento
  4404. fluido y suave.
  4405.  
  4406. El segundo parámetro, {número máximo de saltos permitidos}, se refiere a cómo
  4407. es preferible que se comporte el programa cuando se ejecute en un ordenador
  4408. que sea lo suficientemente rápido como para calcular el número de imágenes
  4409. por segundo que se solicita. Funciona como se muestra a continuación.
  4410.  
  4411. {Número de saltos permitidos.}
  4412.  
  4413. {0} - El juego irá a menos velocidad cuando se ejecute en un ordenador demasiado
  4414. lento, es decir, se mostrarán las imágenes por segundo que a ese ordenador
  4415. le de tiempo a calcular.
  4416.  
  4417. {1} - Si el ordenador no puede calcular todas las imágenes, se le permite que
  4418. de vez en cuando omita alguna imagen para intentar mantener la velocidad
  4419. relativa del juego. El juego se verá un poco más brusco, pero más rápido.
  4420.  
  4421. {2 o más} - Se permite al juego que salte tantas imágenes consecutivas como
  4422. se indica en este parámetro con tal de mantener la velocidad relativa original
  4423. del juego. Por ejemplo, si se fija el número de saltos a {4} y en el juego un
  4424. proceso se desplazaba de un punto en un punto, en un ordenador muy lento se
  4425. podría llegar a desplazar de hasta 4 puntos en 4 puntos.
  4426.  
  4427. {#9999,Programa ejemplo:}
  4428. PROGRAM ejemplo_set_fps;
  4429.  
  4430. PRIVATE
  4431.     imágenes=24;
  4432.     saltos=4;
  4433.  
  4434. BEGIN
  4435.     load_fpg("help\help.fpg");
  4436.     graph=1;
  4437.     x=160;
  4438.     y=100;
  4439.     write(0, 0, 0, 0, "Imágenes por segundo: Arriba(+) / Abajo(-)");
  4440.     write_int(0, 0, 10, 0, offset imágenes);
  4441.     write(0, 0, 20, 0, "Saltos permitidos: Derecha(+) / Izquierda(-)");
  4442.     write_int(0, 0, 30, 0, offset saltos);
  4443.     write(0, 160, 200, 7, "Utilice los CURSORES para cambiar los valores.");
  4444.     LOOP
  4445.  
  4446.         // Se elige el número imagenes por segundo
  4447.         set_fps(imágenes, saltos);
  4448.  
  4449.         IF (key(_up) AND imágenes<200) imágenes++; END
  4450.         IF (key(_down) AND imágenes>4) imágenes--; END
  4451.         IF (key(_right) AND saltos<20) saltos++; END
  4452.         IF (key(_left) AND saltos>0) saltos--; END
  4453.         angle+=4000;
  4454.         FRAME;
  4455.     END
  4456. END
  4457. {-}
  4458.  
  4459. En el ejemplo se imprimen los mensajes necesarios y el proceso
  4460. principal crea un gráfico en el centro de la pantalla rotando
  4461. indefinidamente.
  4462.  
  4463. En cada paso del bucle se detectan las teclas del cursor, se cambia
  4464. el número de imágenes por segundo ({imágenes}) con {arriba/abajo} y
  4465. el máximo número de saltos permitidos ({saltos}) con {derecha/izquierda}.
  4466.  
  4467. Al comienzo de cada iteración del bucle se establece la velocidad según
  4468. los valores de ambas variables, con la función {set_fps()}.
  4469.  
  4470. {/}Ver: {#1029,FRAME} - {#1115,max_process_time} -{#157,set_mode()}
  4471.  
  4472. # ─────────────────────────────────────────────────────────────────────────────
  4473.  
  4474. {.157,set_mode()}
  4475. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  4476.  
  4477. {set_mode(}<nuevo modo de vídeo>{)}
  4478.  
  4479. {Descripción:}
  4480.  
  4481. Fija un nuevo modo de vídeo para la ejecución del juego. Los modos de vídeo
  4482. soportados que se pueden especificar como parámetro son:
  4483.  
  4484.   {m320x200}  - VGA estándar·
  4485.   {m320x240}  - Modo X·
  4486.   {m320x400}  - Modo X·
  4487.   {m360x240}  - Modo X·
  4488.   {m360x360}  - Modo X·
  4489.   {m376x282}  - Modo X·
  4490.   {m640x400}  - SVGA VESA·
  4491.   {m640x480}  - SVGA VESA·
  4492.   {m800x600}  - SVGA VESA·
  4493.   {m1024x768} - SVGA VESA·
  4494.  
  4495. Al realizarse un cambio de modo de vídeo en el programa se realizará
  4496. automáticamente un fundido a negro (de la paleta de colores del programa) y
  4497. en las siguientes visualizaciones del juego se irá restaurando gradualmente
  4498. la paleta de colores, es decir, {set_mode()} realiza siempre un {#111,fade_off()}
  4499. justo antes de cambiar el modo de vídeo y un {#112,fade_on()} justo después
  4500. de haberlo cambiado.
  4501.  
  4502. Por defecto todos los programas comienzan con el modo de 320 por 200 puntos
  4503. activado ({set_mode(m320x200)}).
  4504.  
  4505. {#9999,Programa ejemplo:}
  4506. PROGRAM ejemplo_set_mode;
  4507.  
  4508. PRIVATE
  4509.     modos[]=
  4510.         m320x200, m320x240, m320x400, m360x240, m360x360,
  4511.         m376x282, m640x400, m640x480, m800x600, m1024x768;
  4512.     modovideo=0;
  4513.  
  4514. BEGIN
  4515.     load_fpg("help\help.fpg");
  4516.     write (0, 0, 0, 0, "Pulse [ESPACIO] para cambiar el modo de vídeo");
  4517.     LOOP
  4518.         IF (scan_code==_space)
  4519.             modovideo=modovideo+1;
  4520.             IF (modovideo==10) modovideo=0; END
  4521.  
  4522.             set_mode(modos[modovideo]);
  4523.  
  4524.         END
  4525.         FRAME;
  4526.     END
  4527. END
  4528. {-}
  4529.  
  4530. En el ejemplo se pone un fondo de pantalla y un texto explicativo.
  4531.  
  4532. En la iteración del bucle principal, si se pulsa la barra espaciadora, se
  4533. activará un nuevo modo de vídeo con la función {set_mode()}.
  4534.  
  4535. {/}
  4536.  
  4537. {Importante:} Al utilizar la función {set_mode()} se eliminarán todas las ventanas de
  4538. scroll y de modo 7 que estuvieran activas en el juego y todos los procesos
  4539. que se estuvieran visualizando en ellas.
  4540.  
  4541. {/}Ver: {#156,set_fps()} - {#1115,max_process_time} - {#1150,Constantes m320x200 ... m1024x768}
  4542.  
  4543. # ─────────────────────────────────────────────────────────────────────────────
  4544.  
  4545. {.158,signal()}
  4546. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  4547.  
  4548. {signal(}<id>{,} <señal>{)}
  4549.  
  4550. {Descripción:}
  4551.  
  4552. Manda una señal a un proceso (un objeto del juego). Esta función se utiliza
  4553. principalmente (aunque no sólo) para destruir (matar) a un proceso desde otro, enviándole una
  4554. señal {#1153,s_kill}.
  4555.  
  4556. Si desconoce a qué se hace referencia cuando se habla del proceso padre, hijo,
  4557. {hermano}, un proceso {huérfano}, etc., entonces vea {#1041,Jerarquías de procesos}.
  4558.  
  4559. Si desconoce los términos vivo, {muerto}, {dormido}, etc., referidos a
  4560. procesos, vea {#1040,Estados de un proceso}.
  4561.  
  4562. {#9999,Ejemplo:}
  4563. PROGRAM mi_juego;
  4564. PRIVATE id2;
  4565. BEGIN
  4566.     id2=mi_proceso();
  4567.     // ...
  4568.     signal(id2, s_kill);
  4569. END
  4570. PROCESS mi_proceso()
  4571. BEGIN
  4572.     // ...
  4573.     LOOP
  4574.         FRAME;
  4575.     END
  4576. END
  4577. {-}
  4578.  
  4579. Este programa crearía un proceso de tipo {mi_proceso} y después lo eliminaría
  4580. con la sentencia {signal(id2,s_kill)} (id2 es una variable del programa principal
  4581. que contiene el {#1039,código identificador} del proceso que se va a destruir).
  4582.  
  4583. Cualquier proceso puede enviar una señal a otro, siempre que disponga de su
  4584. {#1039,código identificador}, ver:
  4585.  
  4586.   {#1039,Códigos identificadores de procesos}·
  4587.   {#1038,Formas de obtener el código identificador de un proceso}·
  4588.  
  4589. No obstante, hay otros {tipos de señales} que se le pueden enviar a un proceso,
  4590. y son las siguientes:
  4591.  
  4592. {#1153,s_kill} - Orden de {matar} al proceso, el proceso ya no aparecerá en las
  4593. siguientes imágenes del juego.
  4594.  
  4595. {#1155,s_sleep} - Orden de {dormir} al proceso, el proceso quedará paralizado sin
  4596. ejecutar su código y sin visualizarse en pantalla (ni poder ser detectado
  4597. por el resto de los procesos), como si se hubiera matado. Pero el proceso
  4598. seguirá existiendo en la memoria del ordenador (ver {s_wakeup}).
  4599.  
  4600. {#1156,s_freeze} - Orden de {congelar} al proceso, el proceso quedará inmovilizado
  4601. sin ejecutar su código, pero seguirá visualizándose en pantalla y pudiendo
  4602. ser detectado (en las colisiones) por el resto de procesos. El proceso
  4603. seguirá existiendo en la memoria del ordenador a pesar de no ejecutarse
  4604. su código (ver {s_wakeup}).
  4605.  
  4606. {#1154,s_wakeup} - Orden de {despertar} al proceso, devuelve a su estado normal
  4607. un proceso que ha sido {dormido} o {congelado}; a partir del momento en que
  4608. reciba esta señal el proceso volverá a ejecutarse y visualizarse normalmente.
  4609. No se puede devolver a su estado normal un proceso que ha sido eliminado
  4610. (matado) pues ya ha dejado de existir en la memoria del ordenador.
  4611.  
  4612. Un proceso puede enviarse también estas señales a sí mismo, teniendo en cuenta
  4613. que el {#1039,código identificador} de un proceso es siempre {#1092,ID} (palabra
  4614. reservada en el lenguaje para tal fin). La sentencia sería como la siguiente:
  4615.  
  4616. {signal(}{#1092,id}{,} <señal>{)}
  4617.  
  4618. Auto-eliminar un proceso de esta forma, enviándose una señal {#1153,s_kill}, no
  4619. destruirá el proceso instantáneamente, sino en la próxima visualización
  4620. ({#1029,FRAME}). Para eliminar un proceso de forma inmediata se
  4621. puede utilizar la sentencia {#1028,RETURN}.
  4622.  
  4623. {Todas las señales enviadas a procesos tendrán efecto justo antes de la próxima
  4624. visualización del juego}, es decir, en la próxima imagen ({#1029,FRAME}) del juego (no
  4625. instantáneamente).
  4626.  
  4627. Además de estas cuatro señales existen otras cuatro que se corresponden
  4628. directamente con las anteriores y son: {#1157,s_kill_tree}, {#1158,s_sleep_tree},
  4629. {#1160,s_freeze_tree} y {#1159,s_wakeup_tree}.
  4630.  
  4631. Estas señales se utilizan cuando se quieren enviar, no sólo al proceso indicado,
  4632. sino, además, {a todos los procesos que éste haya creado}, es decir, si se envía
  4633. una señal {#1157,s_kill_tree} a un proceso, se destruirá él y toda su descendencia
  4634. (hijos, nietos, ...), todos los procesos que haya creado y los que hayan creado
  4635. estos.
  4636.  
  4637. Una excepción a estas últimas cuatro señales es cuando existe un {proceso
  4638. huérfano}, esto es, un proceso cuyo padre (el proceso que lo llamó) ya
  4639. está muerto. Los procesos huérfanos no recibirán la señal cuando se
  4640. les envíe a un proceso del cual son descendencia, pues al haber desaparecido
  4641. su padre, éste no podrá transmitir la señal a los procesos que creó.
  4642.  
  4643. {#9999,Programa ejemplo:}
  4644. PROGRAM ejemplo_signal;
  4645. PRIVATE
  4646.     id_text;
  4647. BEGIN
  4648.     load_fpg("help\help.fpg");
  4649.     put_screen(0, 1);
  4650.     write(0, 0, 0, 0, "1 - crear el proceso");
  4651.     write(0, 0, 10, 0, "2 - matar el proceso");
  4652.     write(0, 0, 20, 0, "3 - dormir el proceso");
  4653.     write(0, 0, 30, 0, "4 - congelar el proceso");
  4654.     write(0, 0, 40, 0, "5 - despertar el proceso");
  4655.     id_text=write(0, 0, 190, 0, "No hay proceso");
  4656.     LOOP
  4657.         IF (key(_1) AND NOT son)
  4658.             delete_text(id_text);
  4659.             mi_proceso();
  4660.             id_text=write(0, 0, 190, 0, "Proceso vivo");
  4661.         END
  4662.         IF (key(_2) AND son)
  4663.             delete_text(id_text);
  4664.             signal(son, s_kill);
  4665.             id_text=write(0, 0, 190, 0, "No hay proceso");
  4666.         END
  4667.         IF (key(_3) AND son)
  4668.             delete_text(id_text);
  4669.             signal(son, s_sleep);
  4670.             id_text=write(0, 0, 190, 0, "Proceso dormido");
  4671.         END
  4672.         IF (key(_4) AND son)
  4673.             delete_text(id_text);
  4674.             signal(son, s_freeze);
  4675.             id_text=write(0, 0, 190, 0, "Proceso congelado");
  4676.         END
  4677.         IF (key(_5) AND son)
  4678.             delete_text(id_text);
  4679.             signal(son, s_wakeup);
  4680.             id_text=write(0, 0, 190, 0, "Proceso vivo");
  4681.         END
  4682.         FRAME;
  4683.     END
  4684. END
  4685.  
  4686. PROCESS mi_proceso()
  4687. BEGIN
  4688.     graph=100;
  4689.     LOOP
  4690.         x=160+get_distx(angle, 140);
  4691.         y=100+get_disty(angle, 80);
  4692.         angle+=5000;
  4693.         FRAME;
  4694.     END
  4695. END
  4696. {-}
  4697.  
  4698. Este programa creará con la tecla {1} un proceso ({mi_proceso}) que va
  4699. dando vueltas a la pantalla; con las teclas {2} a {5} se le enviarán a dicho
  4700. proceso diferentes señales utilizando esta función. El {#1039,código identificador}
  4701. de {mi_proceso} está en la variable local {son} (hijo) del programa principal
  4702. por defecto.
  4703.  
  4704. Cuando se crea un proceso, el sistema define la variable {#1118,son} del padre con el
  4705. {#1039,código identificador} del hijo, y la variable {#1117,father} del hijo con el código
  4706. identificador del padre.
  4707.  
  4708. {/}
  4709.  
  4710. {signal(}{#1042,TYPE} <nombre de proceso>{,} <señal>{)}
  4711.  
  4712. {Descripción:}
  4713.  
  4714. Esta segunda acepción de la función {signal} es similar a la anterior,
  4715. con la excepción de que, en lugar de enviarle una señal a un proceso a partir
  4716. de su {#1039,código identificador}, permite enviar una señal {a todos los procesos
  4717. de un tipo determinado} o a ellos y su descendencia si se utilizan las
  4718. señales como {s_kill_tree} (ver: {#1042,Tipos de procesos}).
  4719.  
  4720. Por ejemplo, si en un juego existen, o pueden existir, varios procesos
  4721. de tipo {enemigo} y se quiere congelar a dichos procesos (sin congelar
  4722. a su descendencia) se utilizará la siguiente sentencia:
  4723.  
  4724.   {signal(TYPE enemigo, s_freeze);}
  4725.  
  4726. Como se puede observar para enviar una señal a un proceso en concreto se
  4727. necesita su {#1039,código identificador} y para destruir a un grupo de procesos,
  4728. que estos sean todos del mismo tipo, que se trate de un proceso y su
  4729. descendencia, o bien conocer todos sus identificadores (para enviarles la
  4730. señal uno a uno).
  4731.  
  4732. Se puede enviar una señal a un tipo de procesos aun cuando no exista
  4733. ningún proceso de ese tipo ejecutándose en el juego. Pero si se envía una
  4734. señal a un proceso que ya ha muerto, con su {#1039,código identificador} (primera
  4735. acepción de la sentencia {signal}), se corre el riesgo de que dicho
  4736. {#1039,código identificador} ahora sea usado por otro proceso, siendo éste el que
  4737. reciba la señal. Esto es si, por ejemplo, se pretende matar a un proceso que ya
  4738. está muerto, cabe la posibilidad de que se esté matando a otro.
  4739.  
  4740. {/}
  4741.  
  4742. {Nota:} Si se quieren eliminar todos los procesos y dejar únicamente al proceso
  4743. actual, se puede utilizar la función {#129,let_me_alone()}. Esta función
  4744. envía una señal {s_kill} a todos los procesos, excepto al que ejecutó dicha
  4745. función.
  4746.  
  4747. {/}Ver: {#129,let_me_alone()} - {#1039,Códigos identificadores} - {#1042,Tipos de procesos}
  4748.  
  4749. # ─────────────────────────────────────────────────────────────────────────────
  4750.  
  4751. {.159,sound()}
  4752. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  4753.  
  4754. {sound(}<código del sonido>{,} <volumen>{,} <frecuencia>{)}
  4755.  
  4756. {Retorna:}
  4757.  
  4758. El {número de canal} por el que se reproduce el sonido.
  4759.  
  4760. {Descripción:}
  4761.  
  4762. Hace sonar el efecto cuyo {código de sonido} se especifica como primer parámetro.
  4763. Primero, el sonido se debe haber cargado de un archivo PCM con la función {#134,load_pcm()}
  4764. que es la que devuelve el {código de sonido} correspondiente a dicho efecto.
  4765.  
  4766. Como segundo parámetro se debe especificar el {volumen} al que se desea reproducir
  4767. el sonido, siendo {0} el volumen mínimo y {256} el volumen máximo.
  4768.  
  4769. Como tercer parámetro se especificará la {frecuencia} (velocidad) a la que se
  4770. desea reproducir el sonido, siendo {256} la frecuencia estándar que reproducirá
  4771. el sonido original; a valores menores el sonido se reproducirá más grave, mientras qu a valores
  4772. mayores de frecuencia, más agudo.
  4773.  
  4774. La función devuelve el {número de canal} que puede ser utilizado por las funciones
  4775. {#167,stop_sound()} para detener el sonido y {#102,change_sound()} para modificar su volumen o
  4776. su frecuencia.
  4777.  
  4778. Existen un total de 16 canales de sonido, pudiendo sonar hasta 16 sonidos
  4779. simultáneamente.
  4780.  
  4781. {#9999,Programa ejemplo:}
  4782. PROGRAM ejemplo_sound;
  4783.  
  4784. PRIVATE
  4785.     volumen=128;        // Valor medio (0..256)
  4786.     frecuencia=256;     // Valor medio (0..512)
  4787.     id_sonido, canal;
  4788.  
  4789. BEGIN
  4790.     load_fpg("help\help.fpg");
  4791.     put_screen(0, 1);
  4792.     write(0, 0, 0, 0, "Volumen: Arriba(+) / Abajo(-)");
  4793.     write_int(0, 0, 10, 0, offset volumen);
  4794.     write(0, 0, 20, 0, "Frecuencia: Derecha(+) / Izquierda(-)");
  4795.     write_int(0, 0, 30, 0, offset frecuencia);
  4796.     write(0, 160, 180, 1, "Pulse [ESPACIO] para emitir el el sonido.");
  4797.     write(0, 160, 190, 1, "Utilice los cursores para cambiar los valores.");
  4798.  
  4799.     id_sonido = load_pcm("help\help.pcm", 0);
  4800.  
  4801.     LOOP
  4802.         IF (scan_code==_space)
  4803.  
  4804.             // Hace que suene
  4805.             canal = sound(id_sonido, volumen, frecuencia);
  4806.  
  4807.         END
  4808.         IF (key(_up) AND volumen<256) volumen++; END
  4809.         IF (key(_down) AND volumen>0) volumen--; END
  4810.         IF (key(_right) AND frecuencia<512) frecuencia++; END
  4811.         IF (key(_left) AND frecuencia>0) frecuencia--; END
  4812.         FRAME;
  4813.     END
  4814. END
  4815. {-}
  4816.  
  4817. En el ejemplo se pone una pantalla de fondo y un texto explicativo,
  4818. y se carga un sonido con la función {#134,load_pcm()}; ésta devuelve el
  4819. {identificador del sonido}, que se guarda en la variable {id_sonido}.
  4820.  
  4821. En el bucle principal, a cada pulsación de la barra espaciadora, se
  4822. emitirá el sonido con la función {sound()} con los parámetros definidos
  4823. en las variables {volumen} y {frecuencia}.
  4824.  
  4825. Con las teclas de los cursores se podrán manipular estos valores para
  4826. comprender así mejor su funcionamiento.
  4827.  
  4828. El {número de canal} devuelto por {sound()}, que se guarda en la variable
  4829. {canal}, se podría haber utilizado para modificar el sonido con {#102,change_sound()}
  4830. o pararlo con {#167,stop_sound()}.
  4831.  
  4832. {/}Ver: {#134,load_pcm()} - {#170,unload_pcm()} - {#102,change_sound()} - {#167,stop_sound()}
  4833.  
  4834. # ─────────────────────────────────────────────────────────────────────────────
  4835.  
  4836. {.160,sqrt()}
  4837. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  4838.  
  4839. {sqrt(}<expresión>{)}
  4840.  
  4841. {Retorna:}
  4842.  
  4843. La raíz cuadrada entera de la expresión.
  4844.  
  4845. {Descripción:}
  4846.  
  4847. Calcula la raíz cuadrada de la expresión pasada como parámetro, {truncada a
  4848. un número entero}.
  4849.  
  4850. Por ejemplo, {sqrt(10)} devolverá como resultado {3} y no {3.1623} que es
  4851. el valor real (aproximado) de la raíz cuadrada de diez.
  4852.  
  4853. {#9999,Programa ejemplo:}
  4854. PROGRAM ejemplo_sqrt;
  4855.  
  4856. GLOBAL
  4857.     valores[15];
  4858.     n;
  4859.  
  4860. BEGIN
  4861.     FROM n=0 to 15;
  4862.         valores[n]=rand(0, 100000);
  4863.         write_int(0, 0, n*10, 0, offset valores[n]);
  4864.     END
  4865.     write(0, 0, 192, 0, "Pulse [ESPACIO] para calcular su raíz cuadrada");
  4866.     LOOP
  4867.         IF (scan_code==_space)
  4868.             FROM n=0 TO 15;
  4869.  
  4870.                 valores[n] = sqrt(valores[n]);
  4871.  
  4872.             END
  4873.         END
  4874.         FRAME;
  4875.     END
  4876. END
  4877. {-}
  4878.  
  4879. Este programa imprimirá en pantalla una lista de valores aleatoriamente
  4880. seleccionados; cuando se pulse la barra espaciadora le aplicará
  4881. la función {sqrt()} a todos estos valores, calculando su raíz cuadrada.
  4882.  
  4883. {/}Ver: {#1035,Expresión}
  4884.  
  4885. # ─────────────────────────────────────────────────────────────────────────────
  4886.  
  4887. {.161,start_fli()}
  4888. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  4889.  
  4890. {start_fli(}<nombre de archivo>{,} <x>{,} <y>{)}
  4891.  
  4892. {Retorna:}
  4893.  
  4894. Número de imágenes de la animación.
  4895.  
  4896. {Descripción:}
  4897.  
  4898. Inicia una animación {FLI/FLC} contenida en el {archivo} especificado, en las
  4899. coordenadas ({x}, {y}) (se debe especificar la coordenada superior izquierda
  4900. de la ventana de visualización).
  4901.  
  4902. En el <nombre de archivo> se puede especificar la ruta de acceso, no siendo
  4903. ésta necesaria si el archivo se encuentra en el directorio de DIV Games
  4904. Studio o en un subdirectorio cuyo nombre coincida con la extensión del
  4905. archivo (por ejemplo, "fli\anima.fli").
  4906.  
  4907. La animación debe coger por completo en pantalla, es decir, si la animación
  4908. ocupa toda la pantalla, se debe fijar primero el modo de vídeo con la función
  4909. {#157,set_mode()} y después iniciar con {start_fli()} la animación en las
  4910. coordenadas (0, 0).
  4911.  
  4912. La función devuelve, a título informativo, el número de fotogramas de los
  4913. que consta la animación completa.
  4914.  
  4915. El sistema activará automáticamente las paletas de color que pudiera tener
  4916. la animación {FLI/FLC}, lo que puede presentar problemas en la representanción
  4917. de otros gráficos o fuentes del programa, si éstos hubieran sido dibujados con
  4918. una paleta diferente.
  4919.  
  4920. Si se pretenden combinar otros gráficos con la animación en pantalla, ésta
  4921. debe tener una única paleta de color (lo que se suele denominar "{palette low FLI/FLC}")
  4922. y los gráficos se deben haber dibujado con esa misma paleta.
  4923.  
  4924. Una vez iniciada la animación se irán mostrando los fotogramas de la misma
  4925. con respectivas llamadas a {#115,frame_fli()}.
  4926.  
  4927. {Sólo es posible tener una animación activa en cada momento}, por lo que después
  4928. de haberse iniciado una animación con {start_fli()} y haberse visualizado con
  4929. {#115,frame_fli()}, se debe finalizar ésta con la función {#108,end_fli()} antes
  4930. de iniciar otra animación diferente.
  4931.  
  4932. {#9999,Programa ejemplo:}
  4933. PROGRAM ejemplo_start_fli;
  4934. BEGIN
  4935.  
  4936.     start_fli("help\help.fli", 0, 0); // Se inicia una animación.
  4937.  
  4938.     LOOP
  4939.         frame_fli();
  4940.         FRAME;
  4941.     END
  4942. END
  4943. {-}
  4944.  
  4945. En el ejemplo se inicia la animación contenida en el archivo {help\help.fli} con
  4946. la función {start_fli()} en las coordenadas (0, 0) y se ejecuta esta animación
  4947. indefinidamente.
  4948.  
  4949. {/}
  4950.  
  4951. La función {#115,frame_fli()} utilizada para mostrar cada fotograma devolverá
  4952. 0 cuando la animación haya finalizado, por lo que para mostrar la animación
  4953. una sola vez se debería haber hecho:
  4954.  
  4955. {#9999,Programa ejemplo:}
  4956. PROGRAM ejemplo_start_fli;
  4957.  
  4958. PRIVATE
  4959.     valor;
  4960.  
  4961. BEGIN
  4962.     start_fli("help\help.fli", 0, 0);
  4963.     REPEAT
  4964.         valor=frame_fli();
  4965.         FRAME;
  4966.     UNTIL (valor==0);
  4967.     end_fli();
  4968. END
  4969. {-}
  4970.  
  4971. La función {#153,reset_fli()} permite {rebobinar} la animación, para que
  4972. la función {#115,frame_fli()} continúe ejecutándola desde el principio.
  4973.  
  4974. {/}Ver: {#108,end_fli()} - {#153,reset_fli()} - {#115,frame_fli()}
  4975.  
  4976. # ─────────────────────────────────────────────────────────────────────────────
  4977.  
  4978. {.162,start_mode7()}
  4979. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  4980.  
  4981. {start_mode7(}<número de m7>{,} <fichero>{,} <gráfico>{,} <gráfico exterior>{,}
  4982.               <número de región>{,} <altura del horizonte>{)}
  4983.  
  4984. {Descripción:}
  4985.  
  4986. Ésta es una función avanzada que requiere que el usuario tenga cierta
  4987. soltura para poder utilizarla.
  4988.  
  4989. Crea una ventana de visualización de un modo-7, es decir, visualiza un gráfico
  4990. {tridimensionalmente} en un plano abatido; para conseguir este efecto se llamará
  4991. a esta función con los siguientes parámetros:
  4992.  
  4993. {<número de m7>} - Se pueden crear hasta 10 ventanas de modo-7 en pantalla,
  4994. con los número del {0} al {9}; si únicamente se quiere crear una, lo mejor
  4995. es definir la número {0}. Este número será necesario posteriormente para
  4996. modificar los parámetros de la ventana, pues el sistema necesitará saber
  4997. cuál de las {10} posibles ventanas de modo-7 se quiere alterar.
  4998.  
  4999. {<fichero>} - Los gráficos que se pretendan abatir en la ventana deben estar
  5000. en un fichero cuyo {código de fichero} se debe especificar aquí, como
  5001. segundo parámetro de la función. Los gráficos cargados con la función
  5002. {#174,load_map()} se utilizarán como si pertenecieran al primer fichero (el
  5003. fichero con el código 0).
  5004.  
  5005. {<gráfico>} - El tercer parámetro debe ser el {código del gráfico} principal
  5006. que se va a abatir en la ventana y debe pertenecer al fichero anteriormente
  5007. indicado.
  5008.  
  5009. {<gráfico exterior>} - Aquí se puede indicar un {0} si no se quiere que se
  5010. vea ningún gráfico más allá del gráfico abatido en la perspectiva, o bien un {código
  5011. de gráfico} del mismo fichero que se mostrará en la perspectiva más allá
  5012. del {gráfico principal}, hasta alcanzar el horizonte. Este gráfico debe
  5013. ser de un ancho y alto potencia de dos, no mayor de {8192} (estas potencias
  5014. de dos son: 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096 y 8192),
  5015. por ejemplo, podría ser un gráfico de 64 puntos de ancho por 32 de alto; este
  5016. gráfico se mostrará también abatido.
  5017.  
  5018. {<número de región>} - Aquí se indicará la región rectangular de pantalla
  5019. en la que se va a mostrar el modo-7. Si se indica {0} como número de región,
  5020. se mostrará en toda la pantalla. El resto de regiones se deben definir
  5021. previamente con la función {#106,define_región()} (una {región} no es más
  5022. que una zona rectangular de la pantalla).
  5023.  
  5024. {<altura del horizonte>} - Como último parámetro se indicará a cuántos puntos
  5025. desde la parte superior de la ventana se quiere situar la línea del horizonte.
  5026. Si la cámara se sitúa por encima del plano abatido, entonces no se mostrará
  5027. nada por encima de la línea del horizonte (ese hueco se suele rellenar con
  5028. otra ventana de scroll o de modo-7); en cambio si la camara se sitúa por debajo
  5029. del plano, entonces no se mostrará nada por debajo de la línea del horizonte.
  5030.  
  5031. {/}
  5032.  
  5033. {Además de la llamada a la función se deben inicializar algunos valores de
  5034. la} {#1102,estructura global m7} {para el correcto funcionamiento de la ventana}.
  5035. Ésta es una estructura de 10 registros (uno para cada posible ventana de modo-7)
  5036. y cada registro tiene los siguientes campos:
  5037.  
  5038.   {camera}   - {#1039,Código identificador} de la cámara·
  5039.   {height}   - Altura de la cámara·
  5040.   {distance} - Distancia de la cámara·
  5041.   {horizon}  - Altura del horizonte·
  5042.   {focus}    - Focal de visión·
  5043.   {z}        - Plano de profundidad·
  5044.   {color}    - Color del exterior·
  5045.  
  5046. {Importante:} El campo {camera} es {imprescindible} inicializarlo para que
  5047. se active la ventana de modo 7 ya que, sin este campo, la ventana no puede determinar
  5048. desde dónde se debe {ver} el plano abatido.
  5049.  
  5050. La cámara se situará en el plano abatido a la distancia ({distance}) indicada
  5051. del proceso cuyo {#1039,código identificador} se haya puesto en {camera}, y
  5052. mirando en su mismo ángulo (el que indique su variable local {#1129,angle}).
  5053. La altura a la que se sitúa la cámara respecto al suelo será la indicada en el
  5054. campo {height}.
  5055.  
  5056. Ver la ayuda sobre la {#1102,estructura m7} para más información sobre
  5057. estos campos, o para saber cómo acceder a ellos.
  5058.  
  5059. {/}
  5060.  
  5061. {#9999,Programa ejemplo:}
  5062. PROGRAM ejemplo_start_mode7;
  5063.  
  5064. PRIVATE
  5065.     fichero1;
  5066.  
  5067. BEGIN
  5068.     fichero1=load_fpg("help\help.fpg");
  5069.  
  5070.     start_mode7(0, fichero1, 4, 0, 0, 64);
  5071.  
  5072.     m7.height = 64;
  5073.     m7.distance = 32;
  5074.     m7.color = 162;
  5075.     m7.camera = id;
  5076.  
  5077.     write(0, 160, 0, 1, "Utilice los cursores para moverse");
  5078.     LOOP
  5079.         IF (key(_right)) angle-=8000; END
  5080.         IF (key(_left)) angle+=8000; END
  5081.         IF (key(_up)) advance(6); END
  5082.         FRAME;
  5083.     END
  5084. END
  5085. {-}
  5086.  
  5087. En el ejemplo se carga el fichero de gráficos y entonces se crea un modo 7
  5088. tridimensional con la función {start_mode7()}. A esta última se le pasan
  5089. los siguientes parámetros:
  5090.  
  5091. {0} - Número de ventana de modo 7 (la primera, puesto que sólo se creará
  5092. una ventana de esta clase).
  5093.  
  5094. {fichero1} - Código del fichero del que se deben tomar los gráficos; este
  5095. es el código del archivo {help.fpg} que se cargó con la función {#132,load_fpg()}.
  5096.  
  5097. {4} - Código del gráfico principal a abatir dentro del modo 7; para ver
  5098. este gráfico se debe cargar el fichero con el {Menú de ficheros} y así poder
  5099. observar cuál es el gráfico con {código 4}.
  5100.  
  5101. {0} - Código de gráfico secundario, con un 0 se indica que no habrá gráfico
  5102. secundario (exterior) en el modo 7, luego el exterior se visualizará del
  5103. color que indique la variable {m7[0].color}. Para observar el efecto de poner
  5104. un {gráfico exterior} se puede cambiar este parámetro, por ejemplo, por un
  5105. {100} (que es el código de una bola marrón de 32 por 32 puntos en el fichero
  5106. {help.fpg}).
  5107.  
  5108. {0} - Número de región de la pantalla en la que se debe {colocar} el modo 7;
  5109. con 0 se indica que se debe colocar en la pantalla entera.
  5110.  
  5111. {64} - Altura del horizonte, con este último parámetro se indica que la línea
  5112. del horizonte se situará a 64 puntos del inicio superior de la ventana.
  5113.  
  5114. Tras llamar a la función {start_mode7()} el programa define los siguientes
  5115. valores de la {#1102,estructura global m7}:
  5116.  
  5117. {m7.height=64;} - Para indicar que la cámara se debe situar a 64 puntos sobre
  5118. el suelo.
  5119.  
  5120. {m7.distance=32;} - Para indicar que la cámara se debe situar 32 puntos por
  5121. detrás del proceso cámara.
  5122.  
  5123. {m7.color=162;} - Para indicar que el exterior se debe visualizar del color
  5124. número 162 de la paleta.
  5125.  
  5126. {m7.camera=}{#1092,id}{;} - Para indicar que el proceso cámara será el proceso actual.
  5127.  
  5128. La cámara se situará 32 puntos por detrás del proceso principal, a 64 puntos
  5129. de altura y mirando en el ángulo que indique la variable {#1129,angle} del
  5130. mismo.
  5131.  
  5132. Tras estas inicializaciones el programa ejemplo se quedará en un bucle que
  5133. simplemente controla con los cursores el ángulo ({#1129,angle}) del proceso
  5134. principal, que será el ángulo de la cámara y, cuando se pulse la tecla {cursor
  5135. arriba}, se llamará a la función {#101,advance()} para que el proceso principal
  5136. avance 6 puntos (y por consiguiente la cámara del modo 7).
  5137.  
  5138. {/}{Cómo visualizar gráficos de procesos sobre el modo 7.}{/}
  5139.  
  5140. Para crear un proceso cuyo gráfico se visualice en el modo 7, se debe
  5141. definir su variable local {#1122,ctype} como {#1169,c_m7} ({tipo de coordenada}
  5142. como {coordenada de modo 7}), lo que se hará con la siguiente sentencia:
  5143.  
  5144.   {ctype=c_m7;}
  5145.  
  5146. Una vez hecho esto el proceso se visualizará en el modo 7 con su gráfico ({#1126,graph})
  5147. escalado acorde a la distancia a la que esté. El proceso únicamente debe
  5148. modificar sus variables {#1123,x} e {#1124,y} para moverse por el plano abatido.
  5149.  
  5150. {/}
  5151.  
  5152. {Cuando un proceso pertenezca al modo-7 (se haya asignado el valor c_m7 a su
  5153. variable local} {#1122,ctype}{):}
  5154.  
  5155.   - Sus variables {#1123,x} e {#1124,y} estarán referidas al punto del gráfico
  5156. principal abatido sobre el cual se situará el gráfico del proceso.
  5157.  
  5158.   - Su variable {#1125,z} perderá su efecto, ya que los gráficos aparecerán
  5159. ordenados por estricto orden de profundidad. Esta variable valdrá únicamente
  5160. para indicar prioridades de impresión en gráficos que se sitúen, exactamente,
  5161. en la misma profundidad del plano.
  5162.  
  5163.   - El proceso será eliminado automáticamente cuando se elimine la ventana
  5164. de modo 7 a la que pertenece el proceso, con la función {#165,stop_mode7()},
  5165. o cuando se cambie el modo de vídeo con la función {#157,set_mode()}, ya que
  5166. al hacerlo se eliminarán también las ventanas de modo 7.
  5167.  
  5168. {/}
  5169.  
  5170. Si hubiera varias ventanas de {modo 7} el proceso se visualizaría por defecto
  5171. en todas, si únicamente se tuviera que visualizar el algunas de ellas, se debería
  5172. definir su variable local {#1134,cnumber}. Por ejemplo, si hubiera 6 ventanas
  5173. de modo 7 (de la número 0 a la 5) y se quisiera que un proceso se visualizara
  5174. únicamente en las ventanas 0 y 2, se debería incluir en el mismo la siguiente
  5175. sentencia:
  5176.  
  5177.   {cnumber=c_0+c_2;}
  5178.  
  5179. {/}
  5180.  
  5181. Para que un proceso tenga varios gráficos (varias vistas), dependiendo
  5182. del ángulo desde el que se le mire, se debe definir su gráfico con la
  5183. variable local {#1132,xgraph} (en lugar de la variable {#1126,graph}).
  5184. Para definir esta variable primero se debe crear una tabla (de cualquier
  5185. nombre) indicando en primer lugar el {número de vistas} del gráfico y después
  5186. los {códigos de los gráficos} para estas vistas, comenzando por el {ángulo
  5187. 0} y en sentido contrario a las agujas del reloj. Por ejemplo:
  5188.  
  5189.   {GLOBAL}·
  5190.     {vistas_coche[]=4, 100, 101, 102, 103;}·
  5191.  
  5192. La tabla {vistas_coche} definiría 4 vistas: el gráfico 100 para ángulos
  5193. próximos a 0 grados, el gráfico 101 para ángulos próximos a 90 grados,
  5194. el 102 para ángulos próximos a 180 grados, etc.
  5195.  
  5196. Y después en el código del proceso se debería inicializar la variable
  5197. {#1132,xgraph} con la siguiente sentencia:
  5198.  
  5199.   {xgraph=OFFSET vistas_coche;}
  5200.  
  5201. Para poder observar un ejemplo de lo aquí expuesto, lo mejor es examinar
  5202. alguno de los juegos ejemplo de DIV Games Studio que utilizan esta técnica,
  5203. por lo que se remite al lector directamente a los comentarios de estos
  5204. programas (por ejemplo véase el ejemplo {Speed for dummies}).
  5205.  
  5206. {/}Ver: {#165,stop_mode7()} - {#1102,Estructura m7}
  5207.  
  5208. # ─────────────────────────────────────────────────────────────────────────────
  5209.  
  5210. {.163,start_scroll()}
  5211. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  5212.  
  5213. {start_scroll(}<número de scroll>{,} <fichero>{,} <gráfico>{,} <gráfico fondo>{,}
  5214.                <número de región>{,} <indicador de bloqueo>{)}
  5215.  
  5216. {Descripción:}
  5217.  
  5218. Esta es una función de cierta complejidad, que requiere que el usuario tenga
  5219. cierta soltura (haya realizado algún programa antes) para poder utilizarla.
  5220.  
  5221. Crea una ventana de scroll, en la que se realizará una panorámica sobre
  5222. un gráfico de fondo (el decorado del juego). Es decir, utilizando como fondo
  5223. del juego un gráfico más grande que la ventana de visualización, se podrá
  5224. mostrar una parte del mismo e ir desplazándolo en cualquier dirección.
  5225.  
  5226. Para conseguir este efecto se llamará a esta función con los siguientes
  5227. parámetros:
  5228.  
  5229. {<número de scroll>} - Se pueden crear hasta 10 ventanas de scroll en pantalla,
  5230. con los números del {0} al {9}; si sólo se quiere crear una, lo mejor
  5231. es definir la número {0}. Este número será necesario posteriormente para
  5232. modificar los parámetros de la ventana, pues el sistema necesitará saber
  5233. cuál de las {10} posibles ventanas de scroll se quiere alterar.
  5234.  
  5235. {<fichero>} - Los gráficos que se pretendan mostrar como fondo o decorado
  5236. en dicha ventana deben estar en un fichero cuyo {código de fichero} se debe
  5237. especificar aquí, como segundo parámetro de la función. Los gráficos cargados
  5238. con la función {#174,load_map()} se utilizarán como si pertenecieran al
  5239. primer fichero (el fichero con el código 0).
  5240.  
  5241. {<gráfico>} - El tercer parámetro debe ser el {código del gráfico} principal
  5242. que se va a mostrar como fondo en la ventana y debe pertenecer al fichero anteriormente
  5243. indicado. Este gráfico suele ser el decorado principal del juego sobre el que
  5244. se va a desarrollar la acción, un gráfico más grande que la ventana de visualización,
  5245. que se irá desplazando en una o varias direcciones y sobre el que se situarán
  5246. los gráficos del juego.
  5247.  
  5248. La ventana de scroll se situará inicialmente con el {#1136,punto de control}
  5249. número {0} de este gráfico en la esquina superior izquierda, cuando se haya
  5250. definido este punto en el {editor gráfico}.
  5251.  
  5252. {<gráfico fondo>} - Aquí se indicará un {0} si se quiere un solo plano de
  5253. scroll (un solo gráfico de fondo), o bien otro {código de gráfico} si se
  5254. quiere que éste aparezca como segundo plano de scroll (a mayor profundidad),
  5255. detrás del plano principal. Para que se vea este plano de fondo es
  5256. imprescindible que el {gráfico principal} (primer plano) tenga partes
  5257. dibujadas con el color número 0 de la paleta, pues estas zonas transparentes
  5258. serán las que permitirán ver a través de ellas el {gráfico de fondo}.
  5259.  
  5260. {<número de región>} - Aquí se indicará la región rectangular de pantalla
  5261. en la que se va a mostrar el scroll, si se indica {0} como número de región,
  5262. se mostrará en toda la pantalla. El resto de regiones se deben definir
  5263. previamente con la función {#106,define_region()} (una {región} no es más
  5264. que una zona rectangular de la pantalla).
  5265.  
  5266. {<indicador de bloqueo>} - Aquí se indicará un valor que define si cada uno
  5267. de los dos planos de scroll es cíclico en horizontal y vertical. Por ejemplo,
  5268. un plano es cíclico en horizontal cuando al salirse del dibujo por la derecha
  5269. aparece el dibujo por la izquierda. Para componer este valor se deben sumar
  5270. las siguientes cantidades:
  5271.  
  5272.  { + 1} - Si el primer plano es cíclico horizontalmente.·
  5273.  { + 2} - Si el primer plano es cíclico verticalmente.·
  5274.  { + 4} - Si el segundo plano es cíclico horizontalmente.·
  5275.  { + 8} - Si el segundo plano es cíclico verticalmente.·
  5276.  
  5277. Es decir, {0} si ninguno de los dos planos debe ser cíclico, {15} ({1}+{2}+{4}+{8})
  5278. si ambos planos deben ser cíclicos en ambos ejes, {12} ({4}+{8}) si únicamente
  5279. debe ser cíclico el segundo plano, etc.
  5280.  
  5281. Cuando un gráfico (principal o de fondo) sea más pequeño que la ventana de visualización,
  5282. el sistema forzará a que su plano de scroll sea cíclico pues, en caso contrario,
  5283. no se podría rellenar la ventana de scroll por completo, sin repetir {cíclicamente}
  5284. el gráfico (en mosaico).
  5285.  
  5286. {/}
  5287.  
  5288. {Además de la llamada a la función se deben inicializar algunos valores de
  5289. la} {#1101,estructura global scroll} {para el correcto funcionamiento de la ventana}.
  5290. Ésta es una estructura de 10 registros (uno para cada posible ventana de scroll)
  5291. y cada registro tiene los siguientes campos:
  5292.  
  5293.   {x0, y0}  - Coordenadas del primer plano·
  5294.   {x1, y1}  - Coordenadas del segundo plano·
  5295.   {z}       - Plano de profundidad·
  5296.   {camera}  - {#1039,Código identificador} de la cámara·
  5297.   {ratio}   - Velocidad relativa del segundo plano·
  5298.   {speed}   - Velocidad máxima del primer plano·
  5299.   {region1} - Primera región de pantalla·
  5300.   {region2} - Segunda región de pantalla·
  5301.  
  5302. Hay dos formas de programar el movimiento de las ventanas de scroll:
  5303.  
  5304. - Manualmente, modificando en cada imagen del juego los campos {x0}, {y0},
  5305. {x1} e {y1} de esta estructura (las coordenadas de los planos de scroll).
  5306.  
  5307. - Automáticamente, para lo que se necesita el {#1038,código identificador}
  5308. de un proceso en el campo {camera} de esta estructura. Siendo a partir de
  5309. entonces el sistema el encargado de realizar en la ventana de scroll un
  5310. seguimiento al gráfico de este proceso.
  5311.  
  5312. Ver la ayuda sobre la {#1101,estructura scroll} para más información sobre
  5313. estos campos, o para saber cómo acceder a ellos.
  5314.  
  5315. {/}
  5316.  
  5317. {#9999,Ejemplo de scroll AUTOMATICO:}
  5318. PROGRAM ejemplo_start_scroll;
  5319.  
  5320. PRIVATE
  5321.     fichero1;
  5322.  
  5323. BEGIN
  5324.     fichero1=load_fpg("help\help.fpg");
  5325.  
  5326.     start_scroll(0, fichero1, 103, 102, 0, 15);
  5327.  
  5328.     scroll.camera=id;
  5329.  
  5330.     ctype=c_scroll;
  5331.     graph=100;
  5332.     write(0, 160, 0, 1, "Utilice los cursores para moverse");
  5333.     LOOP
  5334.         IF (key(_right)) x+=2; END
  5335.         IF (key(_left)) x-=2; END
  5336.         IF (key(_down)) y+=2; END
  5337.         IF (key(_up)) y-=2; END
  5338.         FRAME;
  5339.     END
  5340. END
  5341. {-}
  5342.  
  5343. En el ejemplo se carga el fichero de gráficos y entonces se crea una ventana
  5344. de scroll con la función {start_scroll()}. A esta última se le pasan
  5345. los siguientes parámetros:
  5346.  
  5347. {0} - Número de ventana de scroll (la primera, puesto que sólo se creará
  5348. una ventana de esta clase).
  5349.  
  5350. {fichero1} - Código del fichero del que se deben tomar los gráficos; este
  5351. es el código del archivo {help.fpg} que se cargó con la función {#132,load_fpg()}.
  5352.  
  5353. {103} - Código del gráfico principal (primer plano) del scroll, para ver
  5354. este gráfico se debe cargar el fichero con el {Menú de ficheros} y así poder
  5355. observar cuál es el gráfico con {código 103}.
  5356.  
  5357. {102} - Código de gráfico secundario (segundo plano, de fondo); éste es el
  5358. gráfico que se mostrará en la ventana de scroll {detrás} del gráfico principal.
  5359.  
  5360. {0} - Número de región de la pantalla en la que se debe {colocar} el scroll;
  5361. con 0 se indica que se debe colocar en la pantalla entera.
  5362.  
  5363. {15} - Indicador de bloqueo, con 15 (1+2+4+8) se indica que tanto el primer
  5364. plano como el segundo serán cíclicos en ambos ejes (horizontal y vertical).
  5365.  
  5366. Tras llamar a la función {start_scroll()} el programa define el campo {camera}
  5367. de la {#1101,estructura scroll}, asignándole el {#1039,código identificador}
  5368. del proceso principal (con la sentencia {scroll.camera=}{#1092,id}{;}); con esto se convierte
  5369. el scroll en {automático} siguiendo a partir de ese momento al gráfico del proceso
  5370. principal.
  5371.  
  5372. El programa continúa definiendo su {tipo de coordenada} como {coordenada de
  5373. scroll} (con la sentencia {ctype=c_scroll;}), definiendo su gráfico como
  5374. el número 100, que es una bola marrón (con {graph=100;}), imprimiendo un mensaje
  5375. y después permanecerá en un bucle en el que se pueden variar las coordenadas
  5376. de este proceso (las variables {#1123,x} e {#1124,y}) con las teclas de los
  5377. cursores.
  5378.  
  5379. {/}
  5380.  
  5381. {#9999,Ejemplo de scroll MANUAL:}
  5382. PROGRAM ejemplo_start_scroll;
  5383.  
  5384. PRIVATE
  5385.     fichero1;
  5386.  
  5387. BEGIN
  5388.     fichero1=load_fpg("help\help.fpg");
  5389.  
  5390.     start_scroll(0, fichero1, 103, 102, 0, 15);
  5391.  
  5392.     write(0, 160, 0, 1, "Utilice los cursores desplazar el scroll");
  5393.     LOOP
  5394.         IF (key(_right))
  5395.             scroll.x0+=2;
  5396.             scroll.x1+=1;
  5397.         END
  5398.         IF (key(_left))
  5399.             scroll.x0-=2;
  5400.             scroll.x1-=1;
  5401.         END
  5402.         IF (key(_down))
  5403.             scroll.y0+=2;
  5404.             scroll.y1+=1;
  5405.         END
  5406.         IF (key(_up))
  5407.             scroll.y0-=2;
  5408.             scroll.y1-=1;
  5409.         END
  5410.         FRAME;
  5411.     END
  5412. END
  5413. {-}
  5414.  
  5415. En el ejemplo se carga el fichero de gráficos y entonces se crea una ventana
  5416. de scroll con la función {start_scroll()}. A esta última se le pasan
  5417. exactamente los mismos parámetros que en el ejemplo anterior.
  5418.  
  5419. Tras esto, el programa permanecerá en un bucle dentro del cual; al detectarse
  5420. las teclas de los cursores se variarán los campos {x0}, {y0}, {x1} e {y1} de
  5421. la {#1101,estructura global scroll}, los cuales definen las coordenadas de
  5422. los dos planos del scroll ({x0}, {y0} son las del primer plano y {x1}, {y1}
  5423. las del segundo).
  5424.  
  5425. Se puede observar la diferencia entre ambos métodos; este último, al no
  5426. haber inicializado el campo {camera} de la estrucutra, podrá manipular
  5427. directamente las coordenadas de ambos planos.
  5428.  
  5429. {/}{Cómo visualizar gráficos de procesos sobre el scroll.}{/}
  5430.  
  5431. Para crear un proceso cuyo gráfico se visualice en la ventana de scroll, se debe
  5432. definir su variable local {#1122,ctype} como {#1168,c_scroll} ({tipo de coordenada}
  5433. como {coordenada de scroll}), lo que se hará con la siguiente sentencia:
  5434.  
  5435.   {ctype=c_scroll;}
  5436.  
  5437. Una vez hecho esto, el proceso se visualizará en el scroll con su gráfico
  5438. (definido en la variable local {#1126,graph}). El proceso únicamente debe
  5439. modificar sus variables {#1123,x} e {#1124,y} para moverse por el scroll.
  5440.  
  5441. {/}
  5442.  
  5443. {Cuando un proceso pertenezca al scroll (se haya asignado el valor c_scroll a su
  5444. variable local} {#1122,ctype}{):}
  5445.  
  5446.   - Sus variables {#1123,x} e {#1124,y} estarán referidas al punto del gráfico
  5447. del primer plano sobre el cual se situará el gráfico del proceso.
  5448.  
  5449.   - Su variable {#1125,z} ahora será relativa a las {variables z} de los
  5450. procesos que también pertenezcan a la misma ventana de scroll. Es decir,
  5451. cada vez que se pinte una ventana de scroll, se pintarán justo a continuación
  5452. todos los gráficos que pertenecen a la misma (ordenados por su {z}), y
  5453. después se seguirán pintando los procesos que {no pertenecen a dicha ventana
  5454. de scroll}.
  5455.  
  5456.   - El proceso será eliminado automáticamente cuando se elimine la ventana
  5457. de scroll a la que pertenece el proceso, con la función {#166,stop_scroll()}.
  5458. O cuando se cambie el modo de vídeo con la función {#157,set_mode()}, ya que
  5459. al hacerlo se eliminarán también las ventanas de scroll.
  5460.  
  5461. {/}
  5462.  
  5463. Si hubiera varias ventanas de {scroll} el proceso si visualizaría por defecto
  5464. en todas; si únicamente se debiera visualizar el algunas de ellas, se debería
  5465. definir su variable local {#1134,cnumber}. Por ejemplo, si hubiera 6 ventanas
  5466. de scroll (de la número 0 a la 5) y se quisiera que un proceso se visualizara
  5467. únicamente en las ventanas 0 y 2, se debería incluir en el mismo la siguiente
  5468. sentencia:
  5469.  
  5470.   {cnumber=c_0+c_2;}
  5471.  
  5472. Para poder observar un ejemplo de lo aquí expuesto, lo mejor es examinar
  5473. alguno de los juegos ejemplo de DIV Games Studio que utilizan esta técnica,
  5474. por lo que se remite al lector directamente a los comentarios de estos
  5475. programas (por ejemplo véase el ejemplo {Helioball}).
  5476.  
  5477. {/}Ver: {#166,stop_scroll()} - {#152,refresh_scroll()} - {#140,move_scroll()} - {#1101,Estructura scroll}
  5478.  
  5479. # ─────────────────────────────────────────────────────────────────────────────
  5480.  
  5481. {.164,stop_cd()}
  5482. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  5483.  
  5484. {stop_cd()}
  5485.  
  5486. {Descripción:}
  5487.  
  5488. Detiene la reproducción CD-Audio, parando la canción que estuviese sonando.
  5489. Las canciones se reproducen con la función {#144,play_cd()}.
  5490.  
  5491. {#9999,Programa ejemplo:}
  5492. PROGRAM ejemplo_stop_cd;
  5493. BEGIN
  5494.     write(0, 160, 0, 1, "Pulse [ENTER] para poner en marcha el CD.");
  5495.     write(0, 160, 10, 1, "Pulse [ESPACIO] para parar el CD.");
  5496.     LOOP
  5497.         IF (scan_code==_space)
  5498.  
  5499.             stop_cd(); // Para el CD
  5500.  
  5501.         END
  5502.         IF (scan_code==_enter)
  5503.             play_cd(2, 0);
  5504.         END
  5505.         FRAME;
  5506.     END
  5507. END
  5508. {-}
  5509.  
  5510. En el ejemplo se ponen los mensajes necesarios. En cada paso del
  5511. bucle, si se pulsa la barra espaciadora, se parará el CD con la función
  5512. {stop_cd()}.
  5513.  
  5514. Si se pulsa la tecla Enter se pondrá en marcha el CD con la función
  5515. {#144,play_cd()}.
  5516.  
  5517. El volumen de reproducción de cd-audio se puede controlar con la
  5518. estructura {#1104,setup} y la función {#178,set_volume()}.
  5519.  
  5520. {/}Ver: {#144,play_cd()} - {#127,is_play_cd()} - {#178,set_volume()} - {#1104,Estructura setup}
  5521.  
  5522. # ─────────────────────────────────────────────────────────────────────────────
  5523.  
  5524. {.165,stop_mode7()}
  5525. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  5526.  
  5527. {stop_mode7(}<número de m7>{)}
  5528.  
  5529. {Descripción:}
  5530.  
  5531. Elimina la ventana de modo 7 cuyo número (del 0 al 9) se pasa como parámetro.
  5532. Este <número de m7> es el que se indicó como primer parámetro en la función
  5533. {#162,start_mode7()}, es necesario debido a que pueden haber hasta 10 ventanas
  5534. diferentes de modo 7, y el sistema necesita saber cuál de ellas se está
  5535. finalizando.
  5536.  
  5537. Al eliminar una ventana de modo 7, morirán automáticamente todos los procesos
  5538. que pertenezcan en exclusiva a dicha ventana, es decir, todos los procesos que
  5539. tengan su variable {#1122,ctype} con el valor {#1169,c_m7} y no se estén
  5540. visualizando en ninguna otra ventana de modo 7.
  5541.  
  5542. {Importante:} Al cambiar de modo de vídeo con la función {#157,set_mode()}
  5543. todas las ventanas de modo 7 (y sus procesos) serán igualmente eliminadas,
  5544. no siendo en este caso necesario usar esta función ({stop_mode7()}).
  5545.  
  5546. {#9999,Programa ejemplo:}
  5547. PROGRAM ejemplo_stop_mode7;
  5548. BEGIN
  5549.     load_fpg("help\help.fpg");
  5550.     write(0, 160, 0, 1, "Pulse [ENTER] para poner modo 7.");
  5551.     write(0, 160, 10, 1, "Pulse [ESPACIO] para quitar modo 7.");
  5552.     write(0, 160, 190, 1, "Utilice el ratón para moverse por el modo 7.");
  5553.     angle=90000;
  5554.     LOOP
  5555.         IF (scan_code==_space)
  5556.  
  5557.             stop_mode7(0); // Se quita el modo 7
  5558.  
  5559.         END
  5560.         IF (scan_code==_enter)
  5561.             start_mode7(0, 0, 4, 0, 0, 64);
  5562.             m7.camera=id;
  5563.         END
  5564.         x=mouse.x;
  5565.         y=mouse.y;
  5566.         FRAME;
  5567.     END
  5568. END
  5569. {-}
  5570.  
  5571. En el ejemplo se carga el fichero de gráficos y se muestran las instrucciones
  5572. del programa en pantalla, tras lo cual las coordenadas del proceso principal,
  5573. que servirá de cámara del modo 7, serán controladas con el ratón (mediante
  5574. las sentencias {x=mouse.x;} y {y=mouse.y}).
  5575.  
  5576. Cuando se pulse la tecla ENTER se creará una ventana de modo 7 con un gráfico
  5577. de un circuito abatido, controlada por el proceso principal.
  5578.  
  5579. Al pulsarse la barra espaciadora se invocará a la función {stop_mode7()},
  5580. eliminando esta la ventana de visualización en modo 7.
  5581.  
  5582. {/}
  5583.  
  5584. Crear una ventana de modo 7 es un procedimiento algo avanzado y requiere
  5585. iniciar varios parámetros, como en este caso la cámara, algunos de ellos
  5586. requeridos por la función {#162,start_mode7()} y otros contenidos en la
  5587. estructura global {#1102,m7} (como la variable {m7.camera} utilizada en el
  5588. ejemplo).
  5589.  
  5590. {/}Ver: {#162,start_mode7()} - {#1102,Estructura m7}
  5591.  
  5592. # ─────────────────────────────────────────────────────────────────────────────
  5593.  
  5594. {.166,stop_scroll()}
  5595. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  5596.  
  5597. {stop_scroll(}<número de scroll>{)}
  5598.  
  5599. {Descripción:}
  5600.  
  5601. Elimina la ventana de scroll cuyo número (del 0 al 9) se pasa como parámetro.
  5602. Este <número de scroll> es el que se indicó como primer parámetro en la función
  5603. {#163,start_scroll()} y es necesario debido a que puede haber hasta 10 ventanas
  5604. diferentes de scroll, y el sistema necesita saber cuál de ellas se está
  5605. finalizando.
  5606.  
  5607. Al eliminar una ventana de scroll morirán, automáticamente, todos los procesos
  5608. que pertenezcan en exclusiva a dicha ventana, es decir, todos los procesos que
  5609. tengan su variable {#1122,ctype} con el valor {#1168,c_scroll} y no se estén
  5610. visualizando en ninguna otra ventana de scroll.
  5611.  
  5612. {Importante:} Al cambiar de modo de vídeo con la función {#157,set_mode()}
  5613. todas las ventanas de scroll (y sus procesos) serán igualmente eliminadas,
  5614. no siendo en este caso necesario usar esta función ({stop_scroll()}).
  5615.  
  5616. {#9999,Programa ejemplo:}
  5617. PROGRAM ejemplo_stop_scroll;
  5618. BEGIN
  5619.     load_fpg("help\help.fpg");
  5620.     write(0, 160, 0, 1, "Pulse [ENTER] para activar la ventana de scroll.");
  5621.     write(0, 160, 10, 1, "Pulse [ESPACIO] para finalizar el scroll.");
  5622.     LOOP
  5623.         IF (scan_code==_space)
  5624.  
  5625.             stop_scroll(0); // Se quita el scroll.
  5626.  
  5627.         END
  5628.         IF (scan_code==_enter)
  5629.             start_scroll(0, 0, 103, 102, 0, 15);
  5630.         END
  5631.         scroll.x0+=1;
  5632.         scroll.y0+=1;
  5633.         scroll.x1-=1;
  5634.         FRAME;
  5635.     END
  5636. END
  5637. {-}
  5638.  
  5639. En el ejemplo se carga el fichero de gráficos y se muestran las instrucciones
  5640. del programa en pantalla.
  5641.  
  5642. Cuando se pulse la tecla ENTER se creará una ventana de scroll y al pulsarse
  5643. la barra espaciadora se invocará a la función {stop_scroll()}, eliminando
  5644. ésta la ventana de visualización del scroll.
  5645.  
  5646. Dentro del bucle principal se acceden a las coordenadas del scroll contenidas
  5647. en la {#1101,estructura global scroll} para desplazar manualmente la ventana
  5648. de scroll ({scroll.x0+=1; ...}).
  5649.  
  5650. {/}
  5651.  
  5652. Crear una ventana de scroll es un procedimiento algo avanzado y requiere
  5653. iniciar varios parámetros, algunos de ellos requeridos por la función
  5654. {#163,start_scroll()} y otros contenidos en la {#1101,estructura global scroll}
  5655. (como la variable {scroll.x0} utilizada en el ejemplo).
  5656.  
  5657. {/}Ver: {#163,start_scroll()} - {#1101,Estructura scroll}
  5658.  
  5659. # ─────────────────────────────────────────────────────────────────────────────
  5660.  
  5661. {.167,stop_sound()}
  5662. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  5663.  
  5664. {stop_sound(}<número de canal>{)}
  5665.  
  5666. {Descripción:}
  5667.  
  5668. Para el sonido que esté sonando por el canal pasado como parámetro.
  5669.  
  5670. El <número de canal> requerido es el valor que retorna la función
  5671. {#159,sound()} cuando se inicia la reproducción de un efecto de sonido.
  5672.  
  5673. Existen un total de 16 canales de sonido, pudiendo sonar hasta 16 sonidos
  5674. simultáneamente.
  5675.  
  5676. {#9999,Programa ejemplo:}
  5677. PROGRAM ejemplo_stop_sound;
  5678.  
  5679. PRIVATE
  5680.     id_sonido;
  5681.     canal;
  5682.     sonando=FALSE;
  5683.  
  5684. BEGIN
  5685.     load_fpg("help\help.fpg");
  5686.     put_screen(0, 1);
  5687.     write(0, 160, 0, 1, "Pulse [ESPACIO] para iniciar la reproducción.");
  5688.     write(0, 160, 10, 1, "Pulse [ENTER] para detener el canal de sonido.");
  5689.     id_sonido = load_pcm("help\help.pcm", 1);
  5690.     LOOP
  5691.         IF (scan_code==_space AND NOT sonando)
  5692.             canal = sound(id_sonido, 128, 256);
  5693.             sonando=TRUE;
  5694.         END
  5695.         IF (scan_code==_enter)
  5696.  
  5697.             stop_sound(canal); // Se para el sonido
  5698.  
  5699.             sonando=FALSE;
  5700.         END
  5701.         FRAME;
  5702.     END
  5703. END
  5704. {-}
  5705.  
  5706. En el ejemplo se pone un gráfico de fondo y los mensajes necesarios, a la
  5707. vez que se carga el efecto de sonido contenido en el archivo {help.pcm} con
  5708. la función {#134,load_pcm()}, que devuelve el identificador del sonido
  5709. que se guarda en la variable {id_sonido}. Se puede ver que en este ejemplo
  5710. se pasa a esta función un {1} como segundo parámetro; esto es para indicar
  5711. que el efecto de sonido cargado debe repetirse indefinidamente cada vez
  5712. que sea iniciado (esto se hace para resaltar el efecto de la función
  5713. {stop_sound()}.
  5714.  
  5715. En cada paso del bucle se comprueba si se pulsa la barra espaciadora, en
  5716. cuyo caso se iniciará la reproducción del efecto de sonido con {#159,sound()},
  5717. que devolverá el número de canal que se guardará en la variable {canal}.
  5718.  
  5719. Si se pulsa la tecla ENTER el sonido será parado con la función {stop_sound()}.
  5720.  
  5721. {/}
  5722.  
  5723. Para parar gradualmente un sonido, bajando su volumen poco a poco, se deben
  5724. realizar varias llamadas a la función {#102,change_sound()} para ir
  5725. decrementando ligeramente el volumen del canal hasta que éste llegue a 0;
  5726. entonces se puede llamar a la función {stop_sound()} para detener definitivamente
  5727. el efecto de sonido.
  5728.  
  5729. {/}Ver: {#159,sound()} - {#102,change_sound()} - {#134,load_pcm()} - {#170,unload_pcm()}
  5730.  
  5731. # ─────────────────────────────────────────────────────────────────────────────
  5732.  
  5733. {.168,system()}
  5734. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  5735.  
  5736. {system(}<"comando externo">{)}
  5737.  
  5738. {Descripción:}
  5739.  
  5740. Ejecuta el comando de sistema operativo que se pasa como parámetro.
  5741.  
  5742. {#9999,Programa ejemplo:}
  5743. PROGRAM ejemplo_system;
  5744. BEGIN
  5745.     write(0, 160, 0, 1, "Presione [ESPACIO] para hacer un DIR.");
  5746.     LOOP
  5747.         IF (scan_code==_space)
  5748.  
  5749.             system("dir"); // Se ejecuta un comando del MS-DOS.
  5750.  
  5751.         END
  5752.         FRAME;
  5753.     END
  5754. END
  5755. {-}
  5756.  
  5757. En el ejemplo, tras imprimir un texto, se entra dentro del bucle principal
  5758. en el que se ejecutará el comando {DIR} del sistema operativo MS-DOS cada
  5759. vez que se pulse la barra espaciadora.
  5760.  
  5761. {/}
  5762.  
  5763. Una utilidad que puede tener este comando es, por ejemplo, borrar algún
  5764. archivo temporal que se haya creado en el programa, invocando el comando
  5765. del sistema {DEL <}nombre de archivo{>}.
  5766.  
  5767. {/}
  5768.  
  5769. {Nota:} El sistema puede bloquearse según qué comandos se ejecuten, debiendo
  5770. reinicializar el ordenador en estos casos; no se ofrece ningún tipo de
  5771. garantía en cuanto al funcionamiento de esta función, debido a las múltiples
  5772. incompatibilidades que se pueden presentar entre los comandos externos y
  5773. el gestor de procesos interno de DIV Games Studio.
  5774.  
  5775. {/}
  5776.  
  5777. {system("COMMAND.COM")}
  5778.  
  5779. {Descripción:}
  5780.  
  5781. Ejecuta una sesión del sistema operativo MS-DOS desde del propio programa.
  5782. Al teclear EXIT desde la misma, se retornará al programa en el punto en el que
  5783. se ejecutó esta sentencia.
  5784.  
  5785. {/}Ver: {#109,exit()}
  5786.  
  5787. # ─────────────────────────────────────────────────────────────────────────────
  5788.  
  5789. {.169,unload_fpg()}
  5790. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  5791.  
  5792. {unload_fpg(}<código del fichero>{)}
  5793.  
  5794. {Descripción:}
  5795.  
  5796. Descarga de memoria el fichero de gráficos cuyo código se pasa como parámetro.
  5797. Este <código de fichero> es el valor que retorna la función {#132,load_fpg()}
  5798. cuando se carga un nuevo fichero de gráficos en la memoria.
  5799.  
  5800. Tras descargarse un fichero de gráficos {se deben extremar las precauciones}
  5801. para no continuar utilizando en el programa ningún gráfico que estuviera en
  5802. dicho fichero. En cuyo caso el programa correría el riesgo de bloquearse.
  5803.  
  5804. {No es necesario descargar el fichero de memoria} antes de finalizar el
  5805. programa, ya que el sistema lo hará de forma automática.
  5806.  
  5807. Por lo tanto, un fichero se debe descargar de memoria únicamente cuando ya no se
  5808. vaya a utilizar durante un tiempo determinado y se quiera liberar el espacio
  5809. ocupado en la memoria del ordenador para cargar otros recursos (otros ficheros
  5810. de gráficos, sonidos, fuentes, etc.).
  5811.  
  5812. {#9999,Programa ejemplo:}
  5813. PROGRAM ejemplo_unload_fpg;
  5814.  
  5815. PRIVATE
  5816.     fichero1;
  5817.  
  5818. BEGIN
  5819.     fichero1=load_fpg("help\help.fpg");
  5820.     put_screen(fichero1, 1);
  5821.     write(0, 160, 0, 1, "Pulse [ENTER] para descargar el fichero y terminar");
  5822.     REPEAT
  5823.         FRAME;
  5824.     UNTIL (key(_enter));
  5825.  
  5826.     unload_fpg(fichero1); // Se descarga el fichero.
  5827.  
  5828. END
  5829. {-}
  5830.  
  5831. El ejemplo carga el fichero de gráficos contenido en el archivo {help.fpg}
  5832. con la función {#132,load_fpg()}, guardando el {código del fichero} en la
  5833. variable privada {fichero1}.
  5834.  
  5835. El programa permanecerá en un bucle hasta que se pulse la tecla ENTER,
  5836. momento en el cual se descargará el fichero de memoria con {unload_fpg()}
  5837. y terminará el programa.
  5838.  
  5839. {/}
  5840.  
  5841. Los gráficos cargardos individualmente con la función {#174,load_map()} no se
  5842. descargarán cuando se descargue el fichero número 0 (con código 0), aunque
  5843. éstos se utilicen como si pertenecieran al mismo, sino que se deberán descargar
  5844. utilizando la función {#176,unload_map()}.
  5845.  
  5846. {/}Ver: {#132,load_fpg()} - {#174,load_map()} - {#176,unload_map()}
  5847.  
  5848. # ─────────────────────────────────────────────────────────────────────────────
  5849.  
  5850. {.170,unload_pcm()}
  5851. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  5852.  
  5853. {unload_pcm(}<código del sonido>{)}
  5854.  
  5855. {Descripción:}
  5856.  
  5857. Descarga de memoria el sonido cuyo código se pasa como parámetro.
  5858. Este <código de sonido> es el valor que retorna la función {#132,load_pcm()}
  5859. cuando se carga un nuevo efecto de sonido en la memoria.
  5860.  
  5861. Tras descargarse un efecto de sonido {se deben extremar las precauciones}
  5862. para no continuar utilizando en el programa dicho efecto (su código) para
  5863. las funciones {#159,sound()} o {unload_pcm()}. En cuyo caso el programa
  5864. correría el riesgo de bloquearse.
  5865.  
  5866. {No es necesario descargar el sonido de memoria} antes de finalizar el
  5867. programa, ya que el sistema lo hará de forma automática.
  5868.  
  5869. Por lo tanto, un sonido se debe descargar de memoria únicamente cuando ya no se
  5870. vaya a utilizar durante un tiempo determinado y se quiera liberar el espacio
  5871. ocupado en la memoria del ordenador para cargar otros recursos (otros ficheros
  5872. de gráficos, sonidos, fuentes, etc.), lo que tendrá sentido únicamente con
  5873. efectos de sonido de cierta longitud, es decir, que sean lo suficientemente
  5874. grandes como para que merezca la pena liberar el espacio que ocupan.
  5875.  
  5876. {#9999,Programa ejemplo:}
  5877. PROGRAM ejemplo_unload_pcm;
  5878.  
  5879. PRIVATE
  5880.     sonido1;
  5881.  
  5882. BEGIN
  5883.     sonido1=load_pcm("help\help.pcm",0);
  5884.     write(0, 160, 0, 1, "Pulse [ENTER] para descargar el sonido y terminar");
  5885.     REPEAT
  5886.         FRAME;
  5887.     UNTIL (key(_enter));
  5888.  
  5889.     unload_pcm(sonido1); // Se descarga el fichero.
  5890.  
  5891. END
  5892. {-}
  5893.  
  5894. El ejemplo carga el efecto de sonido contenido en el archivo {help.pcm}
  5895. con la función {#134,load_pcm()}, guardando el {código del sonido} en la
  5896. variable privada {sonido1}.
  5897.  
  5898. El programa permanecerá en un bucle hasta que se pulse la tecla ENTER,
  5899. momento en el cual se descargará el fichero de memoria con {unload_pcm()}
  5900. y terminará el programa.
  5901.  
  5902. {/}
  5903.  
  5904. Para parar un efecto de sonido, pero seguir manteniéndolo en memoria para
  5905. cuando se quiera hacer sonar de nuevo, se debe utilizar la función {#167,stop_sound()}.
  5906.  
  5907. {/}Ver: {#134,load_pcm()} - {#159,sound()} - {#102,change_sound()} - {#167,stop_sound()}
  5908.  
  5909. # ─────────────────────────────────────────────────────────────────────────────
  5910.  
  5911. {.171,write()}
  5912. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  5913.  
  5914. {write(}<fuente>{,} <x>{,} <y>{,} <código de centrado>{,} <texto>{)}
  5915.  
  5916. {Retorna:}
  5917.  
  5918. El código identificador del texto que se ha escrito.
  5919.  
  5920. {Descripción:}
  5921.  
  5922. Esta función es la utilizada para mostrar un texto alfanumérico en pantalla;
  5923. para ello requiere los siguientes parámetros:
  5924.  
  5925. {<fuente>} - El {código de la fuente} o {tipo de letra} que se va a utilizar.
  5926. Aquí se debe poner un 0 cuando se quiera utilizar la fuente del sistema
  5927. (fuente de color blanco, pequeña, de 6 por 8 puntos), o bien el {código de
  5928. fuente} devuelto por la función {#131,load_fnt()} cuando se carga una nuevo
  5929. fuente en el programa.
  5930.  
  5931. {<x>}, {<y>} - Las coordenadas relativas a pantalla en las que se va a
  5932. imprimir el texto, primero en el eje horizontal y después en el vertical.
  5933.  
  5934. {<código de centrado>} - Es un código que determina la posición del texto
  5935. que se especifica en las coordenadas anteriores. Sus valores son:
  5936.  
  5937.   {0}-Arriba izquierda {1}-Arriba {2}-Arriba derecha·
  5938.   {3}-Izquierda        {4}-Centro {5}-Derecha·
  5939.   {6}-Abajo izquierda  {7}-Abajo  {8}-Abajo derecha·
  5940.  
  5941. Por ejemplo, si se escribe un texto en las coordenadas 160, 0 y con el
  5942. código de centrado 1 (Arriba), entonces se centrará el texto en la columna
  5943. 160 y se imprimirá de la línea 0 hacia abajo. O si se quiere un texto en la
  5944. esquina superior izquierda, se debe imprimir en las coordenadas 0, 0 y con
  5945. código de centrado 0 (Arriba izquierda).
  5946.  
  5947. {<texto>} - Como último parámetro se especificará texto a escribir como un
  5948. literal, es decir, un texto entre comillas (Ver los
  5949. {#1047,símbolos delimitadores de literales}).
  5950.  
  5951. {/}
  5952.  
  5953. El texto impreso permanecerá en pantalla hasta que se borre con la función
  5954. {#107,delete_text()}, que requiere como parámetro el {código identificador}
  5955. que devuelve {write()}.
  5956.  
  5957. Para imprimir el valor numérico de una variable (como pudiera ser la
  5958. puntuación del jugador) se debe utilizar función {#172,write_int()}.
  5959.  
  5960. Los textos permanecerán inalterados en pantalla aunque se impriman gráficos
  5961. en la misma o pasen gráficos de procesos por delante o por detrás de los
  5962. mismos.
  5963.  
  5964. {#9999,Programa ejemplo:}
  5965. PROGRAM ejemplo_write;
  5966.  
  5967. PRIVATE
  5968.     fuente1;
  5969.  
  5970. BEGIN
  5971.     fuente1 = load_fnt("help\help.fnt");
  5972.  
  5973.     write(0, 160, 100, 4, "Texto de ejemplo con la fuente del sistema.");
  5974.     write(fuente1, 0, 0, 0, "ARRIBA IZQUIERDA");
  5975.     write(fuente1, 320, 200, 8, "ABAJO DERECHA");
  5976.  
  5977.     LOOP
  5978.         FRAME;
  5979.     END
  5980. END
  5981. {-}
  5982.  
  5983. En el ejemplo anterior se carga la fuente contenida en el archivo {help.fnt}
  5984. con la función {#131,load_fnt()} (cuyo código de fuente se guarda en la
  5985. variable {fuente1}), y después se escriben tres textos:
  5986.  
  5987. El primero con la fuente del sistema (0), situándose en las coordenadas 160, 100
  5988. (centro de la pantalla) el {centro} del texto (código de centrado 4).
  5989.  
  5990. El segundo con la fuente cargada (cuyo {identificador de fuente} se tiene
  5991. almacenado en la variable {fuente1}), situándose en las coordenadas 0, 0 la
  5992. esquina superior izquierda del texto (código de centrado 0).
  5993.  
  5994. Y, por último, el tercer texto, también con la fuente cargada, situándose
  5995. en las coordenadas 320, 200 la esquina inferior derecha del texto (código de
  5996. centrado 8).
  5997.  
  5998. Tras esto el programa se quedará esperando indefinidamente dentro de un
  5999. bucle.
  6000.  
  6001. {/}
  6002.  
  6003. El plano de profundidad en el que aparecen los textos escritos se controla
  6004. mediante la variable global {#1106,text_z}, que sirve para regular qué
  6005. gráficos se deben ver por encima de los textos y cuáles por debajo.
  6006.  
  6007. Los textos podrán, luego, moverse hasta otra posición si es necesario
  6008. utilizando la función {#141,move_text()}, que también requiere como
  6009. parámetro el {código identificador} que devuelve {write()}.
  6010.  
  6011. {/}
  6012.  
  6013. Cuando se utilicen fuentes cargadas de {archivos FNT} debe estar activada
  6014. la paleta de colores que se ha utilizado para generar dichas fuentes (ver
  6015. {#133,load_pal()}) pues, de lo contrario, los colores pueden aparecer
  6016. cambiados, visualizándose el texto incorrectamente.
  6017.  
  6018. {/}Ver: {#172,write_int()} - {#141,move_text()} - {#107,delete_text()} - {#131,load_fnt()} - {#1106,text_z}
  6019.  
  6020. # ─────────────────────────────────────────────────────────────────────────────
  6021.  
  6022. {.172,write_int()}
  6023. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  6024.  
  6025. {write_int(}<fuente>{,} <x>{,} <y>{,} <código de centrado>{,} <OFFSET variable>{)}
  6026.  
  6027. {Retorna:}
  6028.  
  6029. El código identificador del texto que se ha escrito.
  6030.  
  6031. {Descripción:}
  6032.  
  6033. Esta función es la utilizada para visualizar el valor numérico de una variable;
  6034. para ello requiere los siguientes parámetros:
  6035.  
  6036. {<fuente>} - El {código de la fuente} o {tipo de letra} que se va a utilizar.
  6037. Aquí se debe poner un 0 cuando se quiera utilizar la fuente del sistema
  6038. (fuente de color blanco, pequeña, de 6 por 8 puntos), o bien el {código de
  6039. fuente} devuelto por la función {#131,load_fnt()} cuando se carga una nuevo
  6040. fuente en el programa.
  6041.  
  6042. {<x>}, {<y>} - Las coordenadas relativas a pantalla en las que se va a
  6043. imprimir el valor numérico, primero en el eje horizontal y después en el vertical.
  6044.  
  6045. {<código de centrado>} - Es un código que determina la posición del valor numérico
  6046. que se especifica en las coordenadas anteriores. Sus valores son:
  6047.  
  6048.   {0}-Arriba izquierda {1}-Arriba {2}-Arriba derecha·
  6049.   {3}-Izquierda        {4}-Centro {5}-Derecha·
  6050.   {6}-Abajo izquierda  {7}-Abajo  {8}-Abajo derecha·
  6051.  
  6052. Por ejemplo, si se escribe un valor numérico en las coordenadas 160, 0 y con el
  6053. código de centrado 1 (Arriba), entonces se centrará el valor numérico en la columna
  6054. 160 y se imprimirá de la línea 0 hacia abajo. O si se quiere un valor numérico en la
  6055. esquina superior izquierda, se debe imprimir en las coordenadas 0, 0 y con
  6056. código de centrado 0 (Arriba izquierda).
  6057.  
  6058. {<OFFSET variable>} - Como último parámetro se debe especificar el
  6059. desplazamiento dentro de la memoria del ordenador de la variable cuyo valor
  6060. se quiere visualizar (el desplazamiento del dato se obtiene con el
  6061. operador {#1085,OFFSET}).
  6062.  
  6063. {/}
  6064.  
  6065. El valor numérico impreso permanecerá en pantalla hasta que se borre con la función
  6066. {#107,delete_text()}, que requiere como parámetro el {código identificador}
  6067. que devuelve {write_int()}.
  6068.  
  6069. {Importante:} Durante el tiempo que aparezca el valor de la variable en
  6070. pantalla, éste se irá actualizando automáticamente cada vez que se modifique
  6071. la variable, no siendo necesarias nuevas llamadas a {write_int()}.
  6072.  
  6073. Para imprimir un texto alfanumérico de cualquier tipo (un texto fijo)
  6074. se debe utilizar la función {#171,write()}.
  6075.  
  6076. Los textos permanecerán inalterados en pantalla aunque se impriman gráficos
  6077. en la misma o pasen gráficos de procesos por delante o por detrás de ellos.
  6078.  
  6079.  
  6080. {#9999,Programa ejemplo:}
  6081. PROGRAM ejemplo_write_int;
  6082.  
  6083. PRIVATE
  6084.     variable;
  6085.  
  6086. BEGIN
  6087.     write(0, 160, 190, 1, "Pulse [ESPACIO] para cambiar el valor de la variable.");
  6088.  
  6089.     write_int(0, 160, 100, 4, OFFSET variable); // Se imprime una variable.
  6090.  
  6091.     LOOP
  6092.         IF (scan_code==_space) variable=rand(-100, 100); END
  6093.         FRAME;
  6094.     END
  6095. END
  6096. {-}
  6097.  
  6098. En el ejemplo se imprime un texto usando {#171,write()} y el valor de una
  6099. variable con la función {write_int()}. A esta última función se le pasan los siguientes
  6100. parámetros:
  6101.  
  6102.   {0} - Como {fuente} (0 es la fuente del sistema).·
  6103.   {0, 10} - Como coordenadas de pantalla.·
  6104.   {0} - Como código de centrado (Arriba/Izquierda).·
  6105.   {OFFSET variable} - Como el desplazamiento en memoria de la variable.·
  6106.  
  6107. A cada paso del bucle, si se pulsa la barra espaciadora, se cambia el valor
  6108. de la variable asignándole uno elegido aleatoriamente, al azar, con la
  6109. función {#149,rand()}.
  6110.  
  6111. {/}
  6112.  
  6113. El plano de profundidad en el que aparecen los textos escritos se controla
  6114. mediante la variable global {#1106,text_z}, que sirve para regular qué
  6115. gráficos se deben ver por encima de los textos y cuáles por debajo.
  6116.  
  6117. Los textos podrán luego moverse hasta otra posición si es necesario
  6118. utilizando la función {#141,move_text()}, que también requiere como
  6119. parámetro el {código identificador} que devuelve {write_int()}.
  6120.  
  6121. {/}
  6122.  
  6123. Cuando se utilicen fuentes cargadas de {archivos FNT} debe estar activada
  6124. la paleta de colores que se ha utilizado para generar dichas fuentes (ver
  6125. {#133,load_pal()}) pues, de lo contrario, los colores pueden aparecer
  6126. cambiados, visualizándose el texto incorrectamente.
  6127.  
  6128. {/}
  6129.  
  6130. {Advertencia:}
  6131.  
  6132. No es posible imprimir una expresión, como se muestra a continuación:
  6133.  
  6134.   {write_int(0, 0, 0, 0, offset variable + 1);}
  6135.  
  6136. Para imprimir el valor de la variable más 1, es decir, si se quisiera
  6137. imprimir este valor, se debería sumar 1 a la variable o crear otra
  6138. variable y asignarle a ésta el valor de la variable original más 1, por
  6139. ejemplo:
  6140.  
  6141.   {variable2 = variable + 1;}·
  6142.   {write_int(0, 0, 0, 0, offset variable2);}·
  6143.  
  6144. En este caso se debería tener en cuenta que habría que actualizar el
  6145. valor de {variable2} al menos una vez por cada imagen (por cada
  6146. {#1029,FRAME}) del juego, ya que al cambiar {variable} no se actualizaría
  6147. automáticamente el valor de {variable2} a no ser que se ejecutara
  6148. nuevamente la sentencia {variable2 = variable + 1;}.
  6149.  
  6150. {/}Ver: {#171,write()} - {#141,move_text()} - {#107,delete_text()} - {#131,load_fnt()} - {#1106,text_z}
  6151.  
  6152. # ─────────────────────────────────────────────────────────────────────────────
  6153.  
  6154. {.173,xput()}
  6155. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  6156.  
  6157. {xput(}<fichero>{,} <gráfico>{,} <x>{,} <y>{,} <angle>{,} <size>{,} <flags>{,} <region>{)}
  6158.  
  6159. {Descripción:}
  6160.  
  6161. Versión avanzada de la función {#146,put()} para poner un gráfico en el fondo
  6162. de la pantalla. Esta función requiere, por orden, los siguientes parámetros:
  6163.  
  6164. {<fichero>} - {código del fichero} con la librería de gráficos que contiene
  6165. a ambos. Los gráficos cargados con la función {#174,load_map()} se utilizarán como
  6166. si pertenecieran al primer fichero (el fichero con el código 0).
  6167.  
  6168. {<gráfico>} - {código del gráfico} dentro del fichero que se va a imprimir
  6169. en pantalla.
  6170.  
  6171. {<x>, <y>} - coordenadas relativas a pantalla donde se desea poner el gráfico.
  6172. Estas coordenadas se refieren a donde se situará el centro del gráfico (o el {#1136,punto
  6173. de control} número 0, en caso de estar definido).
  6174.  
  6175. {<angle>} - ángulo (en milésimas de grados) en el que se imprimirá el gráfico;
  6176. el ángulo normal es {0}.
  6177.  
  6178. {<size>} - tamaño (en porcentaje) en el que se imprimirá el gráfico; el
  6179. tamaño normal es {100}.
  6180.  
  6181. {<flags>} - Indica los espejados y transparencias con los que se imprimirá el
  6182. gráfico; los posibles valores son:
  6183.  
  6184.  {0}-Gráfico normal.·
  6185.  {1}-Espejado horizontal.·
  6186.  {2}-Espejado vertical.·
  6187.  {3}-Espejado horizontal y vertical (180°).·
  6188.  {4}-Gráfico transparente.·
  6189.  {5}-Transparente y espejado horizontal.·
  6190.  {6}-Transparente y espejado vertical.·
  6191.  {7}-Transparente, espejado horizontal y vertical.·
  6192.  
  6193. {<región>} - Número de región (ventana dentro de la pantalla) en la que
  6194. se debe imprimir el gráfico; normalmente este valor será {0} para poder
  6195. imprimir el gráfico en cualquier posición de la pantalla. Para definir
  6196. una región se debe utilizar la función {#106,define_region()}.
  6197.  
  6198. {/}
  6199.  
  6200. Los gráficos impresos de esta forma en el fondo de la pantalla estarán en la
  6201. visualización del juego {por debajo de todos los procesos, regiones de scroll,
  6202. textos, etc.}
  6203.  
  6204. Si se desea que un gráfico esté por encima de otros se debe {crear
  6205. como un nuevo proceso} y fijar su variable {#1125,z} con la prioridad
  6206. de impresión del mismo.
  6207.  
  6208. Para borrar el fondo de la pantalla se debe utilizar la función {#103,clear_screen()}.
  6209.  
  6210. {#9999,Programa ejemplo:}
  6211. PROGRAM ejemplo_put;
  6212.  
  6213. PRIVATE
  6214.     fichero1;
  6215.     coord_x;
  6216.     coord_y;
  6217.     ángulo1;
  6218.     tamaño1;
  6219.     flags1;
  6220.  
  6221. BEGIN
  6222.     fichero1=load_fpg("help\help.fpg");
  6223.     LOOP
  6224.         coord_x=rand(0, 319);
  6225.         coord_y=rand(0, 199);
  6226.         ángulo1=rand(-pi, pi);
  6227.         tamaño1=rand(10, 200);
  6228.         flags1=rand(0, 7);
  6229.  
  6230.         // Se pone el gráfico 101
  6231.         xput(fichero1, 101, coord_x, coord_y, ángulo1, tamaño1, flags1, 0);
  6232.  
  6233.         FRAME;
  6234.     END
  6235. END
  6236. {-}
  6237.  
  6238. En el ejemplo se carga el fichero con los gráficos y en cada iteración
  6239. de bucle se pone el gráfico número 101 (un triángulo) con la función {xput()} en
  6240. coordenadas aleatorias (elegidas al azar con la función {#149,rand()}),
  6241. con un ángulo y un tamaño también aleatorio, con el valor de {flags} aleatorio y
  6242. en la región número 0 (pantalla completa).
  6243.  
  6244. {/}
  6245.  
  6246. La función {#146,put()} es una versión simplificada de la
  6247. función {xput()} de utilidad cuando no se quiera rotar, escalar, espejar
  6248. o imprimir con transparencias el gráfico.
  6249.  
  6250. Para poner un gráfico en otro (en lugar del fondo de la pantalla)
  6251. se deben utilizar las funciones {#137,map_put()} o {#139,map_xput()}.
  6252.  
  6253. {/}
  6254.  
  6255. Si el gráfico que se quiere poner es simplemente una pantalla de fondo,
  6256. resulta más sencillo utilizar la función {#148,put_screen()}, ya que ésta
  6257. no requiere las coordenadas de pantalla, pues centrará el gráfico en la
  6258. misma de forma automática.
  6259.  
  6260. {/}Ver: {#146,put()} - {#137,map_put()} - {#139,map_xput()} - {#148,put_screen()}
  6261.  
  6262. # ─────────────────────────────────────────────────────────────────────────────
  6263.  
  6264. {.174,load_map()}
  6265. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  6266.  
  6267. {load_map(}<nombre de archivo>{)}
  6268.  
  6269. {Retorna:}
  6270.  
  6271. El {código del gráfico} cargado.
  6272.  
  6273. {Descripción:}
  6274.  
  6275. Carga un {archivo MAP} con un gráfico en la memoria del ordenador. La
  6276. función requiere el nombre del archivo como parámetro, entre comillas.
  6277.  
  6278. Se devuelve como valor de retorno el {código del gráfico}, que es un valor
  6279. numérico que debe especificarse para utilizar el gráfico, en la variable
  6280. {#1126,graph} o, en general, en todas las funciones que requieran un {código
  6281. de gráfico} entre sus parámetros.
  6282.  
  6283. Es posible cargar tantos gráficos como sea necesario; cada vez que se
  6284. cargue uno la función devolverá el código que le corresponde (el primer
  6285. gráfico cargado tendrá el código {1000}, el siguiente el {1001}, etc.)
  6286.  
  6287. Se puede especificar la ruta de acceso al archivo con el fichero de gráficos,
  6288. no obstante, si el fichero está en el directorio por defecto (\MAP) no será
  6289. necesario.
  6290.  
  6291. {/}
  6292.  
  6293. {Importante:}
  6294.  
  6295. Cuando se requiera dentro de una función el {código de fichero} al que
  6296. pertenece dicho gráfico, se debe indicar el código {0} (que es el código
  6297. del primer {fichero FPG} que se cargue en el programa).
  6298.  
  6299. {/}
  6300.  
  6301. Cuando se han cargado diferentes gráficos se debe tener en cuenta que si
  6302. éstos tienen paletas diferentes, se debe activar cada una de ellas previamente
  6303. con la función {#133,load_pal()}, indicando el nombre del fichero (MAP) como
  6304. parámetro, antes de utilizar el gráfico.
  6305.  
  6306. No se pueden utilizar simultáneamente gráficos creados con distintas paletas.
  6307.  
  6308. {#9999,Programa ejemplo:}
  6309. PROGRAM ejemplo_load_map;
  6310.  
  6311. PRIVATE
  6312.     mapa1;
  6313.  
  6314. BEGIN
  6315.  
  6316.     mapa1 = load_map("help\help.map"); // Se carga un fichero de mapa gráfico.
  6317.  
  6318.     put_screen(0, mapa1);
  6319.     LOOP
  6320.         FRAME;
  6321.     END
  6322. END
  6323. {-}
  6324.  
  6325. En el ejemplo se carga un mapa gráfico con la función {load_map()} guardando
  6326. el {código del gráfico} que retorna en la variable privada {mapa1}.
  6327.  
  6328. Este código se usa posteriormente como parámetro de la función {#148,put_screen()}
  6329. para poner el gráfico en el fondo de pantalla.
  6330.  
  6331. {/}
  6332.  
  6333. La función {#176,unload_map()} permite liberar la memoria del ordenador utilizada
  6334. por el gráfico cuando ya no se va a utilizar más durante un tiempo, y para ello
  6335. requiere también el {codigo del gráfico} para saber qué gráfico es el que se
  6336. quiere descargar de memoria.
  6337.  
  6338. {No es necesario descargar el gráfico de memoria} antes de finalizar el
  6339. programa, ya que el sistema lo hará de forma automática.
  6340.  
  6341. {/}
  6342.  
  6343. Para cargar varios gráficos de golpe en un programa, éstos deben estar incluidos
  6344. dentro de un fichero de gráficos (FPG) y cargarse con la función {#132,load_fpg()}.
  6345.  
  6346. {/}Ver: {#176,unload_map()} - {#132,load_fpg()} - {#133,load_pal()} - {#1126,graph}
  6347.  
  6348. # ─────────────────────────────────────────────────────────────────────────────
  6349.  
  6350. {.175,reset_sound()}
  6351. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  6352.  
  6353. {reset_sound(}{)}
  6354.  
  6355. {Descripción:}
  6356.  
  6357. {#1032,Función} avanzada, únicamente para usuarios muy experimentados. Reinicializa
  6358. el sistema de sonido.
  6359.  
  6360. Esta función sirve para activar unos nuevos parámetros del hardware de sonido.
  6361.  
  6362. Se deben establecer los siguientes valores de la {#1104,estructura global setup}:
  6363.  
  6364.     {setup.card}·
  6365.     {setup.port}·
  6366.     {setup.irq}·
  6367.     {setup.dma}·
  6368.     {setup.dma2}·
  6369.  
  6370. Esta función se utiliza generalmente dentro de los programas de configuración
  6371. del sistema de sonido (ver {#1093,setup_program}).
  6372.  
  6373. {/}
  6374.  
  6375. Para activar el resto de los valores de la estructura setup, los referentes
  6376. al volumen del mezclador ({mixer}), se debe invocar a la función
  6377. {#178,set_volume()}. Los valores para establecer el volumen son:
  6378.  
  6379.     {setup.master}·
  6380.     {setup.sound_fx}·
  6381.     {setup.cd_audio}·
  6382.  
  6383. {/}Ver: {#178,set_volume()} - {#1104,Estructura setup} - {#1093,setup_program}
  6384.  
  6385. # ─────────────────────────────────────────────────────────────────────────────
  6386.  
  6387. {.176,unload_map()}
  6388. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  6389.  
  6390. {unload_map(}<código del gráfico>{)}
  6391.  
  6392. {Descripción:}
  6393.  
  6394. Descarga de memoria el gráfico cuyo código se pasa como parámetro.
  6395. Este <código de gráfico> es el valor que retorna la función {#174,load_map()}
  6396. al cargar un nuevo gráfico contenido en un {archivo MAP} en la memoria del
  6397. ordenador.
  6398.  
  6399. Tras descargarse un gráfico {se deben extremar las precauciones}
  6400. para no continuar utilizando en el programa dicho gráfico, en cuyo caso el
  6401. programa correría el riesgo de bloquearse.
  6402.  
  6403. {No es necesario descargar el gráfico} antes de finalizar el
  6404. programa, ya que el sistema lo hará de forma automática.
  6405.  
  6406. Luego, un gráfico solamente debe descargarse de memoria cuando ya no se
  6407. vaya a utilizar durante un tiempo determinado y se quiera liberar el espacio
  6408. ocupado en la memoria del ordenador para cargar otros recursos (otros ficheros
  6409. de gráficos, sonidos, fuentes, etc.), lo que tendrá sentido únicamente con
  6410. gráficos de un cierto tamaño, es decir, que sean lo suficientemente
  6411. grandes como para sea rentable liberar el espacio que ocupan.
  6412.  
  6413. {#9999,Programa ejemplo:}
  6414. PROGRAM ejemplo_unload_map;
  6415.  
  6416. PRIVATE
  6417.     mapa1;
  6418.  
  6419. BEGIN
  6420.     mapa1=load_map("help\help.map");
  6421.     put_screen(0, mapa1);
  6422.     write(0, 160, 0, 1, "Pulse [ENTER] para descargar el gráfico y terminar");
  6423.     REPEAT
  6424.         FRAME;
  6425.     UNTIL (key(_enter));
  6426.  
  6427.     unload_map(mapa1); // Se descarga el gráfico.
  6428.  
  6429. END
  6430. {-}
  6431.  
  6432. En el ejemplo se carga un mapa gráfico con la función {#174,load_map()} guardando
  6433. el {código del gráfico} que retorna en la variable privada {mapa1}.
  6434.  
  6435. Este código se usa, posteriormente, como parámetro de la función {#148,put_screen()}
  6436. para poner el gráfico en el fondo de pantalla.
  6437.  
  6438. Entonces el programa imprimirá un mensaje y esperará en un bucle hasta que
  6439. se pulse la tecla ENTER, momento en el cual se descargará el gráfico
  6440. utilizando la función {unload_map()}.
  6441.  
  6442. {/}
  6443.  
  6444. Los gráficos cargados individualmente con la función {#174,load_map()} no se
  6445. descargarán cuando se descargue el fichero número 0 (con código 0) con la
  6446. función {#169,unload_fpg()}, aunque estos gráficos se utilicen como si
  6447. pertenecieran al mismo.
  6448.  
  6449. {/}Ver: {#174,load_map()} - {#169,unload_fpg()}
  6450.  
  6451. # ─────────────────────────────────────────────────────────────────────────────
  6452.  
  6453. {.177,unload_fnt()}
  6454. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  6455.  
  6456. {unload_fnt(}<código de la fuente>{)}
  6457.  
  6458. {Descripción:}
  6459.  
  6460. Descarga de memoria la {fuente} (el {tipo de letra} o el {juego de caracteres
  6461. gráficos}) cuyo código se pasa como parámetro.
  6462.  
  6463. Este <código de fuente> es el valor que retorna la función {#131,load_fnt()}
  6464. al cargar una nueva fuente de letras contenida en un {archivo FNT} en
  6465. la memoria del ordenador.
  6466.  
  6467. Tras descargarse una fuente {se deben extremar las precauciones}
  6468. para no continuar utilizando en el programa dicha fuente; si se hiciera así, se correría el
  6469. riesgo de que el programa pudiera bloquearse.
  6470.  
  6471. {No es necesario descargar la fuente} antes de finalizar el
  6472. programa, ya que el sistema lo hará de forma automática.
  6473.  
  6474. Después, se debe descargar una fuente de memoria únicamente cuando ya no se
  6475. vaya a utilizar durante un tiempo determinado y se quiera liberar el espacio
  6476. ocupado en la memoria del ordenador para cargar otros recursos (otros ficheros
  6477. de gráficos, sonidos, fuentes, etc.).
  6478.  
  6479. {#9999,Programa ejemplo:}
  6480. PROGRAM ejemplo_unload_fnt;
  6481.  
  6482. PRIVATE
  6483.     fuente1;
  6484.  
  6485. BEGIN
  6486.     fuente1=load_fnt("help\help.fnt");
  6487.     write(fuente1, 160, 0, 1, "FUENTE DEL ARCHIVO EN DISCO");
  6488.     write(0, 160, 190, 1, "Pulse [ENTER] para descargar la fuente y terminar");
  6489.     REPEAT
  6490.         FRAME;
  6491.     UNTIL (key(_enter));
  6492.  
  6493.     unload_fnt(fuente1); // Se descarga la fuente
  6494. END
  6495. {-}
  6496.  
  6497. En el ejemplo se carga la fuente contenida en el archivo {help.fnt} con la
  6498. función {#131,load_fnt()} guardando el {código de fuente} que retorna en
  6499. la variable privada {fuente1}.
  6500.  
  6501. Este código se usa posteriormente como parámetro de la función {#171,write()}
  6502. para poner un texto en pantalla con dicha fuente.
  6503.  
  6504. Entonces el programa esperará en un bucle hasta que se pulse la tecla ENTER,
  6505. momento en el cual se descargará la fuente utilizando la función {unload_fnt()},
  6506. con lo que se terminará el programa.
  6507.  
  6508. {/}
  6509.  
  6510. La fuente número 0, (la fuente del sistema que tiene 0 como código de fuente),
  6511. {no se puede descargar}.
  6512.  
  6513. {/}Ver: {#131,load_fnt()} - {#171,write()} - {#172,write_int()}
  6514.  
  6515. # ─────────────────────────────────────────────────────────────────────────────
  6516.  
  6517. {.178,set_volume()}
  6518. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  6519.  
  6520. {set_volume(}{)}
  6521.  
  6522. {Descripción:}
  6523.  
  6524. {#1032,Función} avanzada, sólo para usuarios muy experimentados.
  6525. Ajusta los diferentes controles de volumen gestionados por el mezclador
  6526. ({mixer}) del sistema de sonido.
  6527.  
  6528. Se deben establecer los siguientes valores de la {#1104,estructura global
  6529. setup} para poder ajustar el volumen:
  6530.  
  6531.     {setup.master}   - Volumen general·
  6532.     {setup.sound_fx} - Volumen de los efectos de sonido·
  6533.     {setup.cd_audio} - Volumen de la música de cd-audio·
  6534.  
  6535. Esta función se utiliza generalmente dentro de los programas de configuración
  6536. del sistema de sonido (ver {#1093,setup_program}), o bien en el resto de los
  6537. programas, normalmente para fijar el volumen de la música de CD-Audio.
  6538.  
  6539. {/}
  6540.  
  6541. Para activar el resto de los valores de la estructura setup (los referentes
  6542. a parámetros de la tarjeta de sonido), se debe invocar a la función {#175,reset_sound()} con
  6543. los siguientes valores de la estructura definidos:
  6544.  
  6545.     {setup.card}·
  6546.     {setup.port}·
  6547.     {setup.irq}·
  6548.     {setup.dma}·
  6549.     {setup.dma2}·
  6550.  
  6551. {/}Ver: {#175,reset_sound()} - {#1104,Estructura setup} - {#1093,setup_program}
  6552.  
  6553. # ─────────────────────────────────────────────────────────────────────────────
  6554. # Información extendida sobre los mensajes de error del compilador
  6555. # ─────────────────────────────────────────────────────────────────────────────
  6556.  
  6557. {.500,Memoria insuficiente.}
  6558.  
  6559. No se dispone de {memoria suficiente} para compilar el programa.
  6560.  
  6561. # ─────────────────────────────────────────────────────────────────────────────
  6562.  
  6563. {.501,No se encontro ltobj.def}
  6564.  
  6565. El archivo <LTLEX.DEF> no se ha encontrado en el directorio de DIV; este
  6566. archivo resulta imprescindible para la compilación de los programas.
  6567.  
  6568. Recupere el archivo original si dispone de una copia, en caso contrario
  6569. deberá volver a instalar la aplicación.
  6570.  
  6571. # ─────────────────────────────────────────────────────────────────────────────
  6572.  
  6573. {.502,Archivo ltlex.def erróneo.}
  6574.  
  6575. Los cambios efectuados en el archivo <LTLEX.DEF> {no son válidos}; recupere
  6576. el archivo original si dispone de una copia, en caso contrario deberá volver
  6577. a instalar la aplicación.
  6578.  
  6579. # ─────────────────────────────────────────────────────────────────────────────
  6580.  
  6581. {.503,Archivo ltlex.def erróneo.}
  6582.  
  6583. Se han definido {demasiados símbolos} en el archivo <LTLEX.DEF>; recupere
  6584. el archivo original si dispone de una copia, en caso contrario deberá volver
  6585. a instalar la aplicación.
  6586.  
  6587. # ─────────────────────────────────────────────────────────────────────────────
  6588.  
  6589. {.504,Archivo ltlex.def erróneo.}
  6590.  
  6591. Se ha definido un {símbolo no válido} en el archivo <LTLEX.DEF>; recupere
  6592. el archivo original si dispone de una copia, si no deberá volver
  6593. a instalar la aplicación.
  6594.  
  6595. # ─────────────────────────────────────────────────────────────────────────────
  6596.  
  6597. {.506,No se encontro ltobj.def}
  6598.  
  6599. El archivo <LTOBJ.DEF> no se ha encontrado en el directorio de DIV; este
  6600. archivo resulta imprescindible para la compilación de los programas.
  6601.  
  6602. Recupere el archivo original si dispone de una copia, en caso contrario
  6603. deberá volver a instalar la aplicación.
  6604.  
  6605. # ─────────────────────────────────────────────────────────────────────────────
  6606.  
  6607. {.507,Archivo ltobj.def erróneo.}
  6608.  
  6609. Los cambios efectuados en el archivo <LTOBJ.DEF> {no són válidos}; por ello, tendrá que recuperar
  6610. el archivo original si dispone de una copia, en caso contrario deberá volver
  6611. a instalar la aplicación.
  6612.  
  6613. # ─────────────────────────────────────────────────────────────────────────────
  6614.  
  6615. {.510,Carácter no reconocido.}
  6616.  
  6617. Se encontró en el programa un carácter que no forma parte de ningún símbolo
  6618. del lenguaje y que, además, {no es válido} para construir un nuevo nombre.
  6619.  
  6620. Si se trata de un {#1002,comentario} debe indicarlo correctamente con un símbolo
  6621. // al comienzo de los comentarios de una línea, o los símbolos /* y */ para
  6622. indicar el inicio y fin, respectivamente, de comentarios que ocupen más de una
  6623. línea.
  6624.  
  6625. En caso de que se pretenda construir un {#1001,nombre} debe sustituir dicho
  6626. carácter por otro dentro de los que se permiten en el lenguaje.
  6627.  
  6628. {/}Ver: {#1000,Sintaxis} - {#1002,Comentarios}
  6629.  
  6630. # ─────────────────────────────────────────────────────────────────────────────
  6631.  
  6632. {.511,Literal sin cerrar.}
  6633.  
  6634. Los literales son los {textos entre comillas}. En la posición indicada del
  6635. programa comienza un literal y no se cierra.
  6636.  
  6637. Todos los literales deben cerrarse en la misma línea en la que comenzaron, no
  6638. pudiéndose definir literales de más de una línea.
  6639.  
  6640. Los literales pueden comenzar y terminar con el carácter [{#1047,'}] o bien con el
  6641. carácter [{#1047,"}] (pero deben comenzar y terminar con el mismo). Si se quiere
  6642. incluir el carácter [{#1047,"}] en un literal se puede hacer de dos formas;
  6643. supóngase que se quiere definir un literal que contenga el texto: a"B"c
  6644.  
  6645.  - Duplicar el carácter: "a""B""c"
  6646.  
  6647.  - Definirlo con la comilla simple: 'a"B"c'
  6648.  
  6649. Lo mismo sucede con el carácter [{#1047,'}], que se puede incluir en un literal
  6650. si se duplica, o bien si el literal se delimita con el carácter [{#1047,"}].
  6651.  
  6652. {/}Ver: {#1000,Sintaxis}
  6653.  
  6654. # ─────────────────────────────────────────────────────────────────────────────
  6655.  
  6656. {.512,Símbolo no reconocido.}
  6657.  
  6658. En la posición indicada del programa se encuentra un símbolo no perteneciente
  6659. al lenguaje; revise los símbolos que hay disponibles en el lenguaje para
  6660. construir correctamente la expresión.
  6661.  
  6662. Probablemente se trate de un error tipográfico; revise la sintaxis.
  6663.  
  6664. {/}Ver: {#1000,Sintaxis} - {#4,Glosario}
  6665.  
  6666. # ─────────────────────────────────────────────────────────────────────────────
  6667.  
  6668. {.520,Esperando [PROGRAM]}
  6669.  
  6670. Todos los programas deben comenzar con la palabra reservada {PROGRAM} seguida
  6671. del nombre del programa; antes de dicha palabra sólo pueden aparecer
  6672. {#1002,comentarios} (textos explicativos precedidos del símbolo // o entre
  6673. los símbolos /* y */).
  6674.  
  6675. Compruebe si ha escrito la palabra correctamente, ya que no se diferencia entre mayúsculas
  6676. y minúsculas, por lo que son válidas {PROGRAM}, {program}, {Program}, ...
  6677.  
  6678. {#9999,Ejemplo:}
  6679. // -------------------
  6680. // Listado de mi juego
  6681. // -------------------
  6682.  
  6683. PROGRAM mi_juego;
  6684. BEGIN
  6685.     LOOP
  6686.         FRAME;
  6687.     END
  6688. END
  6689. {-}
  6690.  
  6691. {/}Ver: {#1000,Sintaxis} - {#1002,Comentarios} - {#1003,Cabecera de programa}
  6692.  
  6693. # ─────────────────────────────────────────────────────────────────────────────
  6694.  
  6695. {.521,Esperando el nombre del programa.}
  6696.  
  6697. Tras la palabra reservada {PROGRAM} se espera que venga el nombre del programa.
  6698.  
  6699. {#9999,Ejemplo:}
  6700. PROGRAM nombre_del_programa;
  6701. BEGIN
  6702.     //...
  6703. END
  6704. {-}
  6705.  
  6706. El nombre de este programa es {nombre_del_programa}.
  6707.  
  6708. {/}Ver: {#1000,Sintaxis} - {#1001,Nombres} - {#1003,Cabecera de programa}
  6709.  
  6710. # ─────────────────────────────────────────────────────────────────────────────
  6711.  
  6712. {.522,El nombre no es nuevo.}
  6713.  
  6714. Como nombre de la estructura se ha utilizado uno que ya estaba
  6715. relacionado con otro objeto anteriormente definido. Puede tratarse de un nombre,
  6716. de una constante, una variable, una tabla, una estructura, un proceso o una función del programa.
  6717.  
  6718. También puede que se haya pretendido utilizar el mismo nombre dentro del
  6719. programa para identificar dos objetos diferentes, o bien {que se
  6720. haya utilizado un nombre predefinido para otro uso dentro del lenguaje}.
  6721. En dicho caso, se puede acceder al glosario para ver a qué objeto se refiere
  6722. dicho nombre.
  6723.  
  6724. De todas formas, {debe sustituir dicho nombre por otro similar}.
  6725.  
  6726. {#9999,Ejemplo:}
  6727. PROGRAM nombre_del_programa;
  6728. GLOBAL
  6729.     posicion=0;
  6730.     STRUCT posicion[9] // Error: El nombre no es nuevo.
  6731.         x, y;
  6732.     END
  6733. BEGIN
  6734.     //...
  6735. END
  6736. {-}
  6737.  
  6738. {/}Ver: {#1000,Sintaxis} - {#1001,Nombres} - {#4,Glosario}
  6739.  
  6740. # ─────────────────────────────────────────────────────────────────────────────
  6741.  
  6742. {.523,Esperando [=]}
  6743.  
  6744. Para definir una tabla se suele indicar entre corchetes la longitud de la
  6745. misma; en caso de no especificar entre los corchetes el número de elementos
  6746. de la tabla se espera que a continuación se inicialice para que el compilador
  6747. pueda determinar su longitud.
  6748.  
  6749. Se ha encontrado una tabla sin longitud definida, por lo que el compilador
  6750. esperaba que, tras cerrarse los corchetes ({#1079,[]}), viniera el símbolo
  6751. {#1073,=} precediendo a la inicialización de la tabla.
  6752.  
  6753. Indique la longitud de la tabla entre los corchetes, o asígnele valores
  6754. a las diferentes posiciones de la tabla.
  6755.  
  6756. Cuando una tabla no se inicializa todas sus posiciones serán incializadas
  6757. a cero.
  6758.  
  6759. {#9999,Ejemplo:}
  6760. PROGRAM nombre_del_programa;
  6761. GLOBAL
  6762.     tabla1[3];
  6763.     tabla2[]=2, 4, 6, 8;
  6764.     tabla3[]; // Error: Esperando [=].
  6765. BEGIN
  6766.     //...
  6767. END
  6768. {-}
  6769.  
  6770. En el ejemplo se han definido dos tablas de cuatro posiciones (0..3), tabla1
  6771. inicializada a (0, 0, 0, 0) y tabla2 inicializada a (2, 4, 6, 8).
  6772.  
  6773. {/}Ver: {#1000,Sintaxis} - {#1011,Declaracion de tabla}
  6774.  
  6775. # ─────────────────────────────────────────────────────────────────────────────
  6776.  
  6777. {.525,Esperando [)]}
  6778.  
  6779. El compilador esperaba que en la posición indicada se cerrara un paréntesis
  6780. anteriormente abierto con el símbolo {#1053,)}.
  6781.  
  6782. Este error se suele producir por uno de estos dos motivos:
  6783.  
  6784. - En una expresión se han abierto varios paréntesis y después no se han cerrado todos;
  6785. en este caso debe cerrar los que falten.
  6786.  
  6787. - Dentro de una expresión entre paréntesis se ha omitido algún operador apareciendo,
  6788. entonces, dos operandos seguidos, por ejemplo {(2*3 4)}, debiendo, en este caso, indicar el
  6789. operador que falte.
  6790.  
  6791. {/}Ver: {#1000,Sintaxis}
  6792.  
  6793. # ─────────────────────────────────────────────────────────────────────────────
  6794.  
  6795. {.526,Esperando []]}
  6796.  
  6797. El compilador esperaba que en la posición indicada se cerrara un corchete
  6798. anteriormente abierto, con el símbolo {#1079,]}.
  6799.  
  6800. Este error se suele producir por uno de estos dos motivos:
  6801.  
  6802. - En una tabla o estructura se ha indicado la apertura de corchete ({[})
  6803. y después de indicar la longitud o índice de la misma no se ha cerrado;
  6804. en este caso se debe añadir en la posición indicada el símbolo {]}.
  6805.  
  6806. - Al señalar el índice de una tabla o estructura se ha omitido algún operador apareciendo,
  6807. entonces, dos operandos seguidos, por ejemplo {tabla[2*3 4]}, debiendo indicar, ahora, el
  6808. operador que falte.
  6809.  
  6810. {/}Ver: {#1000,Sintaxis}
  6811.  
  6812. # ─────────────────────────────────────────────────────────────────────────────
  6813.  
  6814. {.527,Se esperaba un operando.}
  6815.  
  6816. La posición indicada en el programa está dentro del contexto de una expresión,
  6817. y en ese punto de la expresión se esperaba un operando (un valor sobre el que
  6818. se puedan realizar cálculos) pero, en su lugar, ha venido otro elemento diferente
  6819. sobre el que no se pueden realizar cálculos.
  6820.  
  6821. Hay varias causas que pueden provocar este error; las más comunes son:
  6822.  
  6823. - Se ha utilizado una palabra reservada del lenguaje como si fuera una variable,
  6824. por ejemplo {x=global*2;}. En este caso se puede comprobar si se trata de una
  6825. palabra reservada accediendo al glosario.
  6826.  
  6827. - Se ha omitido un operando dentro de una expresión, por ejemplo {x=2+ /y;}.
  6828.  
  6829. - Se ha cerrado dentro de una expresión un corchete o paréntesis que no
  6830. habia sido abierto anteriormente, por ejemplo {x=);}.
  6831.  
  6832. En cualquier caso debe revisar la {#1000,sintaxis} de la expresión indicada
  6833. para construirla de forma correcta.
  6834.  
  6835. {/}Ver: {#1000,Sintaxis} - {#4,Glosario} - {#1009,Declaración de dato}
  6836.  
  6837. # ─────────────────────────────────────────────────────────────────────────────
  6838.  
  6839. {.528,Nombre desconocido.}
  6840.  
  6841. En la posición indicada del programa se utiliza una constante, una variable,
  6842. una tabla o una estructura con el fin de acceder a ella antes de haberla declarado.
  6843.  
  6844. El compilador no puede resolver el problema dado que no conoce de qué tipo
  6845. de objeto se trata.
  6846.  
  6847. Todas las constantes se deben definir al comienzo del programa, dentro de
  6848. la sección {#1004,CONST}.
  6849.  
  6850. Las variables, tablas y estructuras se pueden definir dentro de las secciones
  6851. {#1006,GLOBAL}, {#1007,LOCAL} o {#1008,PRIVATE} según su alcance, pero
  6852. siempre tienen que estar definidas antes de ser usadas.
  6853.  
  6854. Los casos más frecuentes en los que se da este error son:
  6855.  
  6856. - Se ha tecleado incorrectamente un nombre, por ejemplo;
  6857.  
  6858. {#9999,Ejemplo:}
  6859. PROGRAM mi_juego;
  6860. CONST
  6861.     centro=160;
  6862. BEGIN
  6863.     x=cenrto; // Error: Nombre desconocido.
  6864.     //...
  6865. END
  6866. {-}
  6867.  
  6868. - Un objeto se usa antes y se declara después, por ejemplo:
  6869.  
  6870. {#9999,Ejemplo:}
  6871. PROGRAM mi_juego;
  6872. CONST
  6873.     doble=simple*2; // Error: Nombre desconocido.
  6874.     simple=1;
  6875. BEGIN
  6876.     //...
  6877. END
  6878. {-}
  6879.  
  6880.   En este caso se deberían intercambiar las dos declaraciones anteriores.
  6881.  
  6882. - Al inicializar una tabla o estructura, se ha colocado una coma accidentalmente
  6883. tras la lista de valores.
  6884.  
  6885. {#9999,Ejemplo:}
  6886. PROGRAM mi_juego;
  6887. GLOBAL
  6888.     tabla[]=0, 1, 2, 3,
  6889.     a=0; // Error: Nombre desconocido.
  6890. BEGIN
  6891.     //...
  6892. END
  6893. {-}
  6894.  
  6895.   En este caso el compilador avisará de este error en la variable {a}, ya
  6896. que interpreta que es el siguiente valor en la lista de inicialización de
  6897. tabla, y es un nombre que todavía se ha definido.
  6898.  
  6899. {/}Ver: {#1000,Sintaxis} - {#1004,Declaración de constantes}
  6900.  
  6901. # ─────────────────────────────────────────────────────────────────────────────
  6902.  
  6903. {.529,Esperando [BEGIN]}
  6904.  
  6905. Este error se produce cuando se realiza una declaración incorrecta dentro
  6906. de las secciones {#1004,CONST}, {#1006,GLOBAL}, {#1007,LOCAL} o
  6907. {#1008,PRIVATE}.
  6908.  
  6909. Tras la sentencia inicial {#1003,PROGRAM nombre_de_programa;} se espera que
  6910. aparezca alguna de las secciones anteriormente citadas (siempre en ese mismo orden)
  6911. y al final la palabra {#1086,BEGIN}.
  6912.  
  6913. Tras el inicio de un proceso ({#1016,PROCESS nombre_de_proceso(}...{)}) se espera
  6914. que se muestre la sección {#1008,PRIVATE} o la palabra {#1086,BEGIN}.
  6915.  
  6916. El error puede producirse bajo las siguientes circunstancias:
  6917.  
  6918. - Se ha escrito incorrectamente el nombre de alguna sección.
  6919.  
  6920. - Se han puesto varias secciones en un orden incorrecto:
  6921.  
  6922. {#9999,Ejemplo:}
  6923. PROGRAM mi_juego;
  6924. LOCAL
  6925.     a=0;
  6926. GLOBAL // Error: Esperando [BEGIN]
  6927.     b=0;
  6928. BEGIN
  6929.     //...
  6930. END
  6931. {-}
  6932.  
  6933.   Se recuerda que las secciones deben ir en el siguiente orden:
  6934.  
  6935.     {CONST}·
  6936.     {#1006,GLOBAL}·
  6937.     {#1007,LOCAL}·
  6938.     {#1008,PRIVATE}·
  6939.  
  6940. - Dentro de cualquiera de las secciones antes mencionadas ha venido un
  6941. elemento que no es una declaración válida dentro de dicha sección.
  6942.  
  6943. {#9999,Ejemplo:}
  6944. PROGRAM mi_juego;
  6945. GLOBAL
  6946.     +variable=0; // Error: Esperando [BEGIN]
  6947. BEGIN
  6948.     //...
  6949. END
  6950. {-}
  6951.  
  6952.   En este ejemplo, al llegar al símbolo {#1056,+} el compilador determina
  6953. que la sección {#1006,GLOBAL} ya ha finalizado y, por lo tanto, como el
  6954. siguiente elemento no es el inicio de las secciones {#1007,LOCAL} ni
  6955. {#1008,PRIVATE}, espera que venga la palabra reservada {#1086,BEGIN}
  6956. marcando el inicio del código del programa.
  6957.  
  6958. - Al comienzo del programa o al definir un proceso se ha omitido la
  6959. palabra {BEGIN}.
  6960.  
  6961. {#9999,Ejemplo:}
  6962. PROGRAM mi_juego;
  6963. BEGIN
  6964.     //...
  6965. END
  6966.  
  6967. PROCESS mi_proceso()
  6968.     FRAME; // Error: Esperando [BEGIN]
  6969. END
  6970. {-}
  6971.  
  6972. {/}Ver: {#1000,Sintaxis} - {#1086,BEGIN}
  6973.  
  6974. # ─────────────────────────────────────────────────────────────────────────────
  6975.  
  6976. {.530,Se esperaba una expresión constante.}
  6977.  
  6978. Para inicializar {#1004,constantes}, variables, tablas
  6979. y estructuras se deben utilizar valores numéricos o expresiones
  6980. cuyo valor pueda ser determinado cuando se compila el programa.
  6981.  
  6982. En la posición indicada comienza una expresión cuyo valor no ha podido ser
  6983. resuelto en tiempo de compilación, probablemente porque use algun dato
  6984. global, local o privado, o bien porque se llame a
  6985. alguna función.
  6986.  
  6987. En las expresiones constantes se pueden utilizar únicamente:
  6988.  
  6989.     - {#1004,Constantes} definidas con anterioridad.·
  6990.     - {Valores numéricos}.·
  6991.     - {Operadores} aritméticos o lógicos.·
  6992.     - {Literales} (textos entre comillas).·
  6993.     - La función {#1094,sizeof()}.·
  6994.  
  6995. {#9999,Ejemplo:}
  6996. PROGRAM mi_juego;
  6997. GLOBAL
  6998.     mi_variable=4;
  6999.     posición=2*mi_variable; // Error: Se esperaba una expresión constante.
  7000. BEGIN
  7001.     //...
  7002. END
  7003. {-}
  7004.  
  7005. En este ejemplo no se puede inicializar {posición}, ya que se está utilizando
  7006. para ello la variable local {x}.
  7007.  
  7008. {/}Ver: {#1000,Sintaxis} - {#1005,Definición de constantes}
  7009.  
  7010. # ─────────────────────────────────────────────────────────────────────────────
  7011.  
  7012. {.531,Se excedió la tabla.}
  7013.  
  7014. La expresión constante que comienza en la posición indicada del programa
  7015. no puede ser calculada, pues en ella se accede a una tabla
  7016. o estructura fuera de su rango de posiciones.
  7017.  
  7018. Revise el rango de la tabla o estructura en su definición.
  7019. Se recuerda que una tabla definida, por ejemplo, como {tabla[10]}
  7020. tiene {11} posiciones (desde tabla[0] hasta tabla[10]).
  7021.  
  7022. {#9999,Ejemplo:}
  7023. PROGRAM mi_juego;
  7024. GLOBAL
  7025.     tabla[]=1, 3, 5;
  7026.     valor=tabla[3]; // Error: Se excedió la tabla.
  7027. BEGIN
  7028.     //...
  7029. END
  7030. {-}
  7031.  
  7032. En este ejemplo no se puede inicializar la variable {valor}
  7033. dado que se está utilizando, para ello, una posición de tabla
  7034. inexistente.
  7035.  
  7036. {/}Ver: {#1000,Sintaxis} - {#1011,Declaración de tabla}
  7037.  
  7038. # ─────────────────────────────────────────────────────────────────────────────
  7039.  
  7040. {.532,No se puede calcular el offset.}
  7041.  
  7042. En la expresión indicada en el programa se utiliza el operador {#1085,offset}
  7043. (o el símbolo sinónimo {#1085,&}) con el fin de obtener la dirección
  7044. (desplazamiento) de un objeto. Dicho objeto no tiene dirección, pues
  7045. no es una variable, una tabla o una estructura,
  7046. por lo que el compilador no puede resolver la expresión.
  7047.  
  7048. Probablemente se haya pretendido obtener la dirección de una expresión constante o una que
  7049. involucre varios operandos.
  7050.  
  7051. A continuación se muestra un programa con varios ejemplos
  7052. de uso válido del operador {#1085,offset}, y otros tantos inválidos.
  7053.  
  7054. {#9999,Ejemplo:}
  7055. PROGRAM mi_juego;
  7056. CONST
  7057.     mi_constante=0;
  7058. GLOBAL
  7059.     mi_offset=0;
  7060.     mi_variable=0;
  7061.     mi_tabla[10];
  7062.     STRUCT mi_estructura[10]
  7063.         variable;
  7064.     END
  7065. BEGIN
  7066.     // Ejemplos correctos
  7067.     mi_offset=offset mi_variable;
  7068.     mi_offset=offset mi_tabla;
  7069.     mi_offset=offset mi_tabla[mi_variable];
  7070.     mi_offset=offset mi_estructura[0].variable;
  7071.     mi_offset=offset id.x;
  7072.  
  7073.     // Ejemplos erróneos
  7074.     mi_offset=offset (mi_variable*2);
  7075.     mi_offset=offset mi_constante;
  7076.     mi_offset=offset 0;
  7077.     write_int(0, 0, 0, 0, offset (mi_variable+1));
  7078. END
  7079. {-}
  7080.  
  7081. No hay ninguna diferencia entre el uso de la palabra reservada {#1085,offset}
  7082. o el símbolo {&}.
  7083.  
  7084. Las {#1005,constantes} como {mi_constante} no tiene una dirección pues son
  7085. simples sinónimos del valor numérico que representan.
  7086.  
  7087. La sentencia {mi_offset=offset (mi_variable*2);} es errónea debido a que
  7088. la multiplicación se realiza en primer lugar y, una vez realizada,
  7089. el valor {mi_variable*2} se convierte en un resultado numérico que
  7090. no tiene ninguna dirección asignada.
  7091.  
  7092. En cambio, la expresión {offset mi_variable*2} sí es correcta pues, en este caso, se obtiene primero la
  7093. dirección de {mi_variable} y luego será esta dirección la que se multiplique por {2}.
  7094.  
  7095. {/}Ver: {#1000,Sintaxis} - {#1085,offset}
  7096.  
  7097. # ─────────────────────────────────────────────────────────────────────────────
  7098.  
  7099. {.533,Demasiados valores para la tabla.}
  7100.  
  7101. Se ha inicializado una tabla con más valores de los que
  7102. puede contener.
  7103.  
  7104. {#9999,Ejemplo:}
  7105. PROGRAM mi_juego;
  7106. GLOBAL
  7107.     tabla1[3]=0, 1,2 , 3, 4; // Error: Demasiados valores para la tabla.
  7108. BEGIN
  7109.     //...
  7110. END
  7111. {-}
  7112.  
  7113. Para inicializar una tabla se debe tener en cuenta que, como
  7114. máximo, puede tener tantos valores como indique el número que va
  7115. entre los corchetes más 1.
  7116.  
  7117. {#9999,Ejemplo:}
  7118. PROGRAM mi_juego;
  7119. GLOBAL
  7120.     tabla1[3]=2, 4, 6, 8;
  7121. BEGIN
  7122.     //...
  7123. END
  7124. {-}
  7125.  
  7126. En este caso la tabla {tabla1} puede contener cuatro valores (tabla1[0]=2,
  7127. tabla1[1]=4, tabla1[2]=6 y tabla1[3]=8).
  7128.  
  7129. Otra opción es {no indicar el tamaño de la tabla}, por lo que el
  7130. compilador lo deducirá a partir de su inicialización.
  7131.  
  7132. {#9999,Ejemplo:}
  7133. PROGRAM mi_juego;
  7134. GLOBAL
  7135.     tabla1[]=2, 4, 6, 8;
  7136. BEGIN
  7137.     //...
  7138. END
  7139. {-}
  7140.  
  7141. En este caso, si dentro del programa se necesitase hacer referencia a la longitud de la tabla,
  7142. se debería utilizar la expresión {sizeof(tabla1)} que, en este ejemplo, valdría {4}.
  7143.  
  7144. {/}Ver: {#1000,Sintaxis} - {#1011,Declaración de tabla} - {#1094,sizeof()}
  7145.  
  7146. # ─────────────────────────────────────────────────────────────────────────────
  7147.  
  7148. {.534,Desbordamiento en división.}
  7149.  
  7150. En la posición indicada del programa aparece una {#1005,expresión constante} que no
  7151. ha podido ser resuelta por contener dentro de sus operaciones una división
  7152. entre cero.
  7153.  
  7154. Al dividir un número entre cero resulta ± infinito y como en el lenguaje
  7155. de programación sólo se pueden manejar números enteros, dentro del rango
  7156. ({#1177,min_int} ... {#1178,max_int}) no es posible guardar el resultado
  7157. de dicha operación en ninguna variable o relacionarlo con una constante.
  7158.  
  7159. {#9999,Ejemplo:}
  7160. PROGRAM mi_juego;
  7161. CONST
  7162.     infinito=1/0; // Error: Desbordamiento en división.
  7163. BEGIN
  7164.     //...
  7165. END
  7166. {-}
  7167.  
  7168. Probablemente se trate de un error involuntario, de ahí que deba evitarse que se realice
  7169. alguna división por cero al evaluar la expresión.
  7170.  
  7171. {/}Ver: {#1000,Sintaxis} - {#1019,Sentencia de asignación}
  7172.  
  7173. # ─────────────────────────────────────────────────────────────────────────────
  7174.  
  7175. {.535,Tabla de longitud negativa.}
  7176.  
  7177. Para definir una tabla indicando entre corchetes su longitud se
  7178. debe emplear un número entero positivo (0, 1, 2, 3, ...), teniendo en cuenta
  7179. que todas las tablas comienzan en la posición cero y terminan en
  7180. la posición que indicada en el índice.
  7181.  
  7182. {#9999,Ejemplo:}
  7183. PROGRAM mi_juego;
  7184. GLOBAL
  7185.     tabla1[9];
  7186.     tabla2[-9]; // Error: Tabla de longitud negativa.
  7187. BEGIN
  7188.     //...
  7189. END
  7190. {-}
  7191.  
  7192. El compilador ha detectado una tabla definida con una longitud
  7193. negativa como {tabla2}; en este ejemplo se debe definir la tabla como
  7194. {tabla1} que, en este caso, será una tabla de 10 posiciones (desde
  7195. tabla1[0] hasta tabla1[9]).
  7196.  
  7197. {/}Ver: {#1000,Sintaxis} - {#1011,Declaración de tabla}
  7198.  
  7199. # ─────────────────────────────────────────────────────────────────────────────
  7200.  
  7201. {.536,Esperando [(]}
  7202.  
  7203. El compilador espera que en la posición del programa indicada se abra un
  7204. paréntesis con el símbolo {#1053,(}.
  7205.  
  7206. Hay varios casos en los que es obligada la apertura de un {#1053,paréntesis}:
  7207.  
  7208. - {Tras un nombre de un proceso o una función} se deben
  7209. indicar siempre sus parámetros de llamada entre paréntesis; incluso cuando
  7210. el proceso o la función no tengan parámetros se debe abrir un paréntesis,
  7211. cerrándolo a continuación.
  7212.  
  7213. {#9999,Ejemplo:}
  7214. PROGRAM mi_juego;
  7215. BEGIN
  7216.     mi_proceso();
  7217.     //...
  7218. END
  7219. PROCESS mi_proceso()
  7220. BEGIN
  7221.   //...
  7222. END
  7223. {-}
  7224.  
  7225. - {En las sentencias de control que requieran una condición}
  7226. para controlar el flujo del programa, se debe poner entre paréntesis dicha
  7227. condición.
  7228.  
  7229. {#9999,Ejemplo:}
  7230. PROGRAM mi_juego;
  7231. BEGIN
  7232.     IF (x<10)
  7233.         //...
  7234.     END
  7235.  
  7236.     WHILE (x<10)
  7237.         //...
  7238.     END
  7239.  
  7240.     REPEAT
  7241.         //...
  7242.     UNTIL (x<10)
  7243.  
  7244.     SWITCH (x)
  7245.         //...
  7246.     END
  7247.  
  7248.     FOR (x=0;x<10;x++)
  7249.         //...
  7250.     END
  7251. END
  7252. {-}
  7253.  
  7254.   En este ejemplo se puede ver cómo las diferentes sentecias de control indican
  7255. entre paréntesis la condición. Hay dos excepciones:
  7256.  
  7257.   - La sentencia {#1021,SWITCH} no requiere una condición sino una simple expresión;
  7258. aún así, la requiere entre paréntesis.
  7259.  
  7260.   - La sentencia {#1025,FOR} tiene tres partes dentro de los paréntesis, separadas
  7261. por puntos y coma, siendo estas partes las siguientes: inicialización ({x=0}),
  7262. condición ({x<10}) e incremento ({x++}).
  7263.  
  7264. - {Tras el operador {#1089,DUP}} (utilizado para inicializar
  7265. tablas y estructuras) también es obligada la apertura
  7266. de un paréntesis.
  7267.  
  7268. {#9999,Ejemplo:}
  7269. PROGRAM mi_juego;
  7270. GLOBAL
  7271.     tabla1[]=10 dup (1, 2, 3);
  7272. BEGIN
  7273.     //...
  7274. END
  7275. {-}
  7276.  
  7277.   En este ejemplo, tabla1 sería una tabla de 30 posiciones (desde tabla1[0]
  7278. hasta tabla1[29]) inicializada de la siguiente forma: 1, 2, 3, 1, 2, 3, ...
  7279.  
  7280. {/}Ver: {#1000,Sintaxis} - {#1053,( )}
  7281.  
  7282. # ─────────────────────────────────────────────────────────────────────────────
  7283.  
  7284. {.538,No se puede duplicar 0 o menos veces.}
  7285.  
  7286. El operador {#1089,DUP} utilizado para inicializar tablas y
  7287. estructuras permite repetir (duplicar) una secuencia de
  7288. valores un determinado número de veces: desde una sola vez (en cuyo
  7289. caso el operador no tiene nínguna utilidad) hasta un número positivo
  7290. indeterminado de veces.
  7291.  
  7292. {#9999,Ejemplo:}
  7293. PROGRAM mi_juego;
  7294. GLOBAL
  7295.     tabla1[]=10 dup (1, 2, 3);
  7296.     tabla2[]=-10 dup (1, 2, 3); // Error: No se puede duplicar 0 o menos veces.
  7297. BEGIN
  7298.     //...
  7299. END
  7300. {-}
  7301.  
  7302. En este ejemplo, tabla1 sería una tabla de 30 posiciones (desde tabla1[0]
  7303. hasta tabla1[29]) inicializada de la siguiente forma: 1, 2, 3, 1, 2, 3, ...
  7304.  
  7305. Es posible, además, omitir el operador {#1089,DUP} quedando entonces la
  7306. declaración de tabla1 de la siguiente forma:
  7307.  
  7308.   {tabla1[]=10(1, 2, 3);}
  7309.  
  7310. El efecto es exactamente el mismo que en el ejemplo anterior, es decir,
  7311. cuando el compilador se encuentra en una inicialización de tabla la secuencia
  7312. {número ( secuencia_de_valores ... )} interpreta que se pretende repetir
  7313. la {secuencia_de_valores} el {número} de veces que se indica.
  7314.  
  7315. Por tanto, es imposible repetir una secuencia de valores cero o un número
  7316. negativo de veces.
  7317.  
  7318. {/}Ver: {#1000,Sintaxis} - {#1089,DUP}
  7319.  
  7320. # ─────────────────────────────────────────────────────────────────────────────
  7321.  
  7322. {.539,Asignación incorrecta.}
  7323.  
  7324. No se puede realizar la asignación indicada en esta posición del programa.
  7325. En una sentencia de asignación sólo está permitido asignar valores a
  7326. objetos tales como variables (sean del tipo que sean) a una
  7327. posición de una tabla, o a un elemento de una estructura.
  7328.  
  7329. No es posible asignar un valor a una {#1004,constante}, a una
  7330. función o a un proceso, o, en general, a cualquier
  7331. expresión numérica o lógica.
  7332.  
  7333. En el siguiente programa se muestran ejemplos de varios tipos de asignaciones
  7334. incorrectas:
  7335.  
  7336. {#9999,Ejemplo:}
  7337. PROGRAM mi_juego;
  7338. CONST
  7339.     mi_constante=0;
  7340. BEGIN
  7341.     mi_constante=1;  // Error: Asignación incorrecta.
  7342.     type mi_juego=2; // Error: Asignación incorrecta.
  7343.     sizeof(mouse)=3; // Error: Asignación incorrecta.
  7344.     4+5=6;           // Error: Asignación incorrecta.
  7345.     //...
  7346. END
  7347. {-}
  7348.  
  7349. Todas estas asignaciones no son válidas porque no se puede modificar con
  7350. una asignación el resultado de una expresión, que es sólo un valor numérico; por ello,
  7351. es como poner una sentencia del tipo {2=4;} que, por supuesto, es imposible de realizar.
  7352.  
  7353. {/}Ver: {#1000,Sintaxis} - {#1035,Definición de expresión}
  7354.  
  7355. # ─────────────────────────────────────────────────────────────────────────────
  7356.  
  7357. {.540,Esperando [END]}
  7358.  
  7359. Dentro de las palabras reservadas {#1086,BEGIN} y {#1091,END} se espera un
  7360. bloque de sentencias, así como dentro de sentencias como las que siguen:
  7361.  
  7362.   {#1020,IF} ... {#1090,ELSE} ... {#1091,END}·
  7363.   {#1024,LOOP} ... {#1091,END}·
  7364.   {#1022,WHILE} ... {#1091,END}·
  7365.   {#1025,FOR} ... {#1091,END}·
  7366.   {#1043,FROM} ... {#1091,END}·
  7367.   {#1021,SWITCH} ... {#1091,END}·
  7368.  
  7369. Un bloque de sentencias acaba (y sólo puede acabar) con cualquiera de estas
  7370. tres palabras reservadas: {#1091,END}, {#1097,UNTIL} o {#1090,ELSE}.
  7371.  
  7372. En el programa hay un bloque que se esperaba que acabara con la palabra
  7373. reservada {#1091,END} pero finaliza con otra palabra; los dos casos más probables son:
  7374.  
  7375. - Que se haya perdido un {#1023,REPEAT} o un {#1020,IF} acabando el bloque de
  7376. sentencias con un {#1097,UNTIL} o un {#1090,ELSE}; en este caso, se debe
  7377. buscar el {#1023,REPEAT} o {#1020,IF} asociado.
  7378.  
  7379. {#9999,Ejemplo:}
  7380. PROGRAM mi_juego;
  7381. BEGIN
  7382. //  REPEAT
  7383.     //...
  7384.     UNTIL (key(_esc)); // Error: Esperando [END].
  7385. END
  7386. {-}
  7387.  
  7388.   En este ejemplo el bloque de sentencias que comenzó con el {#1086,BEGIN}
  7389. del programa principal ha acabado con un {#1097,UNTIL} (puesto que se ha
  7390. comentado accidentalmente el {#1023,REPEAT}), y el compilador esperaba que
  7391. este bloque acabara con un {#1091,END}.
  7392.  
  7393. - Que se haya perdido un {#1091,END} de alguna sentencia y llegue el
  7394. siguiente {#1016,PROCESS} o el final del programa esperando el END que
  7395. se ha perdido.
  7396.  
  7397. {#9999,Ejemplo:}
  7398. PROGRAM mi_juego;
  7399. BEGIN
  7400.     IF (x<0) x++;
  7401. END
  7402. PROCESS mi_proceso() // Error: Esperando [END].
  7403. BEGIN
  7404.     //...
  7405. END
  7406. {-}
  7407.  
  7408.   En este caso no se ha puesto el {#1091,END} del {#1020,IF} interpretando
  7409. el compilador que el {#1020,IF} acaba al llegar el siguiente {#1091,END}
  7410. (el del {#1086,BEGIN}) y, por tanto, al llegar el nuevo {#1016,PROCESS}
  7411. sigue esperando el {#1091,END} del {#1086,BEGIN}.
  7412.  
  7413. {/}Ver: {#1000,Sintaxis} - {#1091,END}
  7414.  
  7415. # ─────────────────────────────────────────────────────────────────────────────
  7416.  
  7417. {.541,Expresión incorrecta.}
  7418.  
  7419. En la posición indicada del programa hay una expresión
  7420. incorrectamente construida, de forma que el compilador no puede
  7421. interpretarla.
  7422.  
  7423. - Revise la {#1000,sintaxis} de la expresión.
  7424.  
  7425. - En caso de no encontrar el error, intente expresarla de otra forma.
  7426.  
  7427. - Intente dividir la expresión en varias subexpresiones realizando
  7428. secuencialmente y de forma separada los distintos cálculos que se realizan
  7429. en la expresión original. Por ejemplo, la expresión:
  7430.  
  7431.   {x=(x*4+1)/2;}
  7432.  
  7433.   se puede expresar como tres expresiones diferentes, que son:
  7434.  
  7435.   {x=x*4;}·
  7436.   {x=x+1;}·
  7437.   {x=x/2;}·
  7438.  
  7439.   De esta forma podrá localizar en qué punto exacto del cálculo se haya la
  7440. operación que no es posible realizar.
  7441.  
  7442. {/}Ver: {#1000,Sintaxis} - {#1035,Definición de Expresión}
  7443.  
  7444. # ─────────────────────────────────────────────────────────────────────────────
  7445.  
  7446. {.542,Esperando [UNTIL]}
  7447.  
  7448. Un bloque de sentencias que comenzó con la palabra reservada {#1023,REPEAT}
  7449. debe acabar necesariamente con la palabra {#1097,UNTIL}; en la posición
  7450. indicada del programa se ha finalizado el bloque de sentencias con otra
  7451. palabra diferente, lo más probable es:
  7452.  
  7453. - Que se ha finalizado un {#1023,REPEAT} con un {#1091,END} en cuyo caso,
  7454. si lo que se prentende es realizar un bucle indefinidamente, se debe utilizar
  7455. la sentencia {#1024,LOOP} ... {#1091,END}.
  7456.  
  7457. {#9999,Ejemplo:}
  7458. PROGRAM mi_juego;
  7459. BEGIN
  7460.     REPEAT
  7461.     //...
  7462.     END // Error: Esperando [UNTIL]
  7463. END
  7464. {-}
  7465.  
  7466. - Que dentro del bucle {#1023,REPEAT} ... {#1097,UNTIL} aparezca una palabra
  7467. como {#1091,END} o {#1090,ELSE} de más y, por lo tanto, sin su correspondiente
  7468. inicio ({#1020,IF}, {#1022,WHILE}, ...).
  7469.  
  7470. {#9999,Ejemplo:}
  7471. PROGRAM mi_juego;
  7472. BEGIN
  7473.     REPEAT
  7474.         IF (x<0) x++; END
  7475.             y++;
  7476.         END // Error: Esperando [UNTIL]
  7477.     UNTIL (x>=0);
  7478. END
  7479. {-}
  7480.  
  7481.   En este caso, se ha puesto el {#1091,END} del {#1020,IF} dos veces,
  7482. interpretando el compilador que el segundo {#1091,END} pretende cerrar el
  7483. {#1023,REPEAT}.
  7484.  
  7485. - O, por último, que se haya olvidado poner el {#1097,UNTIL} del
  7486. {#1023,REPEAT}.
  7487.  
  7488. {/}Ver: {#1000,Sintaxis} - {#1023, Sentencia REPEAT} - {#1020,IF} - {#1022,WHILE}
  7489.  
  7490. # ─────────────────────────────────────────────────────────────────────────────
  7491.  
  7492. {.543,Local no se puede acceder.}
  7493.  
  7494. En la posición indicada en el programa se pretende acceder a un dato
  7495. de otro proceso, siendo imposible ya que dicho dato no es local
  7496. del otro proceso.
  7497.  
  7498. Debe comprobarse que el dato que se pretende acceder está
  7499. definido dentro de la sección {#1007,LOCAL} del programa, o bien un dato
  7500. local predefinido en el lenguaje (como {#1123,x}, {#1124,y}, {#1126,graph},
  7501. {#1128,size}, ...).
  7502.  
  7503. {#9999,Ejemplo:}
  7504. PROGRAM mi_juego;
  7505. GLOBAL
  7506.     id_mi_proceso;
  7507.     puntos=0;
  7508. BEGIN
  7509.     id_mi_proceso=mi_proceso();
  7510.     id_mi_proceso.x=0;
  7511.     id_mi_proceso.puntos=0; // Error: Local no se puede acceder.
  7512. END
  7513. PROCESS mi_proceso()
  7514. BEGIN
  7515.     //...
  7516. END
  7517. {-}
  7518.  
  7519. En este caso se prentende acceder a los {puntos} de {mi_proceso}, pero
  7520. {puntos} es una única variable {#1006,GLOBAL} y no una variable {#1007,LOCAL}
  7521. de cada proceso. Esto también puede suceder intentando acceder a una constante
  7522. (definida en {#1005,CONST}) o a una expresión como:
  7523.  
  7524.   {x=id_mi_proceso.(x+1);}
  7525.  
  7526. En este último ejemplo la expresión carece de sentido por completo;
  7527. probablemente fuera la siguiente expresión la que se prentendiera formular:
  7528.  
  7529.   {x=id_mi_proceso.x+1;}
  7530.  
  7531.   (equivalente a {x=(id_mi_proceso.x)+1;}).
  7532.  
  7533. {/}Ver: {#1000,Sintaxis} - {#1007,Declaracion datos locales}
  7534.  
  7535. # ─────────────────────────────────────────────────────────────────────────────
  7536.  
  7537. {.544,Parámetro no válido.}
  7538.  
  7539. Los procesos pueden recibir parámetros en los siguientes tipos de datos:
  7540.  
  7541. - Un dato local predefinido (como {#1123,x}, {#1128,size}, {#1127,flags}, ...).
  7542.  
  7543. - Un dato local definido dentro de la sección {#1007,LOCAL}.
  7544.  
  7545. - Un dato global definido dentro de la sección {#1006,GLOBAL}.
  7546.  
  7547. - Un dato privado del proceso declarado dentro de la sección {#1008,PRIVATE}
  7548. del propio proceso.
  7549.  
  7550. - Un dato privado que {no esté declarado} dentro de la sección
  7551. {#1008,PRIVATE}.
  7552.  
  7553. Entendiéndose en todos estos casos que un dato puede referirse a una
  7554. variable, a una posición concreta de una tabla o a
  7555. un elemento dentro de una estructura.
  7556.  
  7557. En la posición indicada del programa se pretende recibir un parámetro en
  7558. un objeto diferente de los arriba indicados, o bien indicar una
  7559. expresión en lugar de un simple dato. Estos son algunos ejemplos de
  7560. declaraciones de parámetros inválidas:
  7561.  
  7562.   {PROCESS mi_proceso(mi_constante)}·
  7563.   No se puede recibir un parámetro en una constante.
  7564.  
  7565.   {PROCESS mi_proceso(x*2)}·
  7566.   No se puede recibir un parámetro en una expresión.
  7567.  
  7568.   {PROCESS mi_proceso(x=0)}·
  7569.   No se puede recibir un parámetro en una asignación.
  7570.  
  7571. {/}Ver: {#1000,Sintaxis} - {#1018,Parámetros de un proceso}
  7572.  
  7573. # ─────────────────────────────────────────────────────────────────────────────
  7574.  
  7575. {.545,Se esperaba otro parámetro.}
  7576.  
  7577. En las llamadas a procesos o funciones se deben poner tantos
  7578. valores o expresiones como párametros se requieran, todos dentro del
  7579. mismo {#1053,paréntesis} y separados por {#1059,comas (,)}. Este
  7580. error se produce cuando se cierra el paréntesis tras una {#1059,coma},
  7581. como en el siguiente ejemplo:
  7582.  
  7583. {#9999,Ejemplo:}
  7584. PROGRAM mi_juego;
  7585. BEGIN
  7586.     signal(id, ); // Error: Se esperaba otro parámetro.
  7587. END
  7588. {-}
  7589.  
  7590. Puede haber pasado dos cosas; se ha puesto una coma accidentalmente tras
  7591. el último parámetro, o bien se ha omitido el último parámetro (como en el
  7592. ejemplo anterior).
  7593.  
  7594. {/}Ver: {#1000,Sintaxis} - {#1018,Parámetros de un proceso}
  7595.  
  7596. # ─────────────────────────────────────────────────────────────────────────────
  7597.  
  7598. {.546,Número de parámetros incorrecto.}
  7599.  
  7600. El proceso o función tiene un número diferente de parámetros a los que aparecen
  7601. en la posición señalada en el programa.
  7602.  
  7603. Si se trata de una función, acceda al {#4,glosario} para consultar los parámetros
  7604. que requiere o bien sitúe el cursor sobre el nombre de la función en el
  7605. programa y entonces pulse {F1}.
  7606.  
  7607. Si se trata de un {#1013,proceso}, entonces puede que en la posición señalada el
  7608. número de parámetros sea correcto pero haya aparecido una llamada a dicho
  7609. proceso anteriormente en el programa con un número diferente de parámetros.
  7610.  
  7611. {#9999,Ejemplo:}
  7612. PROGRAM mi_juego;
  7613. BEGIN
  7614.     mi_proceso();
  7615. END
  7616. PROCESS mi_proceso(x, y) // Error: Número de parámetros incorrecto.
  7617. BEGIN
  7618.     //...
  7619. END
  7620. {-}
  7621.  
  7622. En este ejemplo el error no está en la definición del proceso como se indica,
  7623. sino en la llamada anterior a dicho proceso ({mi_proceso();}); esto es así
  7624. porque el compilador, cuando se encuentra una llamada a un proceso que no
  7625. conoce, lo registra como un nuevo proceso y apunta su número de parámetros.
  7626. Si la próxima vez que se encuentre dicho proceso no coincide el número de
  7627. parámetros con los que tenía registrados, entonces se emite el error.
  7628.  
  7629. Por tanto, en caso de ser correcta la llamada o definición del proceso
  7630. señalada en el programa, utilice la opción de búsqueda ({ALT-F}) para revisar
  7631. el número de parámetros en las anteriores llamadas a dicho proceso.
  7632.  
  7633. {/}Ver: {#1000,Sintaxis} - {#4,Glosario} - {#1018,Parámetros de un proceso}
  7634.  
  7635. # ─────────────────────────────────────────────────────────────────────────────
  7636.  
  7637. {.547,Esperando [;]}
  7638.  
  7639. La sentencia {#1024,FOR} tiene tres partes dentro de los paréntesis separadas
  7640. por puntos y coma, siendo estas partes las siguientes:
  7641.  
  7642.   FOR ({inicialización}; {condición}; {incremento})
  7643.  
  7644. - La {inicialización} suele ser una {#1019,asignación} que fija el
  7645. valor de un dato cuando se comienza a ejecutar la sentencia {#1025,FOR}.
  7646.  
  7647. - La condición que se establece en segundo lugar determina
  7648. la permanencia dentro del bucle; cada iteración se mirará primero
  7649. si se cumple dicha condición y, en caso contrario, se finalizará
  7650. la ejecución de la sentencia {#1025,FOR}.
  7651.  
  7652. - El {incremento} actualiza el valor del dato que sirve como contador tras cada
  7653. iteración del bucle.
  7654.  
  7655. Ninguna de las tres partes son obligatorias, pero sí lo son los paréntesis
  7656. y los dos símbolos {#1068,punto y coma (;)} que separan las partes.
  7657.  
  7658. {#9999,Ejemplo:}
  7659. PROGRAM mi_juego;
  7660. BEGIN
  7661.     FOR ( graph=10 ; graph<20 ; graph=graph+1 )
  7662.         //...
  7663.     END
  7664.     FOR ( graph=10 ; graph<20 graph=graph+1) // Error: Esperando [;]
  7665.         //...
  7666.     END
  7667. END
  7668. {-}
  7669.  
  7670. Dentro de cada una de las tres partes se pueden poner varias sentencias
  7671. siempre que se separen por {#1059,comas (,)} (varias inicializaciones, condiciones o
  7672. incrementos).
  7673.  
  7674. {/}Ver: {#1000,Sintaxis} - {#1068, Punto y coma (;)} - {#1025,Sentencia FOR}
  7675.  
  7676. # ─────────────────────────────────────────────────────────────────────────────
  7677.  
  7678. {.548,[BREAK] no aparece dentro de un bucle.}
  7679.  
  7680. La sentencia {#1026,BREAK} provoca que el programa continúe tras el bucle que se
  7681. esté ejecutando.
  7682.  
  7683. Esta sentencia sirve para salir de los siguientes bucles:
  7684.  
  7685.   {#1024,LOOP} ... {#1091,END}·
  7686.   {#1043,FROM} .. {#1096,TO} .. {#1095,STEP} .. ... {#1091,END}·
  7687.   {#1023,REPEAT} ... {#1097,UNTIL} {#1053,(} .. {#1053,)}·
  7688.   {#1022,WHILE} {#1053,(} .. {#1053,)} ... {#1091,END}·
  7689.   {#1025,FOR} {#1053,(} .. {#1068,;} .. {#1068,;} .. {#1053,)} ... {#1091,END}·
  7690.  
  7691. Un {#1026,BREAK} provocará que el programa continúe ejecutándose
  7692. tras el {#1091,END} o {#1097,UNTIL} del bucle más cercano a la sentencia.
  7693. {#1026,BREAK} sólo puede aparecer dentro de uno de estos bucles}.
  7694.  
  7695. En caso de haber varios bucles anidados (unos dentro de otros) la sentencia
  7696. {#1026,BREAK} saldrá unicamente del bucle más interior de todos ellos.
  7697.  
  7698. {#9999,Ejemplo:}
  7699. PROGRAM mi_juego;
  7700. BEGIN
  7701.     LOOP
  7702.         REPEAT
  7703.             IF (key(_esc)) BREAK; END
  7704.             //...
  7705.         UNTIL (x==0);
  7706.         //...
  7707.     END
  7708.     BREAK; // Error: [BREAK] no aparece dentro de un bucle.
  7709. END
  7710. {-}
  7711.  
  7712. En este ejemplo la sentencia {#1026,BREAK} saldrá del
  7713. {#1023,REPEAT} ... {#1097,UNTIL} (cuando se pulse la tecla {ESC})
  7714. pero no del {#1024,LOOP} ... {#1091,END}.
  7715.  
  7716. {/}Ver: {#1000,Sintaxis} - {#1026,Sentencia BREAK}
  7717.  
  7718. # ─────────────────────────────────────────────────────────────────────────────
  7719.  
  7720. {.549,[CONTINUE] no aparece dentro de un bucle.}
  7721.  
  7722. La sentencia {#1027,CONTINUE} provoca que el programa finalice la
  7723. iteración actual del bucle que se esté ejecutando.
  7724.  
  7725. Esta sentencia sirve para ir al inicio/final de los siguientes
  7726. bucles:
  7727.  
  7728. {#1024,LOOP} ... {#1091,END}·
  7729. Un {#1027,CONTINUE} dentro de este bucle saltará al {#1024,LOOP}.
  7730.  
  7731. {#1043,FROM} .. {#1096,TO} .. {#1095,STEP} .. ... {#1091,END}·
  7732. Un {#1027,CONTINUE} dentro de este bucle realizará el incremento
  7733. ({#1095,STEP}) y, si no se ha pasado el valor indicado en el
  7734. {#1096,TO}, continuará el programa al inicio del bucle.
  7735.  
  7736. {#1023,REPEAT} ... {#1097,UNTIL} {#1053,(} .. {#1053,)}·
  7737. Un {#1027,CONTINUE} dentro de este bucle saltará al {#1097,UNTIL}.
  7738.  
  7739. {#1022,WHILE} {#1053,(} .. {#1053,)} ... {#1091,END}·
  7740. Un {#1027,CONTINUE} dentro de este bucle saltará al {#1022,WHILE}.
  7741.  
  7742. {#1025,FOR} {#1053,(} .. {#1068,;} .. {#1068,;} .. {#1053,)} ... {#1091,END}·
  7743. Un {#1027,CONTINUE} dentro de este bucle realizará el incremento
  7744. y la comparación; si ésta última resulta cierta continuará el
  7745. programa al inicio del bucle, pero si resulta falsa el programa
  7746. continuará tras el {#1091,END} del {#1025,FOR}.
  7747.  
  7748. {#1027,CONTINUE} {debe aparecer obligatoriamente dentro de uno de estos bucles}.
  7749.  
  7750. En caso de haber varios bucles anidados (unos dentro de otros) la sentencia
  7751. {#1027,CONTINUE} tendrá efecto únicamente en el bucle más interior de ellos.
  7752.  
  7753. {#9999,Ejemplo:}
  7754. PROGRAM mi_juego;
  7755. BEGIN
  7756.     FOR (x=0, y=0;x<10;x++)
  7757.         IF (x<5) CONTINUE; END
  7758.         y++;
  7759.     END
  7760. END
  7761. {-}
  7762.  
  7763. En este ejemplo tras ejecutarse el bucle completo {x} valdrá {10} e {y}
  7764. valdrá {5}, pues mientras {x} es menor que 5 la sentencia {#1027,CONTINUE}
  7765. impide que se ejecute la sentencia {y++;}.
  7766.  
  7767. {/}Ver: {#1000,Sintaxis} - {#1027,Sentencia CONTINUE}
  7768.  
  7769. # ─────────────────────────────────────────────────────────────────────────────
  7770.  
  7771. {.550,Esperando [CASE], [DEFAULT] o [END]}
  7772.  
  7773. La sintaxis de la sentencia {#1021,SWITCH} es, a grandes rasgos, como sigue:
  7774.  
  7775.     {#1021,SWITCH} {#1053,( }expresión{#1053, )}·
  7776.         {#1087,CASE} valor{#1067, :}·
  7777.             sentencias{#1068,;}·
  7778.         {#1091,END}·
  7779.         {#1087,CASE} valor{#1064, .. }valor{#1067, :}·
  7780.             sentencias{#1068,;}·
  7781.         {#1091,END}·
  7782.         {#1087,CASE} valor, valor, valor{#1067, :}·
  7783.             sentencias{#1068,;}·
  7784.         {#1091,END}·
  7785.         //...·
  7786.         {#1088,DEFAULT} {#1067,:}·
  7787.             sentencias{#1068,;}·
  7788.         {#1091,END}·
  7789.     {#1091,END}
  7790.  
  7791. La posición señalada en el programa está dentro de una sentencia {#1021,SWITCH},
  7792. pero fuera de una sección {#1087,CASE} o {#1088,DEFAULT}; por eso el compilador
  7793. esperaba que en dicha posición apareciera una de estas tres sentencias:
  7794.  
  7795. - La palabra reservada {#1087,CASE} iniciando una nueva sección a ejecutar
  7796. cuando la expresión coincidiera con el valor indicado.
  7797.  
  7798. - La palabra reservada {#1088,DEFAULT} iniciando una sección por defecto a
  7799. ejecutar cuando la expresión no coincidiera con ninguno de los valores
  7800. indicados en las diferentes secciones {#1087,CASE}.
  7801.  
  7802. - La palabra reservada {#1091,END} dando por finalizada la sentencia
  7803. {#1021,SWITCH}.
  7804.  
  7805. Para ver una descripción más detallada de la sentencia {#1021,SWITCH}
  7806. consulte la sintaxis del lenguaje.
  7807.  
  7808. {/}Ver: {#1000,Sintaxis} - {#1021,Sentencia SWITCH}
  7809.  
  7810. # ─────────────────────────────────────────────────────────────────────────────
  7811.  
  7812. {.551,Esperando [END]}
  7813.  
  7814. Se esperaba un {#1091,END} del {#1087,CASE} o {#1088,DEFAULT} dentro de la
  7815. sentencia {#1021,SWITCH}.
  7816.  
  7817. Dentro de las palabras reservadas {#1021,SWITCH} y {#1091,END} se espera una
  7818. o más secciones del tipo:
  7819.  
  7820.   {#1087,CASE} ... {#1091,END}·
  7821.   {#1088,DEFAULT} ... {#1091,END}·
  7822.  
  7823. En el programa hay una de estas secciones que se esperaba que acabe con
  7824. la palabra reservada {#1091,END} pero acaba con otra palabra; el caso más
  7825. probable es:
  7826.  
  7827. - Que se haya perdido un {#1023,REPEAT} o un {#1020,IF} acabando el bloque
  7828. de sentencias con un {#1097,UNTIL} o un {#1090,ELSE}; en este caso se debe
  7829. buscar el {#1023,REPEAT} o {#1020,IF} asociado.
  7830.  
  7831. {#9999,Ejemplo:}
  7832. PROGRAM mi_juego;
  7833. BEGIN
  7834.     SWITCH (x)
  7835.         CASE 0:
  7836.             //REPEAT
  7837.             //...
  7838.             UNTIL (key(_esc)); // Error: Esperando [END]
  7839.         END
  7840.     END
  7841. END
  7842. {-}
  7843.  
  7844. En este ejemplo la sección que comenzó con el {#1087,CASE} ha acabado con
  7845. un {#1097,UNTIL} (puesto que se ha comentado accidentalmente el
  7846. {#1023,REPEAT}), y el compilador esperaba que esta sección acabara con un
  7847. {#1091,END}.
  7848.  
  7849. {/}Ver: {#1000,Sintaxis}
  7850.  
  7851. # ─────────────────────────────────────────────────────────────────────────────
  7852.  
  7853. {.552,Esperando [PROCESS]}
  7854.  
  7855. El compilador ha interpretado que, en la posición señalada en el
  7856. programa, ha finalizado el programa principal
  7857. ({#1015,PROGRAM} ... {#1086,BEGIN} ... {#1091,END}), o el último
  7858. proceso ({#1016,PROCESS} ... {#1086,BEGIN} ... {#1091,END}) y, a
  7859. continuación, se esperaba que continuara otro proceso o bien que
  7860. acabara el programa.
  7861.  
  7862. Lo más frecuente es haber duplicado un {#1091,END} dentro del último bloque de
  7863. sentencias {#1086,BEGIN} ... {#1091,END}.
  7864.  
  7865. {#9999,Ejemplo:}
  7866. PROGRAM mi_juego;
  7867. BEGIN
  7868.     IF (x<0) x++; END
  7869.     END
  7870.     FRAME; // Error: Esperando [PROCESS].
  7871. END
  7872. {-}
  7873.  
  7874. En este ejemplo se ha puesto accidentalmente dos veces el {#1091,END}
  7875. del {#1020,IF}, interpretando el compilador que el segundo es el {#1091,END}
  7876. del {#1086,BEGIN}, por lo tanto, tras este último {#1091,END} sólo
  7877. puede venir el final del programa o la palabra reservada {#1016,PROCESS}
  7878. marcando el inicio de un nuevo proceso. Al encontrarse en esa
  7879. posición, una sentencia {#1029,FRAME}, el compilador emite el error.
  7880.  
  7881. {/}Ver: {#1000,Sintaxis} - {#1016,Declaración de proceso}
  7882.  
  7883. # ─────────────────────────────────────────────────────────────────────────────
  7884.  
  7885. {.553,No se puede especificar una tabla como parámetro.}
  7886.  
  7887. No es necesario declarar dentro de la sección {#1008,PRIVATE} los
  7888. {#1018,parámetros del proceso}, pues éstos se declaran de forma automática;
  7889. pero en caso de declararlos se deben declarar como variables
  7890. no como tablas o estructuras, y no se deben inicializar.
  7891.  
  7892. Lo más probable es que se haya pretendido utilizar el mismo nombre para dos
  7893. objetos diferentes; por un lado, para uno de los parámetros del proceso
  7894. y, por otro, para una tabla {#1008,PRIVATE} del mismo proceso.
  7895.  
  7896. {#9999,Ejemplo:}
  7897. PROGRAM mi_juego;
  7898. BEGIN
  7899.     //...
  7900. END
  7901. PROCESS mi_proceso(a)
  7902. PRIVATE
  7903.     a[9]; // Error: No se puede especificar una tabla como parámetro.
  7904. BEGIN
  7905.     //...
  7906. END
  7907. {-}
  7908.  
  7909. El compilador interpreta que se está tipificando el parámetro {a} como
  7910. una tabla de 10 posiciones y como no se puede pasar una tabla como
  7911. parámetro, emite el error.
  7912.  
  7913. {/}Ver: {#1000,Sintaxis} - {#1018,Parametros de un proceso}
  7914.  
  7915. # ─────────────────────────────────────────────────────────────────────────────
  7916.  
  7917. {.554,No se puede inicializar un parámetro.}
  7918.  
  7919. No es necesario declarar dentro de la sección {#1008,PRIVATE} los
  7920. {#1018,parámetros del proceso}, ya que éstos se declaran de forma automática,
  7921. si bien en caso de declararlos se deben declarar como variables
  7922. no como tablas o estructuras, y no se deben inicializar.
  7923.  
  7924. Lo más probable es que se haya pretendido utilizar el mismo nombre para dos
  7925. objetos diferentes, por un lado, para uno de los parámetros del proceso y, por otro,
  7926. para una variable {#1008,PRIVATE} del mismo proceso.
  7927.  
  7928. {#9999,Ejemplo:}
  7929. PROGRAM mi_juego;
  7930. BEGIN
  7931.     //...
  7932. END
  7933. PROCESS mi_proceso(a)
  7934. PRIVATE
  7935.     a=0; // Error: No se puede inicializar un parámetro.
  7936. BEGIN
  7937.     //...
  7938. END
  7939. {-}
  7940.  
  7941. El compilador interpreta que se está inicializando el parámetro {a} a {0},
  7942. y como no está permitido inicializar un parámetro (pues su valor lo tomará
  7943. en función de la llamada al proceso), se emite el error.
  7944.  
  7945. {/}Ver: {#1000,Sintaxis} - {#1018,Parametros de un proceso}
  7946.  
  7947. # ─────────────────────────────────────────────────────────────────────────────
  7948.  
  7949. {.555,Llegó el final dentro de un comentario.}
  7950.  
  7951. Ha llegado el final del programa dentro de un comentario de varias líneas
  7952. (los definidos entre los símbolos{#1002, /*} y{#1002, */}).
  7953.  
  7954. Este error se debe a que algún comentario no se ha cerrado, por ello se debe revisar
  7955. que todos los comentarios abiertos con el símbolo{#1002, /*} tengan su
  7956. correspondiente símbolo{#1002, */} cerrándolos.
  7957.  
  7958. {#9999,Ejemplo:}
  7959. PROGRAM mi_juego;
  7960. BEGIN
  7961.     /* Inicio del comentario
  7962.     FRAME;
  7963. END // Error: Llegó el final dentro de un comentario.
  7964. {-}
  7965.  
  7966. {/}Ver: {#1000,Sintaxis} - {#1002,Definición de comentarios}
  7967.  
  7968. # ─────────────────────────────────────────────────────────────────────────────
  7969.  
  7970. {.556,No se puede acceder a datos PRIVATE externos.}
  7971.  
  7972. En la posición indicada del programa se intenta acceder a un dato
  7973. de tipo {#1008,PRIVATE} de otro proceso; no está permitido.
  7974.  
  7975. Si se quiere acceder desde un proceso a un dato de otro proceso, éste se
  7976. debe declarar dentro de la sección {#1007,LOCAL}.
  7977.  
  7978. {#9999,Ejemplo:}
  7979. PROGRAM mi_juego;
  7980. PRIVATE n;
  7981. BEGIN
  7982.     mi_proceso();
  7983.     //...
  7984. END
  7985. PROCESS mi_proceso()
  7986. PRIVATE n;
  7987. BEGIN
  7988.     father.n=0; // No se puede acceder a datos PRIVATE externos.
  7989. END
  7990. {-}
  7991.  
  7992. Es imposible acceder a datos {#1008,PRIVATE} incluso cuando el proceso accedido
  7993. es del mismo tipo que el proceso que está intentando acceder al dato.
  7994.  
  7995. La forma correcta en la que se debe declarar la variable {n} en el ejemplo
  7996. anterior es como se muestra a continuación:
  7997.  
  7998. {#9999,Ejemplo:}
  7999. PROGRAM mi_juego;
  8000. LOCAL n;
  8001. BEGIN
  8002.     mi_proceso();
  8003.     //...
  8004. END
  8005. PROCESS mi_proceso()
  8006. BEGIN
  8007.     father.n=0;
  8008. END
  8009. {-}
  8010.  
  8011. Se recuerda que los datos declarados dentro de la sección {#1007,LOCAL}
  8012. los tendrán todos los procesos del programa (todos los procesos del ejemplo
  8013. anterior tendrán una variable propia de nombre {n}).
  8014.  
  8015. {/}Ver: {#1000,Sintaxis} - {#1008,Declaración de datos PRIVATE}
  8016.  
  8017. # ─────────────────────────────────────────────────────────────────────────────
  8018.  
  8019. {.557,Una estructura debe contener, al menos, un elemento.}
  8020.  
  8021. En la posición resaltada del programa se pretende cerrar con
  8022. {#1091,END} la declaración de una estructura sin
  8023. ningún elemento (campo) definido en la misma.
  8024.  
  8025. Una estructura ({#1012,STRUCT}) es como una lista de fichas
  8026. (registros) con varias informaciones (campos) en cada ficha.
  8027.  
  8028. {STRUCT nombre_estructura[10]}·
  8029.     {x, y;}·
  8030. {END}
  8031.  
  8032. En este ejemplo la estructura (conjunto de fichas) se llama {nombre_estructura}
  8033. y tiene {10 registros} (diez fichas) con {2 campos} cada una (con dos
  8034. informaciones; {x} e {y}).
  8035.  
  8036. Por lo tanto, no tiene ningún sentido definir una estructura
  8037. sin campos (ya que es como definir un conjunto de fichas sin ninguna
  8038. información).
  8039.  
  8040. Para acceder después a la información de las fichas se utiliza la estructura
  8041. como sigue (supóngase que se quiere poner en la variable global {n} el valor
  8042. {y} de la ficha número {5}).
  8043.  
  8044. {n=nombre_estructura[5].y;}
  8045.  
  8046. A continuación se muestra un programa erróneo.
  8047.  
  8048. {#9999,Ejemplo:}
  8049. PROGRAM mi_juego;
  8050. GLOBAL
  8051.     STRUCT mi_estructura[10]
  8052.  
  8053.     END // Error: Una estructura debe contener, al menos, un elemento.
  8054. BEGIN
  8055.     //...
  8056. END
  8057. {-}
  8058.  
  8059. {/}Ver: {#1000,Sintaxis} - {#1012,Declaración de Estructura}
  8060.  
  8061. # ─────────────────────────────────────────────────────────────────────────────
  8062.  
  8063. {.558,Esperando un elemento de la estructura.}
  8064.  
  8065. En la posición señalada del programa se pretende declarar un elemento (campo)
  8066. de la estructura no válido.
  8067.  
  8068. Una estructura puede tener únicamente campos de los siguientes tipos:
  8069.  
  8070. - Una variable, en cuyo caso se deberá indicar en la declaración el
  8071. nombre de la misma, sin inicializar.
  8072.  
  8073. - Una tabla, indicando el nombre de la misma y, a continuación,
  8074. entre corchetes, la longitud de la misma (se recuerda que una tabla declarada
  8075. como {mi_tabla[9];} es una tabla de {10} posiciones, desde mi_tabla[0] hasta
  8076. mi_tabla[10]). Tampoco se deben inicializar.
  8077.  
  8078. - Otra estructura. Es posible incluir estructuras dentro de
  8079. otras estructuras, sin ningún límite de anidamiento, hasta donde sea
  8080. necesario. A continuación se muestra un ejemplo de anidamiento de estructuras.
  8081.  
  8082. {#9999,Ejemplo:}
  8083. PROGRAM mi_juego;
  8084. GLOBAL
  8085.     STRUCT mi_estructura[9]
  8086.         elementos;
  8087.         STRUCT datos[9]
  8088.             x, y;
  8089.         END
  8090.     END
  8091.     a, b;
  8092. BEGIN
  8093.     FROM a=0 TO 9;
  8094.         mi_estructura[a].elementos=-1;
  8095.         FROM b=0 TO 9;
  8096.             mi_estructura[a].datos[b].x=-1;
  8097.             mi_estructura[a].datos[b].y=-1;
  8098.         END
  8099.     END
  8100.     //...
  8101. END
  8102. {-}
  8103.  
  8104. En este ejemplo, cada registro de {mi_estructura} tendrá una variable
  8105. denominada {elementos} y otra estructura con 10 elementos cada uno con dos
  8106. variables: {x} e {y}.
  8107.  
  8108. Más adelante, en el mismo ejemplo, se puede observar un ejemplo de acceso
  8109. a dicha estrucutra con dos bucles anidados que inicializan todos los
  8110. valores de la estructura a{ -1}.
  8111.  
  8112. Para ver cómo se debe inicializar en propia definición los valores de
  8113. una estructura acceda al tópico {#1000,sintaxis}.
  8114.  
  8115. {/}Ver: {#1000,Sintaxis} - {#1012,Declaración de Estructura}
  8116.  
  8117. # ─────────────────────────────────────────────────────────────────────────────
  8118.  
  8119. {.560,No es un tipo de proceso.}
  8120.  
  8121. El operador {#1042,TYPE} puede utilizarse únicamente si precede a un
  8122. nombre de proceso del programa o a la palabra {#1100,mouse}
  8123. (para la detección de colisiones con el puntero del ratón).
  8124.  
  8125. En la posición señalada del programa no está precediendo a un nombre de
  8126. proceso; es probable que se haya escrito el nombre del proceso incorrectamente
  8127. o bien que se intente obtener el tipo de un proceso a partir de su {#1039,código identificador}.
  8128.  
  8129. Hay una forma de obtener el tipo de un proceso disponiendo de su {#1039,código identificador},
  8130. como se muestra a continuación (supóngase que el identificador se tiene en
  8131. la variable {id2}).
  8132.  
  8133.     {id2.reserved.process_type}
  8134.  
  8135. En lugar de {TYPE id2} que no está permitido (pues no hay ningún proceso
  8136. con el nombre {id2}, ya que {id2} es una variable).
  8137.  
  8138. A continuación se muestra un ejemplo de uso correcto del operador {#1042,TYPE}
  8139. (con el fin de obtener el {#1039,código identificador} de un proceso).
  8140.  
  8141. {#9999,Ejemplo:}
  8142. PROGRAM mi_juego;
  8143. PRIVATE
  8144.     id2;
  8145. BEGIN
  8146.     //...
  8147.     id2=get_id(TYPE mi_proceso);
  8148.     //...
  8149.     id2=get_id(TYPE id2); // Error: No es un tipo de proceso.
  8150.     //...
  8151. END
  8152. PROCESS mi_proceso()
  8153. BEGIN
  8154.     //...
  8155. END
  8156. {-}
  8157.  
  8158. Como se puede observar, el operador {#1042,TYPE} requiere el nombre de un
  8159. proceso del programa sin paréntesis ni parámetros.
  8160.  
  8161. {/}Ver: {#1000,Sintaxis} - {#1042,Tipos de procesos}
  8162.  
  8163. # ─────────────────────────────────────────────────────────────────────────────
  8164.  
  8165. {.561,No se puede calcular el tamaño.}
  8166.  
  8167. La función {#1094,sizeof()} se puede utilizar para obtener el número de
  8168. elementos de una tabla o de una estructura; para ello
  8169. requiere, entre {#1053,paréntesis}, el nombre de la tabla o
  8170. estructura (sin corchetes ni índice).
  8171.  
  8172. También se puede utilizar con el nombre de una variable pero, en este caso,
  8173. la función devolverá siempre 1.
  8174.  
  8175. Se puede utilizar indistintamente con datos globales, locales
  8176. o privados.
  8177.  
  8178. En la posición señalada del programa se pretende obtener el tamaño de un
  8179. objeto que no es una variable, tabla o estructura. Por ejemplo, este error
  8180. se producirá si se intenta obtener el tamaño de una constante, función,
  8181. proceso, etc.
  8182.  
  8183. {#9999,Ejemplo:}
  8184. PROGRAM mi_juego;
  8185. CONST
  8186.     mi_constante=99;
  8187. GLOBAL
  8188.     a=sizeof(mi_constante); // Error: No se puede calcular el tamaño.
  8189. BEGIN
  8190.     //...
  8191. END
  8192. {-}
  8193.  
  8194. Este ejemplo provocará el error al intentar obtener el número de elementos
  8195. de una {#1004,constante}, pues una constante no es un objeto que tenga un tamaño
  8196. sino que, simplemente, es un sínonimo del valor numérico que representa.
  8197.  
  8198. {/}Ver: {#1000,Sintaxis} - {#1094,sizeof}
  8199.  
  8200. # ─────────────────────────────────────────────────────────────────────────────
  8201.  
  8202. {.562,Uso: import "nombre.dll"}
  8203.  
  8204. El compilador esperaba que, tras la palabra reservada {#1014,IMPORT}, apareciera
  8205. entre comillas el nombre del archivo.
  8206.  
  8207. Para declarar el uso de una librería externa se debe poner una declaración
  8208. como en el siguiente ejemplo.
  8209.  
  8210. {#9999,Ejemplo:}
  8211. PROGRAM mi_juego;
  8212. IMPORT "libreria.dll";
  8213. BEGIN
  8214.     //...
  8215. END
  8216. {-}
  8217.  
  8218. Este programa declara el uso de la librería denominada {libreria.dll}
  8219. (supuesto nombre de una hipotética librería de funciones externas).
  8220.  
  8221. La declaración debe hacerse justo antes de la sección {#1008,PRIVATE} o el
  8222. {#1086,BEGIN} del programa principal. Pudiendo hacerse varias declaraciones
  8223. {#1014,IMPORT} seguidas, para declarar el uso de más de una librería.
  8224.  
  8225. {/}Ver: {#1000,Sintaxis} - {#1014,Declaración de librerías}
  8226.  
  8227. # ─────────────────────────────────────────────────────────────────────────────
  8228.  
  8229. {.563,Uso de una DLL externa no válida.}
  8230.  
  8231. En la posición indicada del programa se pretende cargar una {DLL} que no
  8232. es válida; esto puede deberse a uno de estos motivos:
  8233.  
  8234. - El archivo con la {DLL} se ha corrompido al almacenarse en algún medio defectuoso.
  8235.  
  8236. - No se trata de una {DLL} específicamente diseñada para DIV Games Studio.
  8237.  
  8238. - No se encuetra el archivo con extensión {DLL} en la ruta especificada por
  8239. la sentencia {#1014,IMPORT}.
  8240.  
  8241. No se pueden utilizar {DLL} de otros lenguajes, pues no son compatibles con
  8242. este lenguaje aunque los archivos tengan todos la extension {DLL}.
  8243.  
  8244. En caso de tratarse de una {DLL} preparada para este lenguaje, revise sus
  8245. instrucciones de instalación y compruebe que el archivo con extensión
  8246. {DLL} se encuentra en el directorio de DIV Games Studio, o bien que la
  8247. sentencia {#1014,IMPORT} especifica la ruta completa de acceso a dicho archivo.
  8248.  
  8249. {/}Ver: {#1000,Sintaxis} - {#1014,Declaración de librerías}
  8250.  
  8251. # ─────────────────────────────────────────────────────────────────────────────
  8252.  
  8253. {.564,Expresión sin sentido.}
  8254.  
  8255. En la posición señalada en el programa el compilador ha supuesto que comenzaba
  8256. una sentencia de uno de estos tipos:
  8257.  
  8258.     Asignaciones, ej.:·
  8259.     <dato>{ = }<expresión>{ ; }
  8260.  
  8261.     Incrementos o decrementos, ej.:·
  8262.     <dato>{ ++ ;}
  8263.  
  8264.     Llamada a un proceso o función, ej.:·
  8265.     <nombre_proceso>{ ( }...{ ) ;}
  8266.  
  8267. Pero, en su lugar, se ha encontrado con una expresión que parece carecer de
  8268. sentido, ya que una vez efectuadas sus operaciones no se utiliza el resultado
  8269. de la misma con ningún propósito.
  8270.  
  8271. Es probable que se trate de algún operador suelto que se ha dejado fuera de
  8272. una sentencia, por ejemplo, por haberse perdido un operador.
  8273.  
  8274. {#9999,Ejemplo:}
  8275. PROGRAM mi_juego;
  8276. BEGIN
  8277.     x+1; // Error: Expresión sin sentido.
  8278.     //...
  8279. END
  8280. {-}
  8281.  
  8282. En este ejemplo se advierte de este error, pues la sentencia {x+1;} carece
  8283. de utilidad, suma la variable {x} y la constante {1}, pero, despúes, no se
  8284. utiliza este resultado para ningún fin. Si lo que se quiere es sumarle {1}
  8285. a la variable {x} se debe hacer con la siguiente sentencia:
  8286.  
  8287.     {x=x+1;}
  8288.  
  8289. Aquí se suma la variable {x} y la constante {1} y después se utiliza este
  8290. resultado para asignárselo a la variable {x}; esto tambíen se podría haber
  8291. hecho con la sentencia {x++;} (incrementar x).
  8292.  
  8293. {/}Ver: {#1000,Sintaxis} - {#1019,Sentencia de asignación}
  8294.  
  8295. # ─────────────────────────────────────────────────────────────────────────────
  8296.  
  8297. {.565,Esperando [:]}
  8298.  
  8299. La posición señalada en el programa está dentro de una sentencia {#1021,SWITCH},
  8300. tras el comienzo de una sección con "{#1087,CASE} valor", por eso el compilador
  8301. esperaba que, en dicha posición, apareciera el símbolo{#1067, :} precediendo a
  8302. las sentencias de dicha sección.
  8303.  
  8304. La sintaxis de la sentencia {#1021,SWITCH} es, a grandes rasgos, como sigue:
  8305.  
  8306.     {#1021,SWITCH} {#1053,( }expresión{#1083, )}·
  8307.         {#1087,CASE} valor{#1067, :}·
  8308.             sentencias{#1068,;}·
  8309.         {#1091,END}·
  8310.         {#1087,CASE} valor{#, .. }valor{#1067, :}·
  8311.             sentencias{#1068,;}·
  8312.         {#1091,END}·
  8313.         {#1087,CASE} valor, valor, valor{#1067, :}·
  8314.             sentencias{#1068,;}·
  8315.         {#1091,END}·
  8316.         //...·
  8317.         {#1088,DEFAULT} {#1067,:}·
  8318.             sentencias{#1068,;}·
  8319.         {#1091,END}·
  8320.     {#1091,END}
  8321.  
  8322. Para ver una descripción más detallada de la sentencia {#1021,SWITCH}
  8323. consulte la sintaxis del lenguaje.
  8324.  
  8325. {/}Ver: {#1000,Sintaxis} - {#1021,Sentencia SWITCH}
  8326.  
  8327. # ─────────────────────────────────────────────────────────────────────────────
  8328.  
  8329. {.566,Esperando [;]}
  8330.  
  8331. El compilador espera un {#1068,punto y coma (;)} en la posición indicada en
  8332. el programa.
  8333.  
  8334. En el lenguaje se deben indicar con puntos y coma los siguientes
  8335. puntos del programa:
  8336.  
  8337. - El final de la {#1003,declaración PROGRAM}.
  8338.  
  8339. - El final de una {#1009,declaración de un dato}.
  8340.  
  8341. - El final de una {#1014,declaración IMPORT}.
  8342.  
  8343. - El final de las siguientes sentencias:·
  8344.     {#1019,Asignaciones o incrementos de datos}.·
  8345.     {#1033,Llamadas a procesos}.·
  8346.     {#1032,Llamadas a funciones}.·
  8347.     {#1029,FRAME}, {#1028,RETURN}, {#1031,DEBUG}, {#1026,BREAK} y {#1027,CONTINUE}.·
  8348.  
  8349. - El final de un inicio de bucle {#1043,FROM}.
  8350.  
  8351. - Y como separador de las diferentes partes de una sentencia {#1025,FOR}.
  8352.  
  8353. El compilador indicará cuándo falta el símbolo {;} en cualquiera de estos
  8354. puntos.
  8355.  
  8356. Pudiendo, además, ponerse dicho símbolo en otros puntos determinados de los
  8357. programas, como detrás de cualquier otro tipo de sentencia, aunque en este
  8358. caso será opcional y, por tanto, el compilador no advertirá de su ausencia.
  8359.  
  8360. {/}Ver: {#1000,Sintaxis} - {#1068, ; }
  8361.  
  8362. # ─────────────────────────────────────────────────────────────────────────────
  8363.  
  8364. {.567,Esperando variable.}
  8365.  
  8366. El compilador esperaba una variable global, local o
  8367. privada del proceso en la posición indicada en el programa.
  8368.  
  8369. La sintaxis de la sentencia de bucle {#1043,FROM} es la siguiente:
  8370.  
  8371. {FROM} <variable>{=}{#1005,<constante>} {#1096,TO} {#1005,<constante>} {#1095,STEP} {#1005,<constante>}{;}·
  8372.     {#1017,<sentencia>} {;}·
  8373.     ...·
  8374. {END}
  8375.  
  8376. Siendo la declaración {STEP <constante>} opcional.
  8377.  
  8378. Tras la palabra reservada {#1043,FROM} debe aparecer directamente el
  8379. {#1001,nombre} de una variable (normalmente local o privada del proceso).
  8380.  
  8381. Si se quiere utilizar como contador una variable de otro proceso,
  8382. una tabla o un elemento de una estructura, se debe utilizar la
  8383. sentencia {#1025,FOR} en lugar de {#1043,FROM}, ya que ésta permite mayor libertad
  8384. a la hora de definir las condiciones del bucle.
  8385.  
  8386. {/}Ver: {#1000,Sintaxis} - {#1043,Sentencia FROM}
  8387.  
  8388. # ─────────────────────────────────────────────────────────────────────────────
  8389.  
  8390. {.568,Esperando [=]}
  8391.  
  8392. El compilador esperaba un símbolo {#1073,=} (asignación) en la posición indicada
  8393. en el programa.
  8394.  
  8395. La sintaxis de la sentencia de bucle {#1043,FROM} es la siguiente:
  8396.  
  8397. {FROM} <variable>{=}{#1005,<constante>} {#1096,TO} {#1005,<constante>} {#1095,STEP} {#1005,<constante>}{;}·
  8398.     {#1017,<sentencia>} {;}·
  8399.     ...·
  8400. {END}
  8401.  
  8402. Siendo la declaración {#1095,STEP <constante>} opcional.
  8403.  
  8404. Tras la palabra reservada {#1043,FROM} debe aparecer directamente el
  8405. {nombre} de una variable (normalmente local o
  8406. privada del proceso) y, tras éste, el símbolo {#1073,=}
  8407. (asignación).
  8408.  
  8409. {#9999,Ejemplo:}
  8410. PROGRAM mi_juego;
  8411. GLOBAL
  8412.     id2;
  8413. BEGIN
  8414.     //...
  8415.     FROM id2.x=0 TO 9; // Error: Esperando [=].
  8416.         //...
  8417.     END
  8418. END
  8419. {-}
  8420.  
  8421. En este ejemplo el error se produce al detectarse tras el {primer nombre}
  8422. que aparece ({id2}) el símbolo{#1063, . (punto)} en lugar de {#1073,=}. Esto
  8423. sucede porque no se puede utilizar como contador de un bucle {#1043,FROM}
  8424. una variable de otro proceso.
  8425.  
  8426. Si se quiere utilizar como contador una variable de otro proceso,
  8427. una tabla o un elemento de una estructura, se debe utilizar la
  8428. sentencia {#1025,FOR}, en lugar de {#1043,FROM}, ya que ésta permite mayor
  8429. libertad a la hora de definir las condiciones del bucle.
  8430.  
  8431. {/}Ver: {#1000,Sintaxis} - {#1043,Sentencia FROM}
  8432.  
  8433. # ─────────────────────────────────────────────────────────────────────────────
  8434.  
  8435. {.569,Esperando [TO]}
  8436.  
  8437. El compilador esperaba la palabra reservada {#1096,TO} de la sentencia
  8438. {#1043,FROM} en la posición indicada en el programa.
  8439.  
  8440. La sintaxis de la sentencia de bucle {#1043,FROM} es la siguiente:
  8441.  
  8442. {#1043,FROM} <variable>{=}{#1005,<constante>} {#1096,TO} {#1005,<constante>}
  8443. {#1095,STEP} {#1005,<constante>}{;}·
  8444.     {#1017,<sentencia>} {;}·
  8445.     ...·
  8446. {#1091,END}
  8447.  
  8448. Siendo la declaración {#1095,STEP <constante>} opcional.
  8449.  
  8450. Tras la palabra reservada {#1043,FROM} debe aparecer directamente el
  8451. {nombre} de una variable (normalmente local o privada
  8452. del proceso) y, tras éste, el símbolo {#1073,=} (asignación)
  8453. precediendo a una constante. {Tras este valor constante sólo puede aparecer
  8454. la palabra reservada {#1096,TO}.
  8455.  
  8456. {#9999,Ejemplo:}
  8457. PROGRAM mi_juego;
  8458. GLOBAL
  8459.     id2;
  8460. BEGIN
  8461.     //...
  8462.     FROM id2.x=0 STEP 9; // Error: Esperando [TO].
  8463.         //...
  8464.     END
  8465. END
  8466. {-}
  8467.  
  8468. En una sentencia {#1043,FROM} siempre deben aparecer los valores {inicial}
  8469. y {final} de la variable contador del bucle a ambos lados de la
  8470. palabra {#1096,TO}.
  8471.  
  8472. {/}Ver: {#1000,Sintaxis} - {#1043,Sentencia FROM}
  8473.  
  8474. # ─────────────────────────────────────────────────────────────────────────────
  8475.  
  8476. {.570,El valor STEP no es válido.}
  8477.  
  8478. En una sentencia {#1043,FROM}:
  8479.  
  8480. - Si el valor inicial {es menor} que el valor final, no se puede
  8481. especificar un valor negativo en la declaración {#1095,STEP}.
  8482.  
  8483. - Si el valor inicial {es mayor} que el valor final, no se puede
  8484. especificar un valor positivo en la declaración {#1095,STEP}.
  8485.  
  8486. {#9999,Ejemplo:}
  8487. PROGRAM mi_juego;
  8488. BEGIN
  8489.     FROM x=0 TO 10 STEP -1; // Error: El valor STEP no es válido.
  8490.         //...
  8491.     END
  8492. END
  8493. {-}
  8494.  
  8495. Este bucle no es válido pues si a {x}, que originalmente valdrá {0},
  8496. se le resta {1} en cada iteración, no llegará nunca a {10}. Si lo que
  8497. se pretende es hacer un bucle que se repita siempre, se debe utilizar
  8498. la sentencia {#1024,LOOP}.
  8499.  
  8500. {/}Ver: {#1000,Sintaxis} - {#1043,Sentencia FROM}
  8501.  
  8502. # ─────────────────────────────────────────────────────────────────────────────
  8503.  
  8504. {.571,Sentencia FROM incorrecta.}
  8505.  
  8506. En una sentencia {#1043,FROM}:
  8507.  
  8508. - Los valores {inicial} y {final} de un bucle {#1043,FROM} deben ser
  8509. diferentes.
  8510.  
  8511. {#9999,Ejemplo:}
  8512. PROGRAM mi_juego;
  8513. BEGIN
  8514.     FROM x=0 TO 0; // Error: Sentencia FROM incorrecta.
  8515.         //...
  8516.     END
  8517. END
  8518. {-}
  8519.  
  8520. Realizar este bucle no tiene sentido, pues no se va a repetir el
  8521. grupo interior de sentencias más que una sola vez, lo que sería
  8522. equivalente a inicializar {x} a {0} (con la sentencia {x=0;}) y,
  8523. después, poner directamente las sentencias interiores, omitiendo
  8524. el bucle {#1043,FROM}.
  8525.  
  8526. Si lo que se pretende es hacer un bucle que se repita siempre, se debe
  8527. utilizar la sentencia {#1024,LOOP}.
  8528.  
  8529. {/}Ver: {#1000,Sintaxis} - {#1043,Sentencia FROM}
  8530.  
  8531. # ─────────────────────────────────────────────────────────────────────────────
  8532.  
  8533. {.599,Compilación correcta}
  8534.  
  8535. El programa no tiene errores de compilación, pulse:
  8536.  
  8537. {Menú programas\Ejecutar} o {F10}.·
  8538. Para grabar, compilar y ejecutar el programa.
  8539.  
  8540. {Menú programas\Trazar} o {F12}.·
  8541. Para grabar, compilar y trazar paso a paso el programa.
  8542.  
  8543. # ─────────────────────────────────────────────────────────────────────────────
  8544.  
  8545. {.600,Excedida la capacidad del vector de nombres.}
  8546.  
  8547. Se excedió el buffer para almacenar los {#1001,nombres} del programa;
  8548. este error puede deberse únicamente a que se han utilizado nombres de
  8549. datos y procesos demasiado largos.
  8550.  
  8551. La única solución para poder compilar el programa es sustituir algunos
  8552. de estos nombres por otros más pequeños.
  8553.  
  8554. # ─────────────────────────────────────────────────────────────────────────────
  8555.  
  8556. {.601,Excedida la capacidad de la versión demo.}
  8557.  
  8558. Esta versión DEMO de DIV Games Studio no permite crear programas tan grandes
  8559. como este, sólo puede compilar programas de un determinado número de variables
  8560. y procesos.
  8561.  
  8562. En la versión completa de DIV GAMES STUDIO no existe esta limitación, pudiéndose
  8563. crear programas de cualquier tamaño.
  8564.  
  8565. La única opción para poder compilar este programa es eliminando primero
  8566. todos los procesos y datos que ya no se requieran y/o no sean
  8567. imprescindibles.
  8568.  
  8569. # ─────────────────────────────────────────────────────────────────────────────
  8570.  
  8571. {.602,Excedida la capacidad de la tabla de objetos.}
  8572.  
  8573. Se excedió el espacio disponible para guardar registros de los datos y
  8574. los procesos del programa.
  8575.  
  8576. Este error no debería suceder nunca pero si ha sucedido
  8577. tiene difícil solución; el programa es demasiado grande para esta versión
  8578. del compilador.
  8579.  
  8580. Si existe una nueva versión del compilador o algún 'patch' que actualice
  8581. esta limitación, debe actualizarse.
  8582.  
  8583. En caso contrario la única opción es eliminar del programa todos los
  8584. procesos y {#1034,datos} que ya no se requieran y/o no sean
  8585. imprescindibles.
  8586.  
  8587. # ─────────────────────────────────────────────────────────────────────────────
  8588.  
  8589. {.610,Esperando el nombre de la estructura.}
  8590.  
  8591. Para definir una estructura de datos se debe especificar el nombre de la misma
  8592. tras la palabra reservada {#1012,STRUCT}.
  8593.  
  8594. {#9999,Ejemplo:}
  8595. PROGRAM mi_juego;
  8596. GLOBAL
  8597.     STRUCT posiciones[9]
  8598.         x, y;
  8599.     END
  8600. BEGIN
  8601.     //...
  8602. END
  8603. {-}
  8604.  
  8605. Esta estructura se ha definido con el nombre {posiciones} y contiene
  8606. {diez registros} (del 0 al 9) cada uno con dos valores {x} e {y}.
  8607.  
  8608. {/}Ver: {#1000,Sintaxis} - {#1001,Nombres} - {#1012,Declaración Estructuras}
  8609.  
  8610. # ─────────────────────────────────────────────────────────────────────────────
  8611.  
  8612. {.611,Esperando el nombre del proceso.}
  8613.  
  8614. Para definir un proceso se debe especificar el nombre del mismo
  8615. tras la palabra reservada {#1016,PROCESS}.
  8616.  
  8617. {#9999,Ejemplo:}
  8618. PROGRAM mi_juego;
  8619. BEGIN
  8620.     //...
  8621. END
  8622.  
  8623. PROCESS mi_proceso()
  8624. BEGIN
  8625.     //...
  8626. END
  8627. {-}
  8628.  
  8629. Este proceso se ha declarado con el nombre {mi_proceso}.
  8630.  
  8631. {/}Ver: {#1000,Sintaxis} - {#1001,Nombres} - {#1016,Declaración de procesos}
  8632.  
  8633. # ─────────────────────────────────────────────────────────────────────────────
  8634.  
  8635. {.612,Esperando el nombre de un proceso.}
  8636.  
  8637. Tras la palabra reservada {#1042,TYPE} se debe especificar el nombre de
  8638. uno de los procesos definidos en el programa.
  8639.  
  8640. {#9999,Ejemplo:}
  8641. PROGRAM mi_juego;
  8642. BEGIN
  8643.     //...
  8644.     signal(TYPE mi_proceso, s_kill);
  8645.     //...
  8646. END
  8647.  
  8648. PROCESS mi_proceso()
  8649. BEGIN
  8650.     //...
  8651. END
  8652. {-}
  8653.  
  8654. {/}Ver: {#1000,Sintaxis} - {#1001,Nombres} - {#1042,Tipos de procesos}
  8655.  
  8656. # ─────────────────────────────────────────────────────────────────────────────
  8657.  
  8658. {.613,Esperando un nombre.}
  8659.  
  8660. La función {#1094,sizeof()} requiere como parámetro el nombre de un dato,
  8661. pudiendo ser el nombre de una variable, una tabla o una
  8662. estructura del programa.
  8663.  
  8664. Esta función devuelve el numero de datos (o elementos) que tiene el objeto
  8665. cuyo nombre se le pasa como argumento; por lo tanto, si dicho objeto era una
  8666. variable, la función siempre devolverá 1.
  8667.  
  8668. {#9999,Ejemplo:}
  8669. PROGRAM mi_juego;
  8670. GLOBAL
  8671.     tabla[]=0, 1, 2, 3;
  8672.     longitud_tabla;
  8673. BEGIN
  8674.     longitud_tabla=sizeof(tabla);
  8675. END
  8676. {-}
  8677.  
  8678. En este ejemplo {longitud_tabla} valdrá {4} tras ejecutarse la sentencia,
  8679. ya que la tabla contiene cuatro datos.
  8680.  
  8681. {/}Ver: {#1000,Sintaxis} - {#1001,Nombres} - {#1094,sizeof}
  8682.  
  8683. # ─────────────────────────────────────────────────────────────────────────────
  8684.  
  8685. {.614,El nombre no es nuevo.}
  8686.  
  8687. Se ha utilizado un nombre para un campo de la estructura dos
  8688. veces. Debe sustituir dicho nombre por otro similar.
  8689.  
  8690. {#9999,Ejemplo:}
  8691. PROGRAM nombre_del_programa;
  8692. GLOBAL
  8693.     STRUCT posicion[9]
  8694.         x0, x0; // Error: El nombre no es nuevo.
  8695.     END
  8696. BEGIN
  8697.     //...
  8698. END
  8699. {-}
  8700.  
  8701. {/}Ver: {#1000,Sintaxis} - {#1001,Nombres} - {#1012,Declaración de estructura}
  8702.  
  8703. # ─────────────────────────────────────────────────────────────────────────────
  8704.  
  8705. {.615,El nombre no es nuevo.}
  8706.  
  8707. Se ha utilizado un {#1001,nombre} de programa no válido pues éste
  8708. ya estaba predefinido como nombre de otro objeto. Debe sustituir
  8709. dicho nombre por otro similar.
  8710.  
  8711. Para saber a qué objeto está identificado con dicho {#1001,nombre} puede acceder al
  8712. {#4,glosario}.
  8713.  
  8714. {#9999,Ejemplo:}
  8715. PROGRAM x; // Error: El nombre no es nuevo.
  8716. BEGIN
  8717.     //...
  8718. END
  8719. {-}
  8720.  
  8721. En este ejemplo se pretendía utilizar como nombre del programa {x},
  8722. que está predefinido como nombre de la variable local que indica la coordenada
  8723. x de los procesos.
  8724.  
  8725. {/}Ver: {#1000,Sintaxis} - {#1001,Nombres} - {#4,Glosario}
  8726.  
  8727. # ─────────────────────────────────────────────────────────────────────────────
  8728.  
  8729. {.616,El nombre no es nuevo.}
  8730.  
  8731. Se ha utilizado para definir una {#1004,constante} un {#1001,nombre}
  8732. no válido, pues éste ya estaba predefinido como nombre de otro objeto.
  8733. Puede tratarse de un nombre de una constante, una variable,
  8734. una tabla, una estructura, un proceso o
  8735. una función del programa.
  8736.  
  8737. Puede ser, también, que se haya pretendido utilizar el mismo {#1001,nombre}
  8738. dentro del programa para identificar dos objetos diferentes, o bien
  8739. {puede que se haya utilizado un nombre predefinido para otro uso dentro
  8740. del lenguaje}. En dicho caso se puede acceder al {#4,glosario} para ver a
  8741. qué objeto se refiere dicho nombre.
  8742.  
  8743. Debe sustituir dicho nombre por otro similar.
  8744.  
  8745. {#9999,Ejemplo:}
  8746. PROGRAM mi_juego;
  8747. CONST
  8748.     x=0; // Error: El nombre no es nuevo.
  8749. BEGIN
  8750.     //...
  8751. END
  8752. {-}
  8753.  
  8754. En este ejemplo se pretendía utilizar como nombre de una constante {x} que
  8755. está predefinido como variable local que indica la coordenada {#1123,x} de los
  8756. procesos.
  8757.  
  8758. {/}Ver: {#1000,Sintaxis} - {#1001,Nombres} - {#4,Glosario}
  8759.  
  8760. # ─────────────────────────────────────────────────────────────────────────────
  8761.  
  8762. {.617,El nombre no es nuevo.}
  8763.  
  8764. Se ha utilizado para definir un nuevo dato un {#1001,nombre}
  8765. no válido, pues éste ya estaba predefinido como nombre de otro
  8766. objeto. Puede tratarse de un nombre de una {#1004,constante},
  8767. una variable, una tabla, una estructura,
  8768. un proceso o una función del programa.
  8769.  
  8770. Asimismo, puede ser que se haya pretendido utilizar el mismo nombre dentro del
  8771. programa para identificar dos objetos diferentes, o bien {que se
  8772. haya utilizado un nombre predefinido para otro uso dentro del lenguaje}.
  8773. En dicho caso se puede acceder al {#4,glosario} para ver a qué objeto se refiere
  8774. dicho nombre.
  8775.  
  8776. Debe sustituir dicho nombre por otro similar.
  8777.  
  8778. {#9999,Ejemplo:}
  8779. PROGRAM mi_juego;
  8780. GLOBAL
  8781.     x[3]=0, 1, 2, 3; // Error: El nombre no es nuevo.
  8782. BEGIN
  8783.     //...
  8784. END
  8785. {-}
  8786.  
  8787. En este ejemplo se pretendía utilizar como nombre de una tabla global {x}
  8788. que está predefinido como variable local que indica la coordenada {#1123,x} de los
  8789. procesos.
  8790.  
  8791. {/}Ver: {#1000,Sintaxis} - {#1001,Nombres} - {#4,Glosario}
  8792.  
  8793. # ─────────────────────────────────────────────────────────────────────────────
  8794.  
  8795. {.618,El nombre no es nuevo.}
  8796.  
  8797. Se ha utilizado un {#1001,nombre} de un proceso no válido pues éste
  8798. ya estaba predefinido como nombre de otro objeto. Puede tratarse de
  8799. un nombre de una {#1004,constante}, una variable, una
  8800. tabla, una estructura, un proceso o una
  8801. función del programa.
  8802.  
  8803. Puede ser que se haya pretendido utilizar el mismo nombre dentro del
  8804. programa para identificar dos objetos diferentes, o bien {puede que se
  8805. haya utilizado un nombre predefinido para otro uso dentro del lenguaje}.
  8806. En dicho caso puede acceder al {#4,glosario} para ver a que objeto se refiere
  8807. dicho nombre.
  8808.  
  8809. Debe sustituir dicho nombre por otro similar.
  8810.  
  8811. {#9999,Ejemplo:}
  8812. PROGRAM mi_juego;
  8813. BEGIN
  8814.     //...
  8815. END
  8816.  
  8817. PROCESS mi_juego() // Error: El nombre no es nuevo.
  8818. BEGIN
  8819.     //...
  8820. END
  8821. {-}
  8822.  
  8823. En este ejemplo se pretendía utilizar como nombre de un proceso
  8824. el nombre que anteriormente se había empleado para identificar el
  8825. programa principal.
  8826.  
  8827. {/}Ver: {#1000,Sintaxis} - {#1001,Nombres} - {#4,Glosario}
  8828.  
  8829. # ─────────────────────────────────────────────────────────────────────────────
  8830.  
  8831. {.619,Esperando [=]}
  8832.  
  8833. Para definir una constante se debe poner un símbolo {#1073,=} tras el nombre de la
  8834. constante.
  8835.  
  8836. El compilador ha entendido que la última palabra definida era el nombre
  8837. de una nueva {#1004,constante} y, en la posición que se indica, se esperaba que se mostrara
  8838. el símbolo de asignación ({#1073,=}).
  8839.  
  8840. {#9999,Ejemplo:}
  8841. PROGRAM mi_juego;
  8842. CONST
  8843.     a=0;
  8844.     b=1;
  8845.     c,d; // Error: Esperando [=].
  8846. BEGIN
  8847.     //...
  8848. END
  8849. {-}
  8850.  
  8851. {/}Ver: {#1000,Sintaxis} - {#1009,Declaración de dato}
  8852.  
  8853. # ─────────────────────────────────────────────────────────────────────────────
  8854.  
  8855. {.620,Demasiados valores para la estructura.}
  8856.  
  8857. Se ha inicializado una estructura con más valores de los que puede contener.
  8858.  
  8859. Para inicializar una estructura se debe tener en cuenta el número de valores máximo
  8860. que puede contener; este número será:
  8861.  
  8862.     {Nº de registros} X {Nº de campos}
  8863.  
  8864. {#9999,Ejemplo:}
  8865. PROGRAM mi_juego;
  8866. GLOBAL
  8867.     STRUCT posiciones[9]
  8868.         x, y;
  8869.     END = 10 dup (-99, 99);
  8870. BEGIN
  8871.     //...
  8872. END
  8873. {-}
  8874.  
  8875. En este caso la estructura {posiciones} tiene {10 registros} (desde posiciones[0]
  8876. hasta posiciones[9]) y {2 campos} (x e y); luego, el número máximo de valores que puede
  8877. contener es {20}. En el ejemplo se inicializan todos los campos {x} a{ -99} y todos
  8878. los campos {y} a {99}.
  8879.  
  8880. {/}Ver: {#1000,Sintaxis} - {#1012,Declaración de estructura}
  8881.  
  8882. # ─────────────────────────────────────────────────────────────────────────────
  8883.  
  8884. {.621,Nombre desconocido.}
  8885.  
  8886. En la posición indicada del programa se hace referencia a un {#1016,PROCESS}
  8887. inexistente que puede tratarse de uno de los siguientes casos:
  8888.  
  8889. - Se ha tecleado incorrectamente el nombre de un proceso, en cuyo
  8890. caso revise el nombre del proceso original pues puede que sea en su
  8891. definición donde el nombre no aparece correctamente.
  8892.  
  8893. - Se ha pretendido utilizar una función del lenguaje
  8894. y no se ha escrito su nombre correctamente; en este caso puede
  8895. acceder al índice general para buscar el nombre exacto de la función.
  8896.  
  8897. - Se hace referencia a un proceso cuyo código aún no se ha
  8898. definido, por ello si se quiere compilar el programa se debe
  8899. definir el proceso, al menos, como sigue:
  8900.  
  8901. {#9999,Ejemplo:}
  8902. PROGRAM mi_juego;
  8903. BEGIN
  8904.     mi_proceso();
  8905. END
  8906.  
  8907. PROCESS mi_proceso()
  8908. BEGIN
  8909. END
  8910. {-}
  8911.  
  8912.   Indicando en el proceso los parámetros que reciba (en el ejemplo anterior
  8913. no recibe ningún parámetro).
  8914.  
  8915. {/}Ver: {#1000,Sintaxis} - {#3,Indice} - {#1016,Declaración de proceso}
  8916.  
  8917. # ─────────────────────────────────────────────────────────────────────────────
  8918.  
  8919. {.622,No se puede realizar el incremento.}
  8920.  
  8921. En la expresión indicada en el programa se utiliza el operador
  8922. {#1057, ++} (o el operador{#1061, --}) incorrectamente, con el fin de
  8923. incrementar (o decrementar) un objeto. Dicho objeto no tiene dirección,
  8924. pues no es una variable, tabla o estructura, por
  8925. lo que el compilador no puede realizar un incremento (o decremento) sobre
  8926. el mismo.
  8927.  
  8928. Probablemente se haya pretendido incrementar o decrementar una expresión constante o una que
  8929. involucre varios operandos.
  8930.  
  8931. A continuación, se muestra un programa con varios ejemplos de uso válido de
  8932. los operadores{#1057, ++} y{#1061, --}, y otros tantos inválidos.
  8933.  
  8934. {#9999,Ejemplo:}
  8935. PROGRAM mi_juego;
  8936. CONST
  8937.     mi_constante=0;
  8938. GLOBAL
  8939.     mi_variable=0;
  8940.     mi_tabla[10];
  8941.     STRUCT mi_estructura[10]
  8942.         variable;
  8943.     END
  8944. BEGIN
  8945.     // Ejemplos correctos
  8946.     mi_variable++;
  8947.     mi_tabla--;
  8948.     ++mi_tabla[mi_variable];
  8949.     --mi_estructura[0].variable;
  8950.     id.x++;
  8951.  
  8952.     // Ejemplos erróneos
  8953.     (mi_variable*2)++;
  8954.     mi_constante--;
  8955.     ++0;
  8956.     --(mi_variable+1);
  8957. END
  8958. {-}
  8959.  
  8960. Las constantes como {mi_constante} no se pueden incrementar pues son simples
  8961. sinónimos del valor numérico que representan.
  8962.  
  8963. La sentencia {(mi_variable*2)++;} es errónea debido a que la
  8964. multiplicación se realiza en primer lugar y, una vez realizada, el valor
  8965. {mi_variable*2} se convierte en un resultado numérico que no tiene dirección
  8966. y, por lo tanto, no se puede acceder a ella para incrementarlo.
  8967.  
  8968. En este caso, probablemente, la sentencia correcta que se debería haber utilizado
  8969. habría sido {mi_variable=mi_variable*2+1;}
  8970.  
  8971. {/}Ver: {#1000,Sintaxis} - {#1057,++} - {#1061,--}
  8972.  
  8973. # ─────────────────────────────────────────────────────────────────────────────
  8974.  
  8975. {.623,Estructura de longitud negativa.}
  8976.  
  8977. Para definir una estructura indicando entre {#1079,corchetes} su número de registros
  8978. se debe emplear un número entero positivo (0, 1, 2, 3, ...), teniendo en cuenta que todas las
  8979. estructuras comienzan en el registro cero y terminan en el registro que se indique
  8980. en el índice.
  8981.  
  8982. {#9999,Ejemplo:}
  8983. PROGRAM mi_juego;
  8984. GLOBAL
  8985.     STRUCT e1[9]
  8986.       x, y;
  8987.     END
  8988.     STRUCT e2[-9] // Error: Estructura de longitud negativa.
  8989.       x, y;
  8990.     END
  8991. BEGIN
  8992.     //...
  8993. END
  8994. {-}
  8995.  
  8996. El compilador ha detectado una estructura definida con un número negativo de registros como
  8997. {e2}; en este ejemplo se debe definir la estructura como {e1} que,
  8998. en este caso, será una estructura de 10 registros (desde e1[0] hasta e1[9])
  8999. y dos campos (x e y).
  9000.  
  9001. {/}Ver: {#1000,Sintaxis} - {#1012,Declaración de estructura}
  9002.  
  9003. # ─────────────────────────────────────────────────────────────────────────────
  9004.  
  9005. {.624,Se esperaba una sentencia.}
  9006.  
  9007. La posición indicada en el programa está dentro del contexto de un
  9008. bloque de sentencias, por lo que se esperaba que comenzara una sentencia en
  9009. la posición indicada. Éstos son los posibles tipos de sentencias:
  9010.  
  9011. sentencias de asignación·
  9012. <expresión>{#1035,=}<expresión>;
  9013.  
  9014. sentencias de control·
  9015. {#1020,IF} y {#1021,SWITCH}.
  9016.  
  9017. sentencias de bucles·
  9018. {#1043,FROM}, {#1022,WHILE}, {#1023,REPEAT}, {#1024,LOOP} y {#1025,FOR}.
  9019.  
  9020. sentencias de ruptura·
  9021. {#1026,BREAK}, {#1027,CONTINUE} y {#1028,RETURN}.
  9022.  
  9023. sentencias especiales·
  9024. {#1029,FRAME}, {#1030,CLONE} y {#1031,DEBUG}.
  9025.  
  9026. Siendo posible que en esta posición apareciera una de las palabras
  9027. reservadas que pueden marcar el final de un bloque de sentencias, como son:
  9028.  
  9029. {#1091,END}, {#1090,ELSE} y {#1097,UNTIL}.
  9030.  
  9031. {#9999,Ejemplo:}
  9032. PROGRAM mi_juego;
  9033. BEGIN
  9034.     CASE 0: // Error: Se esperaba una sentencia.
  9035.         //...
  9036.     END
  9037. END
  9038. {-}
  9039.  
  9040. Este ejemplo provocará el error, dado que la palabra reservada {#1087,CASE} no
  9041. es válida para comenzar una sentencia; sólo es válida dentro de una
  9042. sentencia {#1021,SWITCH}.
  9043.  
  9044. {/}Ver: {#1000,Sintaxis} - {#1017,Declaración de sentencia}
  9045.  
  9046. # ─────────────────────────────────────────────────────────────────────────────
  9047. # Temas de interés relacionados con los errores de compilación
  9048. # ─────────────────────────────────────────────────────────────────────────────
  9049.  
  9050. {.1000,Sintaxis de un programa.}
  9051.  
  9052. A continuación se muestra la estructura general de un programa en el
  9053. lenguaje; pulse con el ratón sobre la sección de interés para ver la
  9054. definición sintáctica correspondiente.
  9055.  
  9056. {#1003,<Cabecera del programa>}·
  9057. {#1004,<Declaración de constantes>}·
  9058. {#1006,<Declaración de datos globales>}·
  9059. {#1007,<Declaración de datos locales>}·
  9060. {#1014,<Declaración de librerías>}·
  9061. {#1008,<Declaración de datos privados>}·
  9062. {#1015,<Código principal>}·
  9063. {#1016,<Declaración de procesos>}·
  9064.  
  9065. Todos los programas deben respetar la estructura anterior con una
  9066. única excepción, y es que pueden ponerse {#1002,comentarios explicativos}
  9067. en cualquier punto del programa.
  9068.  
  9069. {/}Ver: {#3,Indice} - {#4,Glosario}
  9070.  
  9071. # ─────────────────────────────────────────────────────────────────────────────
  9072.  
  9073. {.1001,Definición de un nombre.}
  9074.  
  9075. Un nombre es una secuencia de caracteres alfanuméricos que
  9076. se utiliza para {identificar} un objeto del programa, como puede ser
  9077. el nombre de un proceso, de una {#1004,constante} o de una
  9078. variable.
  9079.  
  9080. Estos nombres pueden formarse con los siguientes caracteres:
  9081.  
  9082.   Símbolos:·
  9083.   {_ # ª º $ ₧ ƒ £ ¥ ¢}·
  9084.   Dígitos:·
  9085.   {0123456789}·
  9086.   Letras:·
  9087.   {abcdefghijklmnopqrstuvwxyz}·
  9088.   Letras (extendido):·
  9089.   {ñ ç æ âäàåá êëèé îïìí ôöòó ûüùú ÿ}·
  9090.  
  9091. Siempre que se respeten las siguientes reglas para construir nuevos
  9092. nombres:
  9093.  
  9094. - La secuencia de caracteres no debe contener caracteres que no estén
  9095. en la relación anterior (excepto las letras {mayúsculas} correspondientes
  9096. a las minúsculas de la lista).
  9097.  
  9098. - Dentro de la secuencia no se pueden poner espacios en blanco, es decir,
  9099. no es válido como nombre {nave enemiga}, pues para el compilador
  9100. se trataría de dos nombres; en este caso se puede declarar el
  9101. nombre como {nave_enemiga}.
  9102.  
  9103. - Un nombre no puede comenzar por un dígito numérico, es decir,
  9104. {0a} no es un nombre válido. No obstante tras el primer caracter,
  9105. pueden incluirse en el nombre todos los dígitos necesarios ({a0} si
  9106. es un nombre válido).
  9107.  
  9108. - El nombre no debe coincidir con ninguna de las palabras reservadas
  9109. del lenguaje ni con ninguno de los objetos (constantes, variables, etc.)
  9110. predefinidos en el lenguaje. Para comprobar esto, ver la lista de palabras
  9111. reservadas y objetos predefinidos, pudiéndose acceder al glosario en cualquier
  9112. momento. Las palabras reservadas aparecen en mayúsculas y los objetos
  9113. predefinidos en minúsculas.
  9114.  
  9115. - No se diferencian las letras mayúsculas de las mínusculas ({ABc} y {abC}
  9116. son el mismo nombre para el compilador).
  9117.  
  9118. - No se puede utilizar un mismo nombre para dos objetos diferentes,
  9119. por ejemplo, no se puede llamar a una constante {valor} y, después, declarar
  9120. un proceso como {PROCESS valor(x, y);}.
  9121.  
  9122. {/}Ver: {#1000,Sintaxis} - {#4,Glosario}
  9123.  
  9124. # ─────────────────────────────────────────────────────────────────────────────
  9125.  
  9126. {.1002,Definición de comentarios.}
  9127.  
  9128. Un comentario es una nota aclaratoria sobre el programa. Los comentarios no
  9129. son necesarios para el correcto funcionamiento del programa.
  9130.  
  9131. Hay dos tipos de comentarios:
  9132.  
  9133. - De una sola línea, comienzan con el símbolo{ //} y terminan al final de
  9134. la línea en la que se definen.
  9135.  
  9136. - De varias líneas, comienzan con el símbolo{ /*} y terminan con el
  9137. símbolo {*/}.
  9138.  
  9139. {#9999,Ejemplo:}
  9140. /*
  9141.     Esto es un ejemplo de un comentario
  9142.     de varias líneas, en el que se pueden
  9143.     realizar aclaraciones sobre el programa
  9144. */
  9145.  
  9146. PROGRAM mi_juego; // Ejemplo de un comentario de una línea.
  9147. BEGIN             // Comienza el programa principal.
  9148.     FRAME;
  9149. END               // Termina el programa principal.
  9150. {-}
  9151.  
  9152. Todos los textos incluidos en un comentario son ignorados por el compilador.
  9153. Se pueden poner tantos comentarios en un programa como sean necesarios y
  9154. en cualquier punto del programa.
  9155.  
  9156. Los comentarios que comienzan con{ /*} y terminan con{ */} (denominados de
  9157. varias líneas) pueden también comenzar y terminar en la misma línea.
  9158.  
  9159. {/}Ver: {#1000,Sintaxis}
  9160.  
  9161. # ─────────────────────────────────────────────────────────────────────────────
  9162.  
  9163. {.1003,Cabecera del programa.}
  9164.  
  9165. {PROGRAM} {#1001,<nombre>} {;}
  9166.  
  9167. Todos los programas deben comenzar con la palabra reservada {PROGRAM} seguida
  9168. del nombre del programa y un símbolo {#1068,; (punto y coma)}.
  9169.  
  9170. Esta cabecera es obligatoria en todos los programas. Antes de la misma sólo
  9171. puede aparecer, de forma opcional, uno o varios {#1002,comentarios} (textos explicativos
  9172. precedidos del símbolo{ //}, o bien entre los símbolos{ /*} y{ */}).
  9173.  
  9174. En los nombres y las palabras reservadas no se diferencia entre
  9175. mayúsculas y minúsculas, por lo que son válidas {PROGRAM}, {program}, {Program}, ...
  9176.  
  9177. {#9999,Ejemplo:}
  9178. // -------------------
  9179. // Listado de mi juego
  9180. // -------------------
  9181.  
  9182. PROGRAM nombre_de_mi_juego;
  9183. BEGIN
  9184.     //...
  9185. END
  9186. {-}
  9187.  
  9188. {/}Ver: {#1000,Sintaxis}
  9189.  
  9190. # ─────────────────────────────────────────────────────────────────────────────
  9191.  
  9192. {.1004,Declaración de constantes.}
  9193.  
  9194. {CONST}·
  9195.     {#1001,<nombre>} {=} {#1005,<constante>} {;}·
  9196.     ...
  9197.  
  9198. Esta sección de los programas es opcional, pues su utilidad consiste en establecer
  9199. una serie de sinónimos para unos valores numéricos.
  9200.  
  9201. Por ejemplo, si en un juego se establece en uno o varios puntos del programa
  9202. el número 3 como el máximo de vidas del protagonista, cuando
  9203. se quiera modificar para aumentarlo o disminuirlo habrá que buscar y
  9204. sustituir ese número en el programa. Con el consiguiente riesgo de
  9205. sustituir otros '3' que aparezcan en el programa con otros fines.
  9206.  
  9207. Una alternativa es declarar una constante denominada, por ejemplo,
  9208. {máximo_vidas} como un sinónimo del valor numérico 3 y utilizar en el
  9209. programa dicha constante en lugar del número; ahora, cuando se quiera
  9210. cambiar este valor por otro, simplemente habrá que hacerlo en la declaración
  9211. de la constante {máximo_vidas}.
  9212.  
  9213. Esta sección establece entonces una relación de nombres que van
  9214. a representar una serie de constantes numéricas.
  9215.  
  9216. Esta sección debe comenzar obligatoriamente con la palabra reservada {CONST}
  9217. y, a continuación, por cada constante declarada debe aparecer su nombre
  9218. seguido del símbolo {#1073,= (símbolo de asignación)} y una expresión constante
  9219. (valor numérico). Tras la declaración de cada constante debe venir el símbolo
  9220. {#1068,;} (punto y coma).
  9221.  
  9222. {#9999,Ejemplo:}
  9223. PROGRAM mi_juego;
  9224. CONST
  9225.     máximo_vidas=3;
  9226. BEGIN
  9227.     //...
  9228. END
  9229. {-}
  9230.  
  9231. Una vez que se ha asignado un valor a una constante, éste no podrá ser
  9232. modificado en el programa más adelante.
  9233.  
  9234. {/}Ver: {#1000,Sintaxis} - {#4,Glosario}
  9235.  
  9236. # ─────────────────────────────────────────────────────────────────────────────
  9237.  
  9238. {.1005,Definición de una constante.}
  9239.  
  9240. Una constante es un valor o una expresión numérica constante.
  9241.  
  9242. Como valores se pueden utilizar únicamente números enteros dentro del rango
  9243. ({#1177,min_int} ... {#1178,max_int}).
  9244.  
  9245. Las expresiones númericas constantes son fórmulas matemáticas en las que
  9246. se puede utilizar:
  9247.  
  9248.     - {Constantes} definidas con anterioridad.·
  9249.     - {Valores numéricos}.·
  9250.     - {Operadores} aritméticos o lógicos.·
  9251.     - {Literales} (textos entre comillas).·
  9252.     - La función {#1094,sizeof()}.·
  9253.  
  9254. Estas expresiones serán evaluadas cuando el programa sea compilado y será
  9255. el resultado de las mismas el que sea utilizado en la ejecución del programa.
  9256.  
  9257. Los {operadores} que se pueden utilizar en una expresión constante son (entre
  9258. paréntesis se muestran los sinónimos del operador, en caso de tenerlos).
  9259.  
  9260.     {#1056, +}    Suma·
  9261.     {#1060, -}    Resta (o negación de signo)·
  9262.     {#1054, *}    Multiplicación·
  9263.     {#1065, /}    División·
  9264.     {#1048, MOD}  Módulo ({#1048,%})·
  9265.     {#1070, <<}   Rotación a la derecha·
  9266.     {#1077, >>}   Rotación a la izquierda·
  9267.     {#1045, NOT}  Negación binaria y lógica ({!})·
  9268.     {#1051, AND}  AND binario y lógico ({&},{&&})·
  9269.     {#1083, OR}   OR binario y lógico ({|},{||})·
  9270.     {#1082, XOR}  OR exclusivo ({^}, {^^})·
  9271.     {#1074, ==}   Comparación·
  9272.     {#1046, <>}   Distinto ({!=})·
  9273.     {#1076, >}    Mayor·
  9274.     {#1075, >=}   Mayor o igual ({=>})·
  9275.     {#1069, <}    Menor·
  9276.     {#1072, <=}   Menor o igual ({=<})·
  9277.     {#1085, OFFSET} Dirección o desplazamiento ({&})·
  9278.     {#1053, ( )}  Paréntesis·
  9279.  
  9280. A continuación se muestran algunos ejemplos de constantes válidas:
  9281.  
  9282. { 0}·
  9283. { -1000}·
  9284. { 2+2}·
  9285. { "Hola!"}·
  9286. { 4*(2+1)}·
  9287.  ...
  9288.  
  9289. {/}Ver: {#1000,Sintaxis} - {#4,Glosario}
  9290.  
  9291. # ─────────────────────────────────────────────────────────────────────────────
  9292.  
  9293. {.1006,Declaración de datos globales.}
  9294.  
  9295. {GLOBAL}·
  9296.     {#1009,<declaración de dato>} {#1068,;}·
  9297.     ...
  9298.  
  9299. Esta sección de los programas es opcional; es donde se declaran los
  9300. datos de ámbito global, es decir, los {datos que pueden utilizarse
  9301. desde cualquier punto del programa}.
  9302.  
  9303. La sección debe comenzar obligatoriamente con la palabra reservada GLOBAL
  9304. seguida de una serie de {#1009,declaraciones de datos} terminadas con un
  9305. símbolo {#1068,;} (punto y coma).
  9306.  
  9307. En general, se declaran como datos globales todos aquellos que establecen
  9308. condiciones generales del juego que afecten a varios procesos; un ejemplo
  9309. puede ser los puntos obtenidos por el jugador, que podrían almacenarse en la
  9310. variable global {puntuación}, de modo que cualquier proceso del juego pudiera
  9311. incrementarla cuando fuera necesario.
  9312.  
  9313. Una declaración de dato global definirá un único dato que podrá ser utilizado
  9314. por todos los procesos del programa; en cambio una declaración de dato
  9315. local definirá un dato de ese tipo y con ese nombre, para cada uno de los
  9316. procesos del programa.
  9317.  
  9318. {#9999,Ejemplo:}
  9319. PROGRAM mi_juego;
  9320. GLOBAL
  9321.     puntuación=0;
  9322. BEGIN
  9323.     //...
  9324. END
  9325. {-}
  9326.  
  9327. {/}Ver: {#1000,Sintaxis} - {#4,Glosario}
  9328.  
  9329. # ─────────────────────────────────────────────────────────────────────────────
  9330.  
  9331. {.1007,Declaración de datos locales.}
  9332.  
  9333. {LOCAL}·
  9334.     {#1009,<declaración de dato>} {#1068,;}·
  9335.     ...
  9336.  
  9337. Esta sección de los programas es opcional, ya que es donde se declaran los
  9338. datos de ámbito local, es decir, los {datos que tendrán todos los procesos
  9339. del programa}, cada uno con sus propios valores (como las variables locales
  9340. predefinidas {#1123,x} e {#1124,y} determinan las coordenadas de todos los procesos).
  9341.  
  9342. La sección debe comenzar obligatoriamente con la palabra reservada {LOCAL}
  9343. seguida de una serie de {#1009,declaraciones de datos} terminadas con un
  9344. símbolo {#1068,;} (punto y coma).
  9345.  
  9346. En general, se declaran como datos locales todos aquellos que se consideren
  9347. informaciones importantes de los procesos, o sea, aquellos que pueda interesar
  9348. consultar o modificar desde otros procesos.
  9349.  
  9350. Un ejemplo puede ser la energía que le queda a un proceso (puede ser una
  9351. nave, un disparo, el protagonista, etc.); esta información podría almacenarse
  9352. en la variable local {energía} de modo que cualquier proceso pudiera
  9353. acceder o modificar la energía de los demás (por ejemplo, cuando colisionara
  9354. con ellos les podría quitar energía).
  9355.  
  9356. {#9999,Ejemplo:}
  9357. PROGRAM mi_juego;
  9358. LOCAL
  9359.     energía=0;
  9360. BEGIN
  9361.     //...
  9362. END
  9363. {-}
  9364.  
  9365. Si un dato declarado como local va a utilizarse únicamente dentro de un
  9366. proceso, entonces se puede definir como un dato privado (dentro de la sección
  9367. {#1008,PRIVATE} de dicho proceso).
  9368.  
  9369. {/}Ver: {#1000,Sintaxis} - {#4,Glosario}
  9370.  
  9371. # ─────────────────────────────────────────────────────────────────────────────
  9372.  
  9373. {.1008,Declaración de datos privados.}
  9374.  
  9375. {PRIVATE}·
  9376.     {#1009,<declaración de dato>} {#1068,;}·
  9377.     ...
  9378.  
  9379. Estas secciones de los programas son opcionales; en ellas se pueden declarar
  9380. datos de ámbito privado, es decir, {datos que van a ser utilizados exclusivamente
  9381. dentro de un proceso}.
  9382.  
  9383. Dicha sección se define justo antes del {#1086,BEGIN} del proceso que va a utilizar
  9384. esos datos y debe comenzar, obligatoriamente, con la palabra reservada PRIVATE
  9385. seguida de una serie de {#1009,declaraciones de datos} terminadas con un
  9386. símbolo {#1068,;} (punto y coma).
  9387.  
  9388. El programa principal también se considera como un proceso, pudiendo tener
  9389. su declaración de datos privados justo antes del {#1086,BEGIN} del mismo.
  9390.  
  9391. En general, se declaran como datos privados todos aquellos que vayan a contener
  9392. información necesaria únicamente para un proceso e, igualmente, que no van a poder ser accedidos
  9393. desde ningún otro proceso.
  9394.  
  9395. Típicamente se definen como datos privados aquellas variables que van a ser utilizadas
  9396. como contadores en un bucle, las variables para contener ángulos o códigos identificadores
  9397. secundarios, etc.
  9398.  
  9399. {#9999,Ejemplo:}
  9400. PROGRAM mi_juego;
  9401. PRIVATE
  9402.     n;
  9403. BEGIN
  9404.     FROM n=0 TO 9;
  9405.         //...
  9406.     END
  9407.     //...
  9408. END
  9409.  
  9410. PROCESS mi_proceso()
  9411. PRIVATE
  9412.     id2;
  9413.     angle2;
  9414. BEGIN
  9415.     id2=get_id(TYPE mi_proceso);
  9416.     IF (id2<>0)
  9417.         angle2=id2.angle;
  9418.         //...
  9419.     END
  9420.     //...
  9421. END
  9422. {-}
  9423.  
  9424. Si un dato declarado como privado necesita consultarse o modificarse desde
  9425. otro proceso (identificador.dato), entonces se deberá declarar dicho dato
  9426. como local (dentro de la sección {#1007,LOCAL} del programa); de esta forma,
  9427. todos los procesos poseerán el dato, pudiendo acceder cada uno a su valor
  9428. o al valor que tenga dicho dato en otro proceso.
  9429.  
  9430. {/}Ver: {#1000,Sintaxis} - {#4,Glosario}
  9431.  
  9432. # ─────────────────────────────────────────────────────────────────────────────
  9433.  
  9434. {.1009,Declaración de un dato.}
  9435.  
  9436. En una declaración de dato pueden manifestarse tres tipos diferentes de
  9437. objetos:
  9438.  
  9439.   {#1010,<Declaración de una variable>}·
  9440.   {#1011,<Declaración de una tabla>}·
  9441.   {#1012,<Declaración de una estructura>}·
  9442.  
  9443. En general, una variable almacenará un simple valor numérico, una tabla una
  9444. lista de valores numéricos, mientras que una estructura almacenará una lista de registros de varios
  9445. campos (como una lista de fichas con diversa información).
  9446.  
  9447. Todos los datos se declaran con un nombre propio que, a partir
  9448. de ese momento, será el medio por el cual se acceda o se modifique la información
  9449. que dicho dato contiene.
  9450.  
  9451. Cada dato pertenecerá a un ámbito determinado, según su declaración se
  9452. haga dentro de la sección {#1006,GLOBAL}, {#1007,LOCAL} o {#1008,PRIVATE}..
  9453.  
  9454.   {#1006,<Declaración de datos globales>}·
  9455.   {#1007,<Declaración de datos locales>}·
  9456.   {#1008,<Declaración de datos privados>}·
  9457.  
  9458. A los datos globales se puede acceder desde cualquier punto del
  9459. programa; los locales son aquellos que tienen todos los procesos
  9460. (cada proceso tiene su propio valor en ellos) mientras que los privados son los
  9461. que pertenecen a un solo proceso determinado.
  9462.  
  9463. {/}Ver: {#1000,Sintaxis}
  9464.  
  9465. # ─────────────────────────────────────────────────────────────────────────────
  9466.  
  9467. {.1010,Declaración de una variable.}
  9468.  
  9469. {#1001,<nombre>}
  9470.  
  9471. (o bien, si se quiere inicializar)
  9472.  
  9473. {#1001,<nombre>} {#1073,=} {#1005,<constante>}
  9474.  
  9475. Para declarar una variable dentro de una sección {#1006,GLOBAL}, {#1007,LOCAL}
  9476. o {#1008,PRIVATE} bastará con indicar su nombre dentro de dicha sección, en
  9477. cuyo caso la variable será inicializada a 0 (cero).
  9478.  
  9479. Si se quiere que la variable esté inicializada a otro valor se deberá poner,
  9480. a continuación del nombre de la variable, el símbolo {#1073,=} (asignación)
  9481. y tras éste el valor constante al que se desea inicializar la variable.
  9482.  
  9483. Una variable es una celda (o posición) de la memoria del ordenador a la que
  9484. nos referimos por su nombre, y que puede contener valores numéricos
  9485. enteros dentro del rango ({#1177,min_int} ... {#1178,max_int}).
  9486.  
  9487. {/}Ver: {#1000,Sintaxis} - {#4,Glosario}
  9488.  
  9489. # ─────────────────────────────────────────────────────────────────────────────
  9490.  
  9491. {.1011,Declaración de una tabla.}
  9492.  
  9493. {#1001,<nombre>} {#1079,[} {#1005,<constante>} {#1079,]}
  9494.  
  9495. (o bien, si se quiere inicializar la tabla)
  9496.  
  9497. {#1001,<nombre>} {#1079,[} {#1005,<constante>} {#1079,]} {#1073,=} {#1013,<lista de constantes>}
  9498.  
  9499. (o bien, si se inicializa sin definir su longitud)
  9500.  
  9501. {#1001,<nombre>} {#1079,[} {#1079,]} {#1073,=} {#1013,<lista de constantes>}
  9502.  
  9503. Para declarar una tabla dentro de una sección {#1006,GLOBAL}, {#1007,LOCAL}
  9504. o {#1008,PRIVATE} bastará con indicar su nombre seguido de la longitud
  9505. de la tabla entre corchetes (símbolos {#1079,[} {#1079,]}), en cuyo
  9506. caso todas las posiciones de la tabla serán inicializadas a 0 (cero).
  9507.  
  9508. La longitud de la tabla se expresa como el valor máximo de su índice, es
  9509. decir, todas las tablas van de la posición 0 a la posición indicada entre
  9510. los corchetes en su declaración. Por ejemplo, una tabla declarada como
  9511. {mi_tabla[9]}, será una tabla de longitud {10} (de 10 posiciones, desde
  9512. mi_tabla[0] hasta mi_tabla[9]).
  9513.  
  9514. Si se quiere inicializar las diferentes posiciones de la tabla se deberá poner,
  9515. a continuación de la declaración anterior, el símbolo {#1073,=} (asignación)
  9516. y tras éste una {#1013,lista de constantes}.
  9517.  
  9518. Si se inicializa la tabla con una lista, entonces no es necesario indicar
  9519. entre corchetes la longitud de la tabla, pues el compilador creará una tabla
  9520. con tantas posiciones como valores tenga la lista.
  9521.  
  9522. Una tabla es una serie de celdas (o posiciones) de la memoria del ordenador,
  9523. a las que nos referimos por su nombre y tras él, entre corchetes, el
  9524. número de celda dentro de la tabla a la que se quiere acceder.
  9525.  
  9526. Cada celda de la tabla es una variable y puede contener valores numéricos
  9527. enteros dentro del rango ({#1177,min_int} ... {#1178,max_int}).
  9528.  
  9529. Por ejemplo, si declaramos una tabla como la siguiente:
  9530.  
  9531.     {mi_tabla[]=33, -1, 6, -3, 99;}
  9532.  
  9533. Estaremos declarando una tabla cuyo nombre es {mi_tabla} y tiene
  9534. {5} celdas (o posiciones), desde la celda nº 0 hasta la celda nº 4. En la
  9535. declaración anterior se inicializa la celda 0 ({mi_tabla[0]}) con el valor {33},
  9536. la 1 ({mi_tabla[1]}) con el valor{ -1}, etc.
  9537.  
  9538. El lenguaje permite acceder a la celda 0 simplemente con el nombre
  9539. de la tabla ({mi_tabla}), como si fuera una variable, omitiendo el cero entre
  9540. corchetes que debería aparecer a continuación, es decir, que para el compilador
  9541. {mi_tabla[0]} será lo mismo que {mi_tabla} (la primera celda de la tabla).
  9542.  
  9543. {/}Ver: {#1000,Sintaxis} - {#4,Glosario}
  9544.  
  9545. # ─────────────────────────────────────────────────────────────────────────────
  9546.  
  9547. {.1012,Declaración de una estructura.}
  9548.  
  9549. {STRUCT} {#1001,<nombre>} {#1079,[} {#1005,<constante>} {#1079,]}·
  9550.     {#1009,<declaración de dato>} {#1068,;}·
  9551.     ...·
  9552. {#1091,END}
  9553.  
  9554. (o bien, si se inicializa la estructura)
  9555.  
  9556. {STRUCT} {#1001,<nombre>} {#1079,[} {#1005,<constante>} {#1079,]}·
  9557.     {#1009,<declaración de dato>} {#1068,;}·
  9558.     ...·
  9559. {#1091,END} {#1073,=} {#1013,<lista de constantes>}
  9560.  
  9561. Para declarar una estructura dentro de una sección {#1006,GLOBAL},
  9562. {#1007,LOCAL} o {#1008,PRIVATE} se debe poner la palabra reservada {STRUCT}
  9563. precediendo a su nombre; tras éste, y entre corchetes, (símbolos {#1079,[ ]})
  9564. se deberá indicar el número de registros de la estructura.
  9565.  
  9566. Tras esta cabecera que define el nombre de la estructura y el
  9567. número de registros, se declararán todos los datos pertenecientes a
  9568. la estructura, que conformarán los campos de la misma. Y, por último,
  9569. para finalizar la declaración debe aparecer la palabra reservada {#1091,END}.
  9570.  
  9571. El número de registros de la estructura se expresa como el número de
  9572. registro máximo de la estructura, es decir, todas las estructuras
  9573. tienen desde el registro 0 hasta el registro que se indica entre
  9574. dichos corchetes. Por ejemplo, una estructura declarada como {STRUCT
  9575. mi_estructura[9]}, será una estructura de {10} registros (desde el
  9576. registro mi_estructura[0] hasta mi_estructura[9]).
  9577.  
  9578. Una estructura es como una caja de fichas (registros), cada una con
  9579. varias informaciones escritas (campos). Por ejemplo, una estructura
  9580. en la que podríamos contener la posición inicial y final de una
  9581. serie de procesos de un juego sería como la siguiente (sería como
  9582. una caja con 10 fichas, cada una de ellas indicando la (x, y) inicial
  9583. y la (x, y) final de un proceso):
  9584.  
  9585. {STRUCT movimiento_enemigos[9]}·
  9586.     {x_inicial;}·
  9587.     {y_inicial;}·
  9588.     {x_final;}·
  9589.     {y_final;}·
  9590. {END}
  9591.  
  9592. Esta estructura, a la que se accedería con el nombre
  9593. {movimiento_enemigos}, tiene diez registros y en cada uno cuatro
  9594. campos (dos coordenadas que determinan la posición inicial del
  9595. proceso [x_inicial ,y_final], y dos que determinan la posición final
  9596. [x_final, y_final]). Para acceder a la {x} final del primer enemigo
  9597. se utilizaría {movimiento_enemigo[0].x_final}.
  9598.  
  9599. El lenguaje permite acceder al registro 0 de la estructura simplemente con el nombre
  9600. de la estructura ({movimiento_enemigos.x_final}), omitiendo el cero entre
  9601. corchetes que debería venir a continuación, es decir, que para el compilador
  9602. {movimiento_enemigos[0].x_final} será lo mismo que {movimiento_enemigos.x_final}.
  9603.  
  9604. Cada campo de la estructura puede ser una variable, una tabla
  9605. u otra estructura completa, con sus diferentes registros y campos.
  9606.  
  9607. Si se quiere inicializar la estructura (fijar los valores iniciales
  9608. de sus campos en los diferentes registros), se deberá poner el símbolo
  9609. {#1073,=} (asignación) tras la palabra reservada {#1091,END} seguida de una
  9610. {#1013,lista de constantes}. Si no se inicializa de esta forma la
  9611. estructura, todos los campos serán puestos a 0 por defecto.
  9612.  
  9613. Para inicializar una estructura se debe tener en cuenta que los
  9614. primeros valores serán los valores de los campos del primer registro,
  9615. los siguientes los del segundo registro y, así, sucesivamente.
  9616.  
  9617. Por ejemplo, si se hace la siguiente declaración:
  9618.  
  9619. STRUCT a[2]·
  9620.     b;·
  9621.     c[1];·
  9622. END = 1, 2, 3, 4, 5, 6, 7, 8, 9;
  9623.  
  9624. Primero se debe tener en cuenta que la estructura {a} tiene 3 registros
  9625. (desde a[0] hasta a[2]) y en cada registro tres campos (b, c[0] y c[1]),
  9626. luego la anterior declaración inicializará la estructura de la siguiente
  9627. forma:
  9628.  
  9629. a[0].b=1;·
  9630. a[0].c[0]=2;·
  9631. a[0].c[1]=3;·
  9632. a[1].b=4;·
  9633. a[1].c[0]=5;·
  9634. ...
  9635.  
  9636. {/}Ver: {#1000,Sintaxis} - {#4,Glosario}
  9637.  
  9638. # ─────────────────────────────────────────────────────────────────────────────
  9639.  
  9640. {.1013,Definición de una lista de constantes.}
  9641.  
  9642. Una constante es un valor o una expresión numérica constante
  9643. (ver {#1005,<definición de constante>}).
  9644.  
  9645. Las listas de constantes son básicamente una serie de constantes
  9646. separadas por {#1059,comas (,)} y se utilizan para inicializar los valores
  9647. de tablas o estructuras.
  9648.  
  9649. Un ejemplo de una lista de constantes podría ser el siguiente:
  9650.  
  9651. 1, 2, 3, 4, 5;
  9652.  
  9653. Pero, además de esta forma básica de definición, se permite el
  9654. uso del operador {#1089,DUP} para repetir un número determinado de
  9655. veces una serie de constantes. Por ejemplo la siguiente lista:
  9656.  
  9657. 0, 100 DUP (1, 2, 3), 0;
  9658.  
  9659. Es una lista de 302 constantes (0, 1, 2, 3, 1, 2, 3, ..., 1, 2, 3, 0), es decir,
  9660. que el operador {#1089,DUP} (de duplicar) permite repetir la secuencia que
  9661. aparece tras él, entre paréntesis, el número de veces indicadas.
  9662.  
  9663. Es posible anidar operaciones {#1089,DUP}, por ejemplo la lista siguiente:
  9664.  
  9665. 2 {DUP} (88, 3 DUP (0, 1), 99);
  9666.  
  9667. equivaldría a:
  9668.  
  9669. 88, 0, 1, 0, 1, 0, 1, 99, 88, 0, 1, 0, 1, 0, 1, 99;
  9670.  
  9671. Además, se permite la omisión del operador {#1089,DUP}, esto es, que
  9672. {2 DUP (0, 1)} equivale a {2(0, 1)}.
  9673.  
  9674. El operador DUP es útil, sobre todo, para la inicialización de
  9675. estructuras; si, por ejemplo, se quiere inicializar la siguiente
  9676. estructura de 100 registros:
  9677.  
  9678. {STRUCT a[99]}·
  9679.     {b;}·
  9680.     {c[9];}·
  9681.     {d[9];}·
  9682. {END}
  9683.  
  9684. Con los campos {b} incializados a {0}, los campos {c[9]} a {1} y los
  9685. campos {d[9]} a {2}, se utilizaría la siguiente lista de inicialización:
  9686.  
  9687. 100 {#1089,DUP} (0, 10 DUP(1), 10 DUP(2));
  9688.  
  9689. {/}Ver: {#1000,Sintaxis}
  9690.  
  9691. # ─────────────────────────────────────────────────────────────────────────────
  9692.  
  9693. {.1014,Declaración de librerías.}
  9694.  
  9695. {IMPORT} {<nombre de archivo>}
  9696.  
  9697. La creación de librerías de funciones para el lenguaje es un tema {muy avanzado},
  9698. sólo apto para programadores con amplia experiencia en el lenguaje {C} y/o {Ensamblador}.
  9699.  
  9700. Las librerías deben distribuirse con dos archivos: uno, con extensión {DLL} con
  9701. la librería en sí y, otro, con el mismo nombre pero con extensión {TXT} que
  9702. debe ser un archivo de texto ascii (MSDOS), con la explicación del propósito
  9703. y funcionamiento de la librería; en el mismo deben venir explicadas todas
  9704. las funciones proporcionadas y el proceso de instalación y utilización de la
  9705. librería.
  9706.  
  9707. Desde el lenguaje se deben importar las librerías poniendo la palabra reservada
  9708. {IMPORT} (tras la declaración de datos globales y locales) seguida de la ruta
  9709. de acceso al archivo {DLL}. Si el archivo con extensión {DLL} se ha copiado al
  9710. directorio de {DIV Games Studio} entonces no es necesario especificar la ruta
  9711. de la librería.
  9712.  
  9713. {#9999,Ejemplo:}
  9714. PROGRAM mi_juego;
  9715. IMPORT "c:\tmp\3dtrans.dll";
  9716. BEGIN
  9717.     //...
  9718. END
  9719. {-}
  9720.  
  9721. Desde el momento en que las librerías de funciones pueden ser desarrolladas
  9722. de forma libre, {no se garantiza el correcto funcionamiento de DIV Games
  9723. Studio cuando se utilicen librerías DLL externas}. Puede ser habitual el
  9724. funcionamiento incorrecto del {trazador de programas} cuando en un juego se
  9725. cargue una DLL que modifique partes vitales de la librería de funciones o
  9726. del gestor de procesos de DIV Games Studio.
  9727.  
  9728. {Nota:} Si usted es un programador experto en C y Ensamblador, puede obtener
  9729. más información sobre la creación de nuevas librerías en el archivo
  9730. DLL\SOURCE\LEEME.TXT de DIV.
  9731.  
  9732. {/}Ver: {#1000,Sintaxis}
  9733.  
  9734. # ─────────────────────────────────────────────────────────────────────────────
  9735.  
  9736. {.1015,Código principal.}
  9737.  
  9738. {#1086,BEGIN}·
  9739.     {#1017,<sentencia>} {;}·
  9740.     ...·
  9741. {#1091,END}
  9742.  
  9743. El código principal de un programa comienza con la palabra reservada
  9744. {#1086,BEGIN}, tras la cual puede aparecer cualquier número de sentencias,
  9745. y finaliza con la palabra reservada {#1091,END}.
  9746.  
  9747. Este código controla el proceso principal del programa, que es el encargado
  9748. de inicializar el programa, controlar los bucles de menú y de juego, y
  9749. finalizar el programa.
  9750.  
  9751. {#9999,Ejemplo:}
  9752. PROGRAM mi_juego;
  9753.  
  9754. GLOBAL
  9755.     opción;             // Opción elegida en el menú.
  9756.  
  9757. BEGIN                   // Inicio del código principal.
  9758.  
  9759.     set_mode(m640x480); // Inicialización.
  9760.     set_fps(24, 4);
  9761.     // ...              // Carga ficheros, sonidos, etc.
  9762.  
  9763.     REPEAT              // Inicio bucle principal.
  9764.  
  9765.         opcion=0;       // Bucle de control del menú de opciones.
  9766.         //...           // Inicializa el menú de opciones.
  9767.         REPEAT
  9768.             // ...
  9769.             IF (key(_enter)) opcion=1; END  // Se elige jugar.
  9770.             IF (key(_esc)) opcion=2; END    // Se elige finalizar.
  9771.             FRAME;
  9772.         UNTIL (opcion>0);
  9773.  
  9774.         IF (opcion==1)  // Si se ha elegido la opcion de jugar.
  9775.  
  9776.             // Inicializa regiones, scroll, etc.
  9777.             // Crea los procesos de juego.
  9778.             // Bucle de control del juego, espera a que finalice.
  9779.  
  9780.         END
  9781.  
  9782.     UNTIL (opcion==2);  // Final del bucle principal.
  9783.  
  9784.     let_me_alone();     // Finaliza todos los procesos.
  9785.  
  9786. END                     // Final del código pricipal.
  9787.  
  9788. // ...                  // Declaración de los procesos del programa.
  9789. {-}
  9790.  
  9791. Que finalice la ejecución del código principal no implica que finalice la
  9792. ejecución del programa, pues ésta continuará si quedan procesos vivos; si se
  9793. quiere forzar la terminación del programa cuando finalice este código, se
  9794. puede utilizar, por ejemplo, la función {#129,let_me_alone()} justo antes del
  9795. {#1091,END} que marca el final del código principal, para eliminar al resto
  9796. de procesos que puedan quedar vivos.
  9797.  
  9798. También se puede finalizar en cualquier punto del programa su
  9799. ejecución mediante la función {#109,exit()} que automáticamente eliminará
  9800. todos los procesos.
  9801.  
  9802. {/}Ver: {#1000,Sintaxis}
  9803.  
  9804. # ─────────────────────────────────────────────────────────────────────────────
  9805.  
  9806. {.1016,Declaración de procesos.}
  9807.  
  9808. {PROCESS} {#1001,<nombre>} {(} {#1018,<parámetros>} {)}·
  9809. {#1008,<Declaración de datos privados>}·
  9810. {#1086,BEGIN}·
  9811.     {#1017,<sentencia>} {;}·
  9812.     ...·
  9813. {#1091,END}
  9814.  
  9815. Un proceso debe comenzar con la palabra reservada {PROCESS} seguida
  9816. de su nombre y sus {#1018,parámetros} de llamada entre
  9817. paréntesis. Los parámetros son una lista de datos en los que el
  9818. proceso va a recibir diferentes valores. Los paréntesis son
  9819. obligatorios incluso cuando el proceso no tenga parámetros.
  9820.  
  9821. Tras esta cabecera puede venir, de forma opcional, una sección {#1008,PRIVATE}
  9822. donde se declaren datos que va a utilizar exclusivamente el proceso.
  9823.  
  9824. Y, por último, se especificará el código para el proceso, que es una
  9825. secuencia de sentencias entre las palabras reservadas {#1086,BEGIN} y
  9826. {#1091,END}.
  9827.  
  9828. Un proceso se corresponde, normalmente, con un tipo de objeto del
  9829. juego, como puede ser una nave, una explosion, un disparo, etc.,
  9830. y dentro del código del proceso se suele implementar un bucle
  9831. dentro del cual se fijarán todos los valores necesarios de
  9832. visualización de dicho objeto (gráfico, coordenadas, etc.) y
  9833. después, mediante la sentencia {#1029,FRAME}, se dará la orden para
  9834. visualizar el objeto con los atributos establecidos.
  9835.  
  9836. {#9999,Ejemplo:}
  9837. PROGRAM mi_juego;
  9838. PRIVATE
  9839.     id2;
  9840. BEGIN
  9841.     id2=mi_proceso(160, 100)
  9842.     // ...
  9843. END
  9844.  
  9845. PROCESS mi_proceso(x, y)
  9846. PRIVATE
  9847.     n;
  9848. BEGIN
  9849.     graph=1;
  9850.     FROM n=0 to 99;
  9851.         x=x+2;
  9852.         y=y+1;
  9853.         FRAME;
  9854.     END
  9855. END
  9856. {-}
  9857.  
  9858. Como se puede observar en este ejemplo, cuando se llama a un proceso
  9859. éste devuelve su {#1039,código identificador} (que en el ejemplo se guarda en la
  9860. variable {#1008,PRIVATE} del programa principal {id2}); si se quiere
  9861. implementar un proceso al estilo de las funciones de otros lenguajes,
  9862. que devuelva un resultado numérico, entonces se debe utilizar la
  9863. sentencia {#1028,RETURN(}valor{)} y no utilizar la sentencia {#1029,FRAME}
  9864. dentro del proceso, pues ésta retorna al proceso padre (llamante),
  9865. devolviendo el {#1039,código identificador} del proceso como valor de retorno.
  9866.  
  9867. {/}Ver: {#1000,Sintaxis}
  9868.  
  9869. # ─────────────────────────────────────────────────────────────────────────────
  9870.  
  9871. {.1017,Relación de sentencias.}
  9872.  
  9873. Una sentencia es una orden a ejecutar por el ordenador dentro de un
  9874. programa. Estos son los posibles tipos de sentencias:
  9875.  
  9876. Sentencias de asignación·
  9877.     {#1019,=}·
  9878.  
  9879. Sentencias de control·
  9880.     {#1020,IF}·
  9881.     {#1021,SWITCH}·
  9882.  
  9883. Sentencias de bucles·
  9884.     {#1024,LOOP}·
  9885.     {#1043,FROM}·
  9886.     {#1023,REPEAT}·
  9887.     {#1022,WHILE}·
  9888.     {#1025,FOR}·
  9889.  
  9890. Sentencias de ruptura·
  9891.     {#1026,BREAK}·
  9892.     {#1027,CONTINUE}·
  9893.     {#1028,RETURN}·
  9894.  
  9895. Sentencias especiales·
  9896.     {#1029,FRAME}·
  9897.     {#1030,CLONE}·
  9898.     {#1031,DEBUG}·
  9899.  
  9900. Sentencias de llamada·
  9901.     {#1032,Llamada a una función}·
  9902.     {#1033,Llamada a un proceso}·
  9903.  
  9904. Las sentencias siempre aparecen como un grupo de sentencias, desde
  9905. ninguna (que no tiene sentido) hasta tantas como sean necesarias.
  9906.  
  9907. Todas las sentencias se ejecutarán secuencialmente (la primera,
  9908. la segunda, la tercera, ...) salvo por las excepciones que definen
  9909. las sentencias que pueden controlar el flujo del programa (las
  9910. sentencias de control, de bucles y de ruptura).
  9911.  
  9912. {/}Ver: {#1000,Sintaxis} - {#4,Glosario} - {#3,Indice}
  9913.  
  9914. # ─────────────────────────────────────────────────────────────────────────────
  9915.  
  9916. {.1018,Parámetros de un proceso.}
  9917.  
  9918. Los parámetros de un proceso son, básicamente, una lista de datos en los cuales
  9919. el proceso recibirá distinta información cada vez que sea invocado
  9920. (llamado o utilizado) desde otro proceso.
  9921.  
  9922. Los procesos pueden recibir parámetros en los siguientes tipos de datos:
  9923.  
  9924. - Un dato local predefinido (como {#1123,x}, {#1228,size}, {#1127,flags}, ...).
  9925.  
  9926. - Un dato local definido dentro de la sección {#1007,LOCAL}.
  9927.  
  9928. - Un dato global definido dentro de la sección {#1006,GLOBAL}.
  9929.  
  9930. - Un dato privado del proceso declarado dentro de la sección {#1008,PRIVATE}
  9931. del propio proceso.
  9932.  
  9933. - Un dato privado que {no esté declarado} dentro de la sección {#1008,PRIVATE}.
  9934.  
  9935. Entendiéndose, en todos estos casos, que un dato puede referirse a una variable,
  9936. a una posición concreta de una tabla o a un elemento
  9937. dentro de una estructura.
  9938.  
  9939. Para ejemplificar los diferentes tipos de parámetros se muestra,
  9940. a continuación, un programa con un proceso que recibe cinco parámetros
  9941. diferentes de los tipos indicados en la lista anterior, respectivamente.
  9942.  
  9943. {#9999,Ejemplo:}
  9944. PROGRAM mi_juego;
  9945. GLOBAL
  9946.     puntos=0;
  9947. LOCAL
  9948.     energia=0;
  9949. BEGIN
  9950.     mi_proceso(1, 2, 3, 4, 5);
  9951.     // ...
  9952. END
  9953.  
  9954. PROCESS mi_proceso(x, energía, puntos, n, m)
  9955. PRIVATE
  9956.     n;
  9957. BEGIN
  9958.     // ...
  9959. END
  9960. {-}
  9961.  
  9962. El proceso {mi_proceso} recibe cinco parámetros en cinco variables:
  9963. local predefinida, local, global, {#1008,private} declarada y {#1008,private} sin
  9964. declarar.
  9965.  
  9966. Recibir en un dato global un parámetro (como la variable {#1006,GLOBAL}
  9967. {puntos}) equivale a realizar la asignación ({puntos=3;}) y, después,
  9968. llamar al proceso.
  9969.  
  9970. {/}Ver: {#1000,Sintaxis}
  9971.  
  9972. # ─────────────────────────────────────────────────────────────────────────────
  9973.  
  9974. {.1019,Sentencia de asignación.}
  9975.  
  9976. Las sentencias de asignación sirven para calcular expresiones y
  9977. {asignárselas} a un dato.
  9978.  
  9979. {#1034,<Referencia a un dato>} {#1073,=} {#1035,<expresión>} {#1068,;}
  9980.  
  9981. Se debe indicar el dato en el cual se va a guardar el resultado
  9982. de la expresión, seguido del símbolo {#1073,=} (símbolo de la {asignación})
  9983. y la expresión numérica o lógica a evaluar cuando se ejecute la
  9984. sentencia. Tras esta sentencia se debe poner siempre el
  9985. símbolo{#1068, ;(punto y coma)}.
  9986.  
  9987. En una sentencia de asignación sólo está permitido asignar valores a objetos
  9988. tales como variables (de cualquier tipo), a una {#1011,posición de una tabla},
  9989. o a un {#1012,elemento de una estructura}.
  9990.  
  9991. No es posible asignar un valor a una {#1004,constante}, a una función
  9992. o a un proceso, o, en general, a cualquier {#1035,expresión numérica o lógica}.
  9993.  
  9994. Se muestra a continuación un programa con varias asignaciones.
  9995.  
  9996. {#9999,Ejemplo:}
  9997. PROGRAM mi_juego;
  9998. BEGIN
  9999.     x=x+1;
  10000.     angle=(angle*3)/2-pi/2;
  10001.     size=(x+y)/2;
  10002.     z=abs(x-y)*3-pow(x, 2);
  10003.     // ...
  10004. END
  10005. {-}
  10006.  
  10007. Ésta es la forma básica de las asignaciones, si bien existen otros símbolos de asignación
  10008. que, en lugar de asignar un nuevo valor al dato referido, modifican su valor.
  10009. Éstos son los símbolos de {asignaciones operativas}:
  10010.  
  10011. {#1058, +=} Suma al dato el resultado de la expresión·
  10012.         {x=2; x+=2;} -> (x==4)
  10013.  
  10014. {#1062, -=} Resta al dato el resultado de la expresión·
  10015.         {x=4; x-=2;} -> (x==2)
  10016.  
  10017. {#1055, *=} Multiplica el dato por el resultado de la expresión·
  10018.         {x=2; x*=3;} -> (x==6)
  10019.  
  10020. {#1066, /=} Divide el dato por el resultado de la expresión·
  10021.         {x=8; x/=2;} -> (x==4)
  10022.  
  10023. {#1049, %=} Pone en el dato el resto de dividir al mismo entre el resultado de la
  10024. expresión·
  10025.         {x=3; x%=2;} -> (x==1)
  10026.  
  10027. {#1052, &=} Realiza un AND (binario y/o lógico) entre el dato y el resultado de la
  10028. expresión y lo asigna como nuevo valor del dato·
  10029.         {x=5; x&=6;} -> (x==4)
  10030.  
  10031. {#1084, |=} Realiza un OR (binario y/o lógico) entre el dato y el resultado de la
  10032. expresión y lo asigna como nuevo valor del dato·
  10033.         {x=5; x|=6;} -> (x==7)
  10034.  
  10035. {#1081, ^=} Realiza un OR exclusivo (XOR binario y/o lógico) entre el dato y el
  10036. resultado de la expresión y lo asigna como nuevo valor del dato·
  10037.         {x=5; x^=3;} -> (x==3)
  10038.  
  10039. {#1078, >>=} Rota a la derecha el dato tantas veces como indique el resultado de la
  10040. expresión (cada rotación a la derecha equivale a dividir entre 2 el dato)·
  10041.         {x=8; x>>=2;} -> (x==2)
  10042.  
  10043. {#1071, <<=} Rota a la izquierda el dato tantas veces como indique el resultado de la
  10044. expresión (cada rotación a la izquierda equivale a multiplicar por 2 el dato)·
  10045.         {x=2; x<<=2;} -> (x==8)
  10046.  
  10047. También se admiten dentro de la categoría de sentencias de asignación los
  10048. {incrementos} y {decrementos} de un dato. Por ejemplo, si quisieramos sumarle 1
  10049. a la variable local {x} podríamos hacerlo con la sentencia {x=x+1;}, con
  10050. la sentencia {x+=1;} o bien con el operador de incremento: {x++;} o{ ++x;}.
  10051.  
  10052. Es decir, se aceptan como sentencias de asignación {#1057,incrementos ( ++ )} o
  10053. {#1061,decrementos ( -- )} de un dato.
  10054.  
  10055. {/}Ver: {#1000,Sintaxis}
  10056.  
  10057. # ─────────────────────────────────────────────────────────────────────────────
  10058.  
  10059. {.1020,Sentencia IF}
  10060.  
  10061. {IF} {#1053,(} {#1037,<condición>} {#1053,)}·
  10062.     {#1017,<sentencia>} {#1068,;}·
  10063.     ...·
  10064. {#1091,END}
  10065.  
  10066. (o bien)
  10067.  
  10068. {IF} {#1053,(} {#1037,<condición>} {#1053,)}·
  10069.     {#1017,<sentencia>} {#1068,;}·
  10070.     ...·
  10071. {#1090,ELSE}·
  10072.     {#1017,<sentencia>} {#1068,;}·
  10073.     ...·
  10074. {#1091,END}
  10075.  
  10076. La sentencia {IF} sirve para ejecutar un bloque de sentencias opcionalmente,
  10077. cuando se cumpla una condición. En la segunda variante que aparece arriba,
  10078. se ejecutará además otro bloque de sentencias (dentro de la sección
  10079. {#1090,ELSE}) cuando la condición {no} se cumpla.
  10080.  
  10081. Se muestra, a continuación, un programa con varias sentencias {IF}.
  10082.  
  10083. {#9999,Ejemplo:}
  10084. PROGRAM mi_juego;
  10085. BEGIN
  10086.  
  10087.     IF (key(_esc))
  10088.         exit("Adios!", 0);
  10089.     END
  10090.  
  10091.     IF (x>100 AND x<220)
  10092.         y=y+4;
  10093.     ELSE
  10094.         y=y-8;
  10095.     END
  10096.  
  10097.     IF (size>0)
  10098.         size=size-1;
  10099.     END
  10100.  
  10101.     IF (timer[5]>1000)
  10102.         z=1;
  10103.     ELSE
  10104.         z=-1;
  10105.     END
  10106.  
  10107.     // ...
  10108. END
  10109. {-}
  10110.  
  10111. Es posible anidar sentencias {IF} sin ningún límite, es decir, se pueden poner
  10112. más sentencias {IF} dentro de la parte que se ejecuta cuando se cumple la
  10113. condición (parte {IF}) o dentro de la que se ejecuta cuando la condición no
  10114. se cumple (parte {#1090,ELSE}).
  10115.  
  10116. {/}Ver: {#1000,Sintaxis}
  10117.  
  10118. # ─────────────────────────────────────────────────────────────────────────────
  10119.  
  10120. {.1021,Sentencia SWITCH}
  10121.  
  10122. {SWITCH} {#1053,(} {#1035,<expresión>} {#1053,)}·
  10123.     {#1087,CASE} {<rango de valores>} {#1067,:}·
  10124.         {#1017,<sentencia>} {#1068,;}·
  10125.         ...·
  10126.     {#1091,END}·
  10127.     ...·
  10128.     {#1088,DEFAULT} {#1067,:}·
  10129.         {#1017,<sentencia>} {#1068,;}·
  10130.         ...·
  10131.     {#1091,END}·
  10132. {#1091,END}
  10133.  
  10134. Una sentencia {SWITCH} consta de una serie de secciones {#1087,CASE} y,
  10135. opcionalmente, una sección {#1088,DEFAULT}.
  10136.  
  10137. Cuando se ejecuta una sentencia {SWITCH}, primero se evalúa la expresión y
  10138. después, si el resultado está dentro del rango de valores contemplados en la
  10139. primera sección {CASE}, se ejecutarán las sentencias de la misma y se dará
  10140. por finalizada la sentencia. En caso de no estar el resultado de la expresión
  10141. en el primer {#1087,CASE} se pasará a comprobarlo con el segundo {#1087,CASE}, el tercero,
  10142. etc. Y, por último, si existe una sección {#1088,DEFAULT} y el resultado de la
  10143. expresión no ha coincidido con ninguna de las secciones {#1087,CASE},
  10144. entonces se ejecutarán las sentencias de la sección {#1088,DEFAULT}.
  10145.  
  10146. {#9999,Ejemplo:}
  10147. PROGRAM mi_juego;
  10148. BEGIN
  10149.     SWITCH (x)
  10150.         CASE 1:
  10151.             x=-1;
  10152.         END
  10153.         CASE 2:
  10154.             x=-2;
  10155.         END
  10156.         CASE 3:
  10157.             x=-3;
  10158.         END
  10159.         CASE 99:
  10160.             x=-99;
  10161.         END
  10162.         DEFAULT:
  10163.             x=0;
  10164.         END
  10165.     END
  10166. END
  10167. {-}
  10168.  
  10169. La sentencia {SWITCH} de este programa cambiará de signo la variable {x} si
  10170. ésta vale {1}, {2}, {3} o {99}; en caso contrario la pondrá a {0}.
  10171.  
  10172. {Rango de valores de una sección case}{/}
  10173.  
  10174. En una sección case se puede especificar un valor, un rango de valores
  10175. (mínimo {#1064,..} máximo), o una lista de valores y/o rangos separados por {#1059,comas (,)}.
  10176. Por ejemplo, la sentencia anterior se podría haber expresado como:
  10177.  
  10178.   {SWITCH (x)}·
  10179.       {CASE 1..3, 99:}·
  10180.           {x=-x;}·
  10181.       {END}·
  10182.       {DEFAULT:}·
  10183.           {x=0;}·
  10184.       {END}·
  10185.   {END}·
  10186.  
  10187. Una vez ejecutada una de las secciones {#1087,CASE} de una sentencia {SWITCH}
  10188. {ya no se ejecutarán más secciones}, aunque éstas especifiquen también el
  10189. resultado de la expresión, por ejemplo, en la siguiente sentencia:
  10190.  
  10191.   {SWITCH (2+2)}·
  10192.       {CASE 3..5:}·
  10193.           {x=x+1;}·
  10194.       {END}·
  10195.       {CASE 2, 4, 6:}·
  10196.           {y=y-1;}·
  10197.       {END}·
  10198.   {END}
  10199.  
  10200. Se ejecutará la sección {x=x+1;} y después se finalizará la sentencia, no
  10201. ejecutándose la sección {y=y-1;} pues, aunque el resultado de la expresión
  10202. evaluada ({4}) está contemplado en ella, también lo está en la sección anterior,
  10203. (ya que 4 está dentro del rango 3..5).
  10204.  
  10205. No es necesario ordenar las secciones {#1087,CASE} según sus valores (de menor
  10206. a mayor, o de mayor a menor), pero sí es imprescindible que la sección
  10207. {#1088,DEFAULT} (en caso de haberla) sea la última sección. No puede haber
  10208. más que una sección {#1088,DEFAULT}.
  10209.  
  10210. Es posible anidar sentencias {SWITCH} sin ningún límite, es decir, se pueden
  10211. poner nuevas sentencias {SWITCH} dentro de una sección {#1087,CASE} (y
  10212. cualquier otro tipo de sentencia).
  10213.  
  10214. {/}Ver: {#1000,Sintaxis}
  10215.  
  10216. # ─────────────────────────────────────────────────────────────────────────────
  10217.  
  10218. {.1022,Sentencia WHILE}
  10219.  
  10220. {WHILE} {#1053,(} {#1037,<condición>} {#1053,)}·
  10221.     {#1017,<sentencia>} {#1068,;}·
  10222.     ...·
  10223. {#1091,END}·
  10224.  
  10225. La sentencia {WHILE} (mientras) es una sentencia que implementa un {bucle}, es
  10226. decir, que es capaz de {repetir un grupo de sentencias un número determinado de
  10227. veces}.
  10228.  
  10229. Para implementar este bucle se debe especificar entre paréntesis la
  10230. condición que se debe cumplir para que se ejecute el grupo de sentencias a
  10231. continuación de la palabra reservada {WHILE}. Tras especificar esta condición,
  10232. se pondrán todas las sentencias que se necesita que se repitan y, finalmente,
  10233. se marcará el final del bucle con la palabra reservada {#1091,END} (No
  10234. importa que dentro del bucle aparezcan más palabras {#1091,END} si éstas
  10235. forman parte de sentencias interiores a dicho bucle).
  10236.  
  10237. Cuando se ejecute una sentencia {WHILE} se realizará la comprobación que
  10238. se especifica y, si ésta resulta cierta, se ejecutarán las sentencias
  10239. interiores; en caso contrario, se continuará el programa a partir
  10240. del {#1091,END} que marca el final del {WHILE}.
  10241.  
  10242. Si se han ejecutado las sentencias interiores (lo que se denomina realizar
  10243. una {iteración} del bucle), se volverá a comprobar la condición y, si ésta
  10244. vuelve a ser cierta, se realizará otra {iteración} (se volverán a ejecutar
  10245. las sentencias interiores). Este proceso se repetirá hasta que, al comprobarse
  10246. la condición del {WHILE}, ésta resulte falsa.
  10247.  
  10248. Si según se ejecuta una sentencia {WHILE} la condición resulta falsa directamente,
  10249. entonces no se ejecutarán las sentencias interiores ninguna vez.
  10250.  
  10251. {#9999,Ejemplo:}
  10252. PROGRAM mi_juego;
  10253. BEGIN
  10254.     x=0;
  10255.     WHILE (x<320)
  10256.         x=x+10;
  10257.         FRAME;
  10258.     END
  10259. END
  10260. {-}
  10261.  
  10262. En este ejemplo se pondrá la variable local {x} (coordenada x del proceso) a
  10263. cero y después, mientras x sea menor que 320, se le sumarán 10 a {x} y se
  10264. dará un {#1029,FRAME}.
  10265.  
  10266. Una sentencia {#1026,BREAK} dentro de un bucle {WHILE} lo finalizará de forma
  10267. inmediata, continuando el programa por la sentencia siguiente a dicho bucle.
  10268.  
  10269. Una sentencia {#1027,CONTINUE} dentro de un bucle {WHILE} forzará al programa a
  10270. comprobar la condición inicial inmediatamente y, si ésta es cierta,
  10271. volver a ejecutar las sentencias interiores desde el principio (tras el {WHILE}).
  10272. Si la condición resulta falsa, la sentencia {#1027,CONTINUE} finalizará el bucle.
  10273.  
  10274. Las sentencias interiores a un bucle {WHILE} pueden ser tantas como se
  10275. quieran y de cualquier tipo, incluyendo, por supuesto, nuevos bucles {WHILE}.
  10276.  
  10277. {/}Ver: {#1000,Sintaxis}
  10278.  
  10279. # ─────────────────────────────────────────────────────────────────────────────
  10280.  
  10281. {.1023, Sentencia REPEAT}
  10282.  
  10283. {REPEAT}·
  10284.     {#1017,<sentencia>} {#1068,;}·
  10285.     ...·
  10286. {#1097,UNTIL} {#1053,(} {#1037,<condición>} {#1053,)}
  10287.  
  10288. La sentencia {REPEAT} (REPEAT ... UNTIL( ... )) es una sentencia que implementa
  10289. un {bucle}, es decir, que es capaz de {repetir un grupo de sentencias un número
  10290. determinado de veces}.
  10291.  
  10292. Para implementar este bucle se debe comenzar con la palabra reservada {REPEAT},
  10293. seguida de las sentencias que se quieren repetir una o más veces y el final
  10294. de la sentencia se determinará poniendo la palabra reservada {#1097,UNTIL}
  10295. seguida de la condición que se debe cumplir para que {se de por finalizada
  10296. la sentencia}.
  10297.  
  10298. Cuando se ejecute una sentencia {REPEAT} se ejecutarán primero las sentencias
  10299. interiores (las que están entre el {REPEAT} y el {#1097,UNTIL}) y, tras hacerlo,
  10300. se comprobará la condición especificada en el {#1097,UNTIL} y si ésta continúa
  10301. siendo falsa, se volverán a ejecutar las sentencias interiores. El proceso se
  10302. repetirá hasta que la condición del {#1097,UNTIL} resulte cierta, continuando
  10303. entonces la ejecución del programa tras esta sentencia.
  10304.  
  10305. Cada vez que se ejecutan las sentencias interiores se dice que se ha realizado
  10306. una {iteración} del bucle. La sentencia {REPEAT} ... {#1097,UNTIL} (literalmente
  10307. traducida como {REPETIR} ... {HASTA} (que se cumpla la) {<condición>}) siempre
  10308. ejecutará las sentencias interiores al menos una vez, ya que comprueba
  10309. la condición siempre tras ejecutarlas.
  10310.  
  10311. {#9999,Ejemplo:}
  10312. PROGRAM mi_juego;
  10313. BEGIN
  10314.     x=0;
  10315.     REPEAT
  10316.         x=x+10;
  10317.         FRAME;
  10318.     UNTIL (x>320)
  10319. END
  10320. {-}
  10321.  
  10322. En este ejemplo se pondrá la variable local {x} (coordenada x del proceso) a
  10323. cero y, después, se le sumarán 10 a {x} y se dará un {#1029,FRAME} {hasta} que
  10324. {x} sea un número mayor que 320.
  10325.  
  10326. Una sentencia {#1026,BREAK} dentro de un bucle {REPEAT} lo finalizará de
  10327. forma inmediata, continuando el programa por la sentencia siguiente a dicho
  10328. bucle.
  10329.  
  10330. Una sentencia {#1027,CONTINUE} dentro de un bucle {REPEAT} forzará al programa
  10331. a realizar la comprobación del {#1097,UNTIL} inmediatamente y, si ésta es
  10332. falsa, volverá a ejecutar las sentencias interiores desde el principio (tras la
  10333. palabra reservada {REPEAT}). Si la condición resulta cierta, la sentencia
  10334. {#1027,CONTINUE} finalizará el bucle.
  10335.  
  10336. Las sentencias interiores a un bucle {REPEAT} pueden ser tantas como se
  10337. quieran y de cualquier tipo incluyendo, por supuesto, nuevos bucles {REPEAT}.
  10338.  
  10339. {/}Ver: {#1000,Sintaxis}
  10340.  
  10341. # ─────────────────────────────────────────────────────────────────────────────
  10342.  
  10343. {.1024,Sentencia LOOP}
  10344.  
  10345. {LOOP}·
  10346.     {#1017,<sentencia>} {#1068,;}·
  10347.     ...·
  10348. {#1091,END}
  10349.  
  10350. La sentencia {LOOP} (bucle) es una sentencia que implementa un {bucle infinito},
  10351. es decir, que {repite indefinidamente un grupo de sentencias}.
  10352.  
  10353. Para implementar este bucle se debe comenzar con la palabra reservada {LOOP},
  10354. seguida de las sentencias que se quieren repetir continuamente y la palabra
  10355. reservada {#1091,END} al final.
  10356.  
  10357. Cuando en un programa se encuentre una sentencia {LOOP} ... {#1091,END} se
  10358. ejecutarán a partir de entonces, una y otra vez, todas las sentencias interiores
  10359. a dicho bucle.
  10360.  
  10361. Para finalizar un bucle {LOOP} se puede utlizar la sentencia {#1026,BREAK}
  10362. que, al ejecutarse dentro de un bucle de este tipo, forzará al programa a
  10363. seguir a continuación del {#1091,END}.
  10364.  
  10365. Cada vez que se ejecutan las sentencias interiores se dice que se ha realizado
  10366. una {iteración} del bucle. La sentencia {#1027,CONTINUE}, dentro de un bucle,
  10367. finalizará la {iteración} actual y comenzará la siguiente (el programa
  10368. continuará ejecutándose tras la palabra reservada {LOOP}.
  10369.  
  10370. {#9999,Ejemplo:}
  10371. PROGRAM mi_juego;
  10372. BEGIN
  10373.     x=0;
  10374.     LOOP
  10375.         IF (key(_esc))
  10376.             BREAK;
  10377.         END
  10378.         x=x+1;
  10379.         FRAME;
  10380.     END
  10381. END
  10382. {-}
  10383.  
  10384. En este ejemplo se pondrá la variable local {x} (coordenada x del proceso) a
  10385. cero y, después, se le sumará 1 y se dará un {#1029,FRAME} continuamente. Si
  10386. se pulsa la tecla de escape ({ESC}) se ejecutará la sentencia {#1026,BREAK},
  10387. finalizando el bucle {LOOP}.
  10388.  
  10389. Las sentencias interiores a un bucle {LOOP} pueden ser tantas como se
  10390. quieran y de cualquier tipo incluyendo, por supuesto, nuevos bucles {LOOP}.
  10391.  
  10392. {/}Ver: {#1000,Sintaxis}
  10393.  
  10394. # ─────────────────────────────────────────────────────────────────────────────
  10395.  
  10396. {.1025,Sentencia FOR}
  10397.  
  10398. {FOR} {#1053,(}<inicialización>{#1068,;} <condición>{#1068,;} <incremento>{#1053,)}·
  10399.     {#1017,<sentencia>} {#1068,;}·
  10400.     ...·
  10401. {#1091,END}
  10402.  
  10403. La sentencia {FOR} (réplica del lenguaje C) es una sentencia que implementa
  10404. un {bucle}, es decir, que es capaz de {repetir un grupo de sentencias un número determinado de
  10405. veces}.
  10406.  
  10407. Para implementar este bucle se deben especificar, entre paréntesis, tres partes
  10408. diferentes, separadas por símbolos {#1068,;} (punto y coma) tras la palabra
  10409. reservada {FOR}. Estas tres partes son opcionales (pueden omitirse) y son
  10410. las siguientes:
  10411.  
  10412. - {Inicialización}. En esta parte se suele codificar una sentencia de asignación
  10413. que fija el valor inicial de la variable que va a utilizarse como contador de
  10414. {iteraciones} del bucle (a cada ejecución del grupo interior de sentencias
  10415. se le denomina una {iteración} del bucle). Un ejemplo puede ser la sentencia de
  10416. asignación {x=0}, que fijaría la variable {x} a cero al inicio del bucle (valor
  10417. para la primera iteración).
  10418.  
  10419. - {#1037,Condición}. En esta parte se especifica una condición; justo
  10420. antes de cada iteración se comprobará que sea cierta para pasar a ejecutar
  10421. el grupo de sentencias. Si la condición se evalúa como falsa, se finalizará
  10422. el bucle {FOR}, continuando el programa tras el {#1091,END} del bucle {FOR}.
  10423. Un ejemplo de condición puede ser {x<10}, que permitirá que se ejecute el
  10424. grupo interior de sentencias únicamente cuando la variable {x} sea un número
  10425. menor que {10}.
  10426.  
  10427. - {Incremento}. En la última de las tres partes es donde se indica el incremento
  10428. de la variable usada como contador por cada iteración del bucle; normalmente
  10429. ésto se expresa también con una sentencia de asignación. Por ejemplo, la
  10430. sentencia {x=x+1} le sumaría {1} a la variable {x} tras cada iteración del
  10431. bucle.
  10432.  
  10433. Tras la definición del bucle {FOR} con sus tres partes es donde debe aparecer
  10434. el grupo de sentencias interiores al bucle que se van a repetir secuencialmente
  10435. mientras se cumpla la condición de permanencia (parte segunda). Tras este grupo
  10436. de sentencias la palabra reservada {#1091,END} determinará el final del
  10437. bucle {FOR}.
  10438.  
  10439. Cuando en un programa llega una sentencia {FOR} se ejecuta primero la parte
  10440. de la inicialización y se comprueba la condición; si ésta es cierta se
  10441. ejecutará el grupo de sentencias interiores y, después, la parte del incremento,
  10442. volviéndose a comprobar la condición, etc. Si antes de cualquier iteración la
  10443. condición resulta falsa, finalizará la sentencia {FOR} inmediatamente.
  10444.  
  10445. A continuación, se muestra un programa con un bucle {FOR} con las tres partes
  10446. sugeridas en las secciones anteriores.
  10447.  
  10448. {#9999,Ejemplo:}
  10449. PROGRAM mi_juego;
  10450. BEGIN
  10451.     FOR ( x=0 ; x<10 ; x=x+1 )
  10452.         // Aquí vendrían las sentencias interiores.
  10453.     END
  10454. END
  10455. {-}
  10456.  
  10457. Este bucle se ejecutaría la primera vez con la variable {x} valiendo {0}, la
  10458. segunda valiendo {1}, ..., y la última valiendo {9}; tras esta iteración se
  10459. ejecutaría la parte del incremento, pasando {x} a valer {10} y, entonces,
  10460. al comprobarse la condición de permanencia en el bucle (que {x} sea menor
  10461. que {10}) y resultar ésta falsa, se daría por finalizado el bucle.
  10462.  
  10463. Como se ha mencionado, las tres partes en la definición del bucle son opcionales;
  10464. si se omitieran las tres:
  10465.  
  10466.   {FOR ( ; ; )}·
  10467.       // ...·
  10468.   {END}
  10469.  
  10470. Entonces, este bucle es equivalente a un bucle {#1024,LOOP} ... {#1091,END}.
  10471.  
  10472. Además en un bucle {FOR} pueden ponerse varias partes de inicialización,
  10473. condición o incremento separadas por comas ({#1059,,}), ejecutándose todas las
  10474. inicializaciones al principio, luego comprobándose todas las condiciones
  10475. de permanencia (si cualquiera resulta falsa, el bucle finalizará), las
  10476. asentencias interiores y, al final, tras cada iteración, todos los incrementos.
  10477.  
  10478. {#9999,Ejemplo:}
  10479. PROGRAM mi_juego;
  10480. BEGIN
  10481.     FOR ( x=0, y=1000 ; x<y ; x=x+2, y=y+1 )
  10482.         // Aqui vendrían las sentencias interiores.
  10483.     END
  10484. END
  10485. {-}
  10486.  
  10487. Una sentencia {#1026,BREAK} dentro de un bucle {FOR} lo finalizará de forma
  10488. inmediata, continuando el programa por la sentencia siguiente a dicho bucle.
  10489.  
  10490. Una sentencia {#1027,CONTINUE} dentro de un bucle {FOR} forzará al programa a
  10491. ejecutar directamente la parte del incremento y, después, realizar la comprobación
  10492. de permanencia y, si ésta es cierta, volver a ejecutar las sentencias interiores
  10493. desde el principio. Si la condición resulta cierta, la sentencia {#1027,CONTINUE}
  10494. finalizará el bucle {FOR}.
  10495.  
  10496. Un bucle {FOR} es, prácticamente, equivalente a un bucle {#1022,WHILE} implementado
  10497. de la siguiente forma:
  10498.  
  10499. {#9999,Ejemplo:}
  10500. PROGRAM mi_juego;
  10501. BEGIN
  10502.     x=0;
  10503.     WHILE (x<10)
  10504.         // Aqui vendrían las sentencias interiores.
  10505.         x=x+1;
  10506.     END
  10507. END
  10508. {-}
  10509.  
  10510. Con la única excepción de que una sentencia {#1027,CONTINUE}, dentro de este
  10511. bucle {#1022,WHILE}, no ejecutaría la parte del incremento, mientras que en un bucle {FOR}
  10512. sí lo haría.
  10513.  
  10514. Si en un bucle {FOR}, tras ejecutarse la inicialización, la condición
  10515. resulta falsa directamente, no se ejecutarán ninguna vez las sentencias interiores.
  10516.  
  10517. Las sentencias interiores a un bucle {FOR} pueden ser tantas como se
  10518. quieran y de cualquier tipo incluyendo, por supuesto, nuevos bucles {FOR}.
  10519.  
  10520. {/}Ver: {#1000,Sintaxis}
  10521.  
  10522. # ─────────────────────────────────────────────────────────────────────────────
  10523.  
  10524. {.1026,Sentencia BREAK}
  10525.  
  10526. Una sentencia {BREAK} dentro de un bucle lo finalizará de forma
  10527. inmediata, continuando el programa por la sentencia siguiente a dicho bucle.
  10528. No se puede poner esta sentencia más que dentro de los siguientes bucles:
  10529.  
  10530.   {#1022,LOOP} ... {#1091,END}·
  10531.   {#1043,FROM} .. {#1096,TO} .. {#1095,STEP} .. ... {#1091,END}·
  10532.   {#1023,REPEAT} ... {#1097,UNTIL} {#1053,(} .. {#1053,)}·
  10533.   {#1024,WHILE} {#1053,(} .. {#1053,)} ... {#1091,END}·
  10534.   {#1025,FOR} {#1053,(} .. {#1068;} .. {#1068,;} .. {#1053,)} ... {#1091,END}·
  10535.  
  10536. Un {BREAK} provocará que el programa continúe ejecutándose tras el {#1091,END}
  10537. o {#1097,UNTIL} del bucle más cercano a la sentencia.
  10538.  
  10539. En caso de haber varios bucles anidados (unos dentro de otros) la sentencia
  10540. {BREAK} saldrá únicamente del bucle más interior de ellos.
  10541.  
  10542. {#9999,Ejemplo:}
  10543. PROGRAM mi_juego;
  10544. BEGIN
  10545.     LOOP
  10546.         REPEAT
  10547.             IF (key(_esc)) BREAK; END
  10548.             //...
  10549.         UNTIL (x==0);
  10550.         //...
  10551.     END
  10552. END
  10553. {-}
  10554.  
  10555. En este ejemplo la sentencia {BREAK} saldrá del {#1023,REPEAT} ... {UNTIL}
  10556. (cuando se pulse la tecla {ESC}), pero no del {#1022,LOOP} ... {#1091,END}.
  10557.  
  10558. {Importante}{/}
  10559.  
  10560. La sentencia {BREAK} no es válida para finalizar sentencias {#1020,IF}, ni
  10561. {#1021,SWITCH} (ni las secciones {#1087,CASE} de esta sentencia), ni
  10562. sentencias {#1030,CLONE}.
  10563.  
  10564. {BREAK} sólo puede finalizar las sentencias que implementan un bucle.
  10565.  
  10566. {/}Ver: {#1000,Sintaxis}
  10567.  
  10568. # ─────────────────────────────────────────────────────────────────────────────
  10569.  
  10570. {.1027, Sentencia CONTINUE}
  10571.  
  10572. Una sentencia {CONTINUE} dentro de un bucle forzará al programa a
  10573. finalizar la iteración actual del mismo y comenzar la siguiente.
  10574.  
  10575. Se denomina {iteración} a cada ejecución del grupo de sentencias interior
  10576. a un bucle (las sentencias entre un {#1022,LOOP} y su {#1091,END}, por
  10577. ejemplo).
  10578.  
  10579. No se puede poner esta sentencia más que dentro de los siguientes bucles:
  10580.  
  10581. {#1022,LOOP} ... {#1091,END}·
  10582. Un CONTINUE dentro de este bucle saltará al LOOP.
  10583.  
  10584. {#1043,FROM} .. {#1096,TO} .. {#1095,STEP} .. ... {#1091,END}·
  10585. Un CONTINUE dentro de este bucle realizará el incremento (STEP) y, si no
  10586. se ha pasado el valor indicado en el TO, continuará el programa al inicio
  10587. del bucle.
  10588.  
  10589. {#1023,REPEAT} ... {#1097,UNTIL} {#1053,(}..{#1053,)}·
  10590. Un CONTINUE dentro de este bucle saltará al UNTIL.
  10591.  
  10592. {#1024,WHILE} {#1053,(} .. {#1053,)} ... {#1091,END}·
  10593. Un CONTINUE dentro de este bucle saltará al WHILE.
  10594.  
  10595. {#1025,FOR} {#1053,(} .. {#1068,;} .. {#1068,;} .. {#1053,)} ... {#1091,END}·
  10596. Un CONTINUE dentro de este bucle realizará el incremento y la comparación;
  10597. si ésta última resulta cierta continuará el programa al inicio del bucle,
  10598. si resulta falsa el programa continuará tras el END del FOR.
  10599.  
  10600. En caso de haber varios bucles anidados (unos dentro de otros) la sentencia
  10601. {CONTINUE} tendrá efecto únicamente en el bucle más interior de ellos.
  10602.  
  10603. {#9999,Ejemplo:}
  10604. PROGRAM mi_juego;
  10605. BEGIN
  10606.     FOR (x=0, y=0;x<10;x++)
  10607.         IF (x<5) CONTINUE; END
  10608.         y++;
  10609.     END
  10610. END
  10611. {-}
  10612.  
  10613. En este ejemplo, tras ejecutarse el bucle completo, {x} valdrá {10} e {y}
  10614. valdrá {5}, pues mientras {x} es menor que 5 la sentencia {CONTINUE}
  10615. impide que se ejecute la sentencia {y++;}.
  10616.  
  10617. {Importante}{/}
  10618.  
  10619. La sentencia {CONTINUE} no es válida dentro de sentencias {#1020,IF}, ni
  10620. {#1021,SWITCH} (ni las secciones {#1087,CASE} de esta sentencia), ni
  10621. sentencias {#1030,CLONE} (ya que estas sentencias no implementan bucles y,
  10622. por tanto, no realizan iteraciones).
  10623.  
  10624. {/}Ver: {#1000,Sintaxis}
  10625.  
  10626. # ─────────────────────────────────────────────────────────────────────────────
  10627.  
  10628. {.1028,Sentencia RETURN}
  10629.  
  10630. La sentencia {RETURN} finaliza el proceso actual de forma inmediata, como
  10631. si se llegara al {#1091,END} de su {#1086,BEGIN}.
  10632.  
  10633. Esta sentencia en el código principal lo finalizará, pero si quedan procesos
  10634. vivos éstos se seguirán ejecutando. Para terminar un programa y todos sus
  10635. procesos se puede utilizar, por ejemplo, la función {#109,exit()}.
  10636.  
  10637. Un {RETURN} dentro de un proceso lo finalizará, matando a dicho proceso.
  10638.  
  10639. {#9999,Ejemplo:}
  10640. PROGRAM mi_juego;
  10641. BEGIN
  10642.     LOOP
  10643.         IF (key(_esc))
  10644.             RETURN;
  10645.         END
  10646.         FRAME;
  10647.     END
  10648. END
  10649. {-}
  10650.  
  10651. En este ejemplo, al pulsarse la tecla de escape ({ESC}) se ejecutará la
  10652. sentencia {RETURN}, finalizando el programa.
  10653.  
  10654. {Uso de RETURN para retornar un valor}{/}
  10655.  
  10656. Es posible construir procesos con un comportamiento similar a las funciones
  10657. de otros lenguajes de programación, que {reciban una serie de parámetros y
  10658. devuelvan un valor}. Por ejemplo, un proceso que reciba dos valores numéricos
  10659. y devuelva el mayor de ambos.
  10660.  
  10661. Para ello, se debe utilizar esta sentencia con la siguiente sintaxis:
  10662.  
  10663. {RETURN(}{#1035,<expresión>}{)}
  10664.  
  10665. También es importante no utilizar la sentencia {#1029,FRAME} dentro del proceso,
  10666. pues ésta retornará inmediatamente al proceso llamante. Cuando el compilador
  10667. encuentra la sentencia {#1029,FRAME} dentro de un {#1016,PROCESS} lo cataloga
  10668. directamente como proceso, descartando su posible uso como función.
  10669.  
  10670. A continuación se muestra el ejemplo antes propuesto: una implementación de
  10671. la función matemática {max} que devuelve el mayor de sus dos parámetros.
  10672.  
  10673. {#9999,Ejemplo:}
  10674. PROGRAM mi_juego;
  10675. BEGIN
  10676.     x=max(2, 3)+max(5, 4);
  10677. END
  10678. PROCESS max(a, b)
  10679. BEGIN
  10680.     IF (a>b)
  10681.         RETURN(a);
  10682.     ELSE
  10683.         RETURN(b);
  10684.     END
  10685. END
  10686. {-}
  10687.  
  10688. Tras ejecutarse este programa, la variable {x} del proceso principal valdrá {8} (3+5).
  10689.  
  10690. {Importante}{/}
  10691.  
  10692. Por defecto, si se utiliza la sentencia {RETURN} sin la expresión
  10693. entre paréntesis o la sentencia {#1029,FRAME} en un proceso, el valor de retorno del
  10694. mismo será su {#1039,código identificador} de proceso}.
  10695.  
  10696. {/}Ver: {#1000,Sintaxis}
  10697.  
  10698. # ─────────────────────────────────────────────────────────────────────────────
  10699.  
  10700. {.1029,Sentencia FRAME}
  10701.  
  10702. La sentencia {FRAME} es una pieza clave dentro del lenguaje. El funcionamiento
  10703. de un programa es, a grandes rasgos, el siguiente:
  10704.  
  10705. - Comienza ejecutándose el proceso principal, el cual puede crear más
  10706. procesos (objetos del juego) en cualquier punto. Todos los procesos pueden
  10707. finalizar en cualquier momento, crear o eliminar otros procesos.
  10708.  
  10709. - Los juegos se visualizarán siempre imagen a imagen (frame by frame).
  10710. En cada imagen, el sistema ejecutará todos los procesos existentes en ese
  10711. momento, uno por uno, hasta que cada uno ejecute la sentencia {FRAME}, que
  10712. indicará que está listo para la siguiente visualización (imagen).
  10713.  
  10714. En la preparación de cada imagen todos los procesos serán ejecutados en
  10715. el orden de prioridad establecido (la variable local {#1121,priority} de los
  10716. procesos determina este orden).
  10717.  
  10718. Luego esta sentencia es algo así como la orden de visualización de los
  10719. procesos.
  10720.  
  10721. Si un proceso comienza a ejecutarse y no finaliza ni ejecuta
  10722. esta sentencia, entonces el programa se quedará bloqueado, ya que existe
  10723. un proceso que no está nunca listo para la siguiente visualización; por lo que
  10724. el sistema será incapaz de mostrar la siguiente imagen.
  10725.  
  10726. {#9999,Ejemplo:}
  10727. PROGRAM mi_juego;
  10728. BEGIN
  10729.     mi_proceso();
  10730.     mi_proceso();
  10731.     LOOP
  10732.         IF (key(_esc))
  10733.             mi_segundo_proceso();
  10734.         END
  10735.         FRAME;
  10736.     END
  10737. END
  10738. PROCESS mi_proceso()
  10739. BEGIN
  10740.     LOOP
  10741.         FRAME;
  10742.     END
  10743. END
  10744. PROCESS mi_segundo_proceso()
  10745. BEGIN
  10746.     LOOP
  10747.     END
  10748. END
  10749. {-}
  10750.  
  10751. En este programa el proceso principal (de tipo {mi_juego}) crea otros dos
  10752. procesos (de tipo {mi_proceso}); a partir de este momento los tres procesos
  10753. se ejecutarán continuamente, cada uno hasta su sentencia {FRAME}. Pero si
  10754. se pulsa la tecla de escape ({ESC}), el proceso principal creará un nuevo
  10755. proceso (de tipo {mi_segundo_proceso}) que se quedará en un bucle {#1024,LOOP}
  10756. indefinidamente, sin ejecutar ningún {FRAME}, por lo que el programa
  10757. quedará interrumpido (el sistema advertirá de dicha situación transcurridos
  10758. unos segundos, ver {#1115,max_process_time}).
  10759.  
  10760. Básicamente, todos los procesos que se corresponden con objetos de un juego
  10761. construyen un bucle dentro del cual, cada imagen, fija todos sus valores
  10762. de visualización ({#1123,x}, {#1124,y}, {#1126,graph}, {#1128,size}, {#1129,angle}, ...)
  10763. y, después, ejecutan la sentencia {FRAME}.
  10764.  
  10765. {Sincronización de procesos}{/}
  10766.  
  10767. Es posible utilizar esta sentencia con la siguiente sintaxis:
  10768.  
  10769. {FRAME(}<porcentaje>{)}
  10770.  
  10771. Poniendo un porcentaje entero, de 0 a 100 o mayor, entre paréntesis tras
  10772. la palabra reservada {FRAME}.
  10773.  
  10774. Este porcentaje indicará el tanto por ciento de la siguiente imagen completado
  10775. por el proceso; es decir, cuando no se especifica dicho porcentaje
  10776. es lo mismo que si se pusiera {FRAME(100)} (se ha completado el 100% del
  10777. trabajo previo a la siguiente visualización por parte del proceso).
  10778.  
  10779. Por ejemplo, si un proceso ejecuta en un bucle la sentencia {FRAME(25)},
  10780. necesitará ejecutarla {4 veces} antes de estar listo para la siguiente
  10781. visualización (ya que 4*25% es el 100%).
  10782.  
  10783. En el otro extremo, si un proceso ejecuta dentro de su bucle la sentencia
  10784. {FRAME(400)}, cuando se ejecute la primera vez habrá completado ya un
  10785. 400% de la visualización, por lo que, aun tras visualizarse, le seguirá
  10786. restando un 300% de visualización completado. Por ello, en la preparación
  10787. de las siguientes {3} imágenes el sistema no ejecutará dicho proceso, pues
  10788. ya está listo para la visualización. Luego este proceso se ejecutaría
  10789. sólo una de cada 4 imágenes (al contrario que el ejemplo del párrafo anterior,
  10790. que se ejecutaba 4 veces por cada imagen del juego).
  10791.  
  10792. Los procesos no llegarán a la siguiente visualización hasta no dar,
  10793. {por lo menos, el 100%}. Por ejemplo, si un proceso ejecuta siempre sentencias
  10794. {FRAME(80)}, las ejecutará dos veces antes de la primera visualización con lo
  10795. que llevará el 160% (2*80%) de la visualización completado. Para la siguiente
  10796. visualización tendrá, por tanto, un 60% pre-completado (160%-100%); por ello, en la
  10797. segunda visualización tan solo requerirá una sentencia {FRAME(80)} para
  10798. visualizarse, ya que este 80%, unido al 60% sobrante de la primera, hará un total
  10799. de un 140% completado, con lo cual se visualizará inmediatamente, e incluso le
  10800. sobrará otro 40% para la preparación de la siguiente imagen.
  10801.  
  10802. {/}
  10803.  
  10804. Una sentencia {FRAME(0)}, que complete un 0% de la siguiente visualización,
  10805. puede tener sentido en estos dos casos:
  10806.  
  10807. - Puede ser una forma de forzar al sistema a que ejecute en ese punto al resto
  10808. de los procesos que tienen la misma prioridad que el actual y que, tras ellos,
  10809. vuelva a ejecutarlo.
  10810.  
  10811. - O puede ser una forma de inicializar funciones como {#120,get_id()} o
  10812. {#104,collision()}, pues éstas devuelven unos determinados valores para
  10813. cada imagen; si se quiere volver a obtener valores de nuevo, se puede
  10814. ejecutar una sentencia {FRAME(0)} que estas funciones interpretarán
  10815. como una nueva imagen.
  10816.  
  10817. {/}Ver: {#1000,Sintaxis}
  10818.  
  10819. # ─────────────────────────────────────────────────────────────────────────────
  10820.  
  10821. {.1030,Sentencia CLONE}
  10822.  
  10823. {CLONE}·
  10824.     {#1017,<sentencia>} {#1068,;}·
  10825.     ...·
  10826. {#1091,END}
  10827.  
  10828. Esta sentencia crea un nuevo proceso idéntico al actual, con la salvedad
  10829. de que las sentencias entre las palabras reservadas {CLONE} y {#1091,END} se
  10830. ejecutarán únicamente en el nuevo proceso y no en el actual.
  10831.  
  10832. Por ejemplo, si cualquier proceso del programa, con unas coordenadas ({#1123,x},
  10833. {#1124,y}) determinadas y un gráfico ({#1126,graph}) concreto, ejecuta la
  10834. siguiente sentencia:
  10835.  
  10836.   {CLONE}·
  10837.       x=x+100;·
  10838.   {#1091,END}
  10839.  
  10840. Se creará un nuevo proceso identico a él, con el mismo gráfico y los mismos
  10841. valores en todas sus variables, a excepción de la coordenada {#1123,x}, que
  10842. el nuevo proceso tendrá {100} puntos más a la derecha.
  10843.  
  10844. Esta sentencia se utiliza para crear réplicas de un proceso, dividirlo en
  10845. dos procesos (casi) iguales.
  10846.  
  10847. {#9999,Ejemplo:}
  10848. PROGRAM mi_juego;
  10849. BEGIN
  10850.     // ...
  10851.     x=0;
  10852.     y=0;
  10853.     CLONE
  10854.         x=x+10;
  10855.     END
  10856.     CLONE
  10857.         y=y+10;
  10858.     END
  10859.     // ...
  10860. END
  10861. {-}
  10862.  
  10863. En este ejemplo, las {2} sentencias {CLONE} crearán {3} copias del proceso
  10864. principal (y no 2, como podría haberse esperado).
  10865.  
  10866. Al ejecutarse la primera sentencia {CLONE} se creará un nuevo proceso, con
  10867. lo que habrá {2}: uno en (x=0, y=0) y otro en (x=10, y=0). Y estos dos
  10868. procesos ejecutarán la segunda sentencia {CLONE}, el primero (el original)
  10869. creando con ello un nuevo proceso en (x=0, y=10), y el segundo creará el
  10870. nuevo proceso en (x=10, y=10).
  10871.  
  10872. Para crearse únicamente {2} copias del proceso original se podría haber
  10873. construido el programa, por ejemplo, de la siguiente forma:
  10874.  
  10875. {#9999,Ejemplo:}
  10876. PROGRAM mi_juego;
  10877. BEGIN
  10878.     // ...
  10879.     x=0;
  10880.     y=0;
  10881.     CLONE
  10882.         x=x+10;
  10883.         CLONE
  10884.             y=y+10;
  10885.         END
  10886.     END
  10887.     // ...
  10888. END
  10889. {-}
  10890.  
  10891. El proceso original (x=0, y=0) creará uno en (x=10, y=0) y éste, a su vez,
  10892. otro en (x=10, y=10), creandose únicamente dos copias del original.
  10893.  
  10894. Se debe, por tanto, tener mucho cuidado con el uso de la sentencia {CLONE}
  10895. de forma secuencial o dentro de un {bucle}, pues se debe contar con que los
  10896. primeros '{clones}' pueden crear, a su vez, a nuevos '{clones}'.
  10897.  
  10898. Esta sentencia permite usarse sin poner sentencias entre las palabras
  10899. {CLONE} y {#1091,END}. Pero, al menos en un principio, no parece tener mucho
  10900. sentido el querer tener dos procesos idénticos, con las mismas coordenadas,
  10901. el mismo gráfico y ejecutando el mismo código.
  10902.  
  10903. {/}Ver: {#1000,Sintaxis}
  10904.  
  10905. # ─────────────────────────────────────────────────────────────────────────────
  10906.  
  10907. {.1031,Sentencia DEBUG}
  10908.  
  10909. La sentencia {DEBUG} invocará al trazador (o debugger) interactivo cuando
  10910. se ejecute.
  10911.  
  10912. Se suele utilizar para depurar programas, es decir, para encontrar posibles
  10913. errores que tengan los programas. Se suele poner, en ocasiones, en los siguientes
  10914. puntos.
  10915.  
  10916. - Donde se quiera comprobar que una parte del programa ha hecho lo que se
  10917. esperaba que hiciera; tras ejecutarse dicha parte, {DEBUG} invocará al
  10918. trazador, desde donde pueden comprobarse todos los procesos activos y el
  10919. valor de todas sus variables.
  10920.  
  10921. - Cuando no se está muy seguro de si algo puede suceder en un programa, se
  10922. puede poner esta sentencia en dicho punto, para que nos avise en caso de que
  10923. suceda.
  10924.  
  10925. Esta sentencia se pone únicamente de forma temporal hasta que se localiza
  10926. el error buscado; una vez encontrado ya no es necesaria la sentencia por lo que se puede quitar
  10927. del programa, ya que por lo demás, no tiene ningún otro efecto.
  10928.  
  10929. {#9999,Ejemplo:}
  10930. PROGRAM mi_juego;
  10931. BEGIN
  10932.     // ...
  10933.     IF (x<0)
  10934.         DEBUG;
  10935.     END
  10936.     // ...
  10937. END
  10938. {-}
  10939.  
  10940. En este ejemplo se comprueba, en un determinado punto del programa, que la
  10941. coordenada {x} del proceso no sea un número negativo (menor que cero); si
  10942. esto sucediera, se invocará al trazador para poder investigar por qué
  10943. ha sucedido.
  10944.  
  10945. Cuando se ejecuta esta sentencia se abre un cuadro de diálogo que nos
  10946. ofrece las siguientes opciones:
  10947.  
  10948. - Desabilitar la sentencia {DEBUG}, para que no vuelva a activarse en
  10949. esta ejecución del programa.
  10950.  
  10951. - Detener el programa y entrar en el trazador, para poder examinar todos
  10952. los procesos y sus variables.
  10953.  
  10954. - O terminar de inmediato la ejecución del programa, regresando a la edición
  10955. del mismo en el entorno gráfico de ventanas.
  10956.  
  10957. Además, si se pulsa la tecla de escape {ESC} en dicho cuadro, simplemente
  10958. se ignorará dicha sentencia {DEBUG} y se continuará ejecutando el programa
  10959. normalmente.
  10960.  
  10961. {/}
  10962.  
  10963. Cuando se ejecuta un programa desde el entorno gráfico de ventanas, puede
  10964. invocarse al trazador en cualquier instante pulsando la tecla {F12}.
  10965.  
  10966. Al invocarse de esta forma al trazador, el programa será interrumpido siempre
  10967. justo antes de empezar a procesar una nueva imagen, estando todos los
  10968. procesos por ejecutar antes de la próxima visualización.
  10969.  
  10970. {/}Ver: {#1000,Sintaxis}
  10971.  
  10972. # ─────────────────────────────────────────────────────────────────────────────
  10973.  
  10974. {.1032,Lista de funciones del lenguaje.}
  10975.  
  10976.   Funciones de interacción entre procesos·
  10977.     {#104,collision()}·
  10978.     {#116,get_angle()}·
  10979.     {#117,get_dist()}·
  10980.     {#118,get_distx()}·
  10981.     {#119,get_disty()}·
  10982.     {#120,get_id()}·
  10983.     {#129,let_me_alone()}·
  10984.     {#158,signal()}·
  10985.  
  10986.   Funciones matemáticas·
  10987.     {#100,abs()}·
  10988.     {#101,advance()}·
  10989.     {#113,fget_angle()}·
  10990.     {#114,fget_dist()}·
  10991.     {#142,near_angle()}·
  10992.     {#145,pow()}·
  10993.     {#149,rand()}·
  10994.     {#150,rand_seed()}·
  10995.     {#160,sqrt()}·
  10996.  
  10997.   Funciones gráficas·
  10998.     {#103,clear_screen()}·
  10999.     {#123,get_pixel()}·
  11000.     {#135,map_block_copy()}·
  11001.     {#136,map_get_pixel()}·
  11002.     {#137,map_put()}·
  11003.     {#138,map_put_pixel()}·
  11004.     {#139,map_xput()}·
  11005.     {#146,put()}·
  11006.     {#147,put_pixel()}·
  11007.     {#148,put_screen()}·
  11008.     {#173,xput()}·
  11009.  
  11010.   Funciones para música y sonido·
  11011.     {#102,change_sound()}·
  11012.     {#127,is_playing_cd()}·
  11013.     {#134,load_pcm()}·
  11014.     {#144,play_cd()}·
  11015.     {#178,set_volume()}·
  11016.     {#159,sound()}·
  11017.     {#164,stop_cd()}·
  11018.     {#167,stop_sound()}·
  11019.     {#175,reset_sound()}·
  11020.     {#170,unload_pcm()}·
  11021.  
  11022.   Funciones de entrada·
  11023.     {#121,get_joy_button()}·
  11024.     {#122,get_joy_position()}·
  11025.     {#128,key()}·
  11026.  
  11027.   Funciones para el manejo de la paleta·
  11028.     {#105,convert_palette()}·
  11029.     {#110,fade()}·
  11030.     {#111,fade_off()}·
  11031.     {#112,fade_on()}·
  11032.     {#133,load_pal()}·
  11033.     {#154,roll_palette()}·
  11034.  
  11035.   Funciones para scroll y modo-7·
  11036.     {#140,move_scroll()}·
  11037.     {#152,refresh_scroll()}·
  11038.     {#162,start_mode7()}·
  11039.     {#163,start_scroll()}·
  11040.     {#165,stop_mode7()}·
  11041.     {#166,stop_scroll()}·
  11042.  
  11043.   Funciones para imprimir textos·
  11044.     {#107,delete_text()}·
  11045.     {#131,load_fnt()}·
  11046.     {#141,move_text()}·
  11047.     {#171,write()}·
  11048.     {#177,unload_fnt()}·
  11049.     {#172,write_int()}·
  11050.  
  11051.   Funciones para animaciones·
  11052.     {#108,end_fli()}·
  11053.     {#115,frame_fli()}·
  11054.     {#153,reset_fli()}·
  11055.     {#161,start_fli()}·
  11056.  
  11057.   Funciones de regiones de pantalla·
  11058.     {#106,define_region()}·
  11059.     {#143,out_region()}·
  11060.  
  11061.   Funciones de información sobre gráficos·
  11062.     {#124,get_point()}·
  11063.     {#125,get_real_point()}·
  11064.     {#126,graphic_info()}·
  11065.  
  11066.   Funciones de inicialización·
  11067.     {#156,set_fps()}·
  11068.     {#157,set_mode()}·
  11069.     {#132,load_fpg()}·
  11070.     {#174,load_map()}·
  11071.     {#169,unload_fpg()}·
  11072.     {#176,unload_map()}·
  11073.  
  11074.   Funciones de grabación de datos·
  11075.     {#130,load()}·
  11076.     {#155,save()}·
  11077.  
  11078.   Funciones de sistema·
  11079.     {#109,exit()}·
  11080.     {#168,system()}·
  11081.  
  11082. {/}
  11083.  
  11084. {Nota:} Para obtener ayuda de una función en concreto directamente, sitúe el
  11085. cursor de edición sobre el nombre de la función (en el editor de programas)
  11086. y pulse {F1}.
  11087.  
  11088. {/}Ver: {#1000,Sintaxis}
  11089.  
  11090. # ─────────────────────────────────────────────────────────────────────────────
  11091.  
  11092. {.1033,Llamada a un proceso}
  11093.  
  11094. <nombre_del_proceso>{(}<lista de parámetros>{)}
  11095.  
  11096. Una llamada a un proceso se hace poniendo el {#1001,nombre} del
  11097. proceso (su nombre), seguido de una lista con tantas expresiones
  11098. separadas por {#1059,comas (,)}, como {#1018,parámetros} tenga el proceso,
  11099. entre {#1053,paréntesis (())}. Los paréntesis son obligatorios aun cuando
  11100. el proceso no tenga {#1018,parámetros} de llamada.
  11101.  
  11102. Una llamada a un proceso siempre devolverá un valor, que depende de cual
  11103. de las siguientes acciones realice primero el proceso llamado.
  11104.  
  11105. - Si ejecuta la sentencia {#1029,FRAME} el proceso retornará su {#1039,código identificador}.
  11106.  
  11107. - Si el proceso ejecuta la sentencia {#1028,RETURN}{#1053,(}<expresión>{#1053,)}
  11108. retornará el resultado de dicha expresión.
  11109.  
  11110. - Si el proceso termina, bien porque llegue el {#1091,END} de su {#1086,BEGIN}
  11111. o porque ejecute una sentencia {#1028,RETURN} sin expresión, el proceso
  11112. retornará el {#1039,código identificador} que tuvo, pero como el proceso ha
  11113. finalizado (muerto), se debe tener en cuenta que dicho
  11114. {#1039,código identificador} puede ser ahora utilizado por cualquier otro proceso
  11115. que se cree a partir de ahora.
  11116.  
  11117. El valor de retorno puede ignorarse, asignarse a una variable o bien
  11118. utilizarse dentro de una expresión.
  11119.  
  11120. {#9999,Ejemplo:}
  11121. PROGRAM mi_juego;
  11122. PRIVATE
  11123.   id2;
  11124. BEGIN
  11125.     mi_proceso(0, 0);
  11126.     id2=mi_proceso(320, 200);
  11127.     // ...
  11128. END
  11129. PROCESS mi_proceso(x, y)
  11130. BEGIN
  11131.     LOOP
  11132.         FRAME;
  11133.     END
  11134. END
  11135. {-}
  11136.  
  11137. En este ejemplo el proceso principal {mi_juego} realiza dos llamadas
  11138. al proceso {mi_proceso}, que recibe dos parámetros en sus variables locales
  11139. {x} e {y}.
  11140.  
  11141. Como el proceso ejecuta la sentencia {#1029,FRAME} devolverá su
  11142. {#1039,código identificador}.
  11143.  
  11144. Se puede observar cómo el valor devuelto en la primera llamada al proceso
  11145. es despreciado (no se utiliza para nada), y cómo en la segunda se asigna
  11146. el {#1039,código identificador} de {mi_proceso(320, 200)} a la variable privada del
  11147. proceso principal {id2}.
  11148.  
  11149. Cuando se realiza una llamada a un proceso se detiene momentáneamente la
  11150. ejecución del proceso actual y se pasa a ejecutar el código del proceso
  11151. llamado, hasta que este retorne por uno de los tres casos enumerados (hasta
  11152. que termine o ejecute una sentencia {#1029,FRAME} o {#1028,RETURN}).
  11153.  
  11154. Si el proceso ha terminado con una sentencia {#1029,FRAME} se visualizará
  11155. en la siguiente imagen según los valores establecidos en sus variables
  11156. locales ({#1023,x}, {#1024,y}, {#1026,graph}, ...) y, en la preparación de
  11157. la siguiente imagen, dicho proceso continuará ejecutándose a partir de
  11158. la sentencia {#1029,FRAME}.
  11159.  
  11160. {/}Ver: {#1000,Sintaxis} - {#1018,Parámetros de un proceso}
  11161.  
  11162. # ─────────────────────────────────────────────────────────────────────────────
  11163.  
  11164. {.1034,Referencia a un dato}
  11165.  
  11166. Una referencia a un dato es cualquier expresión que haga referencia a una
  11167. celda o posición de la memoria del ordenador, normalmete suele entenderse
  11168. como uno de los siguientes aspectos:
  11169.  
  11170. - Si el dato es una variable, para referirnos de esta forma al dato
  11171. simplemente debemos especificar su nombre.
  11172.  
  11173. Ejemplo de una referencia a una variable: {x}
  11174.  
  11175. - Si el dato es una tabla se suele hacer referencia a la misma
  11176. con su nombre seguido de una expresión entre corchetes ({#1079,[ ]}); dicha
  11177. expresión determinará la posición de la tabla que se pretende acceder.
  11178. Si se omite el índice entre corchetes se accederá a la primera posición de
  11179. la tabla (la posición 0).
  11180.  
  11181. Ejemplo de una referencia a una tabla: {timer[0]}
  11182.  
  11183. - Si el dato es una estructura se hará referencia a la misma con su
  11184. nombre seguido de una expresión entre corchetes ({#1079,[ ]}) que
  11185. determinará el número de registro al que se accederá y, tras esto, irá
  11186. el símbolo{#1063, . (punto)} precediendo al nombre concreto del campo
  11187. de la estructura al que se va a acceder. Si se omite el número de registro
  11188. entre corchetes se accederá al primer registro de la estructura (el número 0).
  11189.  
  11190. Ejemplo de una referencia a una estructura: {scroll[0].z}
  11191.  
  11192. Estos tres casos se refieren a accesos a datos del propio proceso o globales;
  11193. cuando se pretenda acceder a un dato ajeno (un dato local de otro proceso),
  11194. se precederá por el {#1039,código identificador} del
  11195. proceso ajeno y el símbolo{#1063, . (punto)}, operador de acceso a datos
  11196. locales y estructuras).
  11197.  
  11198. Ejemplo de una referencia a una variable local ajena: {father.x}
  11199.  
  11200. {/}Ver: {#1000,Sintaxis}
  11201.  
  11202. # ─────────────────────────────────────────────────────────────────────────────
  11203.  
  11204. {.1035,Definición de una expresión}
  11205.  
  11206. Una expresión se entiende, básicamente, como una fórmula matemática que
  11207. involucre a uno o más {operandos} ({x}, {2}, {id}, ...) por medio de diversos
  11208. {operadores} ({*}, {AND}, {>>}, ...); algunos ejemplos de expresiones serían:
  11209. {2}, {2+3} o {(x*4)/-3}.
  11210.  
  11211. Como valores se pueden utilizar únicamente números enteros dentro del rango
  11212. ({#1177,min_int} ... {#1178,max_int}) y el resultado de la expresión
  11213. siempre quedará truncado dentro de este rango.
  11214.  
  11215. Estas expresiones serán evaluadas cuando se ejecute la sentencia que las
  11216. contiene dentro del programa.
  11217.  
  11218. Los {operandos} que se pueden utilizar en una expesión son:
  11219.  
  11220.     - {#1004,Constantes}.·
  11221.     - {Valores numéricos}.·
  11222.     - {Literales} (textos entre comillas).·
  11223.     - {#1010,Variables}, tablas o estructuras de cualquier tipo.·
  11224.     - Cualquier tipo de función o proceso.·
  11225.     - {#1039,Código identificador} del proceso.·
  11226.     - Tipo de proceso ({#1042,type <nombre>}).·
  11227.  
  11228. Los {operadores} que se pueden utilizar en una expresión son (entre
  11229. paréntesis se muestran los sinónimos del operador, en caso de tenerlos):
  11230.  
  11231.     {#1056, +}    Suma·
  11232.     {#1060, -}    Resta (o negación de signo)·
  11233.     {#1054, *}    Multiplicación·
  11234.     {#1065, /}    División·
  11235.     {#1048, MOD}  Módulo ({#1048,%})·
  11236.     {#1070, <<}   Rotación a la derecha·
  11237.     {#1077, >>}   Rotación a la izquierda·
  11238.     {#1045, NOT}  Negación binaria y lógica ({#1045,!})·
  11239.     {#1051, AND}  AND binario y lógico ({#1050,&}, {#1051,&&})·
  11240.     {#1083, OR}   OR binario y lógico ({#1083,|}, {#1083,||})·
  11241.     {#1082, XOR}  OR exclusivo ({#1080,^}, {#1082,^^})·
  11242.     {#1074, ==}   Comparación·
  11243.     {#1046, <>}   Distinto ({#1046,!=})·
  11244.     {#1076, >}    Mayor·
  11245.     {#1075, >=}   Mayor o igual ({#1075,=>})·
  11246.     {#1069, <}    Menor·
  11247.     {#1072, <=}   Menor o igual ({#1072,=<})·
  11248.     {#1085, OFFSET} Dirección o desplazamiento ({#1050,&})·
  11249.     {#1057, ++}   Operador de incremento·
  11250.     {#1061, --}   Operador de decremento·
  11251.     {#1079, POINTER} Operador de indirección ({#1054,*}, {#1080,^}, {#1079,[ ]})·
  11252.     {#1053, ( )}  Paréntesis·
  11253.  
  11254. Pulse sobre "{#1036,Evaluación de una expresión}" para ver el orden en el
  11255. que son realizados los cálculos dentro de una expresión y cuándo deben usarse los paréntesis.
  11256.  
  11257. A continuación se muestran algunos ejemplos de expresiones válidas:
  11258.  
  11259. {    -33}·
  11260. {    44-2*22}·
  11261. {    id}·
  11262. {    x+1}·
  11263. {    (angle*3)/2-pi/2}·
  11264. {    (x+y)/2}·
  11265. {    abs(x-y)*3-pow(x, 2)}·
  11266.     ...
  11267.  
  11268. {/}Ver: {#1000,Sintaxis} - {#1036,Evaluación de una expresión}
  11269.  
  11270. # ─────────────────────────────────────────────────────────────────────────────
  11271.  
  11272. {.1036,Evaluación de una expresión}
  11273.  
  11274. Es importante conocer la forma en la que son evaluadas las expresiones para
  11275. saber dónde pueden ser necesarios o no paréntesis que indiquen el modo en el
  11276. que se pretende que la expresión sea evaluada.
  11277.  
  11278. En el lenguaje, una expresión puede contener operadores de diferentes niveles
  11279. de prioridad.
  11280.  
  11281. En la evaluación de una expresión serán siempre procesados primero los de
  11282. {prioridad 1} (si los hay), luego los de {prioridad 2}, tras estos los de
  11283. {prioridad 3} y, así, sucesivamente.
  11284.  
  11285. Prioridad 1·
  11286.     {#1053, ( )}  Paréntesis, inicio y fin de una sub-expresión·
  11287.  
  11288. Prioridad 2·
  11289.     {#1063, .}    Punto, operador de acceso a datos locales y estructuras·
  11290.  
  11291. Prioridad 3·
  11292.     {#1045, NOT}  Negación binaria y lógica (#1045,{!})·
  11293.     {#1085, OFFSET} Dirección o desplazamiento (#1050,{&})·
  11294.     {#1079, POINTER} Operador de indirección ({#1054,*}, {#1080,^}, {#1079,[ ]})·
  11295.     { -}  Negación de signo·
  11296.     {#1057, ++}   Operador de incremento·
  11297.     {#1061, --}   Operador de decremento·
  11298.  
  11299. Prioridad 4·
  11300.     {#1054, *}    Multiplicación·
  11301.     {#1065, /}    División·
  11302.     {#1048, MOD}  Módulo ({#1048,%})·
  11303.  
  11304. Prioridad 5·
  11305.     {#1056, +}    Suma·
  11306.     {#1060, -}    Resta·
  11307.  
  11308. Prioridad 6·
  11309.     {#1070, <<}   Rotación a la derecha·
  11310.     {#1077, >>}   Rotación a la izquierda·
  11311.  
  11312. Prioridad 7·
  11313.     {#1051, AND}  AND binario y lógico ({#1050,&}, {#1051,&&})·
  11314.     {#1083, OR}   OR binario y lógico ({#1083,|}, {#1083,||})·
  11315.     {#1082, XOR}  OR exclusivo ({#1080,^}, {#1082,^^})·
  11316.  
  11317. Prioridad 8·
  11318.     {#1074, ==}   Comparación·
  11319.     {#1046, <>}   Distinto ({#1046,!=}·
  11320.     {#1076, >}    Mayor·
  11321.     {#1075, >=}   Mayor o igual ({#1075,=>}·
  11322.     {#1069, <}    Menor·
  11323.     {#1072, <=}   Menor o igual ({#1072,=<}·
  11324.  
  11325. Prioridad 9·
  11326.     {#1073, =}    Asignación·
  11327.     {#1058, +=}   Suma-asignación·
  11328.     {#1062, -=}   Resta-asignación·
  11329.     {#1055, *=}   Multiplicación-asignación·
  11330.     {#1066, /=}   División-asignación·
  11331.     {#1049, %=}   Módulo-asignación·
  11332.     {#1052, &=}   AND-asignación·
  11333.     {#1084, |=}   OR-asignación·
  11334.     {#1081, ^=}   XOR-asignación·
  11335.     {#1078, >>=}  Rotación a la derecha-asignación·
  11336.     {#1071, <<=}  Rotación a la izquierda-asignación·
  11337.  
  11338. Los operadores de {prioridad 3} son los operadores conocidos como {unarios}; éstos
  11339. no relacionan a dos operandos (que es el caso de los operadores {binarios} como,
  11340. por ejemplo, una multiplicación), sino que únicamente afectan al valor de un
  11341. operador. Dentro de los operadores {unarios} se ejecutarán primero los más
  11342. cercanos al operando, por ejemplo en la expresión:
  11343.  
  11344.   {NOT -x}
  11345.  
  11346. El operando {x} tiene dos operadores {unarios}, la negación de signo{ -} y
  11347. el {#1045,NOT} lógico y/o binario; de éstos se ejecutará primero la negación de
  11348. signo, pues es la que está más cerca del operando.
  11349.  
  11350. Todos los operadores a partir de la {prioridad 4} son {binarios} y se
  11351. ejecutarán según su nivel de prioridad por lo que, cuando en una expresión haya más
  11352. de un operador del mismo nivel (por ejemplo, una multiplicación y una división,
  11353. que son ambas de prioridad 4), se procesarán de izquierda a derecha, es decir,
  11354. en la siguiente expresión:
  11355.  
  11356.   {8/2*2}
  11357.  
  11358. Se ejecutará primero la división y después la multiplicación (que es la forma
  11359. natural de evaluar las expresiones en matemáticas).
  11360.  
  11361. La única excepción son los operadores de {prioridad 9} (operadores de {asignación}),
  11362. que serán evaluados de derecha a izquierda (en lugar de izquierda a derecha), es
  11363. decir, en la expresión:
  11364.  
  11365.   {x=y=0}
  11366.  
  11367. Primero, se procesará {y=0} (se pondrá {y} a {0}) y, después, {x=y} (también se
  11368. pondrá {x} a {0}, ya que {y} ahora valdrá {0}).
  11369.  
  11370. Como se puede observar las asignaciones funcionan a modo de operador
  11371. devolviendo, tras realizar la asignación, el valor que han asignado como
  11372. resultado de la operación.
  11373.  
  11374. {/}Ver: {#1000,Sintaxis} - {#1035,Definición de una expresión}
  11375.  
  11376. # ─────────────────────────────────────────────────────────────────────────────
  11377.  
  11378. {.1037,Definición de una condición}
  11379.  
  11380. Las condiciones son expresiones que normalmente son como las siguientes:
  11381.  
  11382.   {x<320}·
  11383.   {size==100 AND graph>10}·
  11384.   {y==0 OR (x>=100 AND x<=200)}·
  11385.   ...
  11386.  
  11387. En general, cualquier expresión es válida como condición. En el lenguaje
  11388. se interpretan todas las expresiones {IMPARES} como {ciertas} y todas las {PARES}
  11389. como {falsas}.
  11390.  
  11391. {#9999,Ejemplo:}
  11392. PROGRAM mi_juego;
  11393. BEGIN
  11394.     IF (20*2+1)
  11395.         x=x+1;
  11396.     END
  11397. END
  11398. {-}
  11399.  
  11400. En este ejemplo la sentencia {x=x+1;} se ejecutará siempre, pues la expresión
  11401. {20*2+1} vale {41}, que es un número {impar}.
  11402.  
  11403. Todos los operadores disponibles son válidos dentro de una condición, incluso
  11404. es posible realizar asignaciones dentro de una condición (las asignaciones
  11405. son operaciones que devuelven como resultado el valor asignado).
  11406.  
  11407. Todos los {#1039,códigos identificadores} de procesos son números {impares},
  11408. es decir, todos son {ciertos}. Es posible, por tanto, implementar condiciones
  11409. como la siguiente (suponiendo que {id2} se haya declarado como variable,
  11410. y {disparo} es un tipo de proceso del programa).
  11411.  
  11412.   {WHILE (id2=get_id(type disparo))}·
  11413.       {id2.size=id2.size-1;}·
  11414.   {END}
  11415.  
  11416. En la condición {id2=get_id(type disparo)} se está asignando el resultado
  11417. de la función {get_id} a la variable {id2}; si dicha función ha devuelto
  11418. un {#1039,código identificador} éste será un número {impar} y la condición será evaluada
  11419. como {cierta} (si {get_id()} no encuentra (más) identificadores de procesos
  11420. "tipo {disparo}", entonces devolverá {0} (que es un número {par})
  11421. interpretándose la condición como {falsa}, y terminando la sentencia {#1022,WHILE}.
  11422.  
  11423. Las sentencias anteriores decrementarían la variable {#1128,size} (tamaño) de todos
  11424. los procesos de tipo {disparo} que hubiera en el programa.
  11425.  
  11426. {/}Ver: {#1000,Sintaxis} - {#1035,Definición de una expresión}
  11427.  
  11428. # ─────────────────────────────────────────────────────────────────────────────
  11429.  
  11430. {.1038,Formas de obtener el código identificador de un proceso.}
  11431. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  11432.  
  11433. Todos los procesos tienen su propio {#1039,código identificador} en {#1092,ID}
  11434. (palabra reservada en el lenguaje que equivale al {#1039,código identificador} del
  11435. proceso).
  11436.  
  11437. Cuando se crea un proceso (se llama), éste devuelve como valor de retorno
  11438. su propio {#1039,código identificador}, a no ser que haya terminado con un
  11439. {#1028,RETURN}{#1053,(}<expresión>{#1053,)}. Es decir, un proceso devolverá
  11440. su {#1039,código identificador} siempre que termine (llegue su {#1091,END}), ejecute
  11441. la sentencia {#1029,FRAME} o la sentencia {#1028,RETURN} sin expresión
  11442. entre paréntesis.
  11443.  
  11444. En el siguiente ejemplo, desde el programa principal se crea un proceso
  11445. (de tipo {mi_proceso}) y se guarda su identificador en la variable {id2}.
  11446.  
  11447. {#9999,Ejemplo:}
  11448. PROGRAM mi_juego;
  11449. PRIVATE id2;
  11450. BEGIN
  11451.     id2=mi_proceso();
  11452.     // ...
  11453. END
  11454. PROCESS mi_proceso()
  11455. BEGIN
  11456.     // ...
  11457. END
  11458. {-}
  11459.  
  11460. Todos los procesos tienen predefinidas las siguientes variables locales
  11461. con indentificadores de otros procesos:
  11462.  
  11463. {#1117,father} - padre, identificador del proceso que lo creó (el que hizo
  11464. la llamada).
  11465.  
  11466. {#1118,son} - hijo, identificador del último proceso creado por éste (último
  11467. proceso al que se ha llamado).
  11468.  
  11469. {#1120,bigbro} - Hermano mayor, identificador del último proceso que creó
  11470. el padre antes de crear éste.
  11471.  
  11472. {#1119,smallbro} - Hermano menor, identificador del siguiente proceso que
  11473. creó el padre tras crear éste.
  11474.  
  11475. Estas variables pueden valer {0} si no han sido definidas (por ejemplo
  11476. {#1118,son} valdrá {0} hasta que no se cree un proceso, o si éste ya
  11477. ha desaparecido).
  11478.  
  11479. Los códigos identificadores de los procesos permiten acceder a las variables
  11480. locales del mismo (<identificador>.<variable>), y como {#1117,father},
  11481. {#1118,son}, etc., son, a su vez, variables locales se pueden realizar
  11482. combinaciones como {son.bigbro} para acceder al identificador del penúltimo
  11483. proceso creado (ya que {#1118,son} es el del último, por lo que su hermano mayor será
  11484. el penúltimo).
  11485.  
  11486. Hay otras formas de obtener códigos identificadores de procesos (además de
  11487. cuando se crean y por parentesco directo), como son:
  11488.  
  11489. - La función {#120,get_id()} para obtener los identificadores de los procesos
  11490. de un tipo determinado (nave, disparo, etc.) que existen en un determinado
  11491. momento del juego.
  11492.  
  11493. - La función {#104,collision()} para obtener los identificadores de los
  11494. procesos con los se está chocando (colisionando).
  11495.  
  11496. Cuando un proceso determinado necesita acceder desde muchos otros, por
  11497. ser un proceso importante como, por ejemplo, la nave protagonista de un juego,
  11498. entonces puede ser más útil asignar su identificador a una variable
  11499. {#1006,GLOBAL} del programa (que puede ser accedida por cualquier proceso
  11500. en cualquier punto).
  11501. De esta forma cualquier proceso podrá interactuar con él, ya que tendrá su
  11502. identificador.
  11503.  
  11504. {#9999,Ejemplo:}
  11505. PROGRAM mi_juego;
  11506. GLOBAL
  11507.   id_nave;
  11508. BEGIN
  11509.     id_nave=nave();
  11510.     // ...
  11511. END
  11512. PROCESS nave()
  11513. BEGIN
  11514.     // ...
  11515. END
  11516. PROCESS enemigo()
  11517. BEGIN
  11518.     // ...
  11519.     id_nave.z=0;
  11520.     // ...
  11521. END
  11522. {-}
  11523.  
  11524. En este ejemplo los procesos de tipo {enemigo} acceden en un determinado
  11525. punto a la variable {z} de la {nave} que creó el programa principal,
  11526. utilizando para ello su identificador que está en la variable global {id_nave}.
  11527.  
  11528. {/}Ver: {#1039,Códigos identificadores de procesos.}
  11529.  
  11530. # ─────────────────────────────────────────────────────────────────────────────
  11531.  
  11532. {.1039,Códigos identificadores de procesos.}
  11533. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  11534.  
  11535. Un proceso es un objeto independiente del programa que ejecuta su propio
  11536. código y que puede tener sus propias coordenadas, gráficos, etc., por ejemplo
  11537. pueden ser procesos de un programa: una nave, un disparo o un enemigo.
  11538.  
  11539. Cuando se pone dentro de un programa algo similar a esto:
  11540.  
  11541. {PROCESS disparo(}...{);}·
  11542. {#1086,BEGIN}·
  11543.    { // }sentencias{ ...}·
  11544. {#1091,END}
  11545.  
  11546. Se están especificando las sentencias que van a ejecutar los procesos
  11547. "de tipo {disparo}", es decir, el código que va a regir su comportamiento.
  11548.  
  11549. Como se puede observar puede haber en un programa más de un proceso tipo
  11550. {disparo}, luego ¿cómo se diferencian unos de otros? Sencillamente, por
  11551. su código identificador.
  11552.  
  11553. Cada vez que en un juego se crea un nuevo proceso, a éste le es asignado un
  11554. código identificador; este código va a ser la referencia exclusiva del
  11555. proceso hasta el momento en el que desaparezca.
  11556.  
  11557. Dos procesos diferentes no tendrán nunca el mismo código identificador a la vez;
  11558. sin embargo, el código que perteneció a un proceso que ya ha desaparecido le puede
  11559. ser asignado a un nuevo proceso (algo así como el número del carnet de identidad).
  11560.  
  11561. Los código identificadores son siempre números enteros positivos e impares,
  11562. como podrían ser 471, 1937 o 10823.
  11563.  
  11564. Todos los procesos tienen su propio código identificador en {#1092,ID}, que es
  11565. algo similar a una variable local del proceso, salvo que no puede modificarse.
  11566.  
  11567. Los procesos, además, tienen el código identificador del proceso que les
  11568. creó (el que los llamó) en {#1117,father} (padre), el del último proceso
  11569. que ellos crearon (el último que llamaron) en {#1118,son} (hijo), etc.
  11570. (ver {#1041,Jerarquías de procesos}).
  11571.  
  11572. {¿Para qué sirven los códigos identificadores?}{/}
  11573.  
  11574. Normalmente, todos los procesos necesitan el código identificador de los demás
  11575. procesos para interactuar con ellos (ver donde están, modificarlos, ...).
  11576.  
  11577. No se puede, por ejemplo, restarle energía al proceso "tipo {enemigo}", pues
  11578. procesos de ese tipo pueden no existir ninguno o existir muchos; se necesita el
  11579. código identificador concreto del proceso {enemigo} al que se quiere restarle
  11580. energía.
  11581.  
  11582. Un proceso accede a todas sus propias variables simplemente por sus nombres, como
  11583. {#1123,x}, {#1128,size} o {#1126,graph}. Pues bien, si se dispone del
  11584. identificador de un proceso (en {#1118,son}, {#1117,father} o cualquier
  11585. variable definida por el usuario, como {id2}) se puede, entonces, acceder
  11586. a las variables de dicho proceso como ({son.x}, {father.size} o {id2.graph}),
  11587. es decir, la sintaxis para acceder a variables locales de otro proceso es:
  11588.  
  11589.   <código_identificador> . <nombre_variable>
  11590.  
  11591. Pudiéndose utilizar dichas variables normalmente para consultarlas o modificarlas.
  11592.  
  11593. {No es posible en ningún caso acceder a variables de tipo {#1008,PRIVATE} de
  11594. otro proceso}. Si se quiere acceder a una variable privada de otro proceso,
  11595. se debe cambiar la declaración de ésta a la sección {#1007,LOCAL} para
  11596. convertirla en una variable local; entonces, cualquier proceso podrá acceder
  11597. a dicha variable teniendo el código identificador del proceso, ya que todos
  11598. los procesos poseerán dicha variable.
  11599.  
  11600. Los identificadores tienen más usos que el acceso a variables locales ajenas,
  11601. como puede ser la función {#158,signal()} que puede enviar determinadas señales
  11602. a un proceso si se dispone de su código identificador (por ejemplo, para
  11603. eliminar el proceso).
  11604.  
  11605. También hay otras funciones, como {#104,collision()}, para detectar colisiones
  11606. (choques) con otros procesos que, en caso de detectar una colisión, devuelve
  11607. el código identificador del proceso con el cual se está chocando. Una vez
  11608. se tiene dicho código, se puede acceder a las variables del proceso y enviarle
  11609. señales.
  11610.  
  11611. La función {#120,get_id()} funciona de forma similar a {#104,collision()},
  11612. obteniendo el código identificador de un proceso, pero sin necesidad de que se
  11613. produzca una colisión con él.
  11614.  
  11615. {/}Ver: {#1038,Formas de obtener el código identificador de un proceso.}
  11616.  
  11617. # ─────────────────────────────────────────────────────────────────────────────
  11618.  
  11619. {.1040,Estados de un proceso.}
  11620. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  11621.  
  11622. Los procesos son los diferentes elementos de un programa (objetos del juego);
  11623. éstos pueden pasar por diferentes estados al crearse, destruirse o recibir
  11624. determinadas señales por medio de la función {#158,signal()}.
  11625.  
  11626. proceso {vivo o despierto.}
  11627.  
  11628. Si un proceso se está ejecutando (está interpretando las sentencias
  11629. comprendidas entre su {#1086,BEGIN} y su {#1091,END}) se dice que está
  11630. vivo.
  11631.  
  11632. proceso {muerto.}
  11633.  
  11634. Cuando un proceso finaliza (porque llega su {#1091,END} en la ejecución,
  11635. porque ejecute un {#1028,RETURN} o porque reciba una señal {#1153,s_kill} o
  11636. {#1157,s_kill_tree}) se dice que ha muerto.
  11637.  
  11638. proceso {dormido.}
  11639.  
  11640. Un proceso puede recibir la señal {#1155,s_sleep} (o {#1159,s_sleep_tree}) y,
  11641. entonces, pasará a estado dormido; en este estado el proceso se comporta como
  11642. si estuviera muerto, sólo que no lo está pues, en cualquier momento, puede
  11643. recibir una señal {#1154,s_wakeup} y volver a estado vivo o despierto.
  11644. También se puede matar a un proceso que está dormido.
  11645.  
  11646. proceso {congelado.}
  11647.  
  11648. La señal {#1156,s_freeze} (o {#1160,s_freeze_tree}) pasa a estado congelado
  11649. un proceso. En este estado el proceso se queda inmovilizado, se sigue viendo
  11650. y el resto de los procesos lo pueden seguir detectando (en las colisiones,
  11651. por ejemplo), pero no se ejecuta (deja de interpretar sus sentencias de
  11652. código). Estará en este estado hasta que reciba otra señal que le cambie
  11653. de estado o lo mate.
  11654.  
  11655. Un proceso congelado puede ser controlado (movido) por otro proceso,
  11656. manipulando directamente sus variables.
  11657.  
  11658. {/}
  11659.  
  11660. Siempre que se envía una señal a un proceso con el fin de cambiarle de estado,
  11661. ésta no tendrá efecto si el proceso se está ejecutando hasta que llegue a
  11662. su próxima visualización ({#1029,FRAME}). Si el proceso no se estuviera ejecutando,
  11663. entonces la señal tendría efecto de inmediato.
  11664.  
  11665. No se deben enviar señales a procesos inexistentes (a un {#1039,código identificador}
  11666. que no se corresponda a ningún proceso).
  11667.  
  11668. Si se intenta poner a un proceso en el estado en el que ya está, la señal
  11669. será ignorada.
  11670.  
  11671. {/}Ver: {#1041,Jerarquías de procesos.}
  11672.  
  11673. # ─────────────────────────────────────────────────────────────────────────────
  11674.  
  11675. {.1041,Jerarquías de procesos.}
  11676. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  11677.  
  11678. Un proceso es un objeto independiente del programa que ejecuta su propio
  11679. código y que puede tener sus propias coordenadas, gráficos, etc., por ejemplo,
  11680. pueden ser procesos de un programa: una nave, un disparo o un enemigo.
  11681.  
  11682. Cuando un programa comienza a ejecutarse sólo existe un proceso; el proceso
  11683. inicial que es el que comienza a ejecutar las sentencias del código
  11684. principal, pero, a partir de entonces, éste puede crear nuevos procesos
  11685. y éstos, a su vez, otros, destruirse procesos, etc.
  11686.  
  11687. Para aclarar los acontecimientos que van sucediendo en un programa se establece
  11688. un símil, que es hablar de los procesos como si fueran seres vivos que nacen
  11689. y mueren (cuando se crean y destruyen). Por ello, se establecen los siguientes
  11690. términos:
  11691.  
  11692. {Padre}, denominación que se da al proceso que ha creado a otro (la verdad
  11693. es que se debería haber llamado madre).
  11694.  
  11695. {Hijo}, el proceso que ha sido creado por otro.
  11696.  
  11697. {Hermanos}, procesos que han sido creados por el mismo padre.
  11698.  
  11699. {Huérfano}, proceso cuyo padre ha muerto (ha sido eliminado o a finalizado).
  11700.  
  11701. Y esta jerga se puede extender hasta donde llegue la imaginación, {abuelos},
  11702. {nietos}, {tíos}, etc.
  11703.  
  11704. Todos los procesos tienen acceso a los códigos identificadores de los
  11705. procesos con los que tienen parentesco directo (ver: {#1038,Formas de obtener
  11706. el {#1039,código identificador} de un proceso}.
  11707.  
  11708. En ocasiones, se hace referencia a acciones hechas por "{el sistema}"; este
  11709. proceso, denominado {div_main}, es el que controla al resto, por tanto es el
  11710. encargado de crear el proceso inicial al comienzo de la ejecución, de ajustar
  11711. la velocidad de ejecución, el trazador, etc. Todos los procesos que se
  11712. quedan huérfanos pasan a ser hijos de este proceso.
  11713.  
  11714. El {identificador de div_main} se puede obtener con {#120,get_id(0)}. Puede
  11715. servir para enviar una señal en árbol (tree) a todos los procesos,
  11716. pero dicho proceso no se visualizará en pantalla aunque se definan sus
  11717. variables {#1123,x}, {#1124,y}, {#1126,graph}, etc.
  11718.  
  11719. {/}Ver: {#1040,Estados de un proceso.}
  11720.  
  11721. # ─────────────────────────────────────────────────────────────────────────────
  11722.  
  11723. {.1042,Tipos de procesos.}
  11724. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  11725.  
  11726. Los bloques de los programas que comienzan con la palabra reservada {#1016,PROCESS}
  11727. determinan el comportamiento de un tipo concreto de proceso. Después, cuando
  11728. se ejecute el programa podrá haber cualquier número de procesos de dicho
  11729. tipo en un momento determinado, cada uno con un {#1039,código identificador}
  11730. diferente pero todos del mismo tipo.
  11731.  
  11732. {#9999,Ejemplo:}
  11733. PROGRAM mi_juego;
  11734. BEGIN
  11735.     // ...
  11736. END
  11737. PROCESS nave()
  11738. BEGIN
  11739.     // ...
  11740. END
  11741. PROCESS enemigo()
  11742. BEGIN
  11743.     // ...
  11744. END
  11745. PROCESS disparo()
  11746. BEGIN
  11747.     // ...
  11748. END
  11749. {-}
  11750.  
  11751. En este ejemplo se definen cuatro tipos de procesos, {mi_juego} (que será
  11752. el tipo del proceso inicial del programa}, {nave}, {enemigo} y {disparo}.
  11753.  
  11754. El número de procesos de cada uno de estos tipos que haya después en el
  11755. juego depende del número de llamadas que se realicen a dichos procesos.
  11756.  
  11757. Todos los procesos de tipo {nave} ejecutarán siempre las sentencias que
  11758. se definen en el bloque {PROCESS nave()} del programa.
  11759.  
  11760. {Un "tipo de proceso" es un código numérico que hace referencia al
  11761. nombre que tiene el PROCESS que determina el comportamiento del }
  11762. proceso{ durante el juego; este código numérico se puede
  11763. obtener con: TYPE <nombre_del_proceso>.}
  11764.  
  11765. {TYPE} es un operador definido en el lenguaje que, aplicado a un nombre de proceso,
  11766. devuelve este código numérico.
  11767.  
  11768. Por ejemplo, {TYPE nave} equivaldrá a una constante numérica determinada y
  11769. {TYPE enemigo} a otra.
  11770.  
  11771. Todos los procesos tienen una variable local que contiene este código numérico
  11772. y es: {reserved.process_type}.
  11773.  
  11774. {¿Para qué sirve el tipo de un proceso?}{/}
  11775.  
  11776. El tipo de los procesos se emplea para varias cosas, por ejemplo:
  11777.  
  11778. - Para la función {#120,get_id()} que recibe como parámetro un tipo de proceso
  11779. (por ejemplo, {get_id(TYPE enemigo)}) y devuelve los códigos identificadores
  11780. de los procesos de dicho tipo que existan en el juego en ese momento.
  11781.  
  11782. - Para la función {#104,collision()} es similar a la anterior sólo que devuelve
  11783. los códigos identificadores de los procesos con los que se esté colisionado
  11784. (chocando, es decir, que los gráficos de ambos procesos estén parcialmente
  11785. superpuestos).
  11786.  
  11787. - Para la función {#158,signal()} que puede enviar una señal a todos los
  11788. procesos que existan de un tipo determinado.
  11789.  
  11790. - O bien para, a partir de un {#1039,código identificador} de un proceso, poder comprobar
  11791. de qué tipo de proceso se trata (si es de tipo nave, de tipo disparo, etc.).
  11792.  
  11793. {/}
  11794.  
  11795. El operador TYPE puede utilizarse únicamente precediendo a un nombre de
  11796. proceso del programa o a la palabra {mouse}, para la detección de colisiones
  11797. con el puntero del ratón (con {collision(TYPE mouse)}).
  11798.  
  11799. {/}Ver: {#1039,Códigos identificadores de procesos.}
  11800.  
  11801. # ─────────────────────────────────────────────────────────────────────────────
  11802.  
  11803. {.1043,Sentencia FROM}
  11804.  
  11805. {FROM} <variable>{#1073,=}{#1005,<constante>} {#1096,TO} {#1005,<constante>}{#1068,;}·
  11806.     {#1017,<sentencia>} {#1068,;}·
  11807.     ...·
  11808. {#1091,END}
  11809.  
  11810. (o bien)
  11811.  
  11812. {FROM} <variable>{#1073,=}{#1005,<constante>} {#1096,TO} {#1005,<constante>} {#1095,STEP} {#1005,<constante>}{#1068,;}·
  11813.     {#1017,<sentencia>} {#1068,;}·
  11814.     ...·
  11815. {#1091,END}
  11816.  
  11817. La sentencia {FROM} es una sentencia que implementa un {bucle}, es decir, que
  11818. es capaz de {repetir un grupo de sentencias un número determinado de veces}.
  11819.  
  11820. Para implementar este bucle se necesita una variable {#1006,GLOBAL}, {#1007,LOCAL} o
  11821. {#1008,PRIVATE} del propio proceso que sirva como contador del bucle.
  11822.  
  11823. Antes de las sentencias que conformarán el grupo interior de sentencias se
  11824. debe poner la palabra reservada {FROM} seguida del {nombre de la variable contador},
  11825. el símbolo de asignación ({#1073,=}), el {valor inicial} de la variable, la
  11826. palabra reservada {#1096,TO} y, finalmente, el {valor final} de la variable.
  11827. Tras esta declaración del bucle {FROM} se debe poner el símbolo {#1068,;}
  11828. (punto y coma).
  11829.  
  11830. Después de esta cabecera definiendo las condiciones del bucle vendrá
  11831. el grupo interior de sentencias que se pretende repetir un número
  11832. determinado de veces y, al final, la palabra reservada {#1091,END}.
  11833.  
  11834. Se denomina {iteración} del bucle el número de veces que se ejecuta el grupo
  11835. interior de sentencias.
  11836.  
  11837. La primera iteración se hará con el {valor incial}
  11838. en la variable usada como contador, tras esta iteración se le {sumará 1}
  11839. a esta variable (si el valor inicial {es menor} que el valor final)
  11840. o se le {restará 1} (en caso contrario). Tras actualizar el valor
  11841. de la variable, se pasará a la siguiente iteración siempre que el
  11842. valor de dicha variable no haya llegado (o sobrepasado) el {valor
  11843. final} del bucle.
  11844.  
  11845. Como segunda acepción de la sentencia {FROM} se puede poner tras los valores
  11846. inicial y final de la sentencia la palabra reservada {#1095,STEP} seguida de un
  11847. {valor constante} que indique el incremento de la variable contador tras
  11848. cada iteración del bucle, en lugar de {1} o{ -1}, que son los incrementos
  11849. que se harán por defecto si se omite la declaración {#1095,STEP} (paso).
  11850.  
  11851. A continuación, se muestra un programa con dos bucles {FROM}, uno sin declaración
  11852. {#1095,STEP} (con incremento o decremento por defecto) y otro con ella.
  11853.  
  11854. {#9999,Ejemplo:}
  11855. PROGRAM mi_juego;
  11856. BEGIN
  11857.     FROM x=9 TO 0;
  11858.         // sentencias interiores ...
  11859.     END
  11860.     FROM x=0 TO 9 STEP 2;
  11861.         // Sentencias interiores ...
  11862.     END
  11863. END
  11864. {-}
  11865.  
  11866. El primer bucle se ejecutará {10} veces con la variable {x} valiendo
  11867. desde {9} hasta {0} en las diferentes iteraciones; por defecto, se le resta
  11868. uno a la variable cada vez, ya que el valor inicial (9) es mayor que
  11869. el valor final (0).
  11870.  
  11871. En el segundo, se indica como incremento de la variable la constante {2},
  11872. por lo que el bucle se ejecutará {5} veces con la variable {x} valiendo
  11873. {0}, {2}, {4}, {6} y {8}, respectivamente, en las sucesivas iteraciones.
  11874. Como se puede observar no se hará ninguna iteración con {x} valiendo {9},
  11875. aunque éste sea el {valor final} del bucle.
  11876.  
  11877. Por defecto, si no se hubiera especificado como {#1095,STEP} (paso) del bucle {2},
  11878. se le habría sumado {1} a la variable {x} tras cada iteración.
  11879.  
  11880. Un bucle {FROM} siempre se puede realizar también con la sentencia {#1025,FOR},
  11881. como se muestra a continuación (con dos bucles equivalentes a los del
  11882. ejemplo anterior).
  11883.  
  11884. {#9999,Ejemplo:}
  11885. PROGRAM mi_juego;
  11886. BEGIN
  11887.     FOR ( x=9 ; x>=0 ; x=x-1 )
  11888.         // Sentencias interiores ...
  11889.     END
  11890.     FOR ( x=0 ; x<=9 ; x=x+2 )
  11891.         // Sentencias interiores ...
  11892.     END
  11893. END
  11894. {-}
  11895.  
  11896. Los valores {inicial} y {final} de un bucle {FROM} deben ser diferentes.
  11897.  
  11898. Si el valor inicial {es menor} que el valor final, no se puede
  11899. especificar un valor negativo en la declaración {#1095,STEP}.
  11900.  
  11901. Si el valor inicial {es mayor} que el valor final, no se puede
  11902. especificar un valor positivo en la declaración {#1095,STEP}.
  11903.  
  11904. Una sentencia {#1026,BREAK} dentro de un bucle {FROM} lo finalizará de forma
  11905. inmediata, continuando el programa por la sentencia siguiente a dicho bucle
  11906. (tras el {#1091,END}).
  11907.  
  11908. Una sentencia {#1027,CONTINUE} dentro de un bucle {FROM} forzará al programa a
  11909. incrementar inmediatamente la variable usada como contador y, después,
  11910. si no se ha sobrepasado el valor final, comenzar con la siguiente iteración.
  11911.  
  11912. Las sentencias interiores a un bucle {FROM} pueden ser tantas como se
  11913. quiera y de cualquier tipo, incluyendo, por supuesto, nuevos bucles {FROM}.
  11914.  
  11915. {/}Ver: {#1000,Sintaxis}
  11916.  
  11917. # ─────────────────────────────────────────────────────────────────────────────
  11918.  
  11919. {.1044,Uso de ángulos en el lenguaje.}
  11920. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  11921.  
  11922. Todos los ángulos se especifican en el lenguaje en milésimas de grado.
  11923. Por ejemplo:
  11924.  
  11925.   {0} es {0 grados} (hacia la derecha)·
  11926.   {90000} son {90 grados} (hacia arriba)·
  11927.  { -45000} son{ -45 grados} (diagonal abajo derecha)·
  11928.  
  11929. Si a cualquier ángulo se le suman o restan {360 grados} (360000) se
  11930. obtiene un ángulo equivalente. Por ejemplo, los ángulos -90000 y
  11931. 270000 son equivalentes (los ángulos de {-90 grados} y {270 grados}
  11932. son ambos hacia abajo)
  11933.  
  11934. Se puede utilizar como referencia la constante {#1179,PI} predefinida como {180000},
  11935. {3.1415 radianes} o, lo que es lo mismo, {180 grados}. Por ejemplo {PI/2}
  11936. equivaldrá a 90 grados (90000).
  11937.  
  11938. Algunas de las funciones para el manejo de ángulos son las siguientes:
  11939.  
  11940.   {#116,get_angle()}·
  11941.   {#118,get_distx()}·
  11942.   {#119,get_disty()}·
  11943.   {#113,fget_angle()}·
  11944.   {#142,near_angle()}·
  11945.   {#101,advance()}·
  11946.  
  11947. Todos los procesos tienen una variable local predefinida denominada {angle}
  11948. que, por defecto, valdrá {0}; si se modifica su valor se cambiará el ángulo
  11949. de visualización del gráfico del proceso (se rotará el gráfico en los grados
  11950. indicados, a partir del gráfico original).
  11951.  
  11952. {/}Ver: {#1000,Sintaxis}
  11953.  
  11954. # ─────────────────────────────────────────────────────────────────────────────
  11955.  
  11956. {.1045,NOT  !}
  11957. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  11958.  
  11959. Operador unario de {negación} lógica y binaria utilizado en expresiones y
  11960. condiciones.
  11961.  
  11962. La palabra reservada {NOT} y el símbolo {!} son sinónimos.
  11963.  
  11964. {NOT lógico:} Si el operando es {cierto}, al aplicarle este operador, se obtendrá
  11965. una expresión {falsa} y viceversa.
  11966.  
  11967.   CIERTO  ->  FALSO
  11968.   FALSO   ->  CIERTO
  11969.  
  11970. {NOT binario:} Cambia todos los bit del operando, es decir, pasa los 0 a 1 y
  11971. los 1 a 0.
  11972.  
  11973. {/}
  11974.  
  11975. {Nota:} Este operador funciona indistintamente como lógico y binario debido
  11976. a que en el lenguaje se interpretan las expresiones lógicas {ciertas} como las
  11977. que tienen el último bit a 1 (el bit 0, de peso 1), es decir, los números
  11978. impares (1, -1, 3, -3, ...), y como expresiones lógicas {falsas} las que
  11979. tienen el último bit a 0 (los números pares: 0, 2, -2, 4, -4, ...).
  11980.  
  11981. Al cambiar el operador {NOT} todos los bit también cambian
  11982. el último convirtiendo, de este modo, los números pares en impares (expresiones
  11983. falsas en ciertas) e impares en pares (expresiones ciertas en falsas).
  11984.  
  11985. {/}Ver: {#1000,Sintaxis} - {#1035,Expresión} - {#1037,Condición}
  11986.  
  11987. # ─────────────────────────────────────────────────────────────────────────────
  11988.  
  11989. {.1046,<>  !=}
  11990. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  11991.  
  11992. Operador lógico [{distinto que}] utilizado en condiciones. Los símbolos
  11993. {<>} y {!=} son sinónimos.
  11994.  
  11995. Debe utilizarse entre dos expresiones numéricas y devuelve un
  11996. resultado lógico:
  11997.  
  11998. {Falso} - Si ambas expresiones dan el mismo resultado (si son dos
  11999. expresiones equivalentes), pues NO son distintas.
  12000.  
  12001. {Cierto} - Si las expresiones dan resultados distintos, pues SI son distintas.
  12002.  
  12003. {Ejemplos:}
  12004.  
  12005.   {2+2 <> 4} devolverá {falso}.
  12006.   {0 <> -1}  devolverá {cierto}.
  12007.  
  12008. {/}Ver: {#1000,Sintaxis} - {#1037,Condición}
  12009.  
  12010. # ─────────────────────────────────────────────────────────────────────────────
  12011.  
  12012. {.1047,"  '}
  12013. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  12014.  
  12015. Símbolos delimitadores de literales.
  12016.  
  12017. Los literales son los {textos entre comillas} que pueden comenzar y terminar
  12018. con el carácter [{'}] o bien con el carácter [{"}] (deben comenzar y terminar
  12019. con el mismo carácter). Si se quiere incluir el carácter [{"}] en un literal, se puede
  12020. hacer de dos formas; supóngase que se quiere definir un literal que contenga
  12021. el texto: a"B"c
  12022.  
  12023.  - Duplicar el carácter: "a""B""c"
  12024.  
  12025.  - Definirlo con la comilla simple: 'a"B"c'
  12026.  
  12027. Lo mismo sucede con el carácter [{'}], que se puede incluir en un literal
  12028. si se duplica, o bien si el literal se delimita con el carácter [{"}].
  12029.  
  12030. Todos los literales deben cerrarse en la misma línea en la que comenzaron, no
  12031. pudiéndose definir literales de más de una línea.
  12032.  
  12033. {/}Ver: {#1000,Sintaxis}
  12034.  
  12035. # ─────────────────────────────────────────────────────────────────────────────
  12036.  
  12037. {.1048,MOD  %}
  12038. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  12039.  
  12040. Operador aritmético de {módulo} o {resto de una división} entera. La palabra
  12041. reservada {MOD} y el símbolo{ %} son sinónimos.
  12042.  
  12043. Este operador se utiliza en las {#1035,expresiones aritméticas} entre dos
  12044. operandos, para obtener el módulo del primero partido por el segundo.
  12045.  
  12046. Por ejemplo {7 MOD 3} devolverá 1, ya que al realizar la división entera de 7
  12047. entre 3 se obtiene 2 como cociente y {1} como {resto}.
  12048.  
  12049. Es decir, que {n MOD m} siempre devolverá un número dentro del rango (0..m-1).
  12050.  
  12051. Para comprender de forma sencilla cómo obtener el resto de una operación
  12052. {n MOD m} se pueden seguir los siguientes pasos:
  12053.  
  12054. {Paso 1} - Si {n} es menor que {m}, el resultado de la operación {MOD} es {n}.
  12055.  
  12056. {Paso 2} - (Cuando {n} es mayor o igual que {m}) se le resta {m} a {n} y se
  12057. vuelve al {paso 1}.
  12058.  
  12059. {/}
  12060.  
  12061. {Uso:} Este operador se utiliza en ocasiones en los programas en los que
  12062. se requiere que una variable contador varíe entre {0} y {otro número}
  12063. siempre; si se quiere, por ejemplo, que la variable {x} varíe
  12064. entre 0 y 319 indefinidamente (x=0, x=1, x=2, ..., x=319, x=0, x=1, ...)
  12065. se podría optar por lo siguiente:
  12066.  
  12067.   {x=0;}·
  12068.   {LOOP}·
  12069.   {    x=x+1;}·
  12070.   {    IF (x==320) x=0;}·
  12071.   {    // ...}·
  12072.   {END}·
  12073.  
  12074. Pero muchos programas sustituyen estas sentencias por las siguientes:
  12075.  
  12076.   {x=0;}·
  12077.   {LOOP}·
  12078.   {    x=(x+1) MOD 320;}·
  12079.   {    // ...}·
  12080.   {END}·
  12081.  
  12082. que realizan exactamente la misma función, ya que el operador {MOD} truncará
  12083. la expresión cuando sea mayor o igual que 320 a un valor menor.
  12084.  
  12085. {/}
  12086.  
  12087. El {cociente} de una división entera se obtiene con el operador {#1065,/}
  12088. (división).
  12089.  
  12090. {/}Ver: {#1000,Sintaxis} - {#1035,Expresión}
  12091.  
  12092. # ─────────────────────────────────────────────────────────────────────────────
  12093.  
  12094. {.1049,%=}
  12095. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  12096.  
  12097. Asignación operativa. Operación de {módulo} o {resto de división} entera.
  12098.  
  12099. Las {#1019,sentencias de asignación} sirven para calcular expresiones y
  12100. {asignárselas} a un dato.
  12101.  
  12102. {#1034,<referencia a un dato>} {=} {#1035,<expresión>} {;}
  12103.  
  12104. Si se utiliza el símbolo {%=} en lugar de {=} para realizar la asignación,
  12105. se asignará al dato el {módulo} o {resto de la división} siguiente:
  12106.  
  12107.   [{valor_anterior_del_dato}] / [{resultado_de_la_expresión}]
  12108.  
  12109. Ejemplo: {x=3; x%=2;} -> (x=1)
  12110.  
  12111. {/}
  12112.  
  12113. {Nota:} Este símbolo es una simple abreviatura derivada del {lenguaje C},
  12114. en cualquier caso una sentencia del tipo {n %= m;} será equivalente a
  12115. ésta otra {n = n MOD m;}.
  12116.  
  12117. Ver el operador {#1048,MOD} para más información sobre el {módulo}.
  12118.  
  12119. {/}Ver: {#1000,Sintaxis} - {#1019,Asignación}
  12120.  
  12121. # ─────────────────────────────────────────────────────────────────────────────
  12122.  
  12123. {.1050,&}
  12124. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  12125.  
  12126. Símbolo bifuncional que tiene dos usos diferentes según se utilice como
  12127. un operador unario o binario.
  12128.  
  12129. Un operador {UNARIO} aparece dentro de una expresión precediendo,
  12130. simplemente, a un operando (como si fuera el signo de éste); en este caso
  12131. el operador{ &} será un sinónimo de {#1085,OFFSET}.
  12132.  
  12133. {Ejemplo: &x} es equivalente a {OFFSET x}
  12134.  
  12135. Un operador {BINARIO} aparece dentro de una expresión concatenando
  12136. a dos operandos (indicando una operación entre ambos), en este caso el
  12137. operador{ &} será un sinónimo de {#1051,AND}.
  12138.  
  12139. {Ejemplo: x&2} es equivalente a {x AND 2}
  12140.  
  12141. {/}Ver: {#1000,Sintaxis} - {#1085,OFFSET} - {#1051,AND}
  12142.  
  12143. # ─────────────────────────────────────────────────────────────────────────────
  12144.  
  12145. {.1051,AND  &&}
  12146. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  12147.  
  12148. Operador binario del {producto lógico} utilizado en expresiones y
  12149. condiciones.
  12150.  
  12151. La palabra reservada {AND} y el símbolo{ &&} son sinónimos.
  12152.  
  12153. {AND lógico:} Se evalúan, primero, las condiciones de la derecha e izquierda
  12154. del operador y, si ambas son {ciertas}, este operador devolverá {cierto},
  12155. en caso contrario el operador devolverá siempre {falso}.
  12156.  
  12157.   FALSO  AND FALSO  = FALSO
  12158.   FALSO  AND CIERTO = FALSO
  12159.   CIERTO AND FALSO  = FALSO
  12160.   CIERTO AND CIERTO = CIERTO
  12161.  
  12162. Se utiliza para comprobar que se cumplan obligatoriamente más de una condición,
  12163. por ejemplo:
  12164.  
  12165.   {(x>0 AND x<100)}
  12166.  
  12167. Para comprobar que la variable sea mayor que 0 {Y} que sea menor que 100.
  12168.  
  12169. {AND binario:} Evalúa los bit de los resultados de las expresiones anterior
  12170. y posterior al operador generando, como resultado, un valor que tendrá a uno
  12171. únicamente los bit que tuvieran a uno ambas expresiones.
  12172.  
  12173.   0 AND 0 = 0
  12174.   0 AND 1 = 0
  12175.   1 AND 0 = 0
  12176.   1 AND 1 = 1
  12177.  
  12178. Esta regla se aplicará a todos los bits de los operandos (en el lenguaje
  12179. son enteros de 32 bits).
  12180.  
  12181. {/}
  12182.  
  12183. {Nota:} Este operador funciona indistintamente como lógico y binario debido
  12184. a que en el lenguaje se interpretan las expresiones lógicas {ciertas} como las
  12185. que tienen el último bit a 1 (el bit 0, de peso 1), es decir, los números
  12186. impares (1, -1, 3, -3, ... ), y como expresiones lógicas {falsas} las que
  12187. tienen el último bit a 0 (los números pares: 0, 2, -2, 4, -4, ...).
  12188.  
  12189. El operador {AND} únicamente dejará a 1 el último bit (sólo devolverá {cierto}
  12190. como resultado} cuando lo tuvieran a 1 ambos operandos (cuando los dos fueran
  12191. expresiones {ciertas}).
  12192.  
  12193. {/}
  12194.  
  12195. {Nota:} El símbolo{ &} también puede utlizarse como un sinónimo más de
  12196. {AND} y{ &&}.
  12197.  
  12198. {/}Ver: {#1000,Sintaxis} - {#1035,Expresión} - {#1037,Condición}
  12199.  
  12200. # ─────────────────────────────────────────────────────────────────────────────
  12201.  
  12202. {.1052,&=}
  12203. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  12204.  
  12205. Asignación operativa. Operación binaria de {producto lógico} ({AND}).
  12206.  
  12207. Las {#1019,sentencias de asignación} sirven para calcular expresiones y
  12208. {asignárselas} a un dato.
  12209.  
  12210. {#1034,<referencia a un dato>} {=} {#1035,<expresión>} {;}
  12211.  
  12212. Si se utiliza el símbolo {&=} en lugar de {=} para realizar la asignación,
  12213. se asignará al dato el {producto lógico} siguiente:
  12214.  
  12215.   [{valor_anterior_del_dato}] AND [{resultado_de_la_expresión}]
  12216.  
  12217. Ejemplo: {x=5; x&=6;} -> (x=4)
  12218.  
  12219. {/}
  12220.  
  12221. {Nota:} Este símbolo es una simple abreviatura derivada del {lenguaje C};
  12222. en cualquier caso, una sentencia del tipo {n &= m;} será equivalente a
  12223. esta otra {n = n AND m;}.
  12224.  
  12225. Ver el operador {#1051,AND} para más información sobre el {producto lógico}.
  12226.  
  12227. {/}Ver: {#1000,Sintaxis} - {#1019,Asignación}
  12228.  
  12229. # ─────────────────────────────────────────────────────────────────────────────
  12230.  
  12231. {.1053,(  )}
  12232. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  12233.  
  12234. Los símbolos {(} y {)}, denominados paréntesis, deben aparecer siempre
  12235. emparejados y en este mismo orden.
  12236.  
  12237. Se utilizan para delimitar determinados cálculos, parámetros o condiciones
  12238. de los programas, marcando el inicio de los mismos con el símbolo {(} y
  12239. el final con el símbolo {)}.
  12240.  
  12241. {/}
  12242.  
  12243. Dentro de una expresión indican que el cálculo de su interior se
  12244. debe realizar antes que el de su exterior.
  12245.  
  12246. Por ejemplo, la expresión {2*3+2} se evaluará como {8}, ya que primero
  12247. se realizará la multiplicación (2 por 3, que es 6) y después la suma
  12248. (6 más 2, que da como resultado 8).
  12249.  
  12250. Utilizando paréntesis se puede forzar a que se realice la suma en primer lugar,
  12251. expresando el cálculo como {2*(3+2)}, que será evaluado como {10}, ya que
  12252. ahora se realizará primero la suma (3 más 2, que es 5) y después la
  12253. multiplicación (2 por 5, que es 10).
  12254.  
  12255. {/}
  12256.  
  12257. Los paréntesis también se utilizan para delimitar los parámetros de llamada
  12258. de los {#1033,procesos} o las funciones y dentro de la
  12259. sintáxis de diferentes sentencias del lenguaje.
  12260.  
  12261. {/}Ver: {#1000,Sintaxis} - {#1035,Expresión}
  12262.  
  12263. # ─────────────────────────────────────────────────────────────────────────────
  12264.  
  12265. {.1054,*}
  12266. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  12267.  
  12268. Operador aritmético de {multiplicación} entera. Este operador se utiliza en las
  12269. {#1035,expresiones aritméticas} entre dos operandos, para obtener como resultado
  12270. su producto (la multiplicación).
  12271.  
  12272. Por ejemplo {2 * 8} devolverá {16}, {99 * 0} devolverá {0}, {2 * -1}
  12273. devolverá{ -2}, etc.
  12274.  
  12275. Todas las variables son {enteros} con signo de 32 bit en el lenguaje.
  12276. Por lo tanto, únicamente se pueden manejar números enteros dentro del rango
  12277. ({#1177,min_int} ... {#1178,max_int})} por lo que, cuando el resultado de
  12278. la {multiplicación} deba exceder dicho rango, {se mostrarán resultados
  12279. incorrectos}. En este caso, el sistema no advertirá de ningún error, de ahí
  12280. que se deban extremar las precauciones.
  12281.  
  12282. {/}
  12283.  
  12284. Este símbolo es bifuncional, es decir, tiene dos usos diferentes según
  12285. se utilice como un operador unario o binario.
  12286.  
  12287. Un operador {UNARIO} aparece dentro de una expresión precediendo
  12288. simplemente a un operando (como si fuera el signo de éste); en este caso
  12289. el operador {*} será un sinónimo de {#1079,POINTER}.
  12290.  
  12291. {Ejemplo: *x} es equivalente a {POINTER x}
  12292.  
  12293. Un operador {BINARIO} aparece dentro de una expresión concatenando
  12294. a dos operandos (indicando una operación entre ambos), en cuyo caso el
  12295. operador {*} será el operador aritmético de {multiplicación} explicado
  12296. anteriormente.
  12297.  
  12298. {/}Ver: {#1000,Sintaxis} - {#1035,Expresión} - {#1079,POINTER}
  12299.  
  12300. # ─────────────────────────────────────────────────────────────────────────────
  12301.  
  12302. {.1055,*=}
  12303. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  12304.  
  12305. Asignación operativa. Operación aritmética de {multiplicación}.
  12306.  
  12307. Las {#1019,sentencias de asignación} sirven para calcular expresiones y
  12308. {asignárselas} a un dato.
  12309.  
  12310. {#1034,<referencia a un dato>} {=} {#1035,<expresión>} {;}
  12311.  
  12312. Si se utiliza el símbolo {*=} en lugar de {=} para realizar la asignación,
  12313. se asignará al dato la {multiplicación} siguiente:
  12314.  
  12315.   [{valor_anterior_del_dato}] * [{resultado_de_la_expresión}]
  12316.  
  12317. Ejemplo: {x=2; x*=3;} -> (x=6)
  12318.  
  12319. {/}
  12320.  
  12321. {Nota:} Este símbolo es una simple abreviatura derivada del {lenguaje C},
  12322. en cualquier caso una sentencia del tipo {n *= m;} será equivalente a
  12323. esta otra {n = n * m;}.
  12324.  
  12325. Ver el operador {#1054,*} para más información sobre la {multiplicación}.
  12326.  
  12327. {/}Ver: {#1000,Sintaxis} - {#1019,Asignación}
  12328.  
  12329. # ─────────────────────────────────────────────────────────────────────────────
  12330.  
  12331. {.1056,+}
  12332. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  12333.  
  12334. Operador aritmético de {suma}. Este operador se utiliza en las
  12335. {#1035,expresiones aritméticas} entre dos operandos, para obtener su suma.
  12336.  
  12337. Por ejemplo {2 + 6} devolverá 8, la suma de 2 más 6.
  12338.  
  12339. Todas las variables son {enteros} con signo de 32 bits en el lenguaje.
  12340. Luego, únicamente se pueden manejar números enteros dentro del rango
  12341. ({#1177,min_int} ... {#1178,max_int})}, por lo que cuando el resultado de
  12342. la {suma} deba exceder dicho rango, {se mostrarán resultados
  12343. incorrectos}. En este caso, el sistema no advertirá de ningún error, de ahí
  12344. que deban extremarse las precauciones.
  12345.  
  12346. {/}Ver: {#1000,Sintaxis} - {#1035,Expresión}
  12347.  
  12348. # ─────────────────────────────────────────────────────────────────────────────
  12349.  
  12350. {.1057,++}
  12351. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  12352.  
  12353. Operador de incremento, este operador, derivado del lenguaje C, permite
  12354. incrementar el valor de un dato (sumarle 1) sin requerir, para ello, una
  12355. {#1019,sentencia de asignación}.
  12356.  
  12357. El dato puede ser una variable, una {posición de una tabla}, o bien un
  12358. {campo de una estructura}.
  12359.  
  12360. Este operador se puede incluir dentro de una expresión en dos modalidades:
  12361. {preincremento} y {postincremento}.
  12362.  
  12363. {Operador de preincremento.}
  12364.  
  12365. Cuando se ponga el símbolo { ++} justo delante de un dato, se le sumará 1
  12366. al mismo {antes de ejecutar la sentencia}, por ejemplo, véanse las siguientes
  12367. sentencias:
  12368.  
  12369. { ++x;} - sentencia que sumará 1 a la variable {x}.
  12370.  
  12371. { z=++x+y;} - sentencia que sumará 1 a la variable {x} y, después, asignará
  12372. a la variable {z} la suma de {x} (ya incrementada) e {y}.
  12373.  
  12374. {Operador de postincremento.}
  12375.  
  12376. Cuando se ponga el símbolo{ ++} justo detrás de un dato, se le sumará 1 al
  12377. mismo {tras ejecutar la sentencia}, por ejemplo, véanse las siguientes
  12378. sentencias:
  12379.  
  12380. { x++;} - sentencia que sumará 1 a la variable {x}.
  12381.  
  12382. { z=x+y++;} - sentencia que asignará la suma de {x} más {y} a la variable {z},
  12383. y, después, incrementará la variable {y}.
  12384.  
  12385. {/}
  12386.  
  12387. {Resumen:}
  12388.  
  12389. En general, una sentencia del tipo{ ++dato;} o {dato++;} es siempre equivalente
  12390. a la siguiente sentencia: {dato=dato+1;} (o bien {dato+=1;}).
  12391.  
  12392. La diferencia entre el {preincremento} y el {postincremento} es que en el primero se
  12393. toma el valor del dato ya incrementado para evaluar el resto de la expresión,
  12394. mientras que en el segundo se evalúa la expresión con el valor que tenía el dato antes de
  12395. ser incrementado.
  12396.  
  12397. {/}Ver: {#1000,Sintaxis} - {#1035,Expresión} - {#1061,Decremento(--)}
  12398.  
  12399. # ─────────────────────────────────────────────────────────────────────────────
  12400.  
  12401. {.1058,+=}
  12402. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  12403.  
  12404. Asignación operativa. Operación aritmética de {suma}.
  12405.  
  12406. Las {#1019,sentencias de asignación} sirven para calcular expresiones y
  12407. {asignárselas} a un dato.
  12408.  
  12409. {#1034,<referencia a un dato>} {=} {#1035,<expresión>} {;}
  12410.  
  12411. Si se utiliza el símbolo{ +=} en lugar de {=} para realizar la asignación,
  12412. se asignará al dato la {suma} siguiente:
  12413.  
  12414.   [{valor_anterior_del_dato}] + [{resultado_de_la_expresión}]
  12415.  
  12416. Ejemplo: {x=2; x+=2;} -> (x=4)
  12417.  
  12418. {/}
  12419.  
  12420. {Nota:} Este símbolo es una simple abreviatura derivada del {lenguaje C},
  12421. en cualquier caso una sentencia del tipo {n += m;} será equivalente a
  12422. esta otra {n = n + m;}.
  12423.  
  12424. Ver el operador {#1056,+} para más información sobre la {suma}.
  12425.  
  12426. {/}Ver: {#1000,Sintaxis} - {#1019,Asignación}
  12427.  
  12428. # ─────────────────────────────────────────────────────────────────────────────
  12429.  
  12430. {.1059,,}
  12431. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  12432.  
  12433. El símbolo de la coma ( {,} ) se utiliza dentro del lenguaje de programación,
  12434. en diferentes puntos de un programa, {para separar} dos elementos consecutivos
  12435. de una lista.
  12436.  
  12437. Se utiliza, por ejemplo, en los siguientes puntos:
  12438.  
  12439. - En las {#1013,listas de constantes} para separar los diferentes valores
  12440. numéricos de las mismas.
  12441.  
  12442. - En la definición de los {#1018,parámetros de un proceso} para separar
  12443. los nombres de los diferentes parámetros.
  12444.  
  12445. - En la {#1032,llamada a una función} y en la {#1033,llamada a un proceso}
  12446. igualmente parar separar las diferentes expresiones que serán asignadas a
  12447. los párametros de la función o proceso.
  12448.  
  12449. - En la {#1025,sentencia FOR} para separar diferentes inicializaciones,
  12450. condiciones o incrementos.
  12451.  
  12452. - En la {#1021,sentencia SWITCH} para definir los diferentes valores
  12453. aceptados en un bloque {CASE ... END}.
  12454.  
  12455. {/}
  12456.  
  12457. El símbolo de la coma se puede utilizar también para separar varias
  12458. {#1009,declaraciones de datos}, en lugar de finalizar cada una de ellas
  12459. con un símbolo {punto y coma} ({#1068,;}).
  12460.  
  12461. {/}Ver: {#1000,Sintaxis}
  12462.  
  12463. # ─────────────────────────────────────────────────────────────────────────────
  12464.  
  12465. {.1060,-}
  12466. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  12467.  
  12468. Operador aritmético de {resta}. Este operador se utiliza en las
  12469. {#1035,expresiones aritméticas} entre dos operandos para obtener su suma.
  12470.  
  12471. Por ejemplo {2 - 6} devolverá -4, el resultado de restarle 6 a 2.
  12472.  
  12473. Todas las variables son {enteros} con signo de 32 bits en el lenguaje.
  12474. Por ello, únicamente se pueden manejar números enteros dentro del rango
  12475. ({#1177,min_int} ... {#1178,max_int})}, por lo que cuando el resultado de
  12476. la {resta} deba exceder dicho rango, {se mostrarán resultados
  12477. incorrectos}. En este caso, el sistema no advertirá de ningún error, con
  12478. lo que se deben extremar las precauciones.
  12479.  
  12480. {/}
  12481.  
  12482. Este símbolo es bifuncional, es decir, tiene dos usos diferentes según
  12483. se utilice como un operador unario o binario.
  12484.  
  12485. Un operador {UNARIO} aparece dentro de una expresión precediendo
  12486. simplemente a un operando, este caso el operador{ -} será el {signo menos}.
  12487.  
  12488. {Ejemplo: -7} el número entero negativo {menos siete}.
  12489.  
  12490. Un operador {BINARIO} aparece dentro de una expresión concatenando
  12491. a dos operandos (indicando una operación entre ambos); en este caso el
  12492. operador{ -} será el operador aritmético de {resta} explicado anteriormente.
  12493.  
  12494. {/}Ver: {#1000,Sintaxis} - {#1035,Expresión}
  12495.  
  12496. # ─────────────────────────────────────────────────────────────────────────────
  12497.  
  12498. {.1061,--}
  12499. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  12500.  
  12501. Operador de decremento, este operador, derivado del lenguaje C, permite
  12502. decrementar el valor de un dato (restarle 1), sin requerir para ello una
  12503. {#1019,sentencia de asignación}.
  12504.  
  12505. El dato puede ser una variable, una {posición de una tabla}, o bien un
  12506. {campo de una estructura}.
  12507.  
  12508. Este operador se puede incluir dentro de una expresión en dos modalidades:
  12509. {predecremento} y {postdecremento}.
  12510.  
  12511. {Operador de predecremento.}
  12512.  
  12513. Cuando se ponga el símbolo{ --} justo delante de un dato, se le restará 1
  12514. al mismo {antes de ejecutar la sentencia}, por ejemplo, véanse las siguientes
  12515. sentencias:
  12516.  
  12517. { --x;} - sentencia que restará 1 a la variable {x}.
  12518.  
  12519. { z=--x+y;} - sentencia que restará 1 a la variable {x} y después asignará
  12520. a la variable {z} la suma de {x} (ya decrementada) e {y}.
  12521.  
  12522. {Operador de postdecremento.}
  12523.  
  12524. Cuando se ponga el símbolo{ --} justo detrás de un dato, se le restará 1 al
  12525. mismo {tras ejecutar la sentencia}, por ejemplo, véanse las siguientes
  12526. sentencias:
  12527.  
  12528. { x--;} - sentencia que restará 1 a la variable {x}.
  12529.  
  12530. { z=x+y--;} - sentencia que asignará la suma de {x} más {y} a la variable {z},
  12531. y después decrementará la variable {y}.
  12532.  
  12533. {/}
  12534.  
  12535. {Resumen:}
  12536.  
  12537. En general, una sentencia del tipo{ --dato;} o {dato--;} siempre equivalente
  12538. a la siguiente sentencia: {dato=dato-1;} (o bien {dato-=1;}).
  12539.  
  12540. La diferencia entre el {predecremento} y el {postdecremento} es que en el primero se
  12541. toma el valor del dato ya decrementado para evaluar el resto de la expresión,
  12542. y en el segundo se evalúa la expresión con el valor que tenía el dato antes de
  12543. ser decrementado.
  12544.  
  12545. {/}Ver: {#1000,Sintaxis} - {#1035,Expresión} - {#1057,Incremento(++)}
  12546.  
  12547. # ─────────────────────────────────────────────────────────────────────────────
  12548.  
  12549. {.1062,-=}
  12550. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  12551.  
  12552. Asignación operativa. Operación aritmética de {resta}.
  12553.  
  12554. Las {#1019,sentencias de asignación} sirven para calcular expresiones y
  12555. {asignárselas} a un dato.
  12556.  
  12557. {#1034,<referencia a un dato>} {=} {#1035,<expresión>} {;}
  12558.  
  12559. Si se utiliza el símbolo{ -=} en lugar de {=} para realizar la asignación,
  12560. se asignará al dato la {resta} siguiente:
  12561.  
  12562.   [{valor_anterior_del_dato}] - [{resultado_de_la_expresión}]
  12563.  
  12564. Ejemplo: {x=4; x-=2;} -> (x=2)
  12565.  
  12566. {/}
  12567.  
  12568. {Nota:} Este símbolo es una simple abreviatura derivada del {lenguaje C};
  12569. en cualquier caso una sentencia del tipo {n -= m;} será equivalente a
  12570. esta otra {n = n - m;}.
  12571.  
  12572. Ver el operador{#1060, -} para más información sobre la {resta}.
  12573.  
  12574. {/}Ver: {#1000,Sintaxis} - {#1019,Asignación}
  12575.  
  12576. # ─────────────────────────────────────────────────────────────────────────────
  12577.  
  12578. {.1063,.  ->}
  12579. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  12580.  
  12581. Operador de acceso a estructuras o datos locales ajenos. Los símbolos{ .} y{ ->}
  12582. son sinónimos, por lo que pueden ser usados indistintamente.
  12583.  
  12584. {/}
  12585.  
  12586. {Acceso a estructuras.}
  12587.  
  12588. Para acceder a un campo de una estructura se debe utilizar este operador
  12589. de la siguiente forma:
  12590.  
  12591. <nombre de la estructura>{[}<nº registro>{]}{ . }<nombre del campo>
  12592.  
  12593. (o bien, utilizando el otro símbolo)
  12594.  
  12595. <nombre de la estructura>{[}<nº registro>{]}{ -> }<nombre del campo>
  12596.  
  12597. {Ejemplos:}·
  12598.   {scroll[0].camera}·
  12599.   {m7[1]->z}·
  12600.  
  12601. {Nota:} Se recuerda que el número de registro entre corchetes se puede omitir
  12602. cuando se acceda al registro número 0, por ejemplo {scroll[0].camera} equivaldrá
  12603. siempre a {scroll.camera}.
  12604.  
  12605. {/}
  12606.  
  12607. {Acceso a datos locales ajenos (de otro proceso).}
  12608.  
  12609. Para acceder a un dato {#1007,LOCAL} de un proceso desde otro, se debe
  12610. tener el {#1039,código identificador} del proceso del cual se quiere leer
  12611. o modificar su dato, entonces se podrá acceder al mismo de la siguiente forma:
  12612.  
  12613. <código identificador>{ . }<nombre dato local>
  12614.  
  12615. (o bien, utilizando el otro símbolo)
  12616.  
  12617. <código identificador>{ -> }<nombre dato local>
  12618.  
  12619. {Ejemplos:}·
  12620.    {father.x}·
  12621.    {son->graph}·
  12622.  
  12623. {/}Ver: {#1012,Declaración de una estructura} - {#1039,Códigos identificadores} - {#1000,Sintaxis}
  12624.  
  12625. # ─────────────────────────────────────────────────────────────────────────────
  12626.  
  12627. {.1064,..}
  12628. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  12629.  
  12630. {Rango de valores de una sección CASE}{/}
  12631.  
  12632. El símbolo{ ..} (doble punto) se utiliza para definir un rango de valores,
  12633. es decir, para expresar el conjunto de números comprendidos entre dos valores
  12634. (incluyendo éstos).
  12635.  
  12636. Este símbolo se utiliza {únicamente en las sentencias} {#1021,SWITCH}, dentro
  12637. de las {secciones CASE}, para especificar un rango de valores.
  12638.  
  12639. Resulta indiferente expresar un rango como {mínimo..máximo} o como {máximo..mínimo}.
  12640.  
  12641. Por ejemplo, el rango definido con{ -2 .. 1} serían los números{ -2},{ -1}, {0} y {1}.
  12642.  
  12643. {/}Ver: {#1000,Sintaxis} - {#1021,sentencia SWITCH}
  12644.  
  12645. # ─────────────────────────────────────────────────────────────────────────────
  12646.  
  12647. {.1065,/}
  12648. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  12649.  
  12650. Operador aritmético de {división} entera. Este operador se utiliza en las
  12651. {#1035,expresiones aritméticas} entre dos operandos, para obtener el cociente
  12652. del primero partido por el segundo.
  12653.  
  12654. Por ejemplo {7 / 3} devolverá 2, ya que al realizar la división entera de 7
  12655. entre 3 se obtiene {2} como {cociente} (y 1 como resto).
  12656.  
  12657. Es decir, que {n / m} siempre devolverá el resultado de la división
  12658. de {n} entre {m}, pero sin decimales (ya que todas las variables son
  12659. {enteros} con signo de 32 bits en el lenguaje).
  12660.  
  12661. {/}
  12662.  
  12663. El {resto} de una división entera se obtiene con el operador {#1048,MOD}
  12664. (módulo).
  12665.  
  12666. {/}Ver: {#1000,Sintaxis} - {#1035,Expresión}
  12667.  
  12668. # ─────────────────────────────────────────────────────────────────────────────
  12669.  
  12670. {.1066,/=}
  12671. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  12672.  
  12673. Asignación operativa. Operación de {división entera} (cociente).
  12674.  
  12675. Las {#1019,sentencias de asignación} sirven para calcular expresiones y
  12676. {asignárselas} a un dato.
  12677.  
  12678. {#1034,<referencia a un dato>} {=} {#1035,<expresión>} {;}
  12679.  
  12680. Si se utiliza el símbolo{ /=} en lugar de {=} para realizar la asignación,
  12681. se asignará al dato el {resultado entero} (cociente) de la {división} siguiente:
  12682.  
  12683.   [{valor_anterior_del_dato}] / [{resultado_de_la_expresión}]
  12684.  
  12685. Ejemplo: {x=8; x/=2;} -> (x=4)
  12686.  
  12687. {/}
  12688.  
  12689. {Nota:} Este símbolo es una simple abreviatura derivada del {lenguaje C},
  12690. en cualquier caso una sentencia del tipo {n /= m;} será equivalente a
  12691. esta otra {n = n / m;}.
  12692.  
  12693. Ver el operador {#1065,/} para más información sobre la {división entera}.
  12694.  
  12695. {/}Ver: {#1000,Sintaxis} - {#1019,Asignación}
  12696.  
  12697. # ─────────────────────────────────────────────────────────────────────────────
  12698.  
  12699. {.1067,:}
  12700. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  12701.  
  12702. El símbolo {:} (dos puntos) se utiliza para finalizar una declaración
  12703. {#1087,CASE} o una declaración {#1088,DEFAULT} de una {#1021,sentencia SWITCH}.
  12704.  
  12705. En realidad, los símbolos {:} (dos puntos) y {;} (punto y coma) son sinónimos
  12706. en este lenguaje, es decir, que es indiferente utilizar uno u otro.
  12707.  
  12708. Aún así, por similitud a otros lenguajes de programación se utiliza, normalmente,
  12709. el símbolo {punto y coma} como terminador de sentencias y el símbolo {dos puntos}
  12710. dentro de la sintaxis de la {#1021,sentencia SWITCH}.
  12711.  
  12712. {/}Ver: {#1000,Sintaxis} - {#1087,CASE} -  {#1088,DEFAULT} - {#1021,sentencia SWITCH}
  12713.  
  12714. # ─────────────────────────────────────────────────────────────────────────────
  12715.  
  12716. {.1068,;}
  12717. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  12718.  
  12719. El símbolo {;} (punto y coma) se utiliza en múltiples puntos de un programa
  12720. para indicar, siempre, que finaliza una sentencia o algún tipo de declaración.
  12721. Es lo que se denomina un símbolo {terminador} que tiene, como único fin marcar el
  12722. final de algo.
  12723.  
  12724. En el lenguaje se deben indicar con punto y coma los siguientes
  12725. puntos del programa:
  12726.  
  12727. - El final de la {#1003,declaración PROGRAM}.
  12728.  
  12729. - El final de una {#1009,declaración de un dato}.
  12730.  
  12731. - El final de una {#1014,declaración IMPORT}.
  12732.  
  12733. - El final de las siguientes sentencias:·
  12734.     {#1019,Asignaciones o incrementos de datos}.·
  12735.     {#1033,Llamadas a procesos}.·
  12736.     {#1032,Llamadas a funciones}.·
  12737.     {#1029,FRAME}, {#1028,RETURN}, {#1031,DEBUG}, {#1026,BREAK} y {#1027,CONTINUE}.
  12738.  
  12739. - El final de un inicio de bucle {#1043,FROM}.
  12740.  
  12741. - Y como separador de las diferentes partes de una sentencia {#1025,FOR}.
  12742.  
  12743. El compilador indicará cuando falte el símbolo {;} en cualquiera de estos
  12744. puntos.
  12745.  
  12746. Pudiendo, además, ponerse dicho símbolo en otros puntos determinados de los
  12747. programas, como detrás de cualquier otro tipo de sentencia, aunque en este
  12748. caso será opcional y, por tanto, el compilador no advertirá de su ausencia.
  12749.  
  12750. {/}
  12751.  
  12752. En realidad los símbolos {;} (punto y coma) y {:} (dos puntos) son sinónimos
  12753. en este lenguaje, es decir, que es indiferente utilizar uno u otro.
  12754.  
  12755. Aún así, por similitud a otros lenguajes de programación se utiliza, normalmente,
  12756. el símbolo {punto y coma} como terminador de sentencias y el símbolo {dos puntos}
  12757. dentro de la sintaxis de la {#1021,sentencia SWITCH}.
  12758.  
  12759. {/}Ver: {#1000,Sintaxis}
  12760.  
  12761. # ─────────────────────────────────────────────────────────────────────────────
  12762.  
  12763. {.1069,<}
  12764. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  12765.  
  12766. Operador lógico [{menor que}] utilizado en condiciones. Debe utilizarse entre
  12767. dos expresiones numéricas y devuelve un resultado lógico:
  12768.  
  12769. {Falso} - Si la primera expresión NO es menor que la segunda.
  12770.  
  12771. {Cierto} - Si la primera expresión SI es menor que la segunda.
  12772.  
  12773. {Ejemplos:}
  12774.  
  12775.   {2+2 < 4} devolverá {falso}.
  12776.   {1 < 2}   devolverá {cierto}.
  12777.  
  12778. {/}Ver: {#1000,Sintaxis} - {#1037,Condición}
  12779.  
  12780. # ─────────────────────────────────────────────────────────────────────────────
  12781.  
  12782. {.1070,<<}
  12783. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  12784.  
  12785. Operador binario de {rotación a la izquierda}. Este operador se utiliza en las
  12786. {#1035,expresiones aritméticas}, entre dos operandos, para obtener el resultado
  12787. de rotar el primer operando a la izquierda el número de veces que indique
  12788. el segundo. Por ejemplo, la siguiente rotación:
  12789.  
  12790.   {n} << {m}
  12791.  
  12792. Devolverá {n} rotado a la izquierda {m} veces; cada rotación a la izquierda
  12793. equivale a multiplicar por 2 el número. Es decir, rotar a la izquierda 1
  12794. vez, equivale a multiplicar por 2, rotar a la izquierda 2 veces a multiplicar
  12795. por 4, 3 veces a multiplicar por 8, y, así, sucesivamente.
  12796.  
  12797. O lo que es equivalente (la {#145,función POW}{(2, m)} devuelve {2} elevado a {m}):
  12798.  
  12799.   {n} * POW(2, {m})
  12800.  
  12801. Por ejemplo, {2<<3} devolverá 16, {4<<1} devolverá 8, {100<<0} devolverá 100, etc.
  12802.  
  12803. Todas las variables son {enteros} con signo de 32 bits en el lenguaje.
  12804. Por eso sólo se pueden manejar números enteros dentro del rango
  12805. ({#1177,min_int} ... {#1178,max_int})}, por lo que cuando el resultado de
  12806. la {rotación} deba exceder dicho rango, {se mostrarán resultados
  12807. incorrectos}. En este caso, el sistema no advertirá de ningún error, por
  12808. lo que se deben extremar las precauciones.
  12809.  
  12810. {/}
  12811.  
  12812. El operador de rotación a la derecha (operación opuesta a ésta) es el
  12813. {#1077,símbolo >>}.
  12814.  
  12815. {/}Ver: {#1000,Sintaxis} - {#1035,Expresión}
  12816.  
  12817. # ─────────────────────────────────────────────────────────────────────────────
  12818.  
  12819. {.1071,<<=}
  12820. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  12821.  
  12822. Asignación operativa. Operación binaria de {rotación a la izquierda}.
  12823.  
  12824. Las {#1019,sentencias de asignación} sirven para calcular expresiones y
  12825. {asignárselas} a un dato.
  12826.  
  12827. {#1034,<referencia a un dato>} {=} {#1035,<expresión>} {;}
  12828.  
  12829. Si se utiliza el símbolo{ <<=} en lugar de {=} para realizar la asignación,
  12830. se asignará al dato el resultado de la siguiente rotación:
  12831.  
  12832.   [{valor_anterior_del_dato}] << [{resultado_de_la_expresión}]
  12833.  
  12834. O lo que es equivalente (la {#145,función POW}{(2, n)} devuelve {2} elevado a {n}):
  12835.  
  12836.   [{valor_anterior_del_dato}] * POW(2, [{resultado_de_la_expresión}])
  12837.  
  12838. Es decir, si el resultado de la expresión es:
  12839.  
  12840.   0 -> el dato mantendrá su valor.·
  12841.   1 -> el dato será multiplicado por 2.·
  12842.   2 -> el dato será multiplicado por 4.·
  12843.   3 -> el dato será multiplicado por 8.·
  12844.   ...
  12845.  
  12846. Ejemplo: {x=2; x<<=2;} -> (x=8)
  12847.  
  12848. {/}
  12849.  
  12850. {Nota:} Este símbolo es una simple abreviatura derivada del {lenguaje C},
  12851. en cualquier caso una sentencia del tipo {n <<= m;} será equivalente a
  12852. esta otra {n = n << m;}.
  12853.  
  12854. Ver el operador {#1070,<<} para más información sobre la {rotación a la izquierda}.
  12855.  
  12856. {/}Ver: {#1000,Sintaxis} - {#1019,Asignación}
  12857.  
  12858. # ─────────────────────────────────────────────────────────────────────────────
  12859.  
  12860. {.1072,<=  =<}
  12861. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  12862.  
  12863. Operador lógico [{menor o igual que}] utilizado en condiciones. Los símbolos
  12864. {<=} y {=<} son sinónimos.
  12865.  
  12866. Debe utilizarse entre dos expresiones numéricas y devuelve un
  12867. resultado lógico:
  12868.  
  12869. {Falso} - Si la primera expresión NO es menor o igual que la segunda.
  12870.  
  12871. {Cierto} - Si la primera expresión SI es menor o igual que la segunda.
  12872.  
  12873. {Ejemplos:}
  12874.  
  12875.   {2+2 <= 3} devolverá {falso}.
  12876.   {2+2 <= 4} devolverá {cierto}.
  12877.  
  12878. {/}Ver: {#1000,Sintaxis} - {#1037,Condición}
  12879.  
  12880. # ─────────────────────────────────────────────────────────────────────────────
  12881.  
  12882. {.1073,=}
  12883. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  12884.  
  12885. El símbolo {=} (símbolo de {asignación}) se utiliza en el lenguaje dentro
  12886. de las {#1009,declaraciones de datos} para inicializarlos, es decir, para
  12887. definir el valor inicial de los mismos y en las {#1019,sentencias de
  12888. asignación} para separar la referencia al dato, de la expresión asignada.
  12889.  
  12890. Dentro de una expresión este operador se puede utilizar como un
  12891. operador aritmético binario convencional, que se sitúa entre dos operandos,
  12892. y devuelve como resultado el valor del segundo operando (además de realizar
  12893. la asignación de este resultado al dato reflejado como primer operando).
  12894.  
  12895. Este operador representa una {orden imperativa}; se ordena que, al ejecutarse
  12896. la sentencia que lo contiene, el primer operando (anterior al símbolo) tome
  12897. el valor que tiene el segundo operando (o expresión posterior al símbolo).
  12898.  
  12899. En la evaluación de una expresión los operandos de asignación son siempre
  12900. los de {menor prioridad} (los últimos que se interpretan en la expresión),
  12901. pudiendo utilizar paréntesis para forzar una prioridad mayor. Si en una
  12902. expresión (o sentencia) se han utilizado varios operadores de asignación,
  12903. éstos serán evaluados (ejecutados) de derecha a izquierda.
  12904.  
  12905. Por ejemplo, en la sentencia:
  12906.  
  12907.   {x=y=x+y;}
  12908.  
  12909. Primero se relizará la suma ({x+y}), después se asignará el resultado como
  12910. nuevo valor de la variable {y} ({y=x+y}) y, por último, se asignará este
  12911. mismo valor a la variable {x} ({x=y}).
  12912.  
  12913. {/}
  12914.  
  12915. {Importante:}
  12916.  
  12917. Este símbolo no puede utilizarse para realizar comparaciones (que se realizan
  12918. con el {#1074,símbolo ==}), por ejemplo en la siguiente sentencia:
  12919.  
  12920.   {IF (x=2) ... END}
  12921.  
  12922. No se comparará la variable {x} con el valor {2}, sino que se asignará el
  12923. valor {2} a la variable {x} y, después, como el resultado de esta operación
  12924. (de asignación) es {2}, un número par, se interpretará la condición como
  12925. {falsa} (se interpretan como ciertas las expresiones impares y falsas las pares),
  12926. por lo que las sentencias interiores a la sentencia {IF} no serán ejecutadas
  12927. nunca.
  12928.  
  12929. Asimismo, el símbolo {#1074,==} no puede utilizarse para realizar asignaciones,
  12930. ya que es el operador lógico de comparación.
  12931.  
  12932. {/}Ver: {#1000,Sintaxis} - {#1009,Declaraciones de datos} - {#1019,Sentencias de asignación}
  12933.  
  12934. # ─────────────────────────────────────────────────────────────────────────────
  12935.  
  12936. {.1074,==}
  12937. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  12938.  
  12939. Operador lógico [{igual que}] utilizado en condiciones. Debe utilizarse entre
  12940. dos expresiones numéricas y devuelve un resultado lógico:
  12941.  
  12942. {Falso} - Si las expresiones dan resultados distintos, pues NO son iguales
  12943. (ni equivalentes).
  12944.  
  12945. {Cierto} - Si ambas expresiones dan el mismo resultado (si son dos
  12946. expresiones equivalentes), pues SI son iguales.
  12947.  
  12948. {Ejemplos:}
  12949.  
  12950.   {0 == -1}  devolverá {falso}.
  12951.   {2+2 == 4} devolverá {cierto}.
  12952.  
  12953. {/}
  12954.  
  12955. {Nota:} El símbolo {#1073,=} no puede utilizarse para comparar dos expresiones
  12956. o valores numéricos, ya que es el símbolo de asignación.
  12957.  
  12958. {/}Ver: {#1000,Sintaxis} - {#1037,Condición}
  12959.  
  12960. # ─────────────────────────────────────────────────────────────────────────────
  12961.  
  12962. {.1075,>=  =>}
  12963. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  12964.  
  12965. Operador lógico [{mayor o igual que}] utilizado en condiciones. Los símbolos
  12966. {>=} y {=>} son sinónimos.
  12967.  
  12968. Debe utilizarse entre dos expresiones numéricas y devuelve un
  12969. resultado lógico:
  12970.  
  12971. {Falso} - Si la primera expresión NO es mayor o igual que la segunda.
  12972.  
  12973. {Cierto} - Si la primera expresión SI es mayor o igual que la segunda.
  12974.  
  12975. {Ejemplos:}
  12976.  
  12977.   {2+2 >= 5} devolverá {falso}.
  12978.   {2+2 >= 4} devolverá {cierto}.
  12979.  
  12980. {/}Ver: {#1000,Sintaxis} - {#1037,Condición}
  12981.  
  12982. # ─────────────────────────────────────────────────────────────────────────────
  12983.  
  12984. {.1076,>}
  12985. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  12986.  
  12987. Operador lógico [{mayor que}] utilizado en condiciones. Debe utilizarse entre
  12988. dos expresiones numéricas y devuelve un resultado lógico:
  12989.  
  12990. {Falso} - Si la primera expresión NO es mayor que la segunda.
  12991.  
  12992. {Cierto} - Si la primera expresión SI es mayor que la segunda.
  12993.  
  12994. {Ejemplos:}
  12995.  
  12996.   {2+2 > 4} devolverá {falso}.
  12997.   {2 > 1}   devolverá {cierto}.
  12998.  
  12999. {/}Ver: {#1000,Sintaxis} - {#1037,Condición}
  13000.  
  13001. # ─────────────────────────────────────────────────────────────────────────────
  13002.  
  13003. {.1077,>>}
  13004. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  13005.  
  13006. Operador binario de {rotación a la derecha}. Este operador se utiliza en las
  13007. {#1035,expresiones aritméticas} entre dos operandos para obtener el resultado
  13008. de rotar el primer operando a la derecha el número de veces que indique
  13009. el segundo. Por ejemplo, la siguiente rotación:
  13010.  
  13011.   {n} >> {m}
  13012.  
  13013. devolverá {n} rotado a la derecha {m} veces; cada rotación a la derecha
  13014. equivale a dividir por 2 el número. Es decir, rotar a la izquierda 1
  13015. vez, equivale a dividir por 2, rotar a la izquierda 2 veces a dividir
  13016. por 4, 3 veces a dividir por 8, etc.
  13017.  
  13018. Se recuerda que todos los números manipulados en este lenguaje son {enteros}
  13019. (sin decimales) por lo que siempre se devolverá el resultado {entero} de la
  13020. división (7 dividido entre 2 devolverá 3, por ejemplo).
  13021.  
  13022. O lo que es equivalente (la {#145,función POW}{(2, m)} devuelve {2} elevado a {m}):
  13023.  
  13024.   {n} / POW(2, {m})
  13025.  
  13026. Por ejemplo, {16>>3} devolverá 2, {2>>1} devolverá 1, {100>>0} devolverá 100, etc.
  13027.  
  13028. {/}
  13029.  
  13030. El operador de rotación a la izquierda (operación opuesta a ésta) es el
  13031. {#1070,símbolo <<}.
  13032.  
  13033. {/}Ver: {#1000,Sintaxis} - {#1035,Expresión}
  13034.  
  13035. # ─────────────────────────────────────────────────────────────────────────────
  13036.  
  13037. {.1078,>>=}
  13038. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  13039.  
  13040. Asignación operativa. Operación binaria de {rotación a la derecha}.
  13041.  
  13042. Las {#1019,sentencias de asignación} sirven para calcular expresiones y
  13043. {asignárselas} a un dato.
  13044.  
  13045. {#1034,<referencia a un dato>} {=} {#1035,<expresión>} {;}
  13046.  
  13047. Si se utiliza el símbolo{ >>=} en lugar de {=} para realizar la asignación,
  13048. se asignará al dato el resultado de la siguiente rotación:
  13049.  
  13050.   [{valor_anterior_del_dato}] >> [{resultado_de_la_expresión}]
  13051.  
  13052. O lo que es equivalente (la {#145,función POW}{(2, n)} devuelve {2} elevado a {n}):
  13053.  
  13054.   [{valor_anterior_del_dato}] / POW(2, [{resultado_de_la_expresión}])
  13055.  
  13056. Es decir, si el resultado de la expresión es:
  13057.  
  13058.   0 -> el dato mantendrá su valor.·
  13059.   1 -> el dato será dividido por 2.·
  13060.   2 -> el dato será dividido por 4.·
  13061.   3 -> el dato será dividido por 8.·
  13062.   ...
  13063.  
  13064. Ejemplo: {x=8; x>>=2;} -> (x=2)
  13065.  
  13066. El resultado de una rotación a la derecha será siempre un número entero,
  13067. sin decimales, es decir, el cociente de la división entera anterior.
  13068.  
  13069. Ejemplo: {x=9; x>>=2;} -> (x=2)
  13070.  
  13071. {/}
  13072.  
  13073. {Nota:} Este símbolo es una simple abreviatura derivada del {lenguaje C};
  13074. en cualquier caso, una sentencia del tipo {n >>= m;} será equivalente a
  13075. esta otra {n = n >> m;}.
  13076.  
  13077. Ver el operador {#1077,>>} para más información sobre la {rotación a la derecha}.
  13078.  
  13079. {/}Ver: {#1000,Sintaxis} - {#1019,Asignación}
  13080.  
  13081. # ─────────────────────────────────────────────────────────────────────────────
  13082.  
  13083. {.1079,POINTER  [  ]}
  13084. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  13085.  
  13086. Operador de indirección. Este operador requiere un nivel ligeramente
  13087. avanzado en técnicas de programación. El uso de punteros es una
  13088. característica de otros lenguajes que, aunque puede ser muy útil,
  13089. no resulta imprescindible para la realización de programas, por
  13090. complejos que éstos sean.
  13091.  
  13092. La palabra reservada {POINTER} sirve para hacer referencia a una
  13093. posición determinada de la memoria del ordenador.
  13094.  
  13095. {Caso práctico.}{/}
  13096.  
  13097. Por ejemplo, si se tiene una variable denominada {mi_variable}
  13098. con el valor {3}, ésta estará en una dirección de la memoria (todas
  13099. las variables tienen su dirección), el operador {#1085,OFFSET} sirve
  13100. para obtener esta dirección.
  13101.  
  13102. Suponiendo que exista otra variable denominada {dirección_de_mi_variable}
  13103. en la que guardar la dirección de la variable anterior, ésto se haría
  13104. con la siguiente sentencia:
  13105.  
  13106.   {dirección_de_mi_variable = OFFSET mi_variable;}
  13107.  
  13108. Esta dirección será un número entero, pongamos {12345}; para
  13109. obtener el valor de la variable ({3}) o modificarlo, teniendo únicamente
  13110. la dirección (posición) de la variable en memoria (y no su nombre),
  13111. se debe utilizar el operador {POINTER}, la sentencia obtener el
  13112. valor de la variable a partir de su dirección sería:
  13113.  
  13114.   {mi_variable = POINTER dirección_de_mi_variable;}
  13115.  
  13116. Para aclarar los conceptos de {nombre de variable}, {dirección de la
  13117. variable} y {valor de la variable} se muestran a continuación una
  13118. serie de expresiones y sus equivalentes numéricos.
  13119.  
  13120.   {mi_variable} = {3}·
  13121.   {OFFSET mi_variable} = {12345}·
  13122.   {dirección_de_mi_variable} = {12345}·
  13123.   {POINTER dirección_de_mi_variable} = {3}·
  13124.  
  13125. La dirección de una variable puede variar según se vaya ampliando
  13126. un programa (añadiendo nuevos datos y sentencias al mismo).
  13127.  
  13128. En resumen, {el operador POINTER accede al valor que está en la
  13129. posición de la memoria del ordenador indicada tras él}, es decir:
  13130.  
  13131.   {POINTER 12345} = {3}·
  13132.  
  13133. Lo que quiere decir que, en la dirección {12345} de la memoria del
  13134. ordenador, está el valor {3}, ya que en esta dirección es donde
  13135. se {almacena} el valor de la variable {mi_variable} y ése es
  13136. su valor.
  13137.  
  13138. {/}
  13139.  
  13140. El {#1054,símbolo *} y el {#1080,símbolo ^} pueden utilizarse como
  13141. {sinónimos} de la palabra reservada {POINTER} (en el ejemplo
  13142. anterior {*12345} = {3} o bien {^12345} = {3}).
  13143.  
  13144. {/}
  13145.  
  13146. Los corchetes (símbolos {[ ]}) funcionan de forma similiar al operador
  13147. {POINTER}, con la única diferencia que acceden al dato cuya dirección se indica
  13148. entre ellos (en el ejemplo anterior {[12345]} = {3}).
  13149.  
  13150. Los corchetes también se utilizan para especificar el índice en las
  13151. tablas y estructuras.
  13152.  
  13153. {/}Ver: {#1000,Sintaxis} - {#1085,OFFSET}
  13154.  
  13155. # ─────────────────────────────────────────────────────────────────────────────
  13156.  
  13157. {.1080,^}
  13158. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  13159.  
  13160. Símbolo bifuncional que tiene dos usos diferentes según se utilice como
  13161. un operador unario o binario.
  13162.  
  13163. Un operador {UNARIO} aparece dentro de una expresión precediendo
  13164. simplemente a un operando (como si fuera el signo de éste), en cuyo caso
  13165. el operador{ ^} será un sinónimo de {#1079,POINTER}.
  13166.  
  13167. {Ejemplo: ^x} es equivalente a {POINTER x}
  13168.  
  13169. Un operador {BINARIO} aparece dentro de una expresión concatenando
  13170. a dos operandos (indicando una operación entre ambos); en este caso el
  13171. operador{ ^} será un sinónimo de {#1082,XOR}.
  13172.  
  13173. {Ejemplo: x^2} es equivalente a {x XOR 2}
  13174.  
  13175. {/}Ver: {#1000,Sintaxis} - {#1079,POINTER} - {#1082,XOR}
  13176.  
  13177. # ─────────────────────────────────────────────────────────────────────────────
  13178.  
  13179. {.1081,^=}
  13180. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  13181.  
  13182. Asignación operativa. Operación lógica y binaria de {OR (o) exclusivo} ({XOR}).
  13183.  
  13184. Las {#1019,sentencias de asignación} sirven para calcular expresiones y
  13185. {asignárselas} a un dato.
  13186.  
  13187. {#1034,<referencia a un dato>} {=} {#1035,<expresión>} {;}
  13188.  
  13189. Si se utiliza el símbolo{ ^=} en lugar de {=} para realizar la asignación,
  13190. se asignará al dato el {OR (o) exclusivo} siguiente:
  13191.  
  13192.   [{valor_anterior_del_dato}] XOR [{resultado_de_la_expresión}]
  13193.  
  13194. Ejemplo: {x=5; x^=3;} -> (x=3)
  13195.  
  13196. {/}
  13197.  
  13198. {Nota:} Este símbolo es una simple abreviatura derivada del {lenguaje C};
  13199. en cualquier caso una sentencia del tipo {n ^= m;} será equivalente a
  13200. ésta otra {n = n XOR m;}.
  13201.  
  13202. Ver el operador {#1082,XOR} para más información sobre el {OR (o) exclusivo}.
  13203.  
  13204. {/}Ver: {#1000,Sintaxis} - {#1019,Asignación}
  13205.  
  13206. # ─────────────────────────────────────────────────────────────────────────────
  13207.  
  13208. {.1082,XOR  ^^}
  13209. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  13210.  
  13211. Operador lógico y binario de {OR (o) exclusivo} utilizado en expresiones y
  13212. condiciones.
  13213.  
  13214. La palabra reservada {XOR} y el símbolo{ ^^} son sinónimos.
  13215.  
  13216. {XOR lógico:} Se evalúan primero las condiciones de la derecha e izquierda
  13217. del operador y si {sólo una} de ambas es {cierta}, este operador devolverá
  13218. {cierto}; en caso contrario el operador devolverá siempre {falso}.
  13219.  
  13220.   FALSO  XOR FALSO  = FALSO
  13221.   FALSO  XOR CIERTO = CIERTO
  13222.   CIERTO XOR FALSO  = CIERTO
  13223.   CIERTO XOR CIERTO = FALSO
  13224.  
  13225. Se utiliza para comprobar que se cumplan una, y sólo una, de las dos
  13226. condiciones que se especifican, por ejemplo:
  13227.  
  13228.   {(y>0 XOR x>0)}
  13229.  
  13230. Para comprobar que la primera variable sea mayor que 0, o bien
  13231. ('o' exclusivo), que lo sea la segunda (pero no la primera).
  13232.  
  13233. {XOR binario:} Evalúa los bits de los resultados de las expresiones anterior
  13234. y posterior al operador generando, como resultado, un valor que tendrá a 1
  13235. solamente los bits que tuvieran a 1 una, y sólo una, de las expresiones.
  13236.  
  13237.   0 XOR 0 = 0
  13238.   0 XOR 1 = 1
  13239.   1 XOR 0 = 1
  13240.   1 XOR 1 = 0
  13241.  
  13242. Esta regla se aplicará a todos los bits de los operandos (en el lenguaje
  13243. son enteros de 32 bits).
  13244.  
  13245. {/}
  13246.  
  13247. {Nota:} Este operador funciona indistintamente como lógico y binario debido
  13248. a que en el lenguaje se interpretan las expresiones lógicas {ciertas} como las
  13249. que tienen el último bit a 1 (el bit 0, de peso 1), es decir, los números
  13250. impares (1, -1, 3, -3, ... ), y como expresiones lógicas {falsas} las que
  13251. tienen el último bit a 0 (los números pares: 0, 2, -2, 4, -4, ...).
  13252.  
  13253. El operador {XOR} únicamente dejará a 1 el último bit (sólo devolverá {cierto}
  13254. como resultado} cuando lo tuviera a 1 uno, y sólo uno, de ambos operandos
  13255. (cuando únicamente una de las dos expresiones fuera {cierta}).
  13256.  
  13257. {/}
  13258.  
  13259. {Nota:} El símbolo{ ^} también puede utilizarse como un sinónimo más de
  13260. {XOR} y{ ^^}.
  13261.  
  13262. {/}Ver: {#1000,Sintaxis} - {#1035,Expresión} - {#1037,Condición} - {#1083,OR}
  13263.  
  13264. # ─────────────────────────────────────────────────────────────────────────────
  13265.  
  13266. {.1083,OR  ||  |}
  13267. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  13268.  
  13269. Operador binario de {suma lógica} utilizado en expresiones y
  13270. condiciones.
  13271.  
  13272. La palabra reservada {OR} y los símbolos{ ||} y{ |} son sinónimos.
  13273.  
  13274. {OR lógico:} Se evalúan primero las condiciones de la derecha e izquierda
  13275. del operador y si al menos una de ellas es {cierta}, este operador devolverá
  13276. {cierto}, en caso contrario el operador devolverá {falso} (cuando las dos
  13277. condiciones sean {falsas}).
  13278.  
  13279.   FALSO  OR FALSO  = FALSO
  13280.   FALSO  OR CIERTO = CIERTO
  13281.   CIERTO OR FALSO  = CIERTO
  13282.   CIERTO OR CIERTO = CIERTO
  13283.  
  13284. Se utiliza para comprobar que se cumplan una (cualquiera) de las condiciones
  13285. que se establecen, por ejemplo:
  13286.  
  13287.   {(x>0 OR y>0)}
  13288.  
  13289. Para comprobar que al menos una de las dos variables sea mayor que 0. Es
  13290. decir, que se cumpla la primera condición {O} la segunda.
  13291.  
  13292. {OR binario:} Evalúa los bit de los resultados de las expresiones anterior
  13293. y posterior al operador, generando como resultado un valor que tendrá a 1
  13294. los bit que tuvieran a 1 cualquiera de las expresiones.
  13295.  
  13296.   0 OR 0 = 0
  13297.   0 OR 1 = 1
  13298.   1 OR 0 = 1
  13299.   1 OR 1 = 1
  13300.  
  13301. Esta regla se aplicará a todos los bit de los operandos (en el lenguaje
  13302. son enteros de 32 bits).
  13303.  
  13304. {/}
  13305.  
  13306. {Nota:} Este operador funciona indistintamente como lógico y binario debido
  13307. a que en el lenguaje se interpretan las expresiones lógicas {ciertas} como las
  13308. que tienen el último bit a 1 (el bit 0, de peso 1), es decir, los números
  13309. impares (1, -1, 3, -3, ... ), y como expresiones lógicas {falsas} las que
  13310. tienen el último bit a 0 (los números pares: 0, 2, -2, 4, -4, ...).
  13311.  
  13312. El operador {OR} dejará a 1 el último bit (devolverá {cierto}
  13313. como resultado} cuando lo tuviera a 1 uno (cualquiera) de los operandos (cuando los dos fueran,
  13314. al menos, una de las dos expresiones fuera {cierta}).
  13315.  
  13316. {/}Ver: {#1000,Sintaxis} - {#1035,Expresión} - {#1037,Condición} - {#1082,XOR}
  13317.  
  13318. # ─────────────────────────────────────────────────────────────────────────────
  13319.  
  13320. {.1084,|=}
  13321. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  13322.  
  13323. Asignación operativa. Operación binaria de {suma lógica} ({OR}).
  13324.  
  13325. Las {#1019,sentencias de asignación} sirven para calcular expresiones y
  13326. {asignárselas} a un dato.
  13327.  
  13328. {#1034,<referencia a un dato>} {=} {#1035,<expresión>} {;}
  13329.  
  13330. Si se utiliza el símbolo{ |=} en lugar de {=} para realizar la asignación,
  13331. se asignará al dato la {suma lógica} siguiente:
  13332.  
  13333.   [{valor_anterior_del_dato}] OR [{resultado_de_la_expresión}]
  13334.  
  13335. Ejemplo: {x=5; x|=6;} -> (x=7)
  13336.  
  13337. {/}
  13338.  
  13339. {Nota:} Este símbolo es una simple abreviatura derivada del {lenguaje C},
  13340. en cualquier caso una sentencia del tipo {n |= m;} será equivalente a
  13341. esta otra {n = n OR m;}.
  13342.  
  13343. Ver el operador {#1083,OR} para más información sobre la {suma lógica}.
  13344.  
  13345. {/}
  13346.  
  13347. {Nota:} No se debe confundir este símbolo con el de [{distinto que}] que
  13348. se expresa como {#1046,!=}, y sirve para comparar si dos expresiones
  13349. difieren en su resultado.
  13350.  
  13351. {/}Ver: {#1000,Sintaxis} - {#1019,Asignación}
  13352.  
  13353. # ─────────────────────────────────────────────────────────────────────────────
  13354.  
  13355. {.1085,OFFSET}
  13356. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  13357.  
  13358. La palabra reservada {OFFSET} permite obtener la dirección de un
  13359. dato dentro de la memoria del ordenador.
  13360.  
  13361. Todos los datos de un programa se corresponden con alguna posición
  13362. concreta de la memoria en la que está almacenado su valor; el
  13363. operador {OFFSET} permite obtener esta posición como un valor
  13364. numérico.
  13365.  
  13366. Este operador se utiliza, principalmente, en los parámetros de algunas
  13367. de las funciones del lenguaje; esto se hace para permitir a dichas
  13368. funciones que puedan modificar estos parámetros.
  13369.  
  13370. Si se tiene una variable, por ejemplo denominada {mi_variable},
  13371. con el valor {321} y se pasa, como parámetro, dicha variable a una función
  13372. parámetro, se le está pasando a la función el número 321; con esto,
  13373. la función no podrá modificar la variable ya que conoce su valor
  13374. pero no {dónde está la variable} (pues puede haber muchos valores
  13375. {321} por toda la memoria del ordenador, y no sabrá cuál de ellos
  13376. es la variable).
  13377.  
  13378. Si a esta función se le pasa como parámetro {OFFSET mi_variable}
  13379. se le estará informando del lugar en el que está almacenado el
  13380. valor de la variable, pudiendo, la función, acceder a dicho valor para
  13381. consultarlo o modificarlo.
  13382.  
  13383. Para más información sobre este operador se puede acceder al
  13384. {#1079,operador POINTER} que realiza la operación inversa al operador
  13385. {OFFSET} (es decir, obtiene el valor que hay en una posición determinada
  13386. de la memoria).
  13387.  
  13388. {/}
  13389.  
  13390. El {#1050,símbolo &} puede utilizarse como {sinónimo} de la palabra
  13391. reservada {OFFSET}.
  13392.  
  13393. {/}Ver: {#1000,Sintaxis} - {#1079,POINTER}
  13394.  
  13395. # ─────────────────────────────────────────────────────────────────────────────
  13396.  
  13397. {.1086,BEGIN}
  13398. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  13399.  
  13400. Esta palabra reservada indica el comienzo del programa o proceso.
  13401.  
  13402. Es decir, la palabra {BEGIN} se utiliza para separar la zona
  13403. de declaración de datos del programa principal o de un proceso,
  13404. de la zona de sentencias.
  13405.  
  13406. Es obligatoria la declaración {BEGIN} (inicio) en el programa
  13407. principal y todos los procesos.
  13408.  
  13409. Cuando se ejecuta un programa o proceso, éste comenzará siempre por
  13410. la sentencia que venga a continuación de {BEGIN}.
  13411.  
  13412. La sentencia {BEGIN no hace nada}, únicamente sirve como delimitador
  13413. dentro de la estructura de los programas.
  13414.  
  13415. {/}
  13416.  
  13417. Cada {BEGIN} (inicio) viene relacionado directamente con un
  13418. {#1091,END} (fin) que marcará el final de la zona de sentencias
  13419. del programa o proceso.
  13420.  
  13421. {/}Ver: {#1000,Sintaxis} - {#1015,Código Principal} - {#1016,Declaración de procesos}
  13422.  
  13423. # ─────────────────────────────────────────────────────────────────────────────
  13424.  
  13425. {.1087,CASE}
  13426. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  13427.  
  13428. Esta palabra reservada forma parte de la sentencia {#1021,SWITCH};
  13429. se utiliza como inicio de las diferentes secciones de sentencias
  13430. que pueden ejecutarse o no, dependiendo del resultado de la expresión
  13431. evaluada.
  13432.  
  13433. Cada {CASE} debe tener una palabra {#1091,END} que indique el
  13434. final de la sección.
  13435.  
  13436. La sentencia {#1021,SWITCH} evalúa una expresión y el significado
  13437. que tiene la palabra {CASE} es "{en el caso de que el resultado de
  13438. la expresión sea ..., entonces se deben ejecutar las siguientes
  13439. sentencias ...}".
  13440.  
  13441. {/}Ver: {#1000,Sintaxis} - {#1021,Sentencia SWITCH}
  13442.  
  13443. # ─────────────────────────────────────────────────────────────────────────────
  13444.  
  13445. {.1088,DEFAULT}
  13446. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  13447.  
  13448. Esta palabra reservada forma parte de la sentencia {#1021,SWITCH} que
  13449. se utiliza como inicio de una sección de sentencias que debe ejecutarse
  13450. cuando el resultado de la expresión evaluada no esté contemplado en
  13451. ninguna de las secciones {#1087,CASE} de la sentencia.
  13452.  
  13453. Cada {DEFAULT} debe tener una palabra {#1091,END} que indique el
  13454. final de la sección.
  13455.  
  13456. La sentencia {#1021,SWITCH} evalúa una expresión; cada sección
  13457. {#1087,CASE} de la sentencia contemplará uno o varios resultados en los
  13458. que se debe ejecutar dicha sección y, por último, si aparece una
  13459. sección {DEFAULT} es para expresar "{en el caso de que el resultado de
  13460. la expresión no sea ninguno de los anteriores, entonces se deben ejecutar
  13461. las siguientes sentencias ...}".
  13462.  
  13463. {/}Ver: {#1000,Sintaxis} - {#1021,Sentencia SWITCH}
  13464.  
  13465. # ─────────────────────────────────────────────────────────────────────────────
  13466.  
  13467. {.1089,DUP}
  13468. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  13469.  
  13470. Esta palabra sirve para definir {#1013,listas de constantes} (valores numéricos),
  13471. a base de repetir un patrón sencillo. Se utiliza para inicializar los
  13472. valores iniciales de tablas y estructuras.
  13473.  
  13474. Su sintaxis es la siguiente:
  13475.  
  13476. <número de veces> {DUP (}<secuencia a repetir>{)}
  13477.  
  13478. Es equivalente a poner la <secuencia a repetir> el <número de veces>
  13479. que se indica.
  13480.  
  13481. Por ejemplo, la secuencia {1, 2, 3, 1, 2, 3, 1, 2, 3} sería equivalente a
  13482. la secuencia {3 DUP (1, 2, 3)}.
  13483.  
  13484. {/}Ver: {#1000,Sintaxis} - {#1013,Definición de una lista de constantes}
  13485.  
  13486. # ─────────────────────────────────────────────────────────────────────────────
  13487.  
  13488. {.1090,ELSE}
  13489. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  13490.  
  13491. Esta palabra forma parte de la sentencia {#1020,IF}, y sirve
  13492. para especificar dónde comienza el bloque de sentencias que se debe
  13493. ejecutar cuando la condición especificada en la sentencia
  13494. {#1020,IF} no se cumpla.
  13495.  
  13496. El formato de la sentencia {#1020,IF} es el siguiente:
  13497.  
  13498. {IF (<}condición{>)}·
  13499.     // Código a ejecutar cuando se cumpla la condición·
  13500. {ELSE}·
  13501.     // Código a ejecutar cuando {no} se cumpla la condición·
  13502. {END}·
  13503.  
  13504. El significado semántico de {ELSE} es "{en el caso contrario ...}".
  13505.  
  13506. {/}
  13507.  
  13508. La sección {ELSE} es opcional, pudiendo formularse la sentencia {#1020,IF}
  13509. de la siguiente forma:
  13510.  
  13511. {IF (<}condición{>)}·
  13512.     // Código a ejecutar cuando se cumpla la condición·
  13513. {END}·
  13514.  
  13515. Cuando no se requiera que se ejecute ninguna sentencia {en el caso
  13516. contrario}.
  13517.  
  13518. {/}Ver: {#1000,Sintaxis} - {#1020,Sentencia IF}
  13519.  
  13520. # ─────────────────────────────────────────────────────────────────────────────
  13521.  
  13522. {.1091,END}
  13523. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  13524.  
  13525. Esta palabra reservada marca el final de una de las siguientes sentencias:
  13526.  
  13527.   {#1086,BEGIN}·
  13528.   {#1020,IF}·
  13529.   {#1022,WHILE}·
  13530.   {#1021,SWITCH}·
  13531.   {#1087,CASE}·
  13532.   {#1087,DEFAULT}·
  13533.   {#1025,FOR}·
  13534.   {#1043,FROM}·
  13535.   {#1024,LOOP}·
  13536.   {#1030,CLONE}·
  13537.  
  13538. Es decir, la función de la palabra {END} es {delimitar dónde acaba
  13539. una sentencia}.
  13540.  
  13541. Se debe tener en cuenta que las sentencias se pueden
  13542. anidar, es decir, incluir unas dentro de otras, por lo que si no
  13543. se estructura bien un programa (tabulando el código), puede resultar
  13544. difícil averiguar a qué sentencia corresponde cada {END}.
  13545.  
  13546. Por ejemplo, en el siguiente código se puede ver claramente a qué
  13547. sentencia pertenece cada {END}.
  13548.  
  13549. {BEGIN}·
  13550.     {IF (x>0)}·
  13551.         {x=x-1;}·
  13552.     {END}·
  13553. {END}·
  13554.  
  13555. Pero este mismo código podría haberse expresado como sigue:
  13556.  
  13557. {BEGIN}·
  13558.     {IF (x>0)}·
  13559.     {x=x-1;}·
  13560. {END}·
  13561.     {END}·
  13562.  
  13563. resultando mucho más complicada la lectura del programa, aunque
  13564. para el compilador del lenguaje {ambos bloques de código son
  13565. exactamente iguales} (el compilador seguirá interpretando que
  13566. el primer {END} es el de la sentencia {IF} y el segundo el
  13567. del {BEGIN}, aunque éstos estén tabulados incorrectamente).
  13568.  
  13569. {/}Ver: {#1000,Sintaxis}
  13570.  
  13571. # ─────────────────────────────────────────────────────────────────────────────
  13572.  
  13573. {.1092,ID}
  13574. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  13575.  
  13576. La palabra reservada {ID} se utiliza para obtener el {#1039,código
  13577. identificador} de un proceso en tiempo de ejecución.
  13578.  
  13579. Un {#1039,código identificador} es un valor numérico que
  13580. {identifica} a cada uno de los porcesos activos en cada momento
  13581. (cada uno de los objetos que tenga el juego).
  13582.  
  13583. Es decir, {ID} es como una constante numérica sólo que su valor
  13584. será diferente para cada proceso que la consulte.
  13585.  
  13586. No es posible cambiar el valor de {ID}, ya que es un objeto
  13587. únicamente de lectura.
  13588.  
  13589. Normalmente, un proceso accede a este valor cuando quiere informar
  13590. a otros procesos de cuál es su {#1039,código identificador}.
  13591.  
  13592. {/}Ver: {#1000,Sintaxis} - {#1039,Códigos identificadores}
  13593.  
  13594. # ─────────────────────────────────────────────────────────────────────────────
  13595.  
  13596. {.1093,SETUP_PROGRAM}
  13597. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  13598.  
  13599. Esta palabra reservada sirve para designar un tipo especial de
  13600. programas, de {configuración del hardware de sonido}.
  13601.  
  13602. Estos programas se identifican por comenzar con la palabra
  13603. reservada {SETUP_PROGRAM} en lugar de {#1003,PROGRAM}.
  13604.  
  13605. Éste es un tópico muy avanzado, para usuarios con experiencia.
  13606.  
  13607. Se puede observar un programa de este tipo en el directorio {SETUP}
  13608. de DIV Games Studio; estos programas, una vez compilados, se incluirán
  13609. automáticamente en las instalaciones del resto de programas, cuando
  13610. en el proceso de instalación se active la casilla "{Incluir setup de sonido}".
  13611.  
  13612. {Nota:} En las instalaciones siempre se incluirá el último programa
  13613. de setup que haya sido compilado en DIV Games Studio.
  13614.  
  13615. {/}
  13616.  
  13617. No obstante, se recuerda que no es imprescindible crear programas
  13618. de configuración del sistema de sonido, ya que los juegos creados con DIV Games
  13619. Studio detectarán automáticamente si el ordenador en el que se
  13620. ejecutan tiene una tarjeta de sonido compatible con {Sound Blaster}
  13621. o {Gravis Ultrasound}, siempre que ésta esté apropiadamente configurada.
  13622.  
  13623. {/}
  13624.  
  13625. Este tipo de programas suelen modificar la {#1104,estructura global
  13626. setup}, que es la que controla los parámetros del sistema de sonido.
  13627.  
  13628. {/}Ver: {#1000,Sintaxis} - {#1104,Estructura setup}
  13629.  
  13630. # ─────────────────────────────────────────────────────────────────────────────
  13631.  
  13632. {.1094,SIZEOF()}
  13633. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  13634.  
  13635. {SIZEOF(}<nombre del dato>{)}
  13636.  
  13637. {Retorna:}
  13638.  
  13639. El número de elementos que contiene el dato.
  13640.  
  13641. {Descripción:}
  13642.  
  13643. La palabra reservada {SIZEOF} se utiliza para calcular el número
  13644. de elementos que tiene una tabla o una estructura.
  13645.  
  13646. Esta palabra reservada {se utiliza como si fuera una función} del lenguaje,
  13647. indicando, entre paréntesis, el {#1001,nombre} del dato y devolviendo el
  13648. número de elementos (posiciones) del mismo.
  13649.  
  13650. Es posible utilizarla para obtener el número de elementos de una
  13651. variable pero, en este caso, {SIZEOF} retornará siempre {1}
  13652. como número de elementos (ya que una variable es un único elemento).
  13653.  
  13654. {#9999,Programa ejemplo:}
  13655. PROGRAM ejemplo_sizeof;
  13656.  
  13657. PRIVATE
  13658.     tabla1[]=0, 1, 2, 3;
  13659.     tabla2[]=4, 5, 6, 7, 8;
  13660.     variable=9;
  13661.  
  13662. BEGIN
  13663.     // ...
  13664.  
  13665.     save("help\help.dat", OFFSET tabla1, SIZEOF(tabla1)+SIZEOF(tabla2)+SIZEOF(variable));
  13666.  
  13667.     // ...
  13668. END
  13669. {-}
  13670.  
  13671. En este ejemplo se utiliza {SIZEOF} para obtener el número de elementos
  13672. de tres datos diferentes; éstos son:
  13673.  
  13674. {tabla1} de {4} elementos.·
  13675. {tabla2} de {5} elementos.·
  13676. {variable} ({1} elemento).·
  13677.  
  13678. En este caso se utiliza para grabar en el archivo {help.dat} el
  13679. contenido de estos tres datos con la función {#155,save()} que
  13680. requiere, como tercer parámetro, el número de elementos que se quieren
  13681. guardar en el archivo.
  13682.  
  13683. En este caso se guardarán {10} elementos en el archivo {help.dat},
  13684. que según están inicializados los datos en el ejemplo serán los
  13685. números del {0} al {9}.
  13686.  
  13687. La sentencia {#155,save()} del ejemplo anterior se podría haber
  13688. expresado también sin utilizar {SIZEOF} de la siguiente forma:
  13689.  
  13690.   {save("help\help.dat", OFFSET tabla1, 10);}
  13691.  
  13692. La única diferencia es que si en el programa del ejemplo se añadieran
  13693. elementos a alguna de las dos tablas, no haría falta modificar la
  13694. llamada a la función {#155,save()}, ya que {SIZEOF} siempre devolverá
  13695. el tamaño actual de las mismas.
  13696.  
  13697. {/}Ver: {#1000,Sintaxis} - {#1011,Declaración de una tabla} - {#1012,Declaración de una estructura}
  13698.  
  13699. # ─────────────────────────────────────────────────────────────────────────────
  13700.  
  13701. {.1095,STEP}
  13702. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  13703.  
  13704. La palabra reservada {STEP} forma parte de la sentencia {#1043,FROM} y sirve
  13705. para indicar el incremento (paso) que se debe hacer en cada iteración del bucle.
  13706.  
  13707. La sentencia {#1043,FROM} implementa un bucle, es decir, un grupo de
  13708. sentencias que se van a repetir un número determinado de veces; para
  13709. ello, utiliza una variable como contador del número de repeticiones.
  13710.  
  13711. Se define el valor inicial de la variable así como el valor final, y el
  13712. bucle se repetirá hasta que la variable alcance el valor final, partiendo
  13713. del valor inicial.
  13714.  
  13715. Por defecto, la variable pasará por todos los valores numéricos enteros
  13716. comprendidos entre el valor inicial y el valor final, pero se puede
  13717. indicar una declaración {STEP} para establecer un incremento de la
  13718. variable diferente.
  13719.  
  13720. Por ejemplo, si se define un bucle en el que la variable {x} va a
  13721. recorrer los valores del {1} al {10}, se ejecutará dicho bucle un
  13722. total de {10} veces, pero si se estable el paso ({STEP}) como {2}
  13723. el bucle se ejecutará únicamente {5} veces, en donde la variable
  13724. {x} tomará los valores {1}, {3}, {5}, {7} y {9}, pues se habrá
  13725. establecido que la variable debe incrementarse de {2} en {2}. Este
  13726. bucle se implementaría de la siguiente forma:
  13727.  
  13728. {FROM x=1 TO 10 STEP 2}·
  13729.   // Sentencias que se van a repetir las cinco veces·
  13730. {END}·
  13731.  
  13732. Si se omite la declaración {STEP} de la sentencia {#1043,FROM}, el
  13733. incremento será siempre de 1 en 1, sumando 1 a la variable tras cada
  13734. iteración del bucle (o restando 1, en el caso de que el valor final
  13735. sea menor que el valor inicial).
  13736.  
  13737. {Nota:} Unicamente se pueden establecer incrementos enteros.
  13738.  
  13739. {/}Ver: {#1000,Sintaxis} - {#1043,Sentencia FROM}
  13740.  
  13741. # ─────────────────────────────────────────────────────────────────────────────
  13742.  
  13743. {.1096,TO}
  13744. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  13745.  
  13746. La palabra reservada {TO} forma parte de la sentencia {#1043,FROM} y sirve
  13747. para separar las constantes que indican los valores inicial y final que
  13748. debe tomar la variable que se utilice como contador del bucle.
  13749.  
  13750. La sentencia {#1043,FROM} implementa un bucle, es decir, un grupo de
  13751. sentencias que se van a repetir un número determinado de veces; para
  13752. ello utiliza una variable como contador del número de repeticiones.
  13753.  
  13754. Se define el valor inicial de la variable y el valor final, y el
  13755. bucle se repetirá hasta que la variable alcance el valor final, partiendo
  13756. del valor inicial.
  13757.  
  13758. {Ejemplo:}
  13759.  
  13760.   {FROM x=1 TO 10}·
  13761.     // Sentencias que se repetirán 10 veces·
  13762.   {END}·
  13763.  
  13764. Por defecto, la variable pasará por todos los valores numéricos enteros
  13765. comprendidos entre el valor inicial y el valor final, pero se puede
  13766. indicar una declaración {#1095,STEP} para establecer un incremento de la
  13767. variable diferente.
  13768.  
  13769. {/}Ver: {#1000,Sintaxis} - {#1043,Sentencia FROM} - {#1095,STEP}
  13770.  
  13771. # ─────────────────────────────────────────────────────────────────────────────
  13772.  
  13773. {.1097,UNTIL}
  13774. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  13775.  
  13776. La palabra reservada {UNTIL} forma parte de la sentencia {#1023,REPEAT},
  13777. cuya sintaxis es, a grandes rasgos, la siguiente:
  13778.  
  13779. {#1023,REPEAT}·
  13780.     {#1017,<sentencia>};·
  13781.     ...·
  13782. {UNTIL (<}condición>}{)}
  13783.  
  13784. La sentencia {#1023,REPEAT} implementa un bucle, es decir, es capaz
  13785. de repetir un grupo de sentencias un número determinado de veces.
  13786.  
  13787. El final de la sentencia se determina poniendo la palabra reservada {UNTIL}
  13788. seguida de la condición que se debe cumplir para que {se de por finalizada
  13789. la sentencia}.
  13790.  
  13791. {/}Ver: {#1000,Sintaxis} - {#1023,Sentencia REPEAT}
  13792.  
  13793. # ─────────────────────────────────────────────────────────────────────────────
  13794.  
  13795. {.1100,GLOBAL STRUCT mouse}
  13796. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  13797.  
  13798. {STRUCT mouse;}·
  13799.     {x, y;}                // Coordenadas·
  13800.     {graph;}               // Código del gráfico·
  13801.     {file;}                // Código del fichero·
  13802.     {z;}                   // Plano de profundidad·
  13803.     {angle;}               // ángulo·
  13804.     {size;}                // Tamaño (%)·
  13805.     {flags;}               // Indicador espejados·
  13806.     {region;}              // Región de corte·
  13807.     {left, middle, right;} // Estado botones·
  13808. {END}·
  13809.  
  13810. Esta estructura global sirve para controlar el ratón; contiene
  13811. una serie de campos relacionados con la programación de este
  13812. dispositivo, como la posición en pantalla, el gráfico del puntero,
  13813. el estado de los botones, etc.
  13814.  
  13815. Para acceder a estos campos se debe preceder el nombre del campo
  13816. por la palabra {mouse} y el símbolo {#1063,. (punto)}; por ejemplo, para
  13817. acceder al campo {x} (coordenada horizontal del puntero del ratón)
  13818. se debe utilizar {mouse.x}.
  13819.  
  13820. {/}
  13821.  
  13822. {x}, {y} - Coordenadas horizontal y vertical del ratón. Estos dos campos
  13823. ({mouse.x} y {mouse.y}) serán los únicos que necesariamente habrá que leer para
  13824. conocer la posición en pantalla del cursor del ratón.
  13825.  
  13826. Para {posicionar el ratón en otras coordenadas} (forzar su posición),
  13827. bastará con asignar las nuevas coordenadas a estos dos campos.
  13828.  
  13829. {/}
  13830.  
  13831. {graph} - {Código del gráfico} asignado como puntero del ratón. Por
  13832. defecto {el ratón no será visible}; para hacerlo visible se debe crear
  13833. el gráfico que va a servir de puntero en el {editor gráfico},
  13834. cargarlo en el programa (con la función {#132,load_fpg()} o {#174,load_map()}, según
  13835. se haya guardado este gráfico en un {fichero FPG} o en un {archivo MAP}), y
  13836. asignar su {código de gráfico} a esta variable ({mouse.graph}). Entonces se hará
  13837. visible el puntero del ratón en pantalla.
  13838.  
  13839. En las coordenadas {mouse.x}, {mouse.y} aparecerá el centro del gráfico,
  13840. a no ser que se haya definido el {#1136,punto de control} número {0} del mismo
  13841. en el {editor gráfico}. Si se define este punto, comúnmente denominado
  13842. "{punto caliente del ratón}" ({hot spot}), será él mismo el que aparezca
  13843. en las coordenadas indicadas en los campos {mouse.x} e {mouse.y}.
  13844.  
  13845. Por ejemplo, si se crea como dibujo para el puntero del ratón la
  13846. típica flecha (como el puntero de ratón DIV Games Studio), el "punto
  13847. caliente" (punto de control número {0}) se definiría en la
  13848. esquina superior izquierda del gráfico, pues éste es el {punto activo}
  13849. dentro del gráfico. Entonces, cuando el ratón estuviera, por ejemplo,
  13850. en las coordenadas (0, 0), sería la precisamente la "{punta de la flecha}"
  13851. la que se situara en dichas coordenadas.
  13852.  
  13853. {/}
  13854.  
  13855. {file} - {Código del fichero} que contiene el gráfico. En este campo se define
  13856. el {código de fichero} que contiene el gráfico del puntero del ratón.
  13857. {No es necesario} indicar aquí un valor si el gráfico se cargó de un
  13858. {archivo MAP}, o si está en el primer {archivo FPG} cargado en el
  13859. programa. En caso contrario, se deberá asignar a {mouse.file} el
  13860. {código de fichero} que retornó la función {#132,load_fpg()} al cargar
  13861. el fichero que contiene el gráfico del puntero del ratón.
  13862.  
  13863. {/}
  13864.  
  13865. {z} - Prioridad de impresión del gráfico. Indica en qué plano de profundidad
  13866. debe pintarse el gráfico del puntero del ratón. {Por defecto} este campo
  13867. valdrá{ -512}, lo que implica que {el puntero se verá por encima del resto
  13868. de gráficos y textos}. Cuanto mayor sea este campo, más al fondo se situará
  13869. el puntero del ratón.
  13870.  
  13871. Si se quisiera que un gráfico de un proceso apareciera
  13872. por encima del puntero del ratón, bastaría con asignar a la variable
  13873. {#1125,local z} de dicho proceso un número entero menor de{ -512},
  13874. por ejemplo{ -600}.
  13875.  
  13876. {/}
  13877.  
  13878. {angle} - ángulo con el que se verá el gráfico del puntero del ratón.
  13879. El valor de {mouse.angle} por defecto es {0}, lo que implica que no
  13880. se verá rotado este gráfico, a no ser que se asigne un nuevo ángulo
  13881. a este campo.
  13882.  
  13883. Se recuerda que los ángulos se deben especificar en
  13884. milésimas de grado, por ejemplo, la sentencia {mouse.angle=90000;} hará que el
  13885. puntero aparezca rotado {90 grados} (ver el {#1044,uso de ángulos
  13886. en el lenguaje}).
  13887.  
  13888. {/}
  13889.  
  13890. {size} - Tamaño del gráfico en porcentaje. Por defecto, este campo
  13891. valdrá {100} (el gráfico se verá al 100% de su tamaño), y no es
  13892. necesario indicar aquí otro valor a no ser que se quiera que el
  13893. gráfico se escale (se vea ampliado o reducido).
  13894.  
  13895. Si por ejemplo se quisiera que el gráfico apareciera el doble de
  13896. grande que su tamaño original (al 200%), se debería utilizar la sentencia
  13897. {mouse.size=200;}.
  13898.  
  13899. {/}
  13900.  
  13901. {flags} - En este campo se indicarán diferentes valores cuando se
  13902. pretenda que el gráfico del ratón aparezca espejado (invertido
  13903. horizontal o verticalmente), o se quiera visualizarlo como un
  13904. gráfico (semi) transparente. Los posibles valores asignables a
  13905. la variable {mouse.flags} son:
  13906.  
  13907.  {0}-Gráfico normal (valor por defecto).·
  13908.  {1}-Espejado horizontal.·
  13909.  {2}-Espejado vertical.·
  13910.  {3}-Espejado horizontal y vertical (180°).·
  13911.  {4}-Gráfico transparente.·
  13912.  {5}-Transparente y espejado horizontal.·
  13913.  {6}-Transparente y espejado vertical.·
  13914.  {7}-Transparente, espejado horizontal y vertical.·
  13915.  
  13916. {/}
  13917.  
  13918. {region} - Región de corte del gráfico. A este campo se debe asignar
  13919. un valor {únicamente cuando se quiera que el puntero del ratón sea
  13920. visible sólo dentro de una región} (una zona rectangular de la pantalla);
  13921. para conseguirlo se debe, primero, definir esta región con la función
  13922. {#106,define_region()} y, después, asignar a este campo ({mouse.region})
  13923. el número de la región que se ha definido.
  13924.  
  13925. Por defecto este valor será {0}, que es el número de región que se
  13926. refiere a la pantalla completa, por lo que el gráfico será visible
  13927. en toda la pantalla.
  13928.  
  13929. {/}
  13930.  
  13931. {left}, {middle} y {right} - Estos tres campos almacenan valores
  13932. lógicos ({0} o {1}) según los botones del ratón estén pulsados o
  13933. no (se corresponden con los botones izquierdo, central y derecho
  13934. del ratón). Normalmente, se activan únicamente dos botones del ratón
  13935. ({left} y {right}) ignorándose el estado del botón central. Esto
  13936. depende del {driver} (dispositivo de control) del ratón que esté
  13937. instalado en el ordenador.
  13938.  
  13939. Por ejemplo, para realizar en un programa una acción {cuando se pulse
  13940. el botón izquierdo del ratón} ({mouse.left}) se debe incluir en el código
  13941. una sentencia como la siguiente:
  13942.  
  13943.   {IF (mouse.left)}·
  13944.     // Acción a realizar (sentencias)·
  13945.   {END}·
  13946.  
  13947. {/}Ver: {#1200,Datos globales}
  13948.  
  13949. # ─────────────────────────────────────────────────────────────────────────────
  13950.  
  13951. {.1101,GLOBAL STRUCT scroll}
  13952. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  13953.  
  13954. {STRUCT scroll[9];}·
  13955.     {x0, y0;}    // Coordenadas del primer plano·
  13956.     {x1, y1;}    // Coordenadas del segundo plano·
  13957.     {z;}         // Plano de profundidad·
  13958.     {camera;}    // {#1039,Código identificador} de la cámara·
  13959.     {ratio;}     // Velocidad relativa del segundo plano·
  13960.     {speed;}     // Velocidad máxima del primer plano·
  13961.     {region1;}   // Primera región de pantalla·
  13962.     {region2;}   // Segunda región de pantalla·
  13963. {END}·
  13964.  
  13965. Esta estructura de {10} registros contiene ciertos campos relacionados
  13966. con parámetros modificables de las {ventanas de scroll}. Los diez
  13967. registros tienen los mismos nombres de campos, pero cada uno de
  13968. ellos modifica los parámetros de una ventana de scroll diferente
  13969. (ya que pueden activarse hasta 10 ventanas de este tipo).
  13970.  
  13971. Una {ventana de scroll} se podría definir como una región de pantalla que
  13972. muestra sólo una parte de un gráfico más grande que dicha ventana (este
  13973. gráfico suele ser el {decorado} o {fondo} del juego). El {scroll} en sí
  13974. es el movimiento de dicha ventana por el gráfico en cualquier dirección,
  13975. visualizándose poco a poco el gráfico completo, sección a sección del mismo.
  13976.  
  13977. Para que un registro (del {0} al {9}) de la {estructura scroll} tenga sentido,
  13978. primero debe activarse dicha {ventana de scroll} (del {0} al {9}) con la
  13979. función {#163,start_scroll} (ver esta función para más información sobre
  13980. las ventanas de scroll}.
  13981.  
  13982. Se entiende que los campos de esta estructura son complementarios a los
  13983. parámetros de llamada de esta última función.
  13984.  
  13985. {/}
  13986.  
  13987. {Forma de uso de la estructura scroll:}
  13988.  
  13989. Para acceder a estos campos se debe preceder el nombre del campo
  13990. por la palabra {scroll}, el número de registro entre corchetes y el símbolo
  13991. {#1063,.} (punto).
  13992.  
  13993. Por ejemplo, si se inicializaran dos ventanas de scroll, la número 0 y la
  13994. número 1, se podría acceder al campo {camera} de ambas ventanas como
  13995. {scroll[0].camera} y {scroll[1].camera}, respectivamente. Cuando se acceda a la
  13996. ventana número 0 de scroll se puede, además, omitir el número de
  13997. ventana entre corchetes, es decir, que la variable {scroll.camera} y la variable
  13998. {scroll[0].camera} son, a todos los efectos, la misma para el lenguaje.
  13999.  
  14000. {/}
  14001.  
  14002. {Se muestra a continuación una descripción detallada de cada campo.}
  14003.  
  14004. {x0, y0} - Coordenadas del primer plano de scroll, cuando es scroll {NO} es
  14005. automático (no se ha definido el campo {camera}), {éstos son los campos que
  14006. se deberán modificar para mover el primer plano de la ventana de scroll}.
  14007.  
  14008. Estos dos campos almacenan las coordenadas horizontal y vertical de la esquina
  14009. superior izquierda de la ventana de scroll (el punto del gráfico del primer
  14010. plano que se verá en la esquina superior izquierda de la ventana).
  14011.  
  14012. Cuando se haya definido el campo {camera} de esta estructura, el movimiento
  14013. de la ventana de scroll será automático, por lo que estos campos serán
  14014. sólo de lectura; para poder comprobar donde está situado el scroll en cada
  14015. momento (ver la función {#140,move_scroll()}).
  14016.  
  14017. {/}
  14018.  
  14019. {x1, y1} - Coordenadas del segundo plano, cuando se haya definido un gráfico
  14020. para el segundo plano. Cuando el scroll {NO} es automático (no se ha definido
  14021. el campo {camera}), {éstos son los campos que se deberán modificar para mover
  14022. el plano de fondo de la ventana de scroll}.
  14023.  
  14024. Cuando se haya definido el campo {camera} de esta estructura, el movimiento
  14025. de la ventana de scroll será automático, por lo que estos campos serán
  14026. sólo de lectura, determinándose la velocidad de movimento del segundo plano
  14027. en función del campo {ratio} de esta misma estructura.
  14028.  
  14029. {/}
  14030.  
  14031. {z} - Prioridad de impresión del scroll, aquí se indica en que plano de profundidad
  14032. se debe pintar esta ventana, respecto al resto de procesos. Por defecto, esta
  14033. variable valdrá {512}, lo cual quiere decir que como los procesos por defecto
  14034. tienen su variable {#1125,local z} a {0}, la ventana de scroll se pintará en un plano
  14035. de profundidad mayor, más al fondo, visualizándose los gráficos de los procesos
  14036. por encima de la ventana. Para variar esta situación se puede modificar la
  14037. variable {z} de la ventana (por ejemplo, ponerla a{ -1}) o la variable {z} de
  14038. los procesos (por ejemplo, ponerla a {600}).
  14039.  
  14040. {/}
  14041.  
  14042. {camera} - Este campo no es necesario inicializarlo, se inicializará cuando
  14043. se quiera que el scroll sea {automático}, esto es, que el sistema se encargue
  14044. de que éste siga siempre a un proceso (un gráfico del juego). Para ello, se
  14045. debe poner en este campo el {#1039,código identificador} del proceso; sólo
  14046. con esto, el desplazamiento de la ventana de scroll pasará a ser controlado
  14047. automáticamente por el sistema, intentando centrar el gráfico de dicho proceso
  14048. siempre en la ventana. Este proceso debe tener la variable local {#1122,ctype}
  14049. con el valor {#1168,c_scroll}.
  14050.  
  14051. Por defecto este campo valdrá {0}, lo que implica que el scroll no seguirá a
  14052. ningún proceso, a no ser que se asigne el {#1039,código identificador} de uno
  14053. a {camera}. Cuando se haga esto, se denominará a este proceso como el {proceso
  14054. cámara} del scroll.
  14055.  
  14056. {Nota:} A continuación se muestra una serie de campos {sólo para ventanas de
  14057. scroll automático}; esto quiere decir que para que dichos campos tengan sentido
  14058. (y, por consiguiente, efecto) se debe haber definido previamente el campo
  14059. {camera} de esta estructura con el {#1039,código identificador} del proceso
  14060. que se va a centrar en el scroll. Estos valores afectarán a la forma en la
  14061. que se va a hacer este seguimiento al proceso denominado {cámara del scroll}.
  14062.  
  14063. {/}
  14064.  
  14065. {ratio} - {Ventanas de scroll automático}. Cuando se hayan definido dos planos
  14066. de scroll en la llamada a la función {#163,start_scroll()}, en este campo
  14067. se puede definir la {velocidad de movimiento del plano del fondo} respecto
  14068. a la del primer plano. Por defecto, este valor será {200} lo que implicará
  14069. que el plano de fondo se moverá a la mitad de velocidad del primer plano;
  14070. si se define como {400} se moverá a la cuarta parte (cuatro veces más lento),
  14071. {100} a la misma velocidad, {50} al doble de velocidad que el primer plano, etc.
  14072.  
  14073. {/}
  14074.  
  14075. {speed} - {Ventanas de scroll automático}. Velocidad máxima del primer plano
  14076. de scroll, por defecto valdrá {0}, lo que quiere decir que no se impone ningún
  14077. límite de velocidad. Si se impone un límite, especificando el número de puntos máximo
  14078. que puede desplazarse el primer plano por cada imagen del juego, se descentrará
  14079. el {proceso cámara} de la ventana de scroll cuando éste se mueva a una velocidad mayor.
  14080.  
  14081. {/}
  14082.  
  14083. {region1} - {Ventanas de scroll automático}. Región de bloqueo del scroll, cuyo
  14084. valor, por defecto, es{ -1} lo que implica que no hay ninguna región de bloqueo.
  14085. Si se define este campo con un número de región (una zona rectangular de la
  14086. pantalla definida previamente con la función {#106,define_region()}), entonces
  14087. el sistema no moverá el scroll mientras el {proceso cámara} permanezca dentro
  14088. de la misma.
  14089.  
  14090. {/}
  14091.  
  14092. {region2} - {Ventanas de scroll automático}. Region exterior del scroll; por
  14093. defecto su valor es{ -1}, lo que implica que no hay una región exterior.
  14094. Si se define este campo con un número de región y se ha definido una {velocidad
  14095. máxima} en el campo {speed}, entonces el sistema ignorará dicho límite de
  14096. velocidad cuando el proceso{ cámara} vaya a salirse de esta región (ésto se hace para
  14097. no perder de vista al proceso (para que su gráfico siempre sea visible dentro
  14098. de la ventana de scroll).
  14099.  
  14100. {Nota:} Si se definen las dos regiones ({region1} y {region2}), normalmente la región
  14101. 1 es menor que la región 2 (está contenida en ella), esto implicará que:
  14102.  
  14103. - No se desplazará el gráfico de fondo (no se hará scroll) mientras el gráfico
  14104. del proceso cámara esté dentro de la región 1.
  14105.  
  14106. - Si se ha definido una velocidad máxima ({speed}), entonces se hará scroll para
  14107. intentar devolver el gráfico del proceso cámara a la región 1, pero sin sobrepasar
  14108. el límite de velocidad impuesto.
  14109.  
  14110. - Si el gráfico del proceso cámara intentara salirse de la región 2, se
  14111. ignoraría el límite de velocidad impuesto, para no permitirlo.
  14112.  
  14113. {/}Ver: {#1200,Datos globales} - {#163,start_scroll()} - {#166,stop_scroll()}
  14114.  
  14115. # ─────────────────────────────────────────────────────────────────────────────
  14116.  
  14117. {.1102,GLOBAL STRUCT m7}
  14118. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  14119.  
  14120. {STRUCT m7[9];}·
  14121.     {camera;}   // {#1039,Código identificador} de la cámara·
  14122.     {height;}   // Altura de la cámara·
  14123.     {distance;} // Distancia de la cámara·
  14124.     {horizon;}  // Altura del horizonte·
  14125.     {focus;}    // Focal de visión·
  14126.     {z;}        // Plano de profundidad·
  14127.     {color;}    // Color del exterior·
  14128. {END}·
  14129.  
  14130. Esta estructura de {10} registros contiene ciertos campos relacionados
  14131. con parámetros modificables de las {ventanas de modo 7}. Los diez
  14132. registros tienen los mismos nombres de campos, pero cada uno de
  14133. ellos modifica los parámetros de una ventana de modo 7 diferente
  14134. (ya que pueden activarse hasta 10 ventanas de este tipo).
  14135.  
  14136. Una {ventana de modo 7} se podría definir como una región de pantalla que
  14137. muestra un plano gráfico tridimensionalmente abatido. Por ejemplo como
  14138. una hoja de papel con un dibujo que pusieramos horizontal, visualizándose
  14139. en pantalla como un suelo (o techo) virtual.
  14140.  
  14141. Para que un registro (del {0} al {9}) de la {estructura m7} tenga sentido,
  14142. primero debe activarse dicha {ventana de modo 7} (del {0} al {9}) con la
  14143. función {#162,start_mode7()} (ver esta función para más información sobre
  14144. las ventanas de modo 7}.
  14145.  
  14146. Se entiende que los campos de esta estructura son complementarios a los
  14147. parámetros de llamada de esta última función. Para poder observar un ejemplo
  14148. práctico de un modo 7, se puede acceder a la ayuda sobre la función
  14149. {#162,start_mode7()}.
  14150.  
  14151. {/}
  14152.  
  14153. {Forma de uso de la estructura m7:}
  14154.  
  14155. Para acceder a estos campos se debe preceder el nombre del campo
  14156. por la palabra {m7}, el número de registro entre corchetes y el símbolo
  14157. {#1063,. (punto)}.
  14158.  
  14159. Por ejemplo, si se inicializaran dos ventanas de modo-7, la número 0 y la
  14160. número 1, se podría acceder a la variable {camera} de ambas ventanas como
  14161. {m7[0].camera} y {m7[1].camera}, respectivamente. Cuando se acceda a la
  14162. ventana número 0 de modo-7 se puede, además, omitir el número de
  14163. ventanas entre corchetes, es decir, que la variable {m7.camera} y la variable
  14164. {m7[0].camera} son, a todos los efectos, la misma para el lenguaje.
  14165.  
  14166. {/}
  14167.  
  14168. {Se muestra a continuación una descripción detallada de cada campo.}
  14169.  
  14170. {camera} - {#1039,Código identificador del proceso} al que sigue la cámara. Para mover
  14171. la cámara que controla la visión del modo-7, únicamente se debe crear un proceso
  14172. de modo-7, un proceso que tenga su variable local {#1122,ctype} {=} {#1169,c_m7}, y poner
  14173. su {#1039,código identificador} en la variable {camera} de esta estructura.
  14174. Tras esto, símplemente se deben modificar las variables locales {#1123,x}, {#1124,y} e {#1129,angle} de
  14175. este proceso y, por ejemplo, utilizar la función {#101,advance()} para mover hacia
  14176. delante la cámara.
  14177.  
  14178. El campo {camera} es {imprescindible} inicializarlo para que
  14179. se active la ventana de modo 7; sin este campo, la ventana no puede determinar
  14180. desde dónde se debe {ver} el plano abatido.
  14181.  
  14182. {/}
  14183.  
  14184. {height} - Altura de la cámara. Esta variable de la estructura regula la
  14185. distancia a la que se sitúa del suelo la cámara, por defecto su valor es {32}.
  14186. Cualquier número positivo hará que se sitúe la cámara más arriba cuanto mayor
  14187. sea el número. Si el valor puesto en el campo {height} de esta misma estructura
  14188. es negativo, menor que cero, entonces la cámara se situará por debajo del
  14189. plano abatido, mostrándose un "{techo}" en lugar de un "{suelo}".
  14190.  
  14191. Se pueden crear dos modos-7 dentro de la misma región: uno
  14192. como techo y otro como suelo (uno con {height} positiva y otro negativa). En
  14193. este caso, es importante fijar la variable {z} de la {#1102,estructura m7} de
  14194. ambos para, de esta forma, determinar en qué plano de profundidad se debe
  14195. pintar cada uno.
  14196.  
  14197. {/}
  14198.  
  14199. {distance} - Distancia de la cámara al proceso seguido. El punto de vista
  14200. de la cámara siempre se situará un poco por detrás del proceso cuyo identificador
  14201. se ha puesto en el campo {camera} de la estructura. Esto se hace para que se vea el gráfico
  14202. del proceso utilizado como cámara, en el caso de que este proceso lo tenga definido
  14203. (en su variable local {#1126,graph} o {#1132,xgraph}).
  14204.  
  14205. Por defecto, la cámara se situará a {64} puntos por detrás del proceso. Se
  14206. entiende por "detrás", a un punto situado a la distancia indicada del gráfico
  14207. en el ángulo contrario al que esté orientado el proceso; por ejemplo, si el
  14208. proceso está mirando a la derecha, 64 puntos a la izquierda del mismo.
  14209.  
  14210. {/}
  14211.  
  14212. {horizon} - Altura del horizonte. Éste es el mismo valor que se indicaba como
  14213. último parámetro de la función {start_mode7()}; su valor inicial será el que
  14214. se indicó en la llamada a esta función. La utilidad de esta variable es el poder hacer que
  14215. suba o baje el horizonte en cada visualización (imagen) del juego según las necesidades
  14216. de éste.
  14217.  
  14218. Al variar la {altura del horizonte} se conseguirá en la {ventana de modo 7}
  14219. el efecto de "{mirar hacia arriba}" y "{mirar hacia abajo}".
  14220.  
  14221. {/}
  14222.  
  14223. {focus} - Focal para la cámara. Esta variable controla la perspectiva de la
  14224. cámara; por defecto, su valor es 256 pero se puede poner cualquier valor entre
  14225. {0} y {512}, consiguiendo diversos efectos de deformación del plano
  14226. tridimensional.
  14227.  
  14228. Es decir, este campo controla el ángulo que capta el foco de la cámara; cuanto
  14229. mayor sea este valor, más cerca se verán todos los objetos (procesos) situados
  14230. en el plano abatido.
  14231.  
  14232. {/}
  14233.  
  14234. {z} - Prioridad de impresión del modo-7, aquí se indica en qué plano de profundidad
  14235. se debe pintar esta ventana, respecto al resto de procesos. Por defecto, esta
  14236. variable valdrá {256} lo cual quiere decir que, como los procesos por defecto
  14237. tienen su variable {#1125,local z} a {0}, la ventana de modo-7 se pintará en un plano
  14238. de profundidad mayor, más al fondo, visualizándose los gráficos de los procesos
  14239. por encima de la ventana. Para variar esta situación se puede modificar la
  14240. variable {z} de la ventana (por ejemplo ponerla a{ -1}) o la variable {z} de
  14241. los procesos (por ejemplo ponerla a {257}).
  14242.  
  14243. {/}
  14244.  
  14245. {color} - Color para el exterior del modo-7. Cuando en la llamada a la función {start_mode7()}
  14246. no se especifique ningún {gráfico exterior} (se ponga a {0} el cuarto
  14247. parámetro de llamada), esta variable controlará de qué color se quiere pintar
  14248. el exterior, es decir, de qué color debe ser la pantalla más allá del gráfico
  14249. que se está abatiendo (más alla de sus límites).
  14250.  
  14251. Este campo está inicializado por defecto a {0} que, normalmente, es el color
  14252. negro en la paleta de colores, por lo que, si no se asigna a este campo otro
  14253. valor (y no se define un gráfico exterior) se verá la pantalla en negro más
  14254. allá del plano principal.
  14255.  
  14256. {/}Ver: {#1200,Datos globales} - {#162,start_mode7()} - {#165,stop_mode7()}
  14257.  
  14258. # ─────────────────────────────────────────────────────────────────────────────
  14259.  
  14260. {.1103,GLOBAL STRUCT joy}
  14261. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  14262.  
  14263. {STRUCT joy;}·
  14264.     {left;}    // Control izquierda·
  14265.     {right;}   // Control derecha·
  14266.     {up;}      // Control arriba·
  14267.     {down;}    // Control abajo·
  14268.     {button1;} // Primer botón·
  14269.     {button2;} // Segundo botón·
  14270.     {button3;} // Tercer botón·
  14271.     {button4;} // Cuarto botón·
  14272. {END}·
  14273.  
  14274. Esta estructura global sirve para controlar el {joystick} (palanca de
  14275. juegos); contiene una serie de campos lógicos relacionados con la programación
  14276. de este dispositivo que son el estado de los botones (si se encuentran pulsados
  14277. o no) y el estado de las cuatro direcciones de control principales.
  14278.  
  14279. Para acceder a estos campos se debe preceder el nombre del campo
  14280. por la palabra {joy} y el símbolo {#1063,. (punto)}, por ejemplo, para
  14281. acceder al campo {left} (que indica si se está pulsando el control izquierda)
  14282. se debe utilizar {joy.left}.
  14283.  
  14284. {/}
  14285.  
  14286. {left} - Este campo estará a {1} cuando el {joystick} esté orientado hacia la
  14287. {izquierda}, y a {0} en caso contrario.
  14288.  
  14289. {right}  - Este campo estará a {1} cuando el {joystick} esté orientado hacia la
  14290. {derecha}, y a {0} en caso contrario.
  14291.  
  14292. {up}  - Este campo estará a {1} cuando el {joystick} esté orientado hacia
  14293. {arriba}, y a {0} en caso contrario.
  14294.  
  14295. {down}  - Este campo estará a {1} cuando el {joystick} esté orientado hacia
  14296. {abajo}, y a {0} en caso contrario.
  14297.  
  14298. Por ejemplo, para realizar en un programa una acción {cuando se mueva
  14299. el joystick hacia la derecha} ({joy.right}) se debe incluir en el código
  14300. una sentencia como la siguiente:
  14301.  
  14302.   {IF (joy.right)}·
  14303.     // Acción a realizar (sentencias)·
  14304.   {END}·
  14305.  
  14306. Para las posiciones en diagonal se deben comprobar los dos campos que
  14307. conforman esa diagonal; por ejemplo, para realizar una acción cuando el
  14308. {joystick} esté en la diagonal superior derecha se utilizará la siguiente
  14309. sentencia:
  14310.  
  14311.   {IF (joy.up AND joy.right)}·
  14312.     // Acción a realizar (sentencias)·
  14313.   {END}·
  14314.  
  14315. {/}
  14316.  
  14317. {button1}, {button2}, {button3} y {button4} - Estos campos indican el estado
  14318. de hasta cuatro botones del joystick, estando a {1} cuando el botón respectivo
  14319. esté pulsado, y a {0} cuando no lo esté.
  14320.  
  14321. Algunos joystick sólo tienen 2 botones; en este caso, serán los botones
  14322. número 0 y 1. En ordenadores con dos joystick conectados el segundo joystick
  14323. tendrá los botones número 2 y 3.
  14324.  
  14325. {/}
  14326.  
  14327. {Nota:} Cuando se requiera una lectura analógica del {joystick} (conocer las
  14328. coordenadas exactas en las que está situada la "palanca" del joystick), se
  14329. deberá utilizar la función {#122,get_joy_position()}. Obviamente, esta función
  14330. será util únicamente en {joystick} analógicos, no funcionando en los digitales.
  14331.  
  14332. {/}Ver: {#1200,Datos globales} - {#122,get_joy_position()} - {#121,get_joy_button()}
  14333.  
  14334. # ─────────────────────────────────────────────────────────────────────────────
  14335.  
  14336. {.1104,GLOBAL STRUCT setup}
  14337. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  14338.  
  14339. {STRUCT setup;}·
  14340.     {card;}     // Tipo de tarjeta·
  14341.     {port;}     // Puerto de acceso·
  14342.     {irq;}      // Interrupción requerida·
  14343.     {dma;}      // Canal de acceso a memoria·
  14344.     {dma2;}     // Canal de acceso de 16 bit·
  14345.     {master;}   // Volumen maestro (general)·
  14346.     {sound_fx;} // Volumen de los efectos·
  14347.     {cd_audio;} // Volumen de música CD·
  14348. {END}·
  14349.  
  14350. Esta estructura de datos es de nivel muy avanzado y no es en absoluto
  14351. necesaria para crear ningún juego, por complejo que éste sea, ya que el
  14352. gestor de procesos de DIV Games Studio se encargará, normalmente, del hardware
  14353. de sonido de forma transparente.
  14354.  
  14355. Todos los campos referentes al hardware de sonido se actualizan de manera
  14356. automática por el programa si se tiene una tarjeta de sonido, siempre y
  14357. cuando se tenga la variable de entorno {BLASTER} o {GRAVIS} debidamente
  14358. inicializada.
  14359.  
  14360. Esta estructura de un único registro contiene una serie de campos divididos
  14361. en dos grupos: los primeros para activar nuevos parámetros del hardware de
  14362. sonido instalado en el ordenador y los segundos para ajustar los diferentes
  14363. controles de volumen gestionados por el mezclador ({mixer}) del sistema de
  14364. sonido.
  14365.  
  14366. {/}
  14367.  
  14368. {Importante:}
  14369.  
  14370. Para activar los nuevos parámetros del hardware de sonido que se introduzcan
  14371. en esta estructura (en los campos {card}, {port}, {irq}, {dma} y {dma2}) se debe
  14372. llamar a la función {#175,reset_sound()}.
  14373.  
  14374. Para activar los nuevos niveles de volumen que se introduzcan en la estructura
  14375. (en los campos {master}, {sound_fx} y {cd_audio}) se debe llamar a la función
  14376. {#178,set_volume()}.
  14377.  
  14378. Esta estructura se utiliza generalmente dentro de los programas de configuración
  14379. del sistema de sonido (ver {#1093,setup_program}).
  14380.  
  14381. {Nota:} Para acceder a estos campos se debe preceder el nombre del campo
  14382. por la palabra {setup} y el símbolo {#1063,. (punto)}; por ejemplo, para
  14383. acceder al campo {master} (que indica el nivel de volumen general del mezclador)
  14384. se debe utilizar {setup.master}.
  14385.  
  14386. {/}
  14387.  
  14388. Se muestra, a continuación, una descripción algo más detallada de cada uno
  14389. de los campos de esta estructura.
  14390.  
  14391. {card} - Indica el tipo de tarjeta de sonido instalada en el ordenador.
  14392. El programa admite tarjetas de las familias {Sound Blaster} (tm) y {Gravis Ultra
  14393. Sound} (tm) y todas las que sean compatibles {100%} con éstas.
  14394.  
  14395. Los valores que puede tomar este campo son los siguientes, depediendo del tipo
  14396. de tarjeta de sonido:
  14397.  
  14398.     Sin tarjeta o sin sonido = {0}·
  14399.     Sound Blaster 1.5        = {1}·
  14400.     Sound Blaster 2.0        = {2}·
  14401.     Sound Blaster Pro        = {3}·
  14402.     Sound Blaster 16         = {4}·
  14403.     Sound Blaster AWE        = {5}·
  14404.     Gravis Ultra Sound       = {6}·
  14405.     Gravis Ultra Sound MAX   = {7}·
  14406.  
  14407. {/}
  14408.  
  14409. {port} - Indica el puerto de comunicaciones del ordenador en el cual se
  14410. deben escribir y leer los datos de la tarjeta de sonido.
  14411.  
  14412. Los valores que puede tomar este campo son los siguientes, dependiendo del
  14413. puerto asignado al hardware de sonido:
  14414.  
  14415.     0x210 = {0}·
  14416.     0x220 = {1}·
  14417.     0x230 = {2}·
  14418.     0x240 = {3}·
  14419.     0x250 = {4}·
  14420.     0x260 = {5}·
  14421.  
  14422. {/}
  14423.  
  14424. {irq} - Este campo indica el número de interrupción o IRQ (Interrupt request)
  14425. asignado a la tarjeta de sonido activa.
  14426.  
  14427. Los valores que puede tomar este campo son, dependiendo de la interrupción
  14428. utilizada por la tarjeta, los siguientes:
  14429.  
  14430.     IRQ 2   = {0}·
  14431.     IRQ 3   = {1}·
  14432.     IRQ 5   = {2}·
  14433.     IRQ 7   = {3}·
  14434.     IRQ 10  = {4}·
  14435.     IRQ 11  = {5}·
  14436.     IRQ 12  = {6}·
  14437.     IRQ 13  = {7}·
  14438.     IRQ 14  = {8}·
  14439.     IRQ 15  = {9}·
  14440.  
  14441. {/}
  14442.  
  14443. {dma} - En este campo se debe indicar el número de canal de acceso directo
  14444. a memoria (DMA) que utiliza la tarjeta de sonido.
  14445.  
  14446. Este campo puede tomar valores de 0 a 10, dependiendo directamente del número
  14447. de canal.
  14448.  
  14449. {/}
  14450.  
  14451. {dma2} - Algunas tarjetas de sonido tienen disponible un segundo canal de
  14452. acceso directo a memoria más rápido que el anterior, de 16 bits, denominado
  14453. comúnmente HDMA, DMA2 o DMA16.
  14454.  
  14455. Como el campo anterior de esta estructura, éste podrá tomar valores del 0
  14456. al 10 dependiendo del número de canal de 16 bits utilizado por la tarjeta.
  14457.  
  14458. {/}
  14459.  
  14460. {master} - Este campo contiene el volumen general o maestro de salida de la
  14461. tarjeta. Aquí se debe indicar un número entre 0 (volumen mínimo) y 15 (volumen
  14462. máximo). El valor por defecto es {15}, el volumen máximo.
  14463.  
  14464. Si se disminuye el volumen maestro afectará tanto al volumen de los efectos
  14465. de sonido como al volumen de reproducción de la música de cd audio.
  14466.  
  14467. {/}
  14468.  
  14469. {sound_fx} - Este campo controla el volumen al que los efectos de sonido que
  14470. se ejecutan con la función {#159,sound()} son reproducidos.
  14471.  
  14472. Este volumen es independiente del utilizado con las funciones de sonido
  14473. siendo, este volumen, general para todos los efectos de sonido y el indicado
  14474. en las funciones el específico para cada sonido.
  14475.  
  14476. Este campo también puede oscilar entre 0 (volumen mínimo) y 15 (volumen
  14477. máximo), siendo el valor por defecto el volumen máximo.
  14478.  
  14479. {/}
  14480.  
  14481. {cd_audio} - Este campo controla el volumen de la música que será reproducida
  14482. a partir de pistas de audio de un CD ROM o de un Compact Disc.
  14483.  
  14484. Al igual que los dos campos anteriores, este campo también puede oscilar
  14485. entre 0 (volumen mínimo) y 15 (volumen máximo) siendo el valor por defecto
  14486. el volumen máximo.
  14487.  
  14488. {/}Ver: {#1200,Datos globales} - {#175,reset_sound()} - {#178,set_volume()}
  14489.  
  14490. # ─────────────────────────────────────────────────────────────────────────────
  14491.  
  14492. {.1105,GLOBAL timer[]}
  14493. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  14494.  
  14495. {timer[9];} // Contadores de tiempo{/}.
  14496.  
  14497. Ésta es una tabla global con 10 posiciones, desde {timer[0]} hasta {timer[9]},
  14498. y cada una de estas 10 posiciones es un contador de {centésimas de segundo} que
  14499. se va incrementando automáticamente.
  14500.  
  14501. Al comienzo del programa estos 10 contadores serán puestos a cero. Se utilizan
  14502. para cronometrar tiempos dentro de un programa, para lo que pueden ser puestos
  14503. a cero en cualquier momento.
  14504.  
  14505. Se dispone de 10 contadores para que el usuario pueda dedicar cada uno de ellos
  14506. a realizar una cuenta diferente dentro del juego; es indiferente cuáles de los
  14507. 10 contadores se utilicen. Normalmente, si el programa necesita un solo contador
  14508. (en la mayoría de ocasiones) se suele utilizar el número {0} ({timer[0]}), ya
  14509. que el lenguaje permite omitir el cero entre corchetes en este caso, es decir,
  14510. si únicamente se necesita un contador, se puede utilizar simplemente {timer}.
  14511.  
  14512. Por ejemplo, para implementar un proceso que a los 5 segundos del inicio de
  14513. su ejecución (de haberlo llamado) realizara una acción determinada, se
  14514. construiría el mismo de una forma similar a ésta (utilizando, por ejemplo,
  14515. el contador timer[9]):
  14516.  
  14517.  {PROCESS proceso_ejemplo();}·
  14518.  {BEGIN}·
  14519.      {timer[9]=0;}·
  14520.      // ...·
  14521.      {LOOP}·
  14522.          {IF (timer[9]>=500)}·
  14523.              // Acción a realizar ...·
  14524.          {END}·
  14525.          // ...·
  14526.          {FRAME;}·
  14527.      {END}·
  14528.  {END}·
  14529.  
  14530. {/}
  14531.  
  14532. {Nota 1:} Como la cuenta se realiza en centésimas de segundo, en cada imagen del juego
  14533. estos contadores se pueden incrementar en {1} centésima, {2}, {3}, {4}, etc., es decir,
  14534. en un ejemplo como el anterior no se puede esperar a que {timer[9]} sea
  14535. exactamente igual a {500}, ya que una imagen podría indicar {497} centésimas
  14536. transcurridas (desde su puesta a cero con {timer[9]=0;}) y la siguiente
  14537. imagen {502} centésimas, sin haber pasado por el valor {500}.
  14538.  
  14539. {/}
  14540.  
  14541. {Nota 2:} Es también importante resaltar que se deben tomar precauciones para que no
  14542. haya en el programa varios procesos utilizando el mismo contador para diferentes
  14543. fines.
  14544.  
  14545. Si, por ejemplo, se creara un {proceso_ejemplo()} (como el anterior), en cada imagen del juego
  14546. éstos no llegarían nunca a ejecutar la acción de los cinco segundos, ya que
  14547. cada uno de ellos pondría a {0} el contador {timer[9]} al comienzo de su
  14548. ejecución invalidando, de esta forma, la cuenta de los procesos anteriores.
  14549.  
  14550. Teniendo en cuenta que el contador timer[9] es {#1006,GLOBAL}, es decir, es el mismo para todos los
  14551. procesos del juego, si un proceso lo pone a {0}, lo pondrá a {0} para
  14552. el resto de los procesos.
  14553.  
  14554. {/}
  14555.  
  14556. {Nota 3:} Por último se debe tener cuidado con las condiciones similares
  14557. a la del ejemplo anterior ({IF (timer[9]>=500) ... }) ya que estas condiciones
  14558. no se activarán únicamente {una vez a los 5 segundos}, sino que se activarán
  14559. {todas las veces después de los primeros 5 segundos}.
  14560.  
  14561. Para poder comprender mejor el problema, se muestra a continuación un proceso
  14562. que realiza una acción, {únicamente una vez}, a los cinco segundos de haberse
  14563. iniciado su ejecución.
  14564.  
  14565.  {PROCESS proceso_ejemplo();}·
  14566.  
  14567.  {PRIVATE}·
  14568.      {acción_realizada=FALSE;}·
  14569.  
  14570.  {BEGIN}·
  14571.      {timer[9]=0;}·
  14572.      // ...·
  14573.      {LOOP}·
  14574.          {IF (timer[9]>=500) AND NOT acción_realizada)}·
  14575.              // Acción a realizar ...·
  14576.              {acción_realizada=TRUE;}·
  14577.          {END}·
  14578.          // ...·
  14579.          {FRAME;}·
  14580.      {END}·
  14581.  {END}·
  14582.  
  14583. Se utiliza una variable privada denominada {acción_realizada} que, en un
  14584. principio, será {falsa}. Para realizar la acción ahora se requerirá que
  14585. hayan pasado más de cinco segundos y que {no se haya realizado ya la acción}.
  14586. Tras realizar ésta, se pondrá por tanto la variable {acción_realizada} a {cierto}.
  14587.  
  14588. Para que el ejemplo anterior ejecutara la acción {cada cinco segundos}
  14589. (indefinidamente), bastaría con volver a poner la sentencia {timer[9]=0;}
  14590. tras la {acción a realizar}, no siendo necesaria, en esta caso, la variable
  14591. privada {acción_realizada} ya que se necesitarían otros {5} segundos para
  14592. que {timer[9]} fuera otra vez mayor o igual que {500}.
  14593.  
  14594. {/}Ver: {#1200,Datos globales}
  14595.  
  14596. # ─────────────────────────────────────────────────────────────────────────────
  14597.  
  14598. {.1106,GLOBAL text_z}
  14599. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  14600.  
  14601. {text_z=-256;} // Plano de profundidad de los textos{/}.
  14602.  
  14603. En esta variable global se indica el plano de profundidad en el que deben
  14604. aparecer los textos en pantalla, esto es, qué debe aparecer por encima de
  14605. los textos y qué por debajo.
  14606.  
  14607. Los planos de profundidad pueden ser cualquier número entero dentro
  14608. del rango ({#1177,min_int} ... {#1178,max_int}) y, cuanto mayor sea el
  14609. número, más al fondo se situará el texto o gráfico.
  14610.  
  14611. Los gráficos de los procesos tienen su variable {#1125,local z} a {0} por
  14612. defecto, los textos {text_z} a{ -256} y el puntero del ratón tiene
  14613. {#1100,mouse.z} a{ -512} por defecto.
  14614.  
  14615. Esto quiere decir que, por defecto, si no se no modifican estos valores,
  14616. aparecerán los textos sobre los gráficos de los procesos y el puntero del
  14617. ratón sobre los textos.
  14618.  
  14619. Si, por ejemplo, se quisiera que aparecieran los textos sobre el puntero
  14620. del ratón (al revés de lo establecido por defecto), se podrían hacer dos cosas:
  14621.  
  14622. {a)} Situar el plano del puntero más abajo que el plano de los textos (un
  14623. número mayor), como por ejemplo: {mouse.z=-200;} (ya que{ -200} es un número
  14624. mayor que{ -256}).
  14625.  
  14626. {b)} Situar el plano de los textos más arriba que el plano del puntero, como
  14627. por ejemplo {text_z=-600;} ya que{ -600} es un número menor que{ -512} y,
  14628. por tanto, un plano de profundidad menor (menos profundo).
  14629.  
  14630. {/}
  14631.  
  14632. {Nota 1:} La variable {text_z} es {#1006,GLOBAL} para todos los textos, es decir, no
  14633. se pueden definir textos en diferentes planos de profundidad.
  14634.  
  14635. {Nota 2:} Los textos únicamente pueden imprimirse con la función {#171,write()}
  14636. (textos alfanuméricos) o con la función {#172,write_int()} (valores numéricos de variables).
  14637.  
  14638. {/}Ver: {#1200,Datos globales} - {#171,write()} - {#172,write_int()}
  14639.  
  14640. # ─────────────────────────────────────────────────────────────────────────────
  14641.  
  14642. {.1107,GLOBAL fading}
  14643. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  14644.  
  14645. {fading=FALSE;} // Indicador de fundido de pantalla{/}.
  14646.  
  14647. Esta variable global indica si se está realizando un fundido de pantalla
  14648. (una variación gradual de la paleta de colores del juego) en un momento
  14649. determinado, cuyo valor será:
  14650.  
  14651. {#1152,false (0)} - Si {no} se está realizando un fundido.
  14652.  
  14653. {#1151,true (1)} - Si se está realizando un fundido.
  14654.  
  14655. La finalidad de esta variable es poder determinar cuándo ha finalizado un
  14656. fundido de pantalla iniciado con las funciones {#110,fade()} o {#112,fade_on()}.
  14657.  
  14658. Al utilizar estas funciones se iniciará un fundido de los colores de la paleta
  14659. que se irán acercando gradualmente a los colores definitivos en las siguientes
  14660. imágenes del juego, es decir, cada sentencia {#1029,FRAME} se realizará una
  14661. parte del fundido.
  14662.  
  14663. Cuando se inicie un fundido, la variable {fading} pasará automáticamente a
  14664. valer {cierto} (1) y al finalizar éste, volverá de nuevo a su valor original,
  14665. {falso} (0).
  14666.  
  14667. {/}
  14668.  
  14669. {Nota 1:} Generalmente, esta variable se utiliza para controlar a la función {#110,fade()},
  14670. y comprobar si ha terminado de ejecutarse (si ha terminado de realizarse
  14671. el fundido); cuando se quiera, por ejemplo, detener la ejecución del programa
  14672. hasta que finalice el fundido, lo que se puede hacer con una sentencia como
  14673. la siguiente (justo a continuación de la llamada a la función {#110,fade()}):
  14674.  
  14675.   {WHILE (fading)}·
  14676.       {FRAME;}·
  14677.   {END}·
  14678.  
  14679. Literalmente esta sentencia define: "{mientras continúe realizándose el
  14680. fundido, se debe visualizar otra nueva imagen}".
  14681.  
  14682. {Nota 2:} Todos los programas realizan un fundido ({#112,fade_on()}) al
  14683. inicio de su ejecución (automáticamente), por lo que esta variable se
  14684. pondrá a {cierto (1)} al inicio de todos los programas hasta que finalice este
  14685. fundido inicial (mientras dure el "{encendido}" de pantalla).
  14686.  
  14687. {/}Ver: {#1200,Datos globales} - {#110,fade()} - {#112,fade_on()}
  14688.  
  14689. # ─────────────────────────────────────────────────────────────────────────────
  14690.  
  14691. {.1108,GLOBAL shift_status}
  14692. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  14693.  
  14694. {shift_status=0;} // Estado de las teclas especiales{/}.
  14695.  
  14696. En esta variable global predefinida se indica el estado de distintas
  14697. teclas especiales como pueden ser las teclas [{ALT}], [{CONTROL}], etc.
  14698.  
  14699. Cada una de estas teclas tiene asignado un código que es el siguiente:
  14700.  
  14701. Tecla SHIFT o mayúsculas derecho          = {1}·
  14702. Tecla SHIFT o mayúsculas izquierdo        = {2}·
  14703. Teclas CONTROL                            = {4}·
  14704. Teclas ALT y/o ALT GR                     = {8}·
  14705. Tecla BLOQ DESPL o bloqueo desplazamiento = {16}·
  14706. Tecla BLOQ NUM o de bloque numérico       = {32}·
  14707. Tecla BLOQ MAYUS o bloqueo de mayúsculas  = {64}·
  14708. Tecla INSERT o inserción                  = {128}·
  14709.  
  14710. La variable {shift_status} contendrá la {suma de todos los códigos de las
  14711. teclas que estén pulsadas o activadas}.
  14712.  
  14713. Por ejemplo, si estuviera pulsada la tecla [{ALT}] y activada la tecla
  14714. [{BLOQ MAYUS}], la variable {shift_status} tendría el valor {72} (8+64).
  14715.  
  14716. Para comprobar si una tecla como [{ALT}] está pulsada, no se puede comprobar
  14717. que {shift_status} sea igual a {8}, ya que ésto implicaría que [{ALT}] es
  14718. la {única} tecla especial que está pulsada o activada.
  14719.  
  14720. Para realizar esta comprobación correctamente se debería realizar de la
  14721. siguiente forma:
  14722.  
  14723.   {IF (shift_status AND 8 == 8)}·
  14724.       // Está pulsada la tecla [ALT] ...·
  14725.   {END}·
  14726.  
  14727. {/}
  14728.  
  14729. {Nota:} Normalmente, para comprobar si una tecla está pulsada, se utiliza la
  14730. función {#128,key()}. Pero con esta función no se puede determinar si
  14731. teclas como {BLOQ MAYUS} están activadas, únicamente si están pulsadas o no.
  14732.  
  14733. Existen dos variables que contienen el código de la última tecla que se ha pulsado;
  14734. {#1110,scan_code} (código {scan} de la última tecla pulsada) y {#1109,ascii}
  14735. (código {ascii} de la última tecla pulsada).
  14736.  
  14737. {/}Ver: {#1200,Datos globales} - {#128,key()} - {#1109,ascii} - {#1110,scan_code}
  14738.  
  14739. # ─────────────────────────────────────────────────────────────────────────────
  14740.  
  14741. {.1109,GLOBAL ascii}
  14742. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  14743.  
  14744. {ascii=0;} // Código ASCII de la última tecla pulsada{/}.
  14745.  
  14746. Esta variable global indica siempre el código ASCII de la {última tecla
  14747. pulsada} en la última imagen del juego.
  14748.  
  14749. La variable {ascii} estará a {0} si no se ha pulsado ninguna tecla en la
  14750. imagen anterior del juego.
  14751.  
  14752. Los códigos ASCII son una relación de carácteres (letras, números y símbolos)
  14753. enumerados del {0} al {255} que se han convertido en estándar. Los códigos
  14754. inferiores al 32 son los denominados carácteres de control, del 32 al
  14755. 127 son el juego de carácteres internacional y, a partir del número 128,
  14756. aparece el juego de carácteres extendido (según el estándar de PC). A
  14757. continuación, se muestran los carácteres ASCII internacionales y extendidos.
  14758.  
  14759. {Resumen de códigos ASCII estándar del PC.}{/}033 21{ !}│097 61{ a}│161 A1{ í}│225 E1{ ß}·
  14760. 034 22{ "}│098 62{ b}│162 A2{ ó}│226 E2{ Γ}·
  14761. 035 23{ #}│099 63{ c}│163 A3{ ú}│227 E3{ π}·
  14762. 036 24{ $}│100 64{ d}│164 A4{ ñ}│228 E4{ Σ}·
  14763. 037 25{ %}│101 65{ e}│165 A5{ Ñ}│229 E5{ σ}·
  14764. 038 26{ &}│102 66{ f}│166 A6{ ª}│230 E6{ µ}·
  14765. 039 27{ '}│103 67{ g}│167 A7{ º}│231 E7{ τ}·
  14766. 040 28{ (}│104 68{ h}│168 A8{ ¿}│232 E8{ Φ}·
  14767. 041 29{ )}│105 69{ i}│169 A9{ ⌐}│233 E9{ Θ}·
  14768. 042 2A{ *}│106 6A{ j}│170 AA{ ¬}│234 EA{ Ω}·
  14769. 043 2B{ +}│107 6B{ k}│171 AB{ ½}│235 EB{ δ}·
  14770. 044 2C{ ,}│108 6C{ l}│172 AC{ ¼}│236 EC{ ∞}·
  14771. 045 2D{ -}│109 6D{ m}│173 AD{ ¡}│237 ED{ φ}·
  14772. 046 2E{ .}│110 6E{ n}│174 AE{ «}│238 EE{ ε}·
  14773. 047 2F{ /}│111 6F{ o}│175 AF{ »}│239 EF{ ∩}·
  14774. 048 30{ 0}│112 70{ p}│176 B0{ ░}│240 F0{ ≡}·
  14775. 049 31{ 1}│113 71{ q}│177 B1{ ▒}│241 F1{ ±}·
  14776. 050 32{ 2}│114 72{ r}│178 B2{ ▓}│242 F2{ ≥}·
  14777. 051 33{ 3}│115 73{ s}│179 B3{ │}│243 F3{ ≤}·
  14778. 052 34{ 4}│116 74{ t}│180 B4{ ┤}│244 F4{ ⌠}·
  14779. 053 35{ 5}│117 75{ u}│181 B5{ ╡}│245 F5{ ⌡}·
  14780. 054 36{ 6}│118 76{ v}│182 B6{ ╢}│246 F6{ ÷}·
  14781. 055 37{ 7}│119 77{ w}│183 B7{ ╖}│247 F7{ ≈}·
  14782. 056 38{ 8}│120 78{ x}│184 B8{ ╕}│248 F8{ °}·
  14783. 057 39{ 9}│121 79{ y}│185 B9{ ╣}│249 F9{ ∙}·
  14784. 058 3A{ :}│122 7A{ z}│186 BA{ ║}│250 FA{ ∙}·
  14785. 059 3B{ ;}│123 7B{ {{}}│187 BB{ ╗}│251 FB{ √}·
  14786. 060 3C{ <}│124 7C{ |}│188 BC{ ╝}│252 FC{ ⁿ}·
  14787. 061 3D{ =}│125 7D{ {}}}│189 BD{ ╜}│253 FD{ ²}·
  14788. 062 3E{ >}│126 7E{ ~}│190 BE{ ╛}│254 FE{ ■}·
  14789. 063 3F{ ?}│127 7F{ }│191 BF{ ┐}│255 FF{  }·
  14790. 064 40{ @}│128 80{ Ç}│192 C0{ └}·
  14791. 065 41{ A}│129 81{ ü}│193 C1{ ┴}·
  14792. 066 42{ B}│130 82{ é}│194 C2{ ┬}·
  14793. 067 43{ C}│131 83{ â}│195 C3{ ├}·
  14794. 068 44{ D}│132 84{ ä}│196 C4{ ─}·
  14795. 069 45{ E}│133 85{ à}│197 C5{ ┼}·
  14796. 070 46{ F}│134 86{ å}│198 C6{ ╞}·
  14797. 071 47{ G}│135 87{ ç}│199 C7{ ╟}·
  14798. 072 48{ H}│136 88{ ê}│200 C8{ ╚}·
  14799. 073 49{ I}│137 89{ ë}│201 C9{ ╔}·
  14800. 074 4A{ J}│138 8A{ è}│202 CA{ ╩}·
  14801. 075 4B{ K}│139 8B{ ï}│203 CB{ ╦}·
  14802. 076 4C{ L}│140 8C{ î}│204 CC{ ╠}·
  14803. 077 4D{ M}│141 8D{ ì}│205 CD{ ═}·
  14804. 078 4E{ N}│142 8E{ Ä}│206 CE{ ╬}·
  14805. 079 4F{ O}│143 8F{ Å}│207 CF{ ╧}·
  14806. 080 50{ P}│144 90{ É}│208 D0{ ╨}·
  14807. 081 51{ Q}│145 91{ æ}│209 D1{ ╤}·
  14808. 082 52{ R}│146 92{ Æ}│210 D2{ ╥}·
  14809. 083 53{ S}│147 93{ ô}│211 D3{ ╙}·
  14810. 084 54{ T}│148 94{ ö}│212 D4{ ╘}·
  14811. 085 55{ U}│149 95{ ò}│213 D5{ ╒}·
  14812. 086 56{ V}│150 96{ û}│214 D6{ ╓}·
  14813. 087 57{ W}│151 97{ ù}│215 D7{ ╫}·
  14814. 088 58{ X}│152 98{ ÿ}│216 D8{ ╪}·
  14815. 089 59{ Y}│153 99{ Ö}│217 D9{ ┘}·
  14816. 090 5A{ Z}│154 9A{ Ü}│218 DA{ ┌}·
  14817. 091 5B{ [}│155 9B{ ¢}│219 DB{ █}·
  14818. 092 5C{ \}│156 9C{ £}│220 DC{ ▄}·
  14819. 093 5D{ ]}│157 9D{ ¥}│221 DD{ ▌}·
  14820. 094 5E{ ^}│158 9E{ ₧}│222 DE{ ▐}·
  14821. 095 5F{ _}│159 9F{ ƒ}│223 DF{ ▀}·
  14822. 096 60{ `}│160 A0{ á}│224 E0{ α}{/}
  14823.  
  14824. Un código ASCII hace referencia, por tanto, al {carácter que ha sido producido
  14825. con la última pulsación del teclado} (o combinación de pulsaciones, en casos
  14826. como los de las letras acentuadas).
  14827.  
  14828. {/}
  14829.  
  14830. {Importante:} Existe otra variable global predefinida, denominada {#1110,scan_code}, que
  14831. también contiene el código de la última tecla pulsada pero, a diferencia de {ascii},
  14832. ésta última guarda el {código de rastreo} (scan code) de la tecla, es decir,
  14833. indica {qué tecla ha sido pulsada} y no {qué carácter ha sido generado} por
  14834. la misma (como {ascii}).
  14835.  
  14836. Existe una serie de constantes que designan estos {#1176,códigos de teclas} (códigos
  14837. de rastreo del teclado). Acceda a la ayuda sobre estos {#1176,códigos de teclas}
  14838. para observar, además, un {programa ejemplo} con las variables {ascii} y {scan_code}.
  14839.  
  14840. Normalmente, para comprobar si una tecla está siendo pulsada, se utiliza
  14841. simplemente la función {#128,key()} del lenguaje, que recibe como parámetro
  14842. uno de estos {#1176,códigos de teclas}, y devuelve {0} si la tecla no está
  14843. pulsada o {1} cuando sí lo está.
  14844.  
  14845. {/}Ver: {#1200,Datos globales} - {#1110,scan_code} - {#128,key()}
  14846.  
  14847. # ─────────────────────────────────────────────────────────────────────────────
  14848.  
  14849. {.1110,GLOBAL scan_code}
  14850. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  14851.  
  14852. {scan_code=0;} // Código de rastreo de la última tecla pulsada{/}.
  14853.  
  14854. Esta variable global indica siempre el código de rastreo (scan code) de la
  14855. {última tecla pulsada} en la última imagen del juego.
  14856.  
  14857. La variable {scan_code} estará a {0} si no se ha pulsado ninguna tecla en la
  14858. imagen anterior del juego.
  14859.  
  14860. Se utiliza muchas veces esta variable para esperar en un programa a que el
  14861. usuario pulse una tecla (cualquiera), con una sentencia como la siguiente:
  14862.  
  14863.   {WHILE (scan_code == 0)}·
  14864.       {FRAME;}·
  14865.   {END}·
  14866.  
  14867. Esta sentencia indica que mientras no se haya pulsado una tecla en la
  14868. imagen anterior (mientras {scan_code} sea igual a {0}), se deben seguir
  14869. visualizando imágenes del juego.
  14870.  
  14871. Los {códigos de rastreo} son simplemente una relación numérica de las
  14872. teclas del PC; estos códigos pueden variar ligeramente (en alguna tecla)
  14873. de un teclado a otro, ya que hay teclados de diferentes idiomas, con un
  14874. número variado de teclas, etc.
  14875.  
  14876. Sin embargo, se mantienen constantes casi todos los códigos de las principales
  14877. teclas. Hay predefinida una lista de constantes (sinónimos para estos códigos)
  14878. en el lenguaje que se puede ver accediendo a la ayuda sobre {#1176,códigos de
  14879. teclas} (o códigos de rastreo del teclado); son, precisamente, estos valores
  14880. numéricos los que serán asignados a la variable {scan_code} cuando las
  14881. respectivas teclas sean pulsadas en el programa.
  14882.  
  14883. {/}
  14884.  
  14885. {Importante:} Existe otra variable global predefinida, denominada {#1109,ascii}, que
  14886. también contiene el código de la última tecla pulsada pero, a diferencia de {scan_code},
  14887. ésta última guarda el {código ASCII} (carácter) generado por la tecla, es decir,
  14888. indica {qué carácter ha generado la última tecla pulsada} y no qué {tecla
  14889. ha sido pulsada} (como {scan_code}).
  14890.  
  14891. Acceda a la ayuda sobre los {#1176,códigos de teclas} para observar un
  14892. {programa ejemplo} con las variables {ascii} y {scan_code}.
  14893.  
  14894. Normalmente, para comprobar si una tecla está siendo pulsada se utiliza
  14895. simplemente la función {#128,key()} del lenguaje, que recibe como parámetro
  14896. uno de estos {#1176,códigos de teclas}, y devuelve {0} si la tecla no está
  14897. pulsada o {1} cuando si lo está.
  14898.  
  14899. {/}Ver: {#1200,Datos globales} - {#1109,ascii} - {#128,key()}
  14900.  
  14901. # ─────────────────────────────────────────────────────────────────────────────
  14902.  
  14903. {.1111,GLOBAL joy_filter}
  14904. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  14905.  
  14906. {joy_filter=10;} // Filtro aplicado al joystick{/}.
  14907.  
  14908. Esta variable global se utiliza para definir el filtro aplicado a las
  14909. coordenadas leídas del joystick.
  14910.  
  14911. Se define como un porcentaje de {0 %} a {99 %}; por defecto {joy_filter}
  14912. valdrá {10} (se aplicará un filtro de un 10%).
  14913.  
  14914. La utilidad de aplicar este filtro a las coordenadas del joystick es para
  14915. suavizar los movimientos del mismo y evitar posibles "{picos}" en la lectura
  14916. de las coordenadas; dichas coordenadas del joystick se deben obtener con la
  14917. función {#122,get_joy_position()}. La variable {joy_filter} únicamente será
  14918. de utilidad cuando se esté utilizando ésta última función.
  14919.  
  14920. Cuanto mayor sea el filtro aplicado más se suavizarán los movimientos del
  14921. mismo, pero también se retardará su respuesta.
  14922.  
  14923. Dado que la función cometida por este "{filtro}" es algo difícil de comprender,
  14924. se muestra a continuación un ejemplo.
  14925.  
  14926. {#9999,Programa ejemplo:}
  14927. PROGRAM ejemplo_joy_filter;
  14928. BEGIN
  14929.     write(0, 0, 0, 0, "joy_filter=");
  14930.     write_int(0, 70, 0, 0, offset joy_filter);
  14931.     write(0, 160, 180, 1, "El gráfico se muestra en las coordenadas del joystick");
  14932.     write(0, 160, 190, 1, "Utilice las teclas arriba/abajo para variar el filtro");
  14933.     load_fpg("help\help.fpg");
  14934.     put_screen(0, 1);
  14935.     graph=100;
  14936.     LOOP
  14937.         IF (scan_code==_up AND joy_filter<99)
  14938.             joy_filter++;
  14939.         END
  14940.         IF (scan_code==_down AND joy_filter>0)
  14941.             joy_filter--;
  14942.         END
  14943.         x=get_joy_position(0);
  14944.         y=get_joy_position(1);
  14945.         FRAME;
  14946.     END
  14947. END
  14948. {-}
  14949.  
  14950. Este programa imprime el gráfico de una bola en las coordenadas devueltas
  14951. por el joystick principal mediante la función {#122,get_joy_position()}.
  14952.  
  14953. Se puede observar como, para valores pequeños de {joy_filter}, se producen
  14954. muchos "{picos}" (irregularidades) en la lectura, y como para valores muy
  14955. grandes (como 95%) se produce una lectura de las coordenadas mucho más suave
  14956. y regular, pero ligeramente retardada.
  14957.  
  14958. {Nota:} Es imprescindible tener un joystick (o gamepad) conectado al ordenador
  14959. para que esta variable tenga utilidad. Si el joystick se conecta durante la
  14960. ejecución del programa, el sistema no lo detectará (debe estar conectado desde
  14961. el inicio). Ver la variable global {#1112,joy_status}.
  14962.  
  14963. {/}Ver: {#1200,Datos globales} - {#122,get_joy_position()} - {#1112,joy_status}
  14964.  
  14965. # ─────────────────────────────────────────────────────────────────────────────
  14966.  
  14967. {.1112,GLOBAL joy_status}
  14968. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  14969.  
  14970. {joy_status=0;} // Estado del joystick{/}
  14971.  
  14972. En esta variable gobal se indica el estado del joystick (o gamepad) conectado
  14973. al ordenador. Los valores que toma esta variable por defecto son:
  14974.  
  14975. {0} - Si el sistema de lectura del joystick está desactivado. Este valor
  14976. quiere decir que no se ha encontrado un joystick conectado al ordenador al
  14977. inicio de la ejecución del programa, o bien que éste ha sido desconectado.
  14978.  
  14979. {1} - Si el sistema de lectura del joystick está activo. Éste es el valor
  14980. inicial por defecto, pero si se desconecta el joystick (o no se encuentra
  14981. ninguno conectado), se desactivará el sistema de lectura (indicando un {0}
  14982. en la variable joy_status).
  14983.  
  14984. Si el sistema está desactivado, se puede volver a activar simplemente asignando
  14985. de nuevo un {1} a {joy_status} (con la sentencia {joy_status=1;}), pero si
  14986. pasado un tiempo límite no se detecta un joystick, el sistema se volverá
  14987. a desactivar.
  14988.  
  14989. {/}
  14990.  
  14991. Existe un {modo especial} en el que el sistema de lectura del joystick {no
  14992. se desactivará nunca}; este modo se define simplemente {asignando un 2 a
  14993. joy_status}.
  14994.  
  14995.   {joy_status=2;} // Activa modo especial·
  14996.  
  14997. No obstante, se debe tener cuidado ya que si el sistema de lectura del
  14998. joystick está activado de este modo, sin haber un joystick conectado al ordenador, {puede
  14999. ralentizarse la ejecución del juego}.
  15000.  
  15001. {/}
  15002.  
  15003. {Nota:} La lectura del joystick suele realizarse en los programas accediendo
  15004. a la {#1103,estructura global joy} que indica, siempre, la dirección del mismo
  15005. y el estado de sus botones (si están pulsados o no).
  15006.  
  15007. {/}Ver: {#1200,Datos globales} - {#1103,Estructura joy} - {#1111,joy_filter}
  15008.  
  15009. # ─────────────────────────────────────────────────────────────────────────────
  15010.  
  15011. {.1113,GLOBAL restore_type}
  15012. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  15013.  
  15014. {restore_type=complete_restore;} // Tipo de restauración{/}.
  15015.  
  15016. Esta variable global indica el tipo de restauración que se debe realizar
  15017. tras cada imagen en la pantalla.
  15018.  
  15019. Se llama {restauración del fondo} a recuperar las zonas de pantalla
  15020. en las que se han pintado gráficos o escrito textos en la imagen anterior,
  15021. es decir, "{despintar}" los gráficos y "{desescribir}" los textos (borrarlos).
  15022.  
  15023. Hay tres tipos de restauración aplicables que se corresponden, directamente,
  15024. con tres constantes que pueden ser asignadas a la variable {restore_type}.
  15025.  
  15026. {#1172,no_restore}       - El más rápido, no se restaura el fondo (-1)·
  15027. {#1173,partial_restore}  - Medio, restauraciones parciales (0)·
  15028. {#1174,complete_restore} - El más lento, restauración completa (1)·
  15029.  
  15030. Por defecto, el valor de {restore_type} es {complete_restore}, es decir,
  15031. que si no se indica otro valor en esta variable se realizará una restauración
  15032. completa de pantalla tras cada imagen del juego.
  15033.  
  15034. Esta modalidad de restauración (completa) es la más lenta de las tres, por lo
  15035. que seguramente se podrá ganar velocidad de ejecución en el juego (para que vaya
  15036. más fluido en los ordenadores lentos), si se le asigna otro valor a esta variable.
  15037. Por ejemplo, para indicar una restauración parcial, se debe utilizar la siguiente
  15038. sentencia:
  15039.  
  15040.   {restore_type=partial_restore;}
  15041.  
  15042. Con ella se indicaría al gestor de procesos de DIV Games
  15043. Studio que, tras las siguientes imágenes del juego, se debe restaurar
  15044. parcialmente el fondo de la pantalla (únicamente las zonas de pantalla
  15045. sobre las que se hayan puesto gráficos o textos).
  15046.  
  15047. La modalidad más rápida es {no_restore} (no restaurar el fondo de la pantalla);
  15048. sin embargo, ésta es aplicable solamente cuando el juego se desarrolle dentro de
  15049. una ventana de scroll o de modo 7 que ocupe toda la pantalla. En caso
  15050. contrario los gráficos dejarán rastros (de las imágenes anteriores) al moverse
  15051. por pantalla.
  15052.  
  15053. Se puede cambiar la modalidad de restauración durante la ejecución de un
  15054. programa tantas veces como sea necesario, según los requerimientos de las
  15055. fases (o secciones) que se ejecuten en cada momento.
  15056.  
  15057. {/}
  15058.  
  15059. {Nota:} Existe otra variable global relacionada también con la gestión que DIV
  15060. Games Studio realiza de la pantalla; ésta es {#1114,dump_type} que define
  15061. el tipo de {volcado} de imágenes que debe realizarse (qué información
  15062. debe enviarse al monitor tras cada imagen del juego).
  15063.  
  15064. {/}Ver: {#1200,Datos globales} - {#1114,dump_type}
  15065.  
  15066. # ─────────────────────────────────────────────────────────────────────────────
  15067.  
  15068. {.1114,GLOBAL dump_type}
  15069. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  15070.  
  15071. {dump_type=complete_dump;} // Tipo de volcado{/}
  15072.  
  15073. Esta variable global indica el tipo de volcado de imágenes a pantalla
  15074. que se debe realizar en cada imagen del juego.
  15075.  
  15076. Se denomina {volcado} a cuando se envían las imágenes del juego
  15077. al monitor (a la memoria de vídeo de la tarjeta gráfica).
  15078.  
  15079. {/}
  15080.  
  15081. Hay dos tipos de volcado aplicables que se corresponden, directamente,
  15082. con dos constantes que pueden ser asignadas a la variable {dump_type}.
  15083.  
  15084. {#1170,partial_dump} - Se realizarán {volcados parciales} si se indica
  15085. con la siguiente sentencia:
  15086.  
  15087.   {dump_type=partial_dump;}
  15088.  
  15089. En este modo, sólo se volcarán en pantalla los gráficos que se actualicen,
  15090. que hayan variado respecto a la imagen anterior. Este volcado conviene activarlo
  15091. {para ganar velocidad} cuando se programe un juego (o una sección del
  15092. mismo) sin una ventana de scroll o modo 7 que ocupe toda la pantalla,
  15093. es decir, cuando el juego muestre movimientos de gráficos sobre un
  15094. fondo fijo, o bien cuando las ventanas activas de scroll o modo 7 sean
  15095. más pequeñas que la pantalla.
  15096.  
  15097. {#1171,complete_dump} - Se realizarán {volcados completos} si se indica
  15098. con la siguiente sentencia:
  15099.  
  15100.   {dump_type=complete_dump;}
  15101.  
  15102. En este modo, se volcará toda la pantalla sin importar si los gráficos han
  15103. cambiado o no. Éste es más lento que el {volcado parcial}, sin embargo es
  15104. el que se debe utilizar cuando el juego tenga una ventana de scroll o modo 7
  15105. que ocupe toda la pantalla.
  15106.  
  15107. {/}
  15108.  
  15109. Por defecto, el valor de {dump_type} es {complete_dump}, es decir,
  15110. que si no se indica otro valor en esta variable se realizarán {volcados
  15111. completos} de la pantalla tras cada imagen del juego (lo que suele ser
  15112. {más lento} que realizar volcados parciales).
  15113.  
  15114. Se puede cambiar la modalidad de volcado durante la ejecución de un
  15115. programa tantas veces como sea necesario, según los requerimientos de las
  15116. fases (o secciones) que se ejecuten en cada momento.
  15117.  
  15118. {/}
  15119.  
  15120. {Nota:} Existe otra variable global relacionada también con la gestión que DIV
  15121. Games Studio realiza de la pantalla; ésta es {#1113,restore_type} que define
  15122. el tipo de {restauración} que debe realizarse en la pantalla tras cada imagen
  15123. del juego (qué gráficos o qué textos deben ser borrados).
  15124.  
  15125. {/}Ver: {#1200,Datos globales} - {#1113,restore_type}
  15126.  
  15127. # ─────────────────────────────────────────────────────────────────────────────
  15128.  
  15129. {.1115,GLOBAL max_process_time}
  15130. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  15131.  
  15132. {max_process_time=500;} // Tiempo máximo de ejecución{/}.
  15133.  
  15134. Los programas están dotados de un mecanismo {anti-bloqueo} que
  15135. hará que el gestor de procesos de DIV Games Studio interrumpa su
  15136. ejecución cuando un proceso supere el {tiempo máximo de ejecución}
  15137. en una imagen del juego.
  15138.  
  15139. Este tiempo máximo es el que se indica en la variable global
  15140. {max_process_time} en {centésimas de segundo}; su valor por
  15141. defecto es de {500 centésimas} ({5 segundos}).
  15142.  
  15143. Es decir, cuando un proceso tarde más tiempo del aquí indicado en
  15144. ejecutar una sentencia {#1029,FRAME} (que indica que el proceso
  15145. está ya preparado para la siguiente imagen del juego), se producirá
  15146. un error de ejecución.
  15147.  
  15148. {Nota:} La utilidad que tiene la posibilidad de cambiar esta variable, asignándole
  15149. un nuevo valor, es para que en los programas en los que exista un
  15150. proceso, que deba estar realizando cálculos durante bastante tiempo,
  15151. no se produzca este error.
  15152.  
  15153. Para indicar al gestor de procesos, por ejemplo, que no se debe
  15154. interrumpir un proceso, a no ser que esté más de 30 segundos de
  15155. ejecución en una imagen se debe utilizar una sentencia como la
  15156. siguiente:
  15157.  
  15158.   {max_process_time=3000;}
  15159.  
  15160. Ya que 30 segundos son 3000 centésimas de segundo.
  15161.  
  15162. {/}
  15163.  
  15164. {Importante:} Se debe tener en cuenta que no todos los ordenadores
  15165. tardan lo mismo en realizar los cálculos del programa, por lo que hay que definir este valor
  15166. con cierto margen, para que no se supere el {tiempo máximo de ejecución}
  15167. cuando el juego sea ejecutado en ordenadores más lentos.
  15168.  
  15169. {/}Ver: {#1200,Datos globales} - {#1029,Sentencia FRAME}
  15170.  
  15171. # ─────────────────────────────────────────────────────────────────────────────
  15172.  
  15173. {.1116,LOCAL STRUCT reserved}
  15174. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  15175.  
  15176. {STRUCT reserved;}·
  15177.     {process_id;}    // Identificador del proceso·
  15178.     {id_scan;}       // Indice de procesos·
  15179.     {process_type;}  // Tipo de proceso·
  15180.     {type_scan;}     // Indice de tipos·
  15181.     {status;}        // Estado del proceso·
  15182.     {param_offset;}  // Dirección de los parámetros·
  15183.     {program_index;} // Contador de programa·
  15184.     {is_executed;}   // proceso ejecutado·
  15185.     {is_painted;}    // proceso pintado·
  15186.     {distance_1;}    // Reservado modo 7·
  15187.     {distance_2;}    // Reservado modo 7·
  15188.     {frame_percent;} // Porcentaje de imagen·
  15189.     {box_x0, box_y0;} // Inicio del gráfico del proceso·
  15190.     {box_x1, box_y1;} // Final del gráfico del proceso·
  15191. {END}·
  15192.  
  15193. En esta estructura se guardan distintas {variables de uso interno}
  15194. (utilizadas por el {gestor de procesos de DIV Games Studio}).
  15195.  
  15196. Son variables locales reservadas para el sistema. No es necesario
  15197. conocer estas variables ya que la gran mayoría no son de utilidad
  15198. en la creación de programas.
  15199.  
  15200. {Importante:} Modificar los valores de estas variables provocará,
  15201. muy probablemente, un {bloqueo} del ordenador, un funcionamiento
  15202. indebido del {gestor de procesos} o problemas al utilizar muchas
  15203. de las funciones internas. No se asume ninguna responsabilidad
  15204. por tanto, sobre los posibles problemas derivados del uso indebido
  15205. de la estructura {reserved}.
  15206.  
  15207. {/}
  15208.  
  15209. Se mostrará, por tanto, una {breve descripción} de cada uno de estos
  15210. campos, únicamente con fines documentativos.
  15211.  
  15212. {process_id} - {#1039,Código identificador} del proceso; este valor se
  15213. obtiene normalmente con la palabra reservada {#1092,ID} y no se
  15214. debe modificar el valor de este campo.
  15215.  
  15216. {id_scan} - Se utiliza internamente al detectar las colisiones para
  15217. guardar registro del {#1039,código identificador} del último proceso que ha
  15218. colisionado con el proceso actual.
  15219.  
  15220. {process_type} - Tipo del proceso actual, que se
  15221. obtiene normalmente con el operador {#1042,TYPE}, indicando el nombre
  15222. del proceso a continuación (ver {#1042,Tipos de procesos}).
  15223.  
  15224. {type_scan} - Se utiliza internamente para detectar colisiones
  15225. u obtener códigos identificadores de procesos de un tipo determinado.
  15226.  
  15227. {status} - Estado actual del proceso. Los valores que puede
  15228. adoptar este campo son los siguientes:
  15229.  
  15230.   {0} - proceso inexistente.·
  15231.   {1} - proceso que ha recibido una señal {s_kill}.·
  15232.   {2} - proceso vivo o despierto (s_wakeup).·
  15233.   {3} - proceso dormido (s_sleep).·
  15234.   {4} - proceso congelado (s_freeze).·
  15235.  
  15236. {param_offset} - Dirección de la memoria del ordenador en la que
  15237. están situados los parámetros que ha recibido el proceso.
  15238.  
  15239. {program_index} - Contador de programa. Dirección de la memoria del
  15240. ordenador en la que se encuentra la primera sentencia que debe
  15241. ejecutar el proceso en la siguiente imagen.
  15242.  
  15243. {is_executed} - Indica si este proceso ha sido ya ejecutado en la
  15244. imágen actual.
  15245.  
  15246. {is_painted} - Indica si el gráfico del proceso ha sido ya pintado
  15247. en la imagen actual del juego.
  15248.  
  15249. {distance_1} - Distancia vertical del proceso (reservado para procesos
  15250. que se visualicen en una ventana de modo 7).
  15251.  
  15252. {distance_2} - Distancia horizontal del proceso (ocurre lo mismo que en la
  15253. sentencia anterior).
  15254.  
  15255. {frame_percent} - Porcentaje de la siguiente imagen completado por
  15256. el proceso; éste valor será de utilidad cuando se utilice la sentencia
  15257. {#1029,FRAME} indicando un porcentaje. En caso contrario valdrá simplemente
  15258. 0 (0%) cuando el proceso no ha sido ejecutado y 100 (100%) cuando ya lo
  15259. haya sido.
  15260.  
  15261. {box_x0, box_y0} - Coordenada superior izquierda del gráfico en la
  15262. imagen anterior del juego (donde se situó el gráfico en coordenadas
  15263. de pantalla).
  15264.  
  15265. {box_x1, box_y1} - Coordenada inferior derecha del gráfico en la
  15266. imagen anterior del juego.
  15267.  
  15268. {/}Ver: {#1201,Datos locales} - {#1000,Sintaxis}
  15269.  
  15270. # ─────────────────────────────────────────────────────────────────────────────
  15271.  
  15272. {.1117,LOCAL father}
  15273. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  15274.  
  15275. {father;} // {#1039,Código identificador} del proceso padre{/}.
  15276.  
  15277. Esta variable predefinida es {#1007,LOCAL}, lo que significa que cada
  15278. proceso tendrá su propio valor en su variable {father}.
  15279.  
  15280. Esta variable contiene siempre el {#1039,código identificador} del proceso
  15281. que creó (llamó) al proceso actual (el que posee esta variable), es
  15282. decir, indica qué proceso fue el que lo invocó.
  15283.  
  15284. Dentro del lenguaje se denomina proceso padre al que llama a otro
  15285. proceso, y proceso hijo al que ha sido llamado. Para más información
  15286. ver las {#1041,jerarquías de procesos} en el lenguaje.
  15287.  
  15288. El {gestor de procesos} de DIV es el proceso denominado {div_main}
  15289. y es el encargado de crear el proceso principal del programa ({PROGRAM})
  15290. al comienzo de la ejecución del juego. Por lo tanto, éste será el padre
  15291. del programa principal, así como el padre de todos los procesos
  15292. que queden huérfanos (procesos cuyo padre haya muerto o finalizado
  15293. antes que ellos, ver {#1040,estados de un proceso}).
  15294.  
  15295. {/}
  15296.  
  15297. {Nota:} El {#1039,código identificador} del proceso hijo se indica
  15298. en la variable local predefinida {#1118,son}.
  15299.  
  15300. {/}Ver: {#1201,Datos locales} - {#1039,Código identificador} - {#1041,Jerarquias de procesos}
  15301.  
  15302. # ─────────────────────────────────────────────────────────────────────────────
  15303.  
  15304. {.1118,LOCAL son}
  15305. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  15306.  
  15307. {son=0;} // {#1039,Código identificador} del proceso hijo{/}.
  15308.  
  15309. Esta variable predefinida es {#1007,LOCAL}, lo que significa que cada
  15310. proceso tendrá su propio valor en su variable {son}.
  15311.  
  15312. Esta variable contiene siempre el {#1039,código identificador} del
  15313. {último} proceso que ha creado (llamado) el proceso actual, es decir,
  15314. indica cuál es el {último} proceso invocado.
  15315.  
  15316. Dentro del lenguaje se denomina proceso padre al que llama a otro
  15317. proceso, y proceso hijo al que ha sido llamado. Para más información
  15318. ver las {#1041,jerarquías de procesos} en el lenguaje.
  15319.  
  15320. Esta variable estará por defecto a {0} hasta que el proceso realice
  15321. una llamada a otro proceso, momento en el cual se creará el nuevo proceso
  15322. indicando su {#1039,código identificador} en {son}.
  15323.  
  15324. {/}
  15325.  
  15326. {Nota:} El {#1039,código identificador} del proceso padre se indica
  15327. en la variable local predefinida {#1117,father}.
  15328.  
  15329. {/}Ver: {#1201,Datos locales} - {#1039,Código identificador} - {#1041,Jerarquías de procesos}
  15330.  
  15331. # ─────────────────────────────────────────────────────────────────────────────
  15332.  
  15333. {.1119,LOCAL smallbro}
  15334. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  15335.  
  15336. {smallbro=0;} // {#1039,Código identificador} del hermano menor{/}.
  15337.  
  15338. Esta variable predefinida es {#1007,LOCAL}, lo que significa que cada
  15339. proceso tendrá su propio valor en su variable {smallbro}.
  15340.  
  15341. Esta variable contiene siempre el {#1039,código identificador} del
  15342. siguiente proceso que creó el padre del proceso actual tras él, es
  15343. decir, cuando el proceso que invocó al actual invocara a algún otro
  15344. después, esta variable indicará cuál.
  15345.  
  15346. A este proceso se le denomina {hermano menor} dentro del lenguaje.
  15347. Para más información ver las {#1041,jerarquías de procesos} en el lenguaje.
  15348.  
  15349. Esta variable estará por defecto a {0} hasta que el proceso padre
  15350. realice una llamada a otro proceso, momento en el cual se creará el
  15351. nuevo proceso (el hermano menor de éste), indicando su {#1039,código
  15352. identificador} en {smallbro} (de "small brother").
  15353.  
  15354. {/}
  15355.  
  15356. {Nota:} El {#1039,código identificador} del {hermano mayor} se indica
  15357. en la variable local predefinida {#1120,bigbro}.
  15358.  
  15359. {/}Ver: {#1201,Datos locales} - {#1039,Código identificador} - {#1041,Jerarquías de procesos}
  15360.  
  15361. # ─────────────────────────────────────────────────────────────────────────────
  15362.  
  15363. {.1120,LOCAL bigbro}
  15364. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  15365.  
  15366. {bigbro=0;} // {#1039,Código identificador} del hermano mayor{/}.
  15367.  
  15368. Esta variable predefinida es {#1007,LOCAL}, lo que significa que cada
  15369. proceso tendrá su propio valor en su variable {bigbro}.
  15370.  
  15371. Esta variable contiene siempre el {#1039,código identificador} del
  15372. proceso que creó el padre justo antes de crear al proceso actual, es
  15373. decir, cuando el proceso que invocó al actual hubiera creado otro
  15374. antes, ésta variable indicará cuál.
  15375.  
  15376. A este proceso se le denomina {hermano mayor} dentro del lenguaje.
  15377. Para más información ver las {#1041,jerarquías de procesos} en el
  15378. lenguaje.
  15379.  
  15380. Esta variable estará a {0} si el proceso padre (el que invocó al
  15381. proceso actual) no hubiera creado ningún otro antes. En caso de
  15382. que hubiera creado uno, o más de uno, {bigbro} (de "big brother")
  15383. indicaría el {#1039,código identificador} del último de ellos.
  15384.  
  15385. {/}
  15386.  
  15387. {Nota:} El {#1039,código identificador} del {hermano menor} se indica
  15388. en la variable local predefinida {#1119,smallbro}.
  15389.  
  15390. {/}Ver: {#1201,Datos locales} - {#1039,Código identificador} - {#1041,Jerarquías de procesos}
  15391.  
  15392. # ─────────────────────────────────────────────────────────────────────────────
  15393.  
  15394. {.1121,LOCAL priority}
  15395. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  15396.  
  15397. {priority=0;} // Nivel de prioridad del proceso{/}.
  15398.  
  15399. Esta variable predefinida es {#1007,LOCAL}, lo que significa que cada
  15400. proceso tendrá su propio valor en su variable {priority}.
  15401.  
  15402. En la preparación de cada imagen todos los procesos serán ejecutados en
  15403. el orden de prioridad establecido por la variable local {priority}.
  15404.  
  15405. Cuanto mayor sea el valor de {priority} en un proceso, antes será
  15406. procesado éste en cada imagen. El valor de priority puede fijarse
  15407. como cualquier número entero dentro del rango ({#1177,min_int} ...
  15408. {#1178,max_int}); por ejemplo, para establecer el nivel de prioridad
  15409. de un proceso a {10} se debe utilizar la siguiente sentencia:
  15410.  
  15411.   {priority=10;}
  15412.  
  15413. Todos los procesos activos en el programa que tengan {el mismo nivel
  15414. de prioridad} serán ejecutados en un {orden indeterminado} que,
  15415. además, puede variar de unas ejecuciones del juego a otras.
  15416.  
  15417. Por defecto la variable local {priority} estará inicializada a {0}
  15418. en todos los procesos creados en el programa, por lo que éstos
  15419. podrán ser ejecutados en cualquier orden, si no se define el valor
  15420. de esta variable.
  15421.  
  15422. Si se fija la {priority} de un solo proceso a un
  15423. número positivo, como 1, éste será ejecutado antes que el resto
  15424. de los procesos, y si se fija a un número negativo, como -1, entonces
  15425. será ejecutado tras el resto (suponiendo que la variable {priority}
  15426. del resto no se ha modificado, por lo que sigue valiendo {0}).
  15427.  
  15428. {Cuando se debe fijar la prioridad de los procesos}{/}
  15429.  
  15430. Cuando un proceso necesite utilizar en sus cálculos datos de otro
  15431. proceso, suele ser conveniente que se ejecute tras él, definiendo
  15432. su prioridad más baja, para que al leer los datos del otro proceso,
  15433. éstos ya estén actualizados.
  15434.  
  15435. Por ejemplo, si el proceso {B} debe situar su gráfico 8 puntos más
  15436. abajo que el gráfico del proceso {A}, se debe fijar la prioridad
  15437. de {A} mayor que la de {B}, para que éste se ejecute primero.
  15438.  
  15439. De esta forma, cuando el proceso {B} obtenga su coordenada {y} sumando
  15440. 8 a la del proceso {A}, se realice este cálculo con la coordenada {y} del proceso {A}
  15441. ya actualizada para la siguiente imágen (para asegurar que en cada imagen
  15442. primero se fijará la coordenada {y} del proceso {A} y después la
  15443. del proceso {B}).
  15444.  
  15445. Para conseguir ésto, como ambas prioridades estarán por defecto a {0}, bastaría con
  15446. definir la prioridad de {A} como {1}, o bien definir la prioridad
  15447. de {B} como{ -1}.
  15448.  
  15449. {/}
  15450.  
  15451. {Nota:} El nivel de prioridad del proceso no tiene nada que ver
  15452. con el plano de profundidad en el que aparece su gráfico en pantalla,
  15453. ya que éste se indica en la variable {#1125,local z}. Es decir, que
  15454. un gráfico se procese antes no implica que su gráfico se pinte antes.
  15455.  
  15456. {/}Ver: {#1201,Datos locales}
  15457.  
  15458. # ─────────────────────────────────────────────────────────────────────────────
  15459.  
  15460. {.1122,LOCAL ctype}
  15461. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  15462.  
  15463. {ctype=c_screen;} // Sistema de coordenadas{/}.
  15464.  
  15465. Esta variable predefinida es {#1007,LOCAL}, lo que significa que cada
  15466. proceso tendrá su propio valor en su variable {ctype}.
  15467.  
  15468. En esta variable se indica el {sistema de coordenadas} utilizado por
  15469. el proceso, es decir, cómo deben ser interpretadas las coordenadas
  15470. del proceso (contenidas en las variables locales {#1123,x} e {#1124,y}).
  15471.  
  15472. Se pueden utilizar tres sistemas de coordenadas diferentes,
  15473. que se corresponden directamente con tres constantes que pueden ser asignadas
  15474. a la variable {ctype}.
  15475.  
  15476.   {#1167,c_screen} - Coordenadas de pantalla·
  15477.   {#1168,c_scroll} - Coordenadas de scroll·
  15478.   {#1169,c_m7}     - Coordenadas de modo 7·
  15479.  
  15480. {El valor por defecto de ctype es} {#1167,c_screen}, el utilizado para que
  15481. las coordenadas del gráfico del proceso se interpreten como referidas
  15482. a la pantalla, donde la esquina superior izquierda es la (0, 0).
  15483.  
  15484. Se asignará {#1168,c_scroll} a {ctype} con la siguiente sentencia:
  15485.  
  15486.  {ctype=c_scroll;}
  15487.  
  15488. Para que las coordenadas del
  15489. gráfico del proceso se interpreten como referidas a una ventana de
  15490. scroll, a coordenadas sobre el gráfico del primer plano.
  15491.  
  15492. Se asignará {#1169,c_m7} a {ctype} con la siguiente sentencia:
  15493.  
  15494.  {ctype=c_m7;}
  15495.  
  15496. Para que las coordenadas del
  15497. gráfico del proceso se interpreten como referidas a una ventana de
  15498. modo 7, a coordenadas sobre el gráfico principal, abatido tridimensionalmente
  15499. en dicha ventana.
  15500.  
  15501. {/}
  15502.  
  15503. {Nota:} Existe otra variable local que también afecta al modo en el
  15504. que deben ser interpretadas las coordenadas del proceso; ésta es
  15505. {#1135,resolution} y establece la resolución (escala) en la que se
  15506. definen las coordenadas.
  15507.  
  15508. {/}Ver: {#1201,Datos locales} - {#1167,c_screen} - {#1168,c_scroll} - {#1169,c_m7}
  15509.  
  15510. # ─────────────────────────────────────────────────────────────────────────────
  15511.  
  15512. {.1123,LOCAL x}
  15513. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  15514.  
  15515. {x=0;} // Coordenada horizontal del gráfico{/}.
  15516.  
  15517. Esta variable predefinida es {#1007,LOCAL}, lo que significa que cada
  15518. proceso tendrá su propio valor en su variable {x}.
  15519.  
  15520. La variables locales {x} e {#1124,y} de los procesos definen dónde
  15521. debe situarse el gráfico de los mismos (definido en la variable local
  15522. {#1126,graph}).
  15523.  
  15524. La variable local {x} define la {coordenada horizontal} del proceso,
  15525. que se puede definir como un número entero dentro del rango ({#1177,min_int} ...
  15526. {#1178,max_int}), situándose las coordenadas positivas hacia la derecha
  15527. y las negativas hacia la izquierda.
  15528.  
  15529. Por defecto, estas coordenadas se especificarán en {puntos} (píxeles),
  15530. referidos a coordenadas de pantalla, donde la esquina superior izquierda
  15531. es el punto situado en ({0}, {0}).
  15532.  
  15533. {Tipo de coordenadas.}{/}
  15534.  
  15535. Hay varios sistemas de coordenadas que pueden ser utilizados por los
  15536. procesos y que se definen con la variable local {#1122,ctype}, el
  15537. sistema por defecto son las coordenadas relativas a la pantalla.
  15538.  
  15539. {Resolución de las coordenadas.}{/}
  15540.  
  15541. La variable local {#1135,resolution} indica la precisión de las coordenadas
  15542. del proceso; por defecto, esta variable valdrá {0} y las coordenadas ({x}, {#1124,y})
  15543. se especifican en puntos.
  15544.  
  15545. Cuanto mayor sea el valor de {#1135,resolution}, más pequeña (y precisa) será
  15546. la unidad en la que se interpretan las coordenadas, a continuación se
  15547. muestran algunos ejemplos:
  15548.  
  15549. {resolution=1;} - Las coordenadas se especifican en puntos.
  15550.  
  15551. {resolution=10;} - Se especifican en décimas de puntos.
  15552.  
  15553. {resolution=100;} - Se especifican en centésimas de puntos.
  15554.  
  15555. {resolution=2;} - Se especifican en mitades de punto.
  15556.  
  15557. ...
  15558.  
  15559. {/}
  15560.  
  15561. {Nota:} Se puede definir para cada proceso un tipo y resolución de coordenadas
  15562. diferente, así como cambiarlos en tiempo de ejecución cuando sea
  15563. necesario.
  15564.  
  15565. {/}
  15566.  
  15567. {Importante:} Cuando se sitúa un gráfico en unas coordenadas determinadas,
  15568. normalmente será el {centro} del gráfico el que se sitúe en dichas
  15569. coordenadas.
  15570.  
  15571. Esto se puede cambiar definiendo en el {editor gráfico} el {#1136,punto
  15572. de control} número {0} del gráfico del proceso (cuyo {código de gráfico}
  15573. se indica en la variable {#1126,graph}).
  15574.  
  15575. Si se ha definido el punto de control, será éste el que se sitúe en
  15576. las coordenadas especificadas.
  15577.  
  15578. Por ejemplo, si se sitúa el punto de control {0} en la esquina
  15579. superior izquierda del gráfico y, posteriormente, se pone el gráfico
  15580. en las coordenadas (100, 100), se posicionará la esquina superior
  15581. izquierda del gráfico en dichas coordenadas.
  15582.  
  15583. {/}Ver: {#1201,Datos locales} - {#1122,ctype} - {#1135,resolution}
  15584.  
  15585. # ─────────────────────────────────────────────────────────────────────────────
  15586.  
  15587. {.1124,LOCAL y}
  15588. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  15589.  
  15590. {y=0;} // Coordenada vertical del gráfico{/}.
  15591.  
  15592. Esta variable predefinida es {#1007,LOCAL}, lo que significa que cada
  15593. proceso tendrá su propio valor en su variable {y}.
  15594.  
  15595. La variables locales {#1123,x} e {y} de los procesos definen dónde
  15596. debe situarse el gráfico de los mismos (definido en la variable local
  15597. {#1126,graph}).
  15598.  
  15599. La variable local {y} define la {coordenada vertical} del proceso,
  15600. que se puede definir como un número entero dentro del rango ({#1177,min_int} ...
  15601. {#1178,max_int}), situándose las coordenadas positivas hacia abajo
  15602. y las negativas hacia arriba.
  15603.  
  15604. Por defecto, estas coordenadas se especificarán en {puntos} (píxeles),
  15605. referidos a coordenadas de pantalla, donde la esquina superior izquierda
  15606. es el punto situado en ({0}, {0}).
  15607.  
  15608. {Tipo de coordenadas.}{/}
  15609.  
  15610. Hay varios sistemas de coordenadas que pueden ser utilizados por los
  15611. procesos y que se definen con la variable local {#1122,ctype}, el
  15612. sistema por defecto son las coordenadas relativas a la pantalla.
  15613.  
  15614. {Resolución de las coordenadas.}{/}
  15615.  
  15616. La variable local {#1135,resolution} indica la precisión de las coordenadas
  15617. del proceso; por defecto, ésta variable valdrá {0} y las coordenadas ({#1123,x},{y})
  15618. se especifican en puntos.
  15619.  
  15620. Cuanto mayor sea el valor de {#1135,resolution}, más pequeña (y precisa) será
  15621. la unidad en la que se interpretan las coordenadas, a continuación se
  15622. muestran algunos ejemplos:
  15623.  
  15624. {resolution=1;} - Las coordenadas se especifican en puntos.
  15625.  
  15626. {resolution=10;} - Se especifican en décimas de puntos.
  15627.  
  15628. {resolution=100;} - Se especifican en centésimas de puntos.
  15629.  
  15630. {resolution=2;} - Se especifican en mitades de punto.
  15631.  
  15632. ...
  15633.  
  15634. {/}
  15635.  
  15636. {Nota:} Se puede definir para cada proceso un tipo y una resolución de coordenadas
  15637. diferente, así como cambiarlos en tiempo de ejecución cuando sea
  15638. necesario.
  15639.  
  15640. {/}
  15641.  
  15642. {Importante:} Cuando se sitúa un gráfico en unas coordenadas determinadas,
  15643. normalmente será el {centro} del gráfico el que se sitúe en dichas
  15644. coordenadas.
  15645.  
  15646. Ésto se puede cambiar definiendo en el {editor gráfico} el {#1136,punto
  15647. de control} número {0} del gráfico del proceso (cuyo {código de gráfico}
  15648. se indica en la variable {#1126,graph}).
  15649.  
  15650. Si se ha definido el punto de control, será éste el que se sitúe en
  15651. las coordenadas especificadas.
  15652.  
  15653. Por ejemplo, si se sitúa el punto de control {0} en la esquina
  15654. superior izquierda del gráfico y, posteriormente, se pone el gráfico
  15655. en las coordenadas (100, 100), se posicionará la esquina superior
  15656. izquierda del gráfico en dichas coordenadas.
  15657.  
  15658. {/}Ver: {#1201,Datos locales} - {#1122,ctype} - {#1135,resolution}
  15659.  
  15660. # ─────────────────────────────────────────────────────────────────────────────
  15661.  
  15662. {.1125,LOCAL z}
  15663. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  15664.  
  15665. {z=0;} // Plano de profundidad del gráfico del proceso{/}.
  15666.  
  15667. Esta variable predefinida es {#1007,LOCAL}, lo que significa que cada
  15668. proceso tendrá su propio valor en su variable {z}.
  15669.  
  15670. La variable local {z} define en qué plano de profundidad debe situarse
  15671. el gráfico del proceso en la pantalla (el gráfico se define en la variable
  15672. local {#1126,graph}). Es decir, qué debe aparecer por encima del gráfico
  15673. del proceso y qué por debajo.
  15674.  
  15675. Los planos de profundidad pueden ser cualquier número entero dentro
  15676. del rango ({#1177,min_int} ... {#1178,max_int}), y cuanto mayor sea el
  15677. número, más al fondo se situará el gráfico (a mayor profundidad).
  15678.  
  15679. {/}
  15680.  
  15681. Por defecto, los planos de profundidad están dispuestos de la siguiente
  15682. forma:
  15683.  
  15684. { (+) Mayor profundidad}
  15685.  
  15686. { +512} - Ventanas de scroll (ver {#1101,scroll[].z})·
  15687. { +256} - Ventanas de modo 7 (ver {#1102,m7[].z})·
  15688. {  0}   - Gráficos de los procesos (local {z})·
  15689. { -256} - Textos (ver {#1106,text_z})·
  15690. { -512} - Puntero del ratón (ver {#1100,mouse.z})·
  15691.  
  15692. { (-) Menor profundidad}
  15693.  
  15694. Es decir, la variable local {z} que define el plano de profundidad
  15695. de los gráficos de los procesos estará inicializada a {0}. Los gráficos
  15696. de los procesos se situarán debajo del puntero del ratón
  15697. y los textos, y sobre las ventanas de scroll y modo 7 (si no se
  15698. modifican los valores por defecto).
  15699.  
  15700. {/}
  15701.  
  15702. Todos los objetos (textos, gráficos, ventanas, ...) que se sitúen
  15703. en el mismo plano de profundidad aparecerán en pantalla (al superponerse
  15704. unos sobre otros) en un {orden indeterminado}, que puede variar de
  15705. unas ejecuciones del programa a otras.
  15706.  
  15707. Si se quisiera, por ejemplo, que el gráfico de un proceso apareciera
  15708. sobre todos los objetos del programa, se podría fijar para el mismo
  15709. un plano de profundidad por encima del resto (como -1000}, con la
  15710. siguiente sentencia:
  15711.  
  15712.   {z=-1000;}
  15713.  
  15714. Inicialmente, todos los procesos tienen su variable {z} igual a {0},
  15715. luego los gráficos de los procesos aparecerán en cualquier orden
  15716. si no se define en qué plano debe situarse cada uno.
  15717.  
  15718. Se puede variar el plano de profundidad de un proceso (asignando un
  15719. nuevo valor a su variable {z}) tantas veces como sea necesario dentro
  15720. de un programa.
  15721.  
  15722. Los planos de profundidad del resto de objetos (ventanas, textos
  15723. y puntero del ratón) también pueden variarse en cualquier momento
  15724. del programa.
  15725.  
  15726. {/}
  15727.  
  15728. {Nota 1:} Los procesos que pertenezcan a una {ventana de scroll} (que tengan
  15729. su variable {#1122,ctype}{=}{#1168,c_scroll}) se pintarán en el
  15730. {plano de profundidad de la ventana de scroll}; no obstante, dentro
  15731. de dicha ventana, todos los gráficos de los procesos aparecerán
  15732. {ordenados por su plano de profundidad}.
  15733.  
  15734. Es decir, el plano de profundidad del proceso (indicado como siempre
  15735. en la variable {z}) será entonces {relativo a la ventana de scroll}
  15736. en la que aparece el proceso (ver {#163,start_scroll()}).
  15737.  
  15738. {/}
  15739.  
  15740. {Nota 2:} Los procesos que pertenezcan a una {ventana de modo 7} (que tengan
  15741. su variable {#1122,ctype}{=}{#1167,c_m7}) aparecerán en dicha ventana
  15742. {ordenados por estricto orden de profundidad en el plano tridimensional}
  15743. ignorándose el valor de su variable local {z}.
  15744.  
  15745. El único sentido que tiene la variable local {z} en procesos de un
  15746. {modo 7} es definir el orden en el que deben superponerse los
  15747. procesos que estén {exactamente} en las mismas coordenadas del plano
  15748. abatido, es decir, si se sitúan dos procesos en el plano tridimensional
  15749. en las mismas coordenadas entonces se podrá, con la variable {z},
  15750. definir cuál de ellos debe aparecer sobre el otro (ver {#162,start_mode7()}).
  15751.  
  15752. {/}Ver: {#1201,Datos locales} - {#1100,mouse.z} - {#1101,scroll[].z} - {#1102,m7[].z} - {#1106,text_z}
  15753.  
  15754. # ─────────────────────────────────────────────────────────────────────────────
  15755.  
  15756. {.1126,LOCAL graph}
  15757. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  15758.  
  15759. {graph=0;} // Código del gráfico del proceso{/}.
  15760.  
  15761. Esta variable predefinida es {#1007,LOCAL}, lo que significa que cada
  15762. proceso tendrá su propio valor en su variable {graph}.
  15763.  
  15764. Normalmente, la mayoría de procesos se corresponden con un objeto
  15765. gráfico visualizado en pantalla que se situará en las coordenadas
  15766. indicadas en las variables locales {#1123,x} e {#1123,y}. Se debe
  15767. definir qué gráfico es el correspondiente a dicho proceso asignando
  15768. un {código de gráfico} a la variable local {graph}.
  15769.  
  15770. Por defecto, esta variable valdrá {0} lo que implica que no se
  15771. visualizará ningún gráfico para este proceso.
  15772.  
  15773. Los gráficos se deben crear primero en el {editor gráfico} de DIV
  15774. Games Studio (con la opción "{Nuevo...}" del menú de mapas) y, después,
  15775. se pueden guardar en un {archivo MAP} (que contendrá este gráfico),
  15776. o en un {fichero FPG} junto a otros gráficos (se puede crear un
  15777. fichero nuevo con la opción "{Nuevo...}" del menú de ficheros).
  15778.  
  15779. Es decir, los gráficos utilizados en un programa pueden provenir de
  15780. un {archivo MAP} (que contiene un sólo gráfico) o de un {fichero FPG}
  15781. (que puede contener muchos gráficos).
  15782.  
  15783. {Nota:} Un mismo gráfico puede ser utilizado por muchos procesos a
  15784. la vez en un programa.
  15785.  
  15786. {Archivos MAP}{/}
  15787.  
  15788. Para utilizar en el programa un gráfico de un {archivo MAP} se debe
  15789. cargar este llamando a la función {#174,load_map()}, que devolverá
  15790. el {código del gráfico} que se debe ser asignado a la variable {graph}.
  15791.  
  15792. Normalmente se utiliza una variable {#1006,GLOBAL} para guardar este
  15793. {código de gráfico} y después se asigna ésta a la variable {graph}.
  15794.  
  15795. {#9999,Programa ejemplo:}
  15796. PROGRAM ejemplo_graph;
  15797.  
  15798. GLOBAL
  15799.     gráfico1;
  15800.  
  15801. BEGIN
  15802.     gráfico1=load_map("help\help.map");
  15803.  
  15804.     graph=gráfico1; // Se define el gráfico del proceso.
  15805.  
  15806.     LOOP
  15807.         x=mouse.x;
  15808.         y=mouse.y;
  15809.         FRAME;
  15810.     END
  15811. END
  15812. {-}
  15813.  
  15814. Si bien en el ejemplo anterior se podría haber prescindido de la variable
  15815. global {gráfico1} y haber asignado directamente el código devuelto
  15816. por la función {#174,load_map()} a la variable {graph} con la siguiente
  15817. sentencia:
  15818.  
  15819.   {graph=load_map("help\help.map");}
  15820.  
  15821. los {códigos de gráfico} que devuelve esta función son simplemente
  15822. números enteros a partir de {1000}.
  15823.  
  15824. {Ficheros FPG}{/}
  15825.  
  15826. Para incluir un gráfico que se ha realizado en el {editor gráfico}
  15827. en un {fichero FPG} de debe {arrastrar la ventana del gráfico a la
  15828. ventana del fichero} (pulsar en el gráfico, moverse hasta el fichero
  15829. y soltar), entonces el programa pedirá el {código del gráfico}, con lo que se
  15830. debe introducir aquí un número entero entre {1} y {999}.
  15831.  
  15832. Para utilizar entonces el gráfico en un programa, se debe primero
  15833. cargar el {fichero FPG} que lo contiene con la función {#132,load_fpg()}
  15834. y, después, asignar el {código del gráfico} a la variable {graph}.
  15835.  
  15836. Se muestra, a continuación, un ejemplo es necesario saber antes que
  15837. un gráfico de una {bola marrón} se introdujo en el {fichero HELP.FPG}
  15838. indicando el {código de gráfico 100}.
  15839.  
  15840. {#9999,Programa ejemplo:}
  15841. PROGRAM ejemplo_graph;
  15842. BEGIN
  15843.     load_fpg("help\help.fpg");
  15844.  
  15845.     graph=100; // Se define el gráfico del proceso.
  15846.  
  15847.     LOOP
  15848.         x=mouse.x;
  15849.         y=mouse.y;
  15850.         FRAME;
  15851.     END
  15852. END
  15853. {-}
  15854.  
  15855. Se pueden cargar {varios ficheros FPG} en un programa; en ese caso
  15856. se deberá indicar, además del {código del gráfico} en la variable local
  15857. {graph}, el {código de fichero} que devuelve la función {#132,load_fpg()}
  15858. en la variable local {#1131,file}.
  15859.  
  15860. Si sólo se carga un fichero ésto no será necesario, ya que la variable
  15861. {#1131,file} vale {0} por defecto en todos los procesos y {0} será siempre
  15862. el {código del primer fichero} que se cargue en el programa.
  15863.  
  15864. {/}
  15865.  
  15866. Existen más variables locales relacionadas con el gráfico de un
  15867. proceso, las principales son las siguientes:
  15868.  
  15869.   {graph}  - Código del gráfico·
  15870.   {#1131,file}   - Código del fichero·
  15871.   {#1123,x}, {#1124,y}   - Coordenadas del gráfico·
  15872.   {#1125,z}      - Plano de profundidad·
  15873.   {#1129,angle}  - ángulo del gráfico·
  15874.   {#1128,size}   - Tamaño del gráfico·
  15875.   {#1127,flags}  - Espejados y transparencias·
  15876.   {#1130,region} - Ventana de visualización·
  15877.  
  15878. {/}Ver: {#1201,Datos locales}
  15879.  
  15880. # ─────────────────────────────────────────────────────────────────────────────
  15881.  
  15882. {.1127,LOCAL flags}
  15883. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  15884.  
  15885. {flags=0;} // Indicador de espejados y transparencia{/}.
  15886.  
  15887. Esta variable predefinida es {#1007,LOCAL}, lo que significa que cada
  15888. proceso tendrá su propio valor en su variable {flags}.
  15889.  
  15890. La variable local {flags} indica los espejados y transparencias con
  15891. los que se imprimirá el gráfico del proceso; los posibles valores son:
  15892.  
  15893.  {0}-Gráfico normal.·
  15894.  {1}-Espejado horizontal.·
  15895.  {2}-Espejado vertical.·
  15896.  {3}-Espejado horizontal y vertical (180°).·
  15897.  {4}-Gráfico transparente.·
  15898.  {5}-Transparente y espejado horizontal.·
  15899.  {6}-Transparente y espejado vertical.·
  15900.  {7}-Transparente, espejado horizontal y vertical.·
  15901.  
  15902. El valor por defecto de la variable {flags} es {0}, es decir, que si
  15903. no se modifica el gráfico se mostrará opaco (sin transparencia) y
  15904. sin espejar.
  15905.  
  15906. Se definen a continuación los términos de {espejado} y {transparencia}:
  15907.  
  15908. - {Espejado horizontal}, el gráfico se invertirá horizontalmente, es
  15909. decir, si estaba mirando hacia la izquierda, mirará a la derecha y
  15910. viceversa.
  15911.  
  15912. - {Espejado vertical}, el gráfico se invertirá verticalmente, es
  15913. decir, si estaba mirando hacia arriba, mirará hacia abajo y
  15914. viceversa.
  15915.  
  15916. - {Transparencia} (o {ghost-layering}), el gráfico se mostrará semitransparente,
  15917. es decir, se podrá ver lo que haya detrás del gráfico, como si éste
  15918. fuera una cristalera de colores, en contraposición a los gráficos
  15919. opacos que se muestran normalmente.
  15920.  
  15921. Por ejemplo, para que el gráfico de un proceso se muestre transparente
  15922. se debe utilizar la siguiente sentencia:
  15923.  
  15924.   {flags=4;}
  15925.  
  15926. {/}
  15927.  
  15928. {Nota:} El gráfico de un proceso se debe indicar asignando un {código
  15929. de gráfico} a la variable local {#1126,graph}.
  15930.  
  15931. {/}Ver: {#1201,Datos locales}
  15932.  
  15933. # ─────────────────────────────────────────────────────────────────────────────
  15934.  
  15935. {.1128,LOCAL size}
  15936. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  15937.  
  15938. {size=100;} // Tamaño (en porcentaje) del gráfico{/}.
  15939.  
  15940. Esta variable predefinida es {#1007,LOCAL}, lo que significa que cada
  15941. proceso tendrá su propio valor en su variable {size}.
  15942.  
  15943. La variable local {size} define el tamaño en el que se debe ver el
  15944. gráfico del proceso, en un porcentaje relativo a su tamaño original.
  15945.  
  15946. El valor por defecto de esta variable será {100} (100%) para todos
  15947. los procesos, y cuando sea modificado el gráfico se {escalará}
  15948. (reduciéndose o ampliándose) para ajustarse al nuevo tamaño.
  15949.  
  15950. Es decir, para mostrar el gráfico al {doble} de su tamaño se deberá
  15951. especificar un {200%}, lo que se hará con la siguiente sentencia:
  15952.  
  15953.   {size=200;}
  15954.  
  15955. Por lo tanto, si este valor es menor que {100} el gráfico se verá
  15956. más pequeño, y si es mayor, más grande.
  15957.  
  15958. En un principio no hay ningún límite para el tamaño del gráfico, pero
  15959. si se pone la variable local {size} a {0} (0%), entonces no se verá
  15960. el gráfico del proceso.
  15961.  
  15962. {/}
  15963.  
  15964. {Nota:} El gráfico de un proceso se debe indicar asignando un {código
  15965. de gráfico} a la variable local {#1126,graph}.
  15966.  
  15967. {/}Ver: {#1201,Datos locales}
  15968.  
  15969. # ─────────────────────────────────────────────────────────────────────────────
  15970.  
  15971. {.1129,LOCAL angle}
  15972. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  15973.  
  15974. {angle=0;} // ángulo del gráfico del proceso{/}.
  15975.  
  15976. Esta variable predefinida es {#1007,LOCAL}, lo que significa que cada
  15977. proceso tendrá su propio valor en su variable {angle}.
  15978.  
  15979. La variable local {angle} define el ángulo en el que se debe ver el
  15980. gráfico del proceso, indicando un ángulo respecto al gráfico original
  15981. en {milésimas de grado} (ver {#1044,Uso de ángulos en el lenguaje}).
  15982.  
  15983. El valor por defecto de esta variable será {0} (0 grados) para todos
  15984. los procesos, pero cuando sea modificado el gráfico se {rotará} para
  15985. ajustarse al nuevo ángulo.
  15986.  
  15987. El ángulo puede definirse como cualquier número entero dentro del
  15988. rango ({#1177,min_int} ... {#1178,max_int}).
  15989.  
  15990. Se muestran a continuación algunos ejemplos de los ángulos que
  15991. definen ciertos valores en la variable local {angle} (se recuerda
  15992. que los ángulos se expresan en {milésimas} de grado):
  15993.  
  15994.       ...·
  15995.  { -180000} - {#1044,Angulo} hacia la izquierda·
  15996.  {  -90000} - {#1044,Angulo} hacia abajo·
  15997.  {  -45000} - {#1044,Angulo} de la diagonal abajo/derecha·
  15998.  {       0} - {#1044,Angulo} hacia la derecha·
  15999.  {  +45000} - {#1044,Angulo} de la diagonal derecha/arriba·
  16000.  {  +90000} - {#1044,Angulo} hacia arriba·
  16001.  { +180000} - {#1044,Angulo} hacia la izquierda·
  16002.  { +270000} - {#1044,Angulo} hacia abajo·
  16003.       ...·
  16004.  
  16005. {Importante:} Cuando se pretenda rotar el gráfico de un proceso,
  16006. {es conveniente dibujarlo orientado hacia la derecha}, ya que así es
  16007. como se mostrará por defecto (con la variable local {angle} igual
  16008. a {0}).
  16009.  
  16010. De esta forma, cuando se especifique otro ángulo, el gráfico
  16011. aparecerá orientado exactamente hacia él.
  16012.  
  16013. Por ejemplo, para que un gráfico que ha sido dibujado hacia la
  16014. derecha se vea orientado hacia arriba (hacia el ángulo de 90 grados),
  16015. bastará con indicar la siguiente sentencia:
  16016.  
  16017.   {angle=90000;} // 90 milésimas de grado (90 grados).
  16018.  
  16019. Es decir, si un gráfico se dibujara orientado hacia otro ángulo,
  16020. por ejemplo hacia abajo, quedaría orientado hacia abajo por defecto,
  16021. {en el ángulo 0}, lo que puede provocar confusiones a la hora de
  16022. orientar el gráfico hacia otro ángulo.
  16023.  
  16024. {/}
  16025.  
  16026. Para hacer que el gráfico de un proceso avance sus coordenadas ({#1123,x}, {#1124,y})
  16027. hacia su ángulo (el especificado en la variable local {angle} del proceso)
  16028. una distancia determinada, se puede utilizar la función {#101,advance()}.
  16029.  
  16030. {/}
  16031.  
  16032. {Nota:} El gráfico de un proceso se debe indicar asignando un {código
  16033. de gráfico} a la variable local {#1126,graph}.
  16034.  
  16035. {/}Ver: {#1201,Datos locales} - {#1044,Uso de ángulos en el lenguaje}
  16036.  
  16037. # ─────────────────────────────────────────────────────────────────────────────
  16038.  
  16039. {.1130,LOCAL region}
  16040. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  16041.  
  16042. {region=0;} // Región de pantalla asignada al proceso{/}.
  16043.  
  16044. Esta variable predefinida es {#1007,LOCAL}, lo que significa que cada
  16045. proceso tendrá su propio valor en su variable {region}.
  16046.  
  16047. La variable local {region} define en qué zona de pantalla debe ser
  16048. visible el gráfico del proceso, indicando el {número de región}.
  16049.  
  16050. Una región es una zona rectangular de pantalla, como una ventana,
  16051. que está asociada a un número.
  16052.  
  16053. Por defecto, esta variable valdrá {0} en todos los procesos haciendo
  16054. referencia a la {región número 0} que es {la pantalla entera}.
  16055.  
  16056. Es decir, que por defecto los gráficos de los procesos serán visibles
  16057. en toda la pantalla (en cualquier punto de la misma en el que estén).
  16058.  
  16059. En un principio, únicamente está definida la {región numero 0}.
  16060. Para definir nuevas regiones de pantalla se debe utilizar la función
  16061. {#106,define_region()}.
  16062.  
  16063. {/}
  16064.  
  16065. Por ejemplo, para que el gráfico de un proceso fuera visible sólo
  16066. dentro de una caja de 100 por 100 puntos situada en la esquina superior
  16067. izquierda de la pantalla (en las coordenadas 0, 0), primero se debería
  16068. definir la nueva región la siguiente forma, suponiendo que se defina
  16069. la región número {1}:
  16070.  
  16071.   {define_region(1, 0, 0, 100, 100);}
  16072.  
  16073. y, después, se debería asignar el número de región ({1}) a la variable
  16074. local {region} del proceso con la siguiente sentencia:
  16075.  
  16076.   {region=1;}
  16077.  
  16078. Las regiones pueden redefinirse en cualquier momento dentro de un
  16079. programa; esto es, se pueden cambiar de posición o de tamaño siempre
  16080. que sea necesario.
  16081.  
  16082. {/}
  16083.  
  16084. {Nota:} El gráfico de un proceso se debe indicar asignando un {código
  16085. de gráfico} a la variable local {#1126,graph}.
  16086.  
  16087. {/}Ver: {#1201,Datos locales} - {#106,define_region()}
  16088.  
  16089. # ─────────────────────────────────────────────────────────────────────────────
  16090.  
  16091. {.1131,LOCAL file}
  16092. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  16093.  
  16094. {file=0;} // Código del fichero del gráfico del proceso{/}.
  16095.  
  16096. Esta variable predefinida es {#1007,LOCAL}, lo que significa que cada
  16097. proceso tendrá su propio valor en su variable {file}.
  16098.  
  16099. La variable local {file} indica, en los casos en los que se hayan cargado
  16100. varios {ficheros FPG} de gráficos en un programa, cuál es el fichero
  16101. que contiene el gráfico que está utilizando el proceso.
  16102.  
  16103. El gráfico de un proceso se debe indicar asignando un {código
  16104. de gráfico} a la variable local {#1126,graph}.
  16105.  
  16106. Si únicamente se ha cargado un fichero en el programa, no será necesario
  16107. asignar ningún valor a {file}, ya que el {código del primer fichero cargado}
  16108. será el {0} y éste es el valor por defecto de la variable.
  16109.  
  16110. Si el gráfico se ha cargado con la función {#174,load_map()}, tampoco
  16111. será necesario asignar ningún valor a {file}, ya que los gráficos cargados
  16112. con esta función se utilizan como si pertenecieran al fichero número {0}
  16113. (al primero que se cargue en el programa).
  16114.  
  16115. Cuando se cargue más de un fichero, se debe indicar en cada proceso
  16116. en cuál de ellos se encuentra su gráfico; esto se debe hacer asignando
  16117. el {código de fichero} que ha devuelto la función {#132,load_fpg()}
  16118. (al cargar dicho {fichero FPG}) a la variable local {file}.
  16119.  
  16120. {Nota:} Normalmente, si se cargan varios ficheros en un programa secuencialmente,
  16121. el primero tendrá el código {0}, el segundo el {1}, el tercero el {2} y, así sucesivamente.
  16122.  
  16123. {/}
  16124.  
  16125. En general, es una buena práctica, si se utilizan varios ficheros,
  16126. tener el mismo número de variables globales (denominadas por ejemplo
  16127. {fichero1}, {fichero2}, ...) que contengan el código de cada uno de
  16128. los ficheros, para utilizarlas en los procesos a la hora de definir
  16129. su variable {file} (el {fichero FPG} que se debe emplear).
  16130.  
  16131. Las variables se definirían dentro de la sección {#1006,GLOBAL} de la
  16132. siguiente forma:
  16133.  
  16134.   {GLOBAL}·
  16135.       {fichero1;} // Código del primer fichero·
  16136.       {fichero2;} // Código del segundo·
  16137.       ...
  16138.  
  16139. Después, se les asignaría a estas variables los {códigos de fichero}
  16140. al cargar éstos con la función {#132,load_fpg()} de la siguiente
  16141. forma (suponiendo que el nombre de los ficheros es {nombre1.fpg},
  16142. {nombre2.fpg}, etc.):
  16143.  
  16144.   {fichero1=load_fpg("nombre1.fpg");} // Carga de ficheros·
  16145.   {fichero2=load_fpg("nombre2.fpg");}·
  16146.   ...
  16147.  
  16148. Generalmente, esta carga de ficheros se realiza al inicio del programa;
  16149. posteriormente, dentro de cada proceso, solamente habría que definir
  16150. el fichero utilizado con la siguiente sentencia (suponiendo que el proceso
  16151. utilice gráficos contenidos en el fichero {nombre1.fpg}):
  16152.  
  16153.   {file=fichero1;} // Se utiliza el primer fichero·
  16154.  
  16155. {/}
  16156.  
  16157. {Nota:} Se recuerda que definir la variable local {file} no sirve para nada,
  16158. a no ser que también se asigne un {código de gráfico} a la variable local
  16159. {#1126,graph}.
  16160.  
  16161. {/}Ver: {#1201,Datos locales}
  16162.  
  16163. # ─────────────────────────────────────────────────────────────────────────────
  16164.  
  16165. {.1132,LOCAL xgraph}
  16166. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  16167.  
  16168. {xgraph=0;} // OFFSET de la tabla gráfica del proceso{/}.
  16169.  
  16170. Esta variable predefinida es {#1007,LOCAL}, lo que significa que cada
  16171. proceso tendrá su propio valor en su variable {xgraph}.
  16172.  
  16173. Esta variable es de nivel avanzado, por lo que requiere cierta experiencia
  16174. para su utilización.
  16175.  
  16176. La variable local {xgraph} ({extended graphic}) sirve para utilizar
  16177. {gráficos múltiples}. Para definir el gráfico de un proceso como un
  16178. {conjunto de gráficos} de los cuales se debe ver {el más acorde con
  16179. el ángulo del proceso} (especificado en la variable local {#1129,angle}).
  16180.  
  16181. Es decir, si se define la variable {xgraph}, {se ignorará la }variable local
  16182. {#1126,graph} que normalmente define el gráfico del proceso y se
  16183. utilizará un gráfico u otro en función de la variable {#1129,angle}.
  16184.  
  16185. Por lo tanto, al cambiar el ángulo del proceso {ya no aparecerá
  16186. el gráfico del proceso rotado}, sino que utilizará este ángulo como
  16187. seleccionador del gráfico del proceso (dentro del conjunto definido).
  16188.  
  16189. Por defecto la variable {xgraph} valdrá {0} en todos los procesos,
  16190. lo que indica que éstos no van a utilizar {gráficos múltiples}.
  16191.  
  16192. {/}
  16193.  
  16194. La utilidad de los gráficos múltiples reside en poder realizar juegos
  16195. en {perspectiva}, donde un cambio de ángulo en un proceso no implica
  16196. una rotación de su gráfico, sino el cambio del gráfico por otro dibujado
  16197. con otra {perspectiva} (dibujado con otro ángulo dentro de dicha perspectiva).
  16198.  
  16199. {Forma de empleo de los gráficos múltiples.}{/}
  16200.  
  16201. 1 - En primer lugar se deben realizar los diferentes dibujos que van
  16202. a representar al gráfico del proceso con diferentes ángulos en la
  16203. perspectiva. Éstos serán un número finito de vistas del gráfico, como
  16204. puede ser {4}, {8}, {12}, etc., (o cualquier otro número entero mayor que {1}).
  16205.  
  16206. Se debe tener en cuenta que si se definen 4 vistas, se estará definiendo
  16207. una vista diferente cada 90 grados, si se definen 8 vistas, cada 45
  16208. grados, etc.
  16209.  
  16210. 2 - Se deben ordenar dichos gráficos según su ángulo; primero el gráfico
  16211. que se corresponderá con el ángulo 0 (hacia la derecha) y, después,
  16212. el resto en sentido contrario a las agujas del reloj.
  16213.  
  16214. 3 - Se debe crear una tabla, generalmente {#1006,GLOBAL}, inicializada
  16215. con los siguientes valores:
  16216.  
  16217.   {Número de vistas del gráfico},·
  16218.   {Código del gráfico para el }ángulo {0 (primera vista)},·
  16219.   {Código del siguiente ángulo (segunda vista)},·
  16220.   ...
  16221.  
  16222. Es indiferente el nombre que se le de a dicha tabla, por ejemplo,
  16223. si se define un gráfico múltiple con 4 vistas, que deben ser los
  16224. gráficos con el código 10, 11, 12, y 13, la definición de la tabla
  16225. podría ser:
  16226.  
  16227.   {GLOBAL}·
  16228.       {tabla_gráfico1[]=4, 10, 11, 12, 13;}·
  16229.       ....
  16230.  
  16231. 4 - Por último, se debe asignar la dirección de esta tabla dentro
  16232. de la memoria del ordenador a la variable local {xgraph} del proceso,
  16233. lo que se haría con la siguiente sentencia (dentro del proceso en cuestión):
  16234.  
  16235.   {xgraph=OFFSET tabla_gráfico1;}
  16236.  
  16237. El operador {#1085,OFFSET} sirve para obtener la dirección en la
  16238. memoria de un dato del programa.
  16239.  
  16240. {/}
  16241.  
  16242. Una vez definido el {gráfico múltiple}, el sistema utilizará en
  16243. cada imagen del juego el gráfico correspondiente al ángulo {que
  16244. más se aproxima al ángulo del proceso} (el indicado en su variable
  16245. {#1129,angle}).
  16246.  
  16247. Para desactivar el sistema de {gráficos múltiples} en un proceso,
  16248. simplemente se debe volver a poner a {0} la variable {xgraph}.
  16249.  
  16250. {Importante:} Si dentro de la tabla que define el conjunto de gráficos
  16251. se pone algún código de gráfico con {signo negativo}, entonces aparecerá
  16252. este gráfico {espejado horizontalmente}, es decir, si el gráfico
  16253. estaba mirando hacia la derecha, aparecerá mirando hacia la izquierda,
  16254. y viceversa.
  16255.  
  16256. {/}
  16257.  
  16258. {Nota:} El sistema de gráficos múltiples se suele utilizar en las
  16259. {ventanas de modo 7}, ya que en el plano tridimensional abatido los
  16260. gráficos se deben ver de distinta forma según el ángulo desde el que
  16261. se miren.
  16262.  
  16263. Para más información sobre esta técnica, ver la función {#162,start_mode7()}
  16264. utilizada para activar una {ventana de modo 7} en el programa.
  16265.  
  16266. {/}Ver: {#1201,Datos locales}
  16267.  
  16268. # ─────────────────────────────────────────────────────────────────────────────
  16269.  
  16270. {.1133,LOCAL height}
  16271. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  16272.  
  16273. {height=0;} // Altura del gráfico (en el modo 7){/}.
  16274.  
  16275. Esta variable predefinida es {#1007,LOCAL}, lo que significa que cada
  16276. proceso tendrá su propio valor en su variable {height}.
  16277.  
  16278. La variable local {height} se utiliza {exclusivamente} en los procesos
  16279. que pertenecen a {ventanas de modo 7}, es decir, procesos que tienen
  16280. su sistema de coordenadas dentro de una ventana tridimensional (su
  16281. variable local {#1122,ctype}={#1169,c_m7}).
  16282.  
  16283. Se utiliza para definir la altura a la que deben situarse los gráficos
  16284. de los procesos sobre el plano tridimensional. No se utiliza para esto
  16285. la variable {#1125,local z}, porque ésta sigue utilizándose para definir
  16286. el plano de profundidad de los gráficos (aunque ahora únicamente sea
  16287. útil para procesos situados en las mismas coordenadas).
  16288.  
  16289. La altura del proceso puede definirse como cualquier número entero dentro
  16290. del rango ({#1177,min_int} ... {#1178,max_int}), si bien se suelen
  16291. utilizar normalmente números positivos, ya que la altura ({height})
  16292. del suelo es la {0} y los procesos se sitúan por encima de éste.
  16293.  
  16294. El valor por defecto de la variable {height} es {0} para todos los
  16295. procesos, lo que quiere decir que si no se especifica otro valor,
  16296. los gráficos de los procesos aparecerán justo sobre el suelo del
  16297. {modo 7} (sobre el plano tridimensionalmente abatido).
  16298.  
  16299. En un principio se situará en la altura indicada en {height} la {base
  16300. del gráfico} del proceso, a no ser que se defina el {#1136,punto de
  16301. control} número {0}, en cuyo caso será este punto el que se sitúe
  16302. en esa altura.
  16303.  
  16304. {Nota:} Para más información sobre las {ventanas de modo 7} y cómo situar
  16305. gráficos dentro de estas ventanas, se debe ver la ayuda sobre la función
  16306. {#162,start_mode7()} que es la utilizada para activarlas en el programa.
  16307.  
  16308. {/}
  16309.  
  16310. En los procesos que no son de {modo 7} se puede utilizar esta variable
  16311. con cualquier otra finalidad, ya que el sistema la ignorará por completo.
  16312.  
  16313. {/}Ver: {#1201,Datos locales} - {#162,start_mode7()}
  16314.  
  16315. # ─────────────────────────────────────────────────────────────────────────────
  16316.  
  16317. {.1134,LOCAL cnumber}
  16318. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  16319.  
  16320. {cnumber=0;} // Números de ventanas de scroll o modo 7{/}.
  16321.  
  16322. Esta variable predefinida es {#1007,LOCAL}, lo que significa que cada
  16323. proceso tendrá su propio valor en su variable {cnumber}.
  16324.  
  16325. La variable local {cnumber} se utiliza {exclusivamente} cuando en un juego
  16326. aparezcan varias {ventanas de scroll} o varias {ventanas de modo 7}
  16327. simultáneamente en pantalla.
  16328.  
  16329. - Para más información sobre las {ventanas de scroll}, se debe ver la
  16330. ayuda sobre la función {#163,start_scroll()}, que es la utilizada para
  16331. activarlas en el programa.
  16332.  
  16333. - Para más información sobre las {ventanas de modo 7}, se debe ver la
  16334. ayuda sobre la función {#162,start_mode7()}, que es la utilizada para
  16335. activarlas en el programa.
  16336.  
  16337. {/}
  16338.  
  16339. La utilidad de {cnumber} reside en indicar {en cuáles de estas ventanas
  16340. debe verse el gráfico del proceso}. Evidentemente, esta variable se
  16341. debe definir sólo en procesos visibles dentro de las {ventanas
  16342. de scroll} o de las {ventanas de modo 7}; para el resto de procesos
  16343. (los procesos de pantalla o los que no tengan gráfico) esta variable
  16344. carece de utilidad.
  16345.  
  16346. {Si el proceso debe verse en todas las ventanas}, entonces no será
  16347. necesario modificar esta variable, ya que el valor por defecto de
  16348. {cnumber} (que es {0}) indica precisamente esto.
  16349.  
  16350. Puede activarse hasta {10} ventanas, tanto de un tipo como del otro,
  16351. con los números del {0} al {9}. Existen diez constantes predefinidas
  16352. que se utilizan para definir el valor de {cnumber}; estas son
  16353. {#1175,c_0, c_1, c_2, ..., c_9} y se corresponden directamente con
  16354. las {10} posibles ventanas de estos tipos.
  16355.  
  16356. Se debe asignar a {cnumber la suma de las constantes} correspondientes
  16357. a las {ventanas en las que el proceso debe ser visible}.
  16358.  
  16359. Por ejemplo, si en un programa hay {4 ventanas de scroll} que son
  16360. las número {0}, {1}, {2} y {3}, y se quiere definir que un proceso determinado
  16361. debe ser visible tan solo dentro de las ventanas {0} y {2}, se
  16362. debe utilizar para esto la siguiente sentencia:
  16363.  
  16364.   {cnumber=c_0+c_2;}
  16365.  
  16366. El valor de {cnumber} puede variarse durante la ejecución del proceso
  16367. siempre que sea necesario.
  16368.  
  16369. {/}
  16370.  
  16371. {Nota:} Se recuerda que para que el gráfico del proceso se vea en
  16372. todas las ventanas no es necesario hacer nada, ya que ésta es la
  16373. opción por defecto.
  16374.  
  16375. {/}Ver: {#1201,Datos locales} - {#1175,c_0...c_9}
  16376.  
  16377. # ─────────────────────────────────────────────────────────────────────────────
  16378.  
  16379. {.1135,LOCAL resolution}
  16380. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  16381.  
  16382. {resolution=0;} // Resolución de las coordenadas del proceso{/}.
  16383.  
  16384. Esta variable predefinida es {#1007,LOCAL}, lo que significa que cada
  16385. proceso tendrá su propio valor en su variable {resolution}.
  16386.  
  16387. Normalmente, las coordenadas de un proceso (indicadas en las variables
  16388. locales {#1123,x} e {#1124,y}) se definen en puntos (de pantalla).
  16389.  
  16390. La variable local {resolution} se debe utilizar cuando se quieran definir
  16391. las coordenadas en {unidades más pequeñas} que el punto.
  16392.  
  16393. Es decir, que esta variable indica la precisión de las coordenadas
  16394. del proceso.
  16395.  
  16396. Por defecto la variable valdrá {0} y las coordenadas se
  16397. especificarán en puntos.
  16398.  
  16399. Cuanto mayor sea el valor de {#1135,resolution}, más pequeña (y precisa)
  16400. será la unidad en la que se interpretan las coordenadas; a continuación
  16401. se muestran algunos ejemplos:
  16402.  
  16403. {resolution=1;} - Las coordenadas se especifican en puntos (al igual
  16404. que con {resolution=0}, que es el valor por defecto).
  16405.  
  16406. {resolution=10;} - Se especifican en décimas de puntos.
  16407.  
  16408. {resolution=100;} - Se especifican en centésimas de puntos.
  16409.  
  16410. {resolution=2;} - Se especifican en mitades de punto.
  16411.  
  16412. ...
  16413.  
  16414. Por ejemplo, un proceso situado en {160}, {100} con {resolution} igual a
  16415. {0} (o {1}), estará en la misma posición que un proceso situado en
  16416. {1600}, {1000} y con {resolution} igual a {10}.
  16417.  
  16418. El valor de {resolution} se define normalmente como un {número
  16419. entero positivo múltiplo de 10} (10, 100, 1000, ...).
  16420.  
  16421. {/}
  16422.  
  16423. En resumen, cuando se defina el valor de {resolution}, el gestor de
  16424. procesos de DIV Games Studio {dividirá} las coordenadas de los procesos
  16425. entre {resolution} a la hora de pintar los gráficos de los mismos
  16426. en pantalla.
  16427.  
  16428. {/}
  16429.  
  16430. {Importante:} Se deben extremar las precauciones cuando en un programa
  16431. existan varios procesos con diferentes resoluciones de coordenadas,
  16432. ya que algunas funciones, como {#117,get_dist()} (para obtener la
  16433. distancia entre dos procesos), devolverán {resultados incorrectos}
  16434. cuando se esté accediendo a dos procesos que utilicen diferente
  16435. resolución de coordenadas.
  16436.  
  16437. Suele ser conveniente que todos los procesos activos en el juego,
  16438. al menos todos los que interactúen entre ellos (se detecten, modifiquen
  16439. o puedan colisionar) utilicen la misma resolución.
  16440.  
  16441. {/}Ver: {#1201,Datos locales}
  16442.  
  16443. # ─────────────────────────────────────────────────────────────────────────────
  16444.  
  16445. {.1136,Puntos de control.}
  16446. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  16447.  
  16448. {+200,0}Los {puntos de control} se definen dentro del {editor gráfico}
  16449. con la barra de puntos de control, indicada con este icono.{-}{+201,1}{-}{/}
  16450.  
  16451. Para acceder al {editor gráfico} basta con hacer "{doble-click}" con
  16452. el ratón (dos pulsaciones seguidas del botón izquierdo del ratón)
  16453. sobre un gráfico dentro del entorno (sobre una ventana de un mapa).
  16454.  
  16455. Los {puntos de control} son simplemente puntos que pueden localizarse
  16456. dentro de un gráfico, para diferentes funciones.
  16457.  
  16458. La {barra de puntos de control} permite situar hasta {1000} puntos
  16459. diferentes dentro de un gráfico, cada uno será identificado por su
  16460. número (del {0} al {999}).
  16461.  
  16462. Para situar uno de estos puntos, basta con seleccionar el {número de
  16463. punto} con los {iconos flecha izquierda} y {flecha derecha} y, después,
  16464. pulsar sobre el gráfico.
  16465.  
  16466. Para {borrar} (deseleccionar) un punto de control, se debe volver a
  16467. pulsar sobre el mismo en el gráfico una segunda vez.
  16468.  
  16469. {/}
  16470.  
  16471. El único {punto de control} que utiliza el sistema es el punto de
  16472. control número {0} (el primero); éste es el punto que define cuál
  16473. es el {centro virtual del gráfico} y que tiene múltiples aplicaciones
  16474. dentro del lenguaje.
  16475.  
  16476. Cuando no se defina el {punto de control número 0}, el sistema
  16477. actuará como si el centro virtual del gráfico fuera el {centro real
  16478. del mismo} (un punto situado en la mitad del ancho y la mitad del
  16479. alto del gráfico).
  16480.  
  16481. {/}
  16482.  
  16483. {Nota:} Una vez definidos los puntos de control, para que éstos tengan
  16484. efecto dentro de un programa, debe grabarse el {archivo MAP} o volverse
  16485. a incluir el gráfico en el {fichero FPG} arrastrándolo hasta el mismo
  16486. (según cuál de ambos se cargue en el programa).
  16487.  
  16488. # ─────────────────────────────────────────────────────────────────────────────
  16489.  
  16490. {.1150,Modos de vídeo}
  16491. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  16492.  
  16493. Constantes: {m320x200} ... {m1024x768}
  16494. {/}
  16495.  
  16496. Esta constantes sirven para indicar el modo de vídeo en la función
  16497. {#157,set_mode()}. La lista completa de constantes es la siguiente:
  16498.  
  16499.     m320x200·
  16500.     m320x240·
  16501.     m320x400·
  16502.     m360x240·
  16503.     m360x360·
  16504.     m376x282·
  16505.     m640x400·
  16506.     m640x480·
  16507.     m800x600·
  16508.     m1024x768·
  16509.  
  16510. Cada constante indica el modo de vídeo de la siguiente manera: primero,
  16511. la letra {m} y, luego, la resolución horizontal y vertical del modo separadas por
  16512. una {x}.
  16513.  
  16514. Los valores definidos para dichas constantes son los siguientes.
  16515.  
  16516.     m320x200  = 320200·
  16517.     m320x240  = 320240·
  16518.     m320x400  = 320400·
  16519.     m360x240  = 360240·
  16520.     m360x360  = 360360·
  16521.     m376x282  = 376282·
  16522.     m640x400  = 640400·
  16523.     m640x480  = 640480·
  16524.     m800x600  = 800600·
  16525.     m1024x768 = 1024768·
  16526.  
  16527. {/}Ver: {#1202,Constantes} - {#157,set_mode()}
  16528.  
  16529. # ─────────────────────────────────────────────────────────────────────────────
  16530.  
  16531. {.1151,true}
  16532. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  16533.  
  16534. Constante: {true}
  16535. {/}
  16536.  
  16537. Esta constante se utiliza para indicar valores {ciertos}, para inicializar variables lógicas o
  16538. definir parámetros lógicos, es decir, que deben ser evaluados como una condición.
  16539.  
  16540. Su valor es {1}, y como en el lenguaje se interpretan como {ciertos} todos
  16541. los números {impares}, ésta constante será evaluada como una condición
  16542. que siempre se cumple ({cierta}).
  16543.  
  16544. {/}
  16545.  
  16546. La constante {#1152,false} es la opuesta a ésta: la utilizada para
  16547. indicar valores lógicos {falsos}.
  16548.  
  16549. {/}Ver: {#1202,Constantes} - {#1152,false}
  16550.  
  16551. # ─────────────────────────────────────────────────────────────────────────────
  16552.  
  16553. {.1152,false}
  16554. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  16555.  
  16556. Constante: {false}
  16557. {/}
  16558.  
  16559. Esta constante se utiliza para indicar valores {falsos}, para inicializar variables lógicas o
  16560. definir parámetros lógicos, es decir, que deben ser evaluados como una condición.
  16561.  
  16562. Su valor es {0}, y como en el lenguaje se interpretan como {falsos} todos
  16563. los números {pares}, esta constante será evaluada como una condición
  16564. que nunca se cumple ({falsa}).
  16565.  
  16566. {/}
  16567.  
  16568. La constante {#1152,true} es la opuesta a ésta: la utilizada para
  16569. indicar valores lógicos {ciertos}.
  16570.  
  16571. {/}Ver: {#1202,Constantes} - {#1151,true}
  16572.  
  16573. # ─────────────────────────────────────────────────────────────────────────────
  16574.  
  16575. {.1153,s_kill}
  16576. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  16577.  
  16578. Constante: {s_kill}
  16579. {/}
  16580.  
  16581. Esta constante se utiliza como parámetro de la función
  16582. {#158,signal()} (para mandar señales a los procesos).
  16583. Su valor es {0}.
  16584.  
  16585. Esta señal transmite a los procesos la orden imperativa {kill}
  16586. (muerte). Se utiliza para eliminar procesos en el programa
  16587. (para hacer desaparecer ciertos objetos del juego).
  16588.  
  16589. Es decir, al enviarle una señal {s_kill} a un proceso, éste será
  16590. eliminado y ya no aparecerá en las siguientes imágenes del juego.
  16591.  
  16592. Una constante relacionada directamente con ésta es {#1157,s_kill_tree}, con la
  16593. diferencia de que, al enviar esta señal, se eliminará al proceso indicado y
  16594. a sus {hijos}, que son los procesos que éste hubiera creado.
  16595.  
  16596. La lista completa de las constantes que utilizadas como señales pueden
  16597. ser enviadas a los diferentes procesos de un programa, es:
  16598.  
  16599.     {s_kill}·
  16600.     {#1154,s_wakeup}·
  16601.     {#1155,s_sleep}·
  16602.     {#1156,s_freeze}·
  16603.     {#1157,s_kill_tree}·
  16604.     {#1158,s_wakeup_tree}·
  16605.     {#1159,s_sleep_tree}·
  16606.     {#1160,s_freeze_tree}·
  16607.  
  16608. {/}Ver: {#1202,Constantes} - {#158,signal()} - {#1157,s_kill_tree}
  16609.  
  16610. # ─────────────────────────────────────────────────────────────────────────────
  16611.  
  16612. {.1154,s_wakeup}
  16613. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  16614.  
  16615. Constante: {s_wakeup}
  16616. {/}
  16617.  
  16618. Esta constante se utiliza como parámetro de la función
  16619. {#158,signal()} (para mandar señales a los procesos).
  16620. Su valor es {1}.
  16621.  
  16622. Esta señal transmite a los procesos la orden imperativa {wakeup}
  16623. (despierta). Se utiliza para devolver al estado normal los procesos
  16624. que han sido dormidos (con la señal {#1155,s_sleep}), o congelados
  16625. (con la señal {#1156,s_freeze}).
  16626.  
  16627. Es decir, al enviarle una señal {s_wakeup} a un proceso, éste será
  16628. reactivado en las siguientes imágenes del juego (se volverá a ver
  16629. y a procesar).
  16630.  
  16631. Una constante relacionada directamente con ésta es {#1158,s_wakeup_tree}, con la
  16632. diferencia de que, al enviar esta señal, se despertará al proceso indicado y
  16633. a sus {hijos}, que son los procesos que éste hubiera creado.
  16634.  
  16635. La lista completa de las constantes que utilizadas como señales pueden
  16636. ser enviadas a los diferentes procesos de un programa, es:
  16637.  
  16638.     {#1153,s_kill}·
  16639.     {s_wakeup}·
  16640.     {#1155,s_sleep}·
  16641.     {#1156,s_freeze}·
  16642.     {#1157,s_kill_tree}·
  16643.     {#1158,s_wakeup_tree}·
  16644.     {#1159,s_sleep_tree}·
  16645.     {#1160,s_freeze_tree}·
  16646.  
  16647.  
  16648. {/}Ver: {#1202,Constantes} - {#158,signal()} - {#1158,s_wakeup_tree}
  16649.  
  16650. # ─────────────────────────────────────────────────────────────────────────────
  16651.  
  16652. {.1155,s_sleep}
  16653. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  16654.  
  16655. Constante: {s_sleep}
  16656. {/}
  16657.  
  16658. Esta constante se utiliza como parámetro de la función
  16659. {#158,signal()} (para mandar señales a los procesos).
  16660. Su valor es {2}.
  16661.  
  16662. Esta señal transmite a los procesos la orden imperativa {sleep}
  16663. (duerme). Se utiliza para dormir a un proceso. Un proceso dormido
  16664. no aparecerá en las siguientes imágenes del juego, pero no será
  16665. eliminado, como con la señal {#1153,s_kill}, sino que podrá volver
  16666. a {despertarse} en cualquier momento con una señal {#1154,s_wakeup}.
  16667.  
  16668. Es decir, al enviarle una señal {s_sleep} a un proceso, éste dejará
  16669. de aparecer en las siguientes imágenes del juego (hasta que sea
  16670. despertado o eliminado).
  16671.  
  16672. Una constante relacionada directamente con ésta es {#1159,s_sleep_tree}, con la
  16673. diferencia de que, al enviar esta señal, se dormirá al proceso indicado y
  16674. a sus {hijos}, que son los procesos que éste hubiera creado.
  16675.  
  16676. La lista completa de las constantes que utilizadas como señales pueden
  16677. ser enviadas a los diferentes procesos de un programa, es:
  16678.  
  16679.     {#1153,s_kill}·
  16680.     {#1154,s_wakeup}·
  16681.     {s_sleep}·
  16682.     {#1156,s_freeze}·
  16683.     {#1157,s_kill_tree}·
  16684.     {#1158,s_wakeup_tree}·
  16685.     {#1159,s_sleep_tree}·
  16686.     {#1160,s_freeze_tree}·
  16687.  
  16688. {/}Ver: {#1202,Constantes} - {#158,signal()} - {#1159,s_sleep_tree}
  16689.  
  16690. # ─────────────────────────────────────────────────────────────────────────────
  16691.  
  16692. {.1156,s_freeze}
  16693. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  16694.  
  16695. Constante: {s_freeze}
  16696. {/}
  16697.  
  16698. Esta constante se utiliza como parámetro de la función
  16699. {#158,signal()} (para mandar señales a los procesos).
  16700. Su valor es {3}.
  16701.  
  16702. Esta señal transmite a los procesos la orden imperativa {freeze}
  16703. (congelar). Se utiliza para congelar (inmovilizar) a un proceso.
  16704. Un proceso congelado seguirá apareciendo en las siguientes imágenes
  16705. del juego, pero no será procesado, por lo que permanecerá inmóvil.
  16706. Este proceso podrá volver a {activarse} en cualquier momento si se
  16707. le envía una señal {#1154,s_wakeup}.
  16708.  
  16709. Es decir, al enviarle una señal {s_freeze} a un proceso, éste dejará
  16710. de procesar (interpretar sus sentencias) en las siguientes imágenes
  16711. del juego (hasta que sea activado o eliminado con {#1153,s_kill}).
  16712.  
  16713. Una constante relacionada directamente con ésta es {#1160,s_freeze_tree}, con la
  16714. diferencia de que, al enviar esta señal, se congelará al proceso indicado y
  16715. a sus {hijos}, que son los procesos que éste hubiera creado.
  16716.  
  16717. La lista completa de las constantes que utilizadas como señales pueden
  16718. ser enviadas a los diferentes procesos de un programa es:
  16719.  
  16720.     {#1153,s_kill}·
  16721.     {#1154,s_wakeup}·
  16722.     {#1155,s_sleep}·
  16723.     {s_freeze}·
  16724.     {#1157,s_kill_tree}·
  16725.     {#1158,s_wakeup_tree}·
  16726.     {#1159,s_sleep_tree}·
  16727.     {#1160,s_freeze_tree}·
  16728.  
  16729. {/}Ver: {#1202,Constantes} - {#158,signal()} - {#1160,s_freeze_tree}
  16730.  
  16731. # ─────────────────────────────────────────────────────────────────────────────
  16732.  
  16733. {.1157,s_kill_tree}
  16734. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  16735.  
  16736. Constante: {s_kill_tree}
  16737. {/}
  16738.  
  16739. Esta constante se utiliza como parámetro de la función
  16740. {#158,signal()} (para mandar señales a los procesos).
  16741. Su valor es {100}.
  16742.  
  16743. Esta señal se utiliza para que un proceso y todos los procesos
  16744. que éste haya creado sean {eliminados} enviándoles la orden imperativa
  16745. {kill} (muerte). Es una versión de la señal {#1153,s_kill}, que
  16746. elimina al proceso, pero no a los procesos que éste haya creado.
  16747.  
  16748. Es decir, con {s_kill_tree} se {eliminará} al proceso y a toda su
  16749. descendencia, con lo que ya no aparecerá ninguno de ellos en las
  16750. siguientes imágenes del juego.
  16751.  
  16752. La lista completa de las constantes que utilizadas como señales, pueden
  16753. ser enviadas a los diferentes procesos de un programa es:
  16754.  
  16755.     {#1153,s_kill}·
  16756.     {#1154,s_wakeup}·
  16757.     {#1155,s_sleep}·
  16758.     {#1156,s_freeze}·
  16759.     {s_kill_tree}·
  16760.     {#1158,s_wakeup_tree}·
  16761.     {#1159,s_sleep_tree}·
  16762.     {#1160,s_freeze_tree}·
  16763.  
  16764. {/}Ver: {#1202,Constantes} - {#158,signal()} - {#1153,s_kill}
  16765.  
  16766. # ─────────────────────────────────────────────────────────────────────────────
  16767.  
  16768. {.1158,s_wakeup_tree}
  16769. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  16770.  
  16771. Constante: {s_wakeup_tree}
  16772. {/}
  16773.  
  16774. Esta constante se utiliza como parámetro de la función
  16775. {#158,signal()} (para mandar señales a los procesos).
  16776. Su valor es {101}.
  16777.  
  16778. Esta señal se utiliza para que un proceso y todos los procesos
  16779. que éste haya creado sean {despertados} enviándoles la orden imperativa
  16780. {wakeup} (despertar). Es una versión de la señal {#1154,s_wakeup}, que
  16781. despierta al proceso, pero no a los procesos que éste haya creado.
  16782.  
  16783. Es decir, con {s_wakeup_tree} se {despertará} al proceso y a toda su
  16784. descendencia, volviendo todos estos procesos a su estado normal en las
  16785. siguientes imágenes del juego.
  16786.  
  16787. Se puede despertar (reactivar) a procesos que han sido {dormidos}
  16788. con la señal {#1159,s_sleep_tree} o {congelados} con la señal
  16789. {#1160,s_freeze_tree}.
  16790.  
  16791. La lista completa de las constantes que utilizadas como señales pueden
  16792. ser enviadas a los diferentes procesos de un programa es:
  16793.  
  16794.     {#1153,s_kill}·
  16795.     {#1154,s_wakeup}·
  16796.     {#1155,s_sleep}·
  16797.     {#1156,s_freeze}·
  16798.     {#1157,s_kill_tree}·
  16799.     {s_wakeup_tree}·
  16800.     {#1159,s_sleep_tree}·
  16801.     {#1160,s_freeze_tree}·
  16802.  
  16803. {/}Ver: {#1202,Constantes} - {#158,signal()} - {#1154,s_wakeup}
  16804.  
  16805. # ─────────────────────────────────────────────────────────────────────────────
  16806.  
  16807. {.1159,s_sleep_tree}
  16808. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  16809.  
  16810. Constante: {s_sleep_tree}
  16811. {/}
  16812.  
  16813. Esta constante se utiliza como parámetro de la función
  16814. {#158,signal()} (para mandar señales a los procesos).
  16815. Su valor es {102}.
  16816.  
  16817. Esta señal se utiliza para que un proceso y todos los procesos
  16818. que éste haya creado sean {dormidos} enviándoles la orden imperativa
  16819. {sleep} (dormir). Es una versión de la señal {#1155,s_sleep}, que
  16820. duerme al proceso, pero no a los procesos que éste haya creado.
  16821.  
  16822. Es decir, con {s_sleep_tree} se {dormirá} al proceso y a toda su
  16823. descendencia, desapareciendo todos estos procesos en las
  16824. siguientes imágenes del juego (pero sin ser eliminados).
  16825.  
  16826. Se puede despertar (reactivar) a estos procesos {dormidos}
  16827. con la señal {#1158,s_wakeup_tree}.
  16828.  
  16829. La lista completa de las constantes que utilizadas como señales pueden
  16830. ser enviadas a los diferentes procesos de un programa es:
  16831.  
  16832.     {#1153,s_kill}·
  16833.     {#1154,s_wakeup}·
  16834.     {#1155,s_sleep}·
  16835.     {#1156,s_freeze}·
  16836.     {#1157,s_kill_tree}·
  16837.     {#1158,s_wakeup_tree}·
  16838.     {s_sleep_tree}·
  16839.     {#1160,s_freeze_tree}·
  16840.  
  16841. {/}Ver: {#1202,Constantes} - {#158,signal()} - {#1155,s_sleep}
  16842.  
  16843. # ─────────────────────────────────────────────────────────────────────────────
  16844.  
  16845. {.1160,s_freeze_tree}
  16846. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  16847.  
  16848. Constante: {s_freeze_tree}
  16849. {/}
  16850.  
  16851. Esta constante se utiliza como parámetro de la función
  16852. {#158,signal()} (para mandar señales a los procesos).
  16853. Su valor es {103}.
  16854.  
  16855. Esta señal se utiliza para que un proceso y todos los procesos
  16856. que éste haya creado sean {congelados} (inmovilizados) enviándoles la orden imperativa
  16857. {freeze} (congelar). Es una versión de la señal {#1156,s_freeze}, que
  16858. congela al proceso, pero no a los procesos que éste haya creado.
  16859.  
  16860. Es decir, con {s_freeze_tree} se {congelará} al proceso y a toda su
  16861. descendencia, dejando de procesar todos estos procesos en las
  16862. siguientes imágenes del juego (quedarán inmovilizados, pues no
  16863. ejecutarán sus sentencias).
  16864.  
  16865. Se puede descongelar (reactivar) a estos procesos {congelados}
  16866. con la señal {#1158,s_wakeup_tree}.
  16867.  
  16868. La lista completa de las constantes que utilizadas como señales pueden
  16869. ser enviadas a los diferentes procesos de un programa es:
  16870.  
  16871.     {#1153,s_kill}·
  16872.     {#1154,s_wakeup}·
  16873.     {#1155,s_sleep}·
  16874.     {#1156,s_freeze}·
  16875.     {#1157,s_kill_tree}·
  16876.     {#1158,s_wakeup_tree}·
  16877.     {#1159,s_sleep_tree}·
  16878.     {s_freeze_tree}·
  16879.  
  16880. {/}Ver: {#1202,Constantes} - {#158,signal()} - {#1156,s_freeze}
  16881.  
  16882. # ─────────────────────────────────────────────────────────────────────────────
  16883.  
  16884. {.1161,all_text}
  16885. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  16886.  
  16887. Constante: {all_text}
  16888. {/}
  16889.  
  16890. Esta constante se usa como parámetro de la función {#107,delete_text()},
  16891. para eliminar {todos} los textos visualizados en el programa con las
  16892. funciones {#171,write()} y {#172,write_int()}.
  16893.  
  16894. Es decir, para que desaparezcan todos los textos que aparecen en
  16895. pantalla se debe ejecutar la siguiente sentencia:
  16896.  
  16897.   {delete_text(all_text);}
  16898.  
  16899. El valor que tiene asignado esta constante es {0}.
  16900.  
  16901. {/}Ver: {#1202,Constantes} - {#107,delete_text()}
  16902.  
  16903. # ─────────────────────────────────────────────────────────────────────────────
  16904.  
  16905. {.1162,all_sound}
  16906. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  16907.  
  16908. Constante: {all_sound}
  16909. {/}
  16910.  
  16911. Esta constante se usa como parámetro de la función {#167,stop_sound()},
  16912. para parar {todos} los efectos de sonido previamente activados con la
  16913. función {#159,sound()}.
  16914.  
  16915. Es decir, para detener todos los canales de sonido activos en un momento
  16916. determinado se debe ejecutar la siguiente sentencia:
  16917.  
  16918.   {stop_sound(all_sound);}
  16919.  
  16920. El valor que tiene asignado esta constante es{ -1}.
  16921.  
  16922. {/}Ver: {#1202,Constantes} - {#167,stop_sound()} - {#159,sound()}
  16923.  
  16924. # ─────────────────────────────────────────────────────────────────────────────
  16925.  
  16926. {.1163,g_wide}
  16927. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  16928.  
  16929. Constante: {g_wide}
  16930. {/}
  16931.  
  16932. Esta constante se usa como parámetro de la función {#126,graphic_info()},
  16933. para pedir información sobre el {ancho} (en puntos) de un gráfico determinado.
  16934. Su valor es {0}.
  16935.  
  16936. Las constantes que pueden utilizarse como parámetros de esta función son:
  16937.  
  16938.     {g_wide}·
  16939.     {#1164,g_height}·
  16940.     {#1165,g_x_center}·
  16941.     {#1166,g_y_center}·
  16942.  
  16943. {/}Ver: {#1202,Constantes} - {#126,graphic_info()}
  16944.  
  16945. # ─────────────────────────────────────────────────────────────────────────────
  16946.  
  16947. {.1164,g_height}
  16948. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  16949.  
  16950. Constante: {g_height}
  16951. {/}
  16952.  
  16953. Esta constante se usa como parámetro de la función {#126,graphic_info()},
  16954. para pedir información sobre el {alto} (en puntos) de un gráfico determinado.
  16955. Su valor es {1}.
  16956.  
  16957. Las constantes que pueden utilizarse como parámetros de esta función son:
  16958.  
  16959.     {#1163,g_wide}·
  16960.     {g_height}·
  16961.     {#1165,g_x_center}·
  16962.     {#1166,g_y_center}·
  16963.  
  16964. {/}Ver: {#1202,Constantes} - {#126,graphic_info()}
  16965.  
  16966. # ─────────────────────────────────────────────────────────────────────────────
  16967.  
  16968. {.1165,g_x_center}
  16969. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  16970.  
  16971. Constante: {g_x_center}
  16972. {/}
  16973.  
  16974. Esta constante se usa como parámetro de la función {#126,graphic_info()},
  16975. para pedir información sobre el {centro horizontal} de un gráfico determinado.
  16976. Su valor es {2}.
  16977.  
  16978. El {centro horizontal} de un gráfico será la mitad del ancho (en puntos),
  16979. si no se ha definido en la herramienta de dibujo el {#1136,punto de control}
  16980. número {0} (centro del gráfico).
  16981.  
  16982. Las constantes que pueden utilizarse como parámetros de esta función son:
  16983.  
  16984.     {#1163,g_wide}·
  16985.     {#1164,g_height}·
  16986.     {g_x_center}·
  16987.     {#1166,g_y_center}·
  16988.  
  16989. {/}Ver: {#1202,Constantes} - {#126,graphic_info()}
  16990.  
  16991. # ─────────────────────────────────────────────────────────────────────────────
  16992.  
  16993. {.1166,g_y_center}
  16994. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  16995.  
  16996. Constante: {g_y_center}
  16997. {/}
  16998.  
  16999. Esta constante se usa como parámetro de la función {#126,graphic_info()},
  17000. para pedir información sobre el {centro vertical} de un gráfico determinado.
  17001. Su valor es {3}.
  17002.  
  17003. El {centro vertical} de un gráfico será la mitad del alto (en puntos),
  17004. si no se ha definido en la herramienta de dibujo el {#1136,punto de control}
  17005. número {0} (centro del gráfico).
  17006.  
  17007. Las constantes que pueden utilizarse como parámetros de esta función son:
  17008.  
  17009.     {#1163,g_wide}·
  17010.     {#1164,g_height}·
  17011.     {#1165,g_x_center}·
  17012.     {g_y_center}·
  17013.  
  17014. {/}Ver: {#1202,Constantes} - {#126,graphic_info()}
  17015.  
  17016. # ─────────────────────────────────────────────────────────────────────────────
  17017.  
  17018. {.1167,c_screen}
  17019. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  17020.  
  17021. Constante: {c_screen}
  17022. {/}
  17023.  
  17024. Esta constante se utiliza para asignarla a la variable local predefinida
  17025. {#1122,ctype} que sirve para definir el tipo de coordenadas que
  17026. tendrá un proceso. Su valor es {0}.
  17027.  
  17028. {Este es el valor por defecto de} {#1122,ctype}, el utilizado para que
  17029. las coordenadas del gráfico del proceso se interpreten como referidas
  17030. a la pantalla, donde la esquina superior izquierda es la (0, 0).
  17031.  
  17032. Existen otras constantes utilizadas para otros sistemas de coordenadas,
  17033. la lista completa es la siguiente:
  17034.  
  17035.     {c_screen} - Coordenadas de pantalla·
  17036.     {#1168,c_scroll} - Coordenadas de scroll·
  17037.     {#1169,c_m7}     - Coordenadas de modo 7·
  17038.  
  17039. {/}Ver: {#1202,Constantes} - {#1122,ctype}
  17040.  
  17041. # ─────────────────────────────────────────────────────────────────────────────
  17042.  
  17043. {.1168,c_scroll}
  17044. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  17045.  
  17046. Constante: {c_scroll}
  17047. {/}
  17048.  
  17049. Esta constante se utiliza para asignarla a la variable local predefinida
  17050. {#1122,ctype} que sirve para definir el tipo de coordenadas que
  17051. tendrá un proceso. Su valor es {1}.
  17052.  
  17053. Éste es el valor asignado a {#1122,ctype} para que
  17054. las coordenadas del gráfico del proceso se interpreten como referidas
  17055. a una ventana de scroll, a coordenadas sobre el gráfico
  17056. del primer plano.
  17057.  
  17058. Para más información sobre las {ventanas de scroll}, se puede acceder
  17059. a la función {#163,start_scroll()} utilizada para activarlas.
  17060.  
  17061. Existen otras constantes utilizadas para otros sistemas de coordenadas,
  17062. la lista completa es la siguiente:
  17063.  
  17064.     {#1167,c_screen} - Coordenadas de pantalla·
  17065.     {c_scroll} - Coordenadas de scroll·
  17066.     {#1169,c_m7}     - Coordenadas de modo 7·
  17067.  
  17068. {/}Ver: {#1202,Constantes} - {#1122,ctype} - {#163,start_scroll()}
  17069.  
  17070. # ─────────────────────────────────────────────────────────────────────────────
  17071.  
  17072. {.1169,c_m7}
  17073. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  17074.  
  17075. Constante: {c_m7}
  17076. {/}
  17077.  
  17078. Esta constante se utiliza para asignarla a la variable local predefinida
  17079. {#1122,ctype} que sirve para definir el tipo de coordenadas que
  17080. tendrá un proceso. Su valor es {2}.
  17081.  
  17082. Éste es el valor asignado a {#1122,ctype} para que
  17083. las coordenadas del gráfico del proceso se interpreten como referidas
  17084. a una ventana de modo 7, a coordenadas sobre el gráfico
  17085. principal, abatido tridimensionalmente en dicha ventana.
  17086.  
  17087. Para más información sobre las {ventanas de modo 7}, se puede acceder
  17088. a la función {#162,start_mode7()}, utilizada para activarlas.
  17089.  
  17090. Existen otras constantes utilizadas para otros sistemas de coordenadas,
  17091. la lista completa es la siguiente:
  17092.  
  17093.     {#1167,c_screen} - Coordenadas de pantalla·
  17094.     {#1168,c_scroll} - Coordenadas de scroll·
  17095.     {c_m7}     - Coordenadas de modo 7·
  17096.  
  17097. {/}Ver: {#1202,Constantes} - {#1122,ctype} - {#162,start_mode7()}
  17098.  
  17099. # ─────────────────────────────────────────────────────────────────────────────
  17100.  
  17101. {.1170,partial_dump}
  17102. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  17103.  
  17104. Constante: {partial_dump}
  17105. {/}
  17106.  
  17107. Esta constante se utiliza para asignarla a la variable global predefinida
  17108. {#1114,dump_type} que sirve para definir el tipo de volcado que se hará a
  17109. pantalla. Su valor es {0}.
  17110.  
  17111. Se utiliza en la siguiente sentencia:
  17112.  
  17113.   {dump_type=partial_dump;}
  17114.  
  17115. Con esta sentencia se indica al gestor de procesos de DIV Games
  17116. Studio que los siguientes volcados deben ser {parciales}.
  17117.  
  17118. Se denomina {volcado} al procedimiento de enviar las imágenes del juego
  17119. al monitor (a la memoria de vídeo de la tarjeta gráfica).
  17120.  
  17121. Hay dos tipos de volcados:
  17122.  
  17123. {Parcial}: Sólo se volcarán en pantalla los gráficos que se actualicen,
  17124. que hayan variado respecto a la imagen anterior. Este volcado conviene activarlo
  17125. {para ganar velocidad} cuando se programe un juego (o una sección del
  17126. mismo) sin una ventana de scroll o modo 7 que ocupe toda la pantalla,
  17127. es decir, cuando el juego muestre movimientos de gráficos sobre un
  17128. fondo fijo, o bien cuando las ventanas activas de scroll o modo 7 sean
  17129. más pequeñas que la pantalla.
  17130.  
  17131. {Completo}: Se volcará toda la pantalla, sin importar si los gráficos han
  17132. cambiado o no. Éste es el volcado por defecto y {es más lento que el
  17133. volcado parcial}, sin embargo, es el que se debe utilizar cuando el
  17134. juego tenga una ventana de scroll o modo 7 que ocupe toda la pantalla.
  17135.  
  17136. {/}
  17137.  
  17138. La otra constante que se utiliza para designar el tipo de volcado es
  17139. {#1171,complete_dump} que, al contrario de ésta, define un volcado {completo}.
  17140.  
  17141. {/}Ver: {#1202,Constantes} - {#1114,dump_type} - {#1171,complete_dump}
  17142.  
  17143. # ─────────────────────────────────────────────────────────────────────────────
  17144.  
  17145. {.1171,complete_dump}
  17146. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  17147.  
  17148. Constante: {complete_dump}
  17149. {/}
  17150.  
  17151. Esta constante se utiliza para asignarla a la variable global predefinida
  17152. {#1114,dump_type} que sirve para definir el tipo de volcado que se hará a
  17153. pantalla. Su valor es {1}.
  17154.  
  17155. Éste es el {valor por defecto} de la variable {#1114,dump_type}.
  17156. Para establecer este valor se debe utilizar la siguiente sentencia:
  17157.  
  17158.   {dump_type=complete_dump;}
  17159.  
  17160. Con esta sentencia se indica al gestor de procesos de DIV Games
  17161. Studio que los siguientes volcados deben ser {completos}.
  17162.  
  17163. Se denomina {volcado} al proceso de enviar las imágenes del juego
  17164. al monitor (a la memoria de vídeo de la tarjeta gráfica).
  17165.  
  17166. Hay dos tipos de volcados:
  17167.  
  17168. {Parcial}: Sólo se volcarán en pantalla los gráficos que se actualicen,
  17169. que hayan variado respecto a la imagen anterior. Este volcado conviene activarlo
  17170. {para ganar velocidad} cuando se programe un juego (o una sección del
  17171. mismo) sin una ventana de scroll o modo 7 que ocupe toda la pantalla,
  17172. es decir, cuando el juego muestre movimientos de gráficos sobre un
  17173. fondo fijo, o bien cuando las ventanas activas de scroll o modo 7 sean
  17174. más pequeñas que la pantalla.
  17175.  
  17176. {Completo}: Se volcará toda la pantalla, sin importar si los gráficos han
  17177. cambiado o no. Éste es el volcado por defecto y {es más lento que el
  17178. volcado parcial}, sin embargo, es el que se debe utilizar cuando el
  17179. juego tenga una ventana de scroll o modo 7 que ocupe toda la pantalla.
  17180.  
  17181. {/}
  17182.  
  17183. La otra constante que se utiliza para designar el tipo de volcado es
  17184. {#1170,partial_dump} que, al contrario de ésta, define un volcado {parcial}.
  17185.  
  17186. {/}Ver: {#1202,Constantes} - {#1114,dump_type} - {#1170,partial_dump}
  17187.  
  17188. # ─────────────────────────────────────────────────────────────────────────────
  17189.  
  17190. {.1172,no_restore}
  17191. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  17192.  
  17193. Constante: {no_restore}
  17194. {/}
  17195.  
  17196. Esta constante se utiliza para asignarla a la variable global predefinida
  17197. {#1113,restore_type} que sirve para definir el tipo de restauración
  17198. que se debe aplicar al fondo de la pantalla tras cada imagen del juego.
  17199. Su valor es{ -1}.
  17200.  
  17201. Se denomina {restauración del fondo} a recuperar las zonas de pantalla
  17202. en las que se han pintado gráficos o escrito textos en la imagen anterior,
  17203. es decir, "{despintar}" los gráficos y "{desescribir}" los textos (borrarlos).
  17204.  
  17205. Para establecer este valor se debe utilizar la siguiente sentencia:
  17206.  
  17207.   {restore_type=no_restore;}
  17208.  
  17209. Con esta sentencia se indica al gestor de procesos de DIV Games
  17210. Studio que tras las siguientes imágenes del juego {no es necesario
  17211. que se restaure el fondo de pantalla}.
  17212.  
  17213. Si no se restaura el fondo, se {ganará velocidad} de ejecución en
  17214. el juego (irá más fluido en los ordenadores lentos). Pero esta
  17215. modalidad de restauración ({no_restore}) es aplicable únicamente
  17216. en juegos o secciones de los mismos, en los que {exista una ventana
  17217. de scroll o de modo 7 que ocupe la pantalla completa}.
  17218.  
  17219. Los tres tipos de restauración aplicables se corresponden con
  17220. estas tres constantes:
  17221.  
  17222. {no_restore}       - El más rápido, no se restaura el fondo·
  17223. {#1173,partial_restore}  - Medio, restauraciones parciales·
  17224. {#1174,complete_restore} - El más lento, restauración completa·
  17225.  
  17226. {/}Ver: {#1202,Constantes} - {#1113,restore_type}
  17227.  
  17228. # ─────────────────────────────────────────────────────────────────────────────
  17229.  
  17230. {.1173,partial_restore}
  17231. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  17232.  
  17233. Constante: {partial_restore}
  17234. {/}
  17235.  
  17236. Esta constante se utiliza para asignarla a la variable global predefinida
  17237. {#1113,restore_type} que sirve para definir el tipo de restauración
  17238. que se debe aplicar al fondo de la pantalla tras cada imagen del juego.
  17239. Su valor es{ 0}.
  17240.  
  17241. Se denomina {restauración del fondo} a recuperar las zonas de pantalla
  17242. en las que se han pintado gráficos o escrito textos en la imagen anterior,
  17243. es decir, "{despintar}" los gráficos y "{desescribir}" los textos (borrarlos).
  17244.  
  17245. Para establecer este valor se debe utilizar la siguiente sentencia:
  17246.  
  17247.   {restore_type=partial_restore;}
  17248.  
  17249. Con esta sentencia se indica al gestor de procesos de DIV Games
  17250. Studio que, tras las siguientes imágenes del juego, {se deben restaurar
  17251. únicamente las zonas de pantalla en las que se hayan pintado
  17252. gráficos o escrito textos}.
  17253.  
  17254. Esta modalidad de restauración ({partial_restore}) es más rápida que una restauración
  17255. completa (opción por defecto), pero debe aplicarse únicamente en
  17256. juegos, o secciones de los mismos, en los que {NO exista una ventana
  17257. de scroll o de modo 7 que ocupe la pantalla completa}.
  17258.  
  17259. Los tres tipos de restauración aplicables se corresponden con
  17260. estas tres constantes:
  17261.  
  17262. {#1172,no_restore}       - El más rápido, no se restaura el fondo·
  17263. {partial_restore}  - Medio, restauraciones parciales·
  17264. {#1174,complete_restore} - El más lento, restauración completa·
  17265.  
  17266. {/}Ver: {#1202,Constantes} - {#1113,restore_type}
  17267.  
  17268. # ─────────────────────────────────────────────────────────────────────────────
  17269.  
  17270. {.1174,complete_restore}
  17271. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  17272.  
  17273. Constante: {complete_restore}
  17274. {/}
  17275.  
  17276. Esta constante se utiliza para asignarla a la variable global predefinida
  17277. {#1113,restore_type} que sirve para definir el tipo de restauración
  17278. que se debe aplicar al fondo de la pantalla tras cada imagen del juego.
  17279. Su valor es{ 1}.
  17280.  
  17281. Se denomina {restauración del fondo} a recuperar las zonas de pantalla
  17282. en las que se han pintado gráficos o escrito textos en la imagen anterior,
  17283. es decir, "{despintar}" los gráficos y "{desescribir}" los textos (borrarlos).
  17284.  
  17285. {Éste es el valor por defecto de la variable} {#1113,restore_type} y,
  17286. de las tres modalidades de restauración disponible, es la {más lenta}.
  17287. Para establecer este valor se debe utilizar la siguiente sentencia:
  17288.  
  17289.   {restore_type=complete_restore;}
  17290.  
  17291. Con esta sentencia se indica al gestor de procesos de DIV Games
  17292. Studio que tras las siguientes imágenes del juego {se debe restaurar
  17293. completamente el fondo de la pantalla}.
  17294.  
  17295. Esta modalidad de restauración ({complete_restore}) es la más
  17296. lenta de todas (y es la opción por defecto), por lo que puede
  17297. cambiarse por otra para {ganar velocidad} de ejecución en el juego
  17298. (con lo que irá más fluido en los ordenadores lentos).
  17299.  
  17300. En realidad, esta modalidad interesa únicamente en juegos, o secciones
  17301. de los mismos, que {no} tengan una ventana de scroll o de modo 7 que ocupe
  17302. toda la pantalla, pero que tengan una gran cantidad de gráficos
  17303. moviéndose por pantalla.
  17304.  
  17305. Los tres tipos de restauración aplicables se corresponden con
  17306. estas tres constantes:
  17307.  
  17308. {#1172,no_restore}       - El más rápido, no se restaura el fondo·
  17309. {#1173,partial_restore}  - Medio, restauraciones parciales·
  17310. {complete_restore} - El más lento, restauración completa·
  17311.  
  17312. {/}Ver: {#1202,Constantes} - {#1113,restore_type}
  17313.  
  17314. # ─────────────────────────────────────────────────────────────────────────────
  17315.  
  17316. {.1175,Números de ventana}
  17317. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  17318.  
  17319. Constantes: {c_0} ... {c_9}
  17320. {/}
  17321.  
  17322. Estas constantes se utilizan para asignarlas a la variable local predefinida
  17323. {#1134,cnumber} que sirve para definir las ventanas de scroll o modo 7
  17324. en las que debe aparecer el gráfico de un proceso.
  17325.  
  17326. {Ésto será necesario solamente cuando se hayan activado varias ventanas
  17327. de scroll o varias ventanas de modo 7, y NO se quiera que el gráfico
  17328. del proceso se visualice en todas ellas.}
  17329.  
  17330. Pueden definirse hasta 10 ventanas de estos tipos, con los números
  17331. del {0} al {9}, y que se corresponderán directamente con las constantes
  17332. {c_0}, {c_1}, {c_2} ... {c_9}.
  17333.  
  17334. Para que el gráfico de un proceso aparezca sólo en una de estas
  17335. ventanas, se debe asignar la constante correspondiente a su variable
  17336. local {#1134,cnumber}. Por ejemplo, si se quisiera que el gráfico
  17337. de un proceso apareciera únicamente en la ventana número 3 (de scroll
  17338. o modo 7), se debería incluir en su código la siguiente sentencia:
  17339.  
  17340.   {cnumber=c_3;}
  17341.  
  17342. Si se quiere que el gráfico de un proceso aparezca en varias ventanas
  17343. de estas ventanas, entonces se deberán sumar las constantes.
  17344. Por ejemplo, para que un proceso aparezca en las ventanas 0, 4, y 5
  17345. se realizará la siguiente asignación:
  17346.  
  17347.   {cnumber=c_0+c_4+c_5;}
  17348.  
  17349. Para que el gráfico aparezca en todas las ventanas, basta con asignar
  17350. un {0} a la variable {#1134,cnumber}. Aspecto que no será necesario si
  17351. esta variable no se ha modificado, pues ése es su valor por defecto.
  17352.  
  17353. Los valores a los que equivalen estas constantes se corresponden
  17354. con las siguientes potencias de 2:
  17355.  
  17356.     {c_0} = 1   scroll / modo-7 número 0·
  17357.     {c_1} = 2   scroll / modo-7 número 1·
  17358.     {c_2} = 4   scroll / modo-7 número 2·
  17359.     {c_3} = 8   scroll / modo-7 número 3·
  17360.     {c_4} = 16  scroll / modo-7 número 4·
  17361.     {c_5} = 32  scroll / modo-7 número 5·
  17362.     {c_6} = 64  scroll / modo-7 número 6·
  17363.     {c_7} = 128 scroll / modo-7 número 7·
  17364.     {c_8} = 256 scroll / modo-7 número 8·
  17365.     {c_9} = 512 scroll / modo-7 número 9·
  17366.  
  17367. {/}Ver: {#1202,Constantes} - {#1134,cnumber}.
  17368.  
  17369. # ─────────────────────────────────────────────────────────────────────────────
  17370.  
  17371. {.1176,Códigos de las teclas}
  17372. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  17373.  
  17374. Constantes: {Códigos de las teclas}
  17375. {/}
  17376.  
  17377. Estas constantes se utilizan normalmente como parámetro de la
  17378. función {#128,key()}, para indicar qué tecla es la que se desea
  17379. saber si está pulsada.
  17380.  
  17381. También se pueden utilizar para comparar la variable global
  17382. {#1110,scan_code}, que contiene el código de la última tecla que
  17383. se ha pulsado, con estos valores.
  17384.  
  17385. Normalmente, para designar a cada constante se suele usar el carácter {_}
  17386. (subrayado) seguido del nombre de la tecla, por ejemplo para la tecla [{A}],
  17387. la constante referida a su código será {_a}.
  17388.  
  17389. La lista completa de estas constantes, con sus respectivos valores,
  17390. es la siguiente (según la disposición estándar del teclado):
  17391.  
  17392. {_esc}         = 1   [ESC] o escape·
  17393. {_f1}          = 59  [F1] o función 1·
  17394. {_f2}          = 60  [F2] o función 2·
  17395. {_f3}          = 61  [F3] o función 3·
  17396. {_f4}          = 62  [F4] o función 4·
  17397. {_f5}          = 63  [F5] o función 5·
  17398. {_f6}          = 64  [F6] o función 6·
  17399. {_f7}          = 65  [F7] o función 7·
  17400. {_f8}          = 66  [F8] o función 8·
  17401. {_f9}          = 67  [F9] o función 9·
  17402. {_f10}         = 68  [F10] o función 10·
  17403. {_f11}         = 87  [F11] o función 11·
  17404. {_f12}         = 88  [F12] o función 12 (TRAZADOR)·
  17405. {_prn_scr}     = 55  [IMPR PANT] o impresión pantalla·
  17406. {_scroll_lock} = 70  [BLOQ DESPL] o bloqueo desplazamiento·
  17407.  
  17408. {_wave}        = 41  Tecla [º] o [ª]·
  17409. {_1}           = 2   Tecla con el número "1"·
  17410. {_2}           = 3   Tecla con el número "2"·
  17411. {_3}           = 4   Tecla con el número "3"·
  17412. {_4}           = 5   Tecla con el número "4"·
  17413. {_5}           = 6   Tecla con el número "5"·
  17414. {_6}           = 7   Tecla con el número "6"·
  17415. {_7}           = 8   Tecla con el número "7"·
  17416. {_8}           = 9   Tecla con el número "8"·
  17417. {_9}           = 10  Tecla con el número "9"·
  17418. {_0}           = 11  Tecla con el número "0"·
  17419. {_minus}       = 12  Tecla con el símbolo "?"·
  17420. {_plus}        = 13  Tecla con el símbolo "¿"·
  17421.  
  17422. {_backspace}   = 14  Tecla de borrado ( <- )·
  17423. {_tab}         = 15  Tecla de tabulador [TAB]·
  17424. {_q}           = 16  Tecla con la letra "Q"·
  17425. {_w}           = 17  Tecla con la letra "W"·
  17426. {_e}           = 18  Tecla con la letra "E"·
  17427. {_r}           = 19  Tecla con la letra "R"·
  17428. {_t}           = 20  Tecla con la letra "T"·
  17429. {_y}           = 21  Tecla con la letra "Y"·
  17430. {_u}           = 22  Tecla con la letra "U"·
  17431. {_i}           = 23  Tecla con la letra "I"·
  17432. {_o}           = 24  Tecla con la letra "O"·
  17433. {_p}           = 25  Tecla con la letra "P"·
  17434. {_l_brachet}   = 26  Tecla [^] o [`]·
  17435. {_r_brachet}   = 27  Tecla [*] o [+]·
  17436. {_enter}       = 28  [ENTER] (Intro o Retorno)·
  17437.  
  17438. {_caps_lock}   = 58  [BLOQ MAYUS] o bloqueo mayúsculas·
  17439. {_a}           = 30  Tecla con la letra "A"·
  17440. {_s}           = 31  Tecla con la letra "S"·
  17441. {_d}           = 32  Tecla con la letra "D"·
  17442. {_f}           = 33  Tecla con la letra "F"·
  17443. {_g}           = 34  Tecla con la letra "G"·
  17444. {_h}           = 35  Tecla con la letra "H"·
  17445. {_j}           = 36  Tecla con la letra "J"·
  17446. {_k}           = 37  Tecla con la letra "K"·
  17447. {_l}           = 38  Tecla con la letra "L"·
  17448. {_semicolon}   = 39  Tecla con la letra "Ñ"·
  17449. {_apostrophe}  = 40  Tecla [{{}]·
  17450. {_backslash}   = 43  Tecla [{}}]·
  17451.  
  17452. {_l_shift}     = 42  [SHIFT] o mayúsculas izquierdo·
  17453. {_z}           = 44  Tecla con la letra "Z"·
  17454. {_x}           = 45  Tecla con la letra "X"·
  17455. {_c}           = 46  Tecla con la letra "C"·
  17456. {_v}           = 47  Tecla con la letra "V"·
  17457. {_b}           = 48  Tecla con la letra "B"·
  17458. {_n}           = 49  Tecla con la letra "N"·
  17459. {_m}           = 50  Tecla con la letra "M"·
  17460. {_comma}       = 51  Tecla [;] o [,]·
  17461. {_point}       = 51  Tecla [:] o [.]·
  17462. {_slash}       = 51  Tecla [_] o [-]·
  17463. {_r_shift}     = 54  [SHIFT] o mayúsculas derecho·
  17464.  
  17465. {_control}     = 29  Teclas [CONTROL]·
  17466. {_alt}         = 56  Tecla [ALT] o [ALT GR]·
  17467. {_space}       = 57  [SPACE] o barra espaciadora·
  17468.  
  17469. {_ins}         = 82  [INSERT] o insertar·
  17470. {_home}        = 71  [INICIO] o inicio de página·
  17471. {_pgup}        = 73  [RE PAG] o retroceso de página·
  17472. {_del}         = 83  [SUPR] o suprimir·
  17473. {_end}         = 79  [FIN] o fin de página·
  17474. {_pgdn}        = 81  [AV PAG] o avance de página·
  17475.  
  17476. {_up}          = 72  Cursor para arriba·
  17477. {_down}        = 80  Cursor para abajo·
  17478. {_left}        = 75  Cursor para izquierda·
  17479. {_right}       = 77  Cursor para derecha·
  17480.  
  17481. {_num_lock}    = 69  [BLOQ NUM] o bloqueo numérico·
  17482. {_c_backslash} = 53  Símbolo [/] del teclado numérico·
  17483. {_c_asterisk}  = 55  Símbolo [*] del teclado numérico·
  17484. {_c_minus}     = 74  Símbolo [-] del teclado numérico·
  17485. {_c_home}      = 71  [INICIO] del teclado numérico·
  17486. {_c_up}        = 72  Cursor arriba del teclado numérico·
  17487. {_c_pgup}      = 73  [RE PAG] del teclado numérico·
  17488. {_c_left}      = 75  Cursor izquierda del teclado numérico·
  17489. {_c_center}    = 76  Tecla [5] del teclado numérico·
  17490. {_c_right}     = 77  Cursor derecha del teclado numérico·
  17491. {_c_end}       = 79  [FIN] del teclado numérico·
  17492. {_c_down}      = 80  Cursor abajo del teclado numérico·
  17493. {_c_pgdn}      = 81  [AV PAG] del teclado numérico·
  17494. {_c_ins}       = 82  [INS] del teclado numérico·
  17495. {_c_del}       = 83  [SUPR] del teclado numérico·
  17496. {_c_plus}      = 78  Símbolo [+] del teclado numérico·
  17497. {_c_enter}     = 28  [ENTER] del teclado numérico·
  17498.  
  17499. Resulta indiferente utilizar estas constantes o los valores numéricos
  17500. que representan, es decir, se puede llamar a la función {#128,key()},
  17501. para comprobar si está pulsada la tecla [{A}], como {key(_a)} o bien
  17502. como {key(30)} (se puede comprobar en la lista anterior que {30} es
  17503. el valor numérico de la constante {_a}).
  17504.  
  17505. {/}
  17506.  
  17507. {Importante:} Algunos de estos códigos pueden diferir en ciertos
  17508. teclados, en caso de duda se puede ejecutar el siguiente programa
  17509. ejemplo, que muestra en pantalla una tabla, correspondiente con la
  17510. función {#128,key()} (indicando los {códigos de las teclas que están
  17511. pulsadas} en cada momento), además de los valores de las variables
  17512. {#1110,scan_code}, {#1109,ascii} y {#1108,shift_status} (relacionados
  17513. igualmente con la lectura del teclado).
  17514.  
  17515. {#9999,Programa ejemplo:}
  17516. PROGRAM ejemplo_códigos_del_teclado;
  17517.  
  17518. GLOBAL
  17519.     teclas[128];
  17520.  
  17521. BEGIN
  17522.     write(0, 0, 0, 0, "Códigos de las teclas pulsadas, según key()");
  17523.     FROM x=0 TO 127;
  17524.         write_int(0, (x%16)*20, (x/16)*10+20, 0, OFFSET teclas[x]);
  17525.     END
  17526.     write(0, 0, 160, 0, "Código de la última tecla pulsada (scan_code):");
  17527.     write_int(0, 320, 160, 2, OFFSET scan_code);
  17528.     write(0, 0, 180, 0, "Código ASCII de la última tecla (ascii):");
  17529.     write_int(0, 320, 180, 2, OFFSET ascii);
  17530.     write(0, 0, 190, 0, "Estado de las teclas especiales (shift_status):");
  17531.     write_int(0, 320, 190, 2, OFFSET shift_status);
  17532.     LOOP
  17533.         FROM x=1 TO 127;
  17534.             IF (key(x))
  17535.                 teclas[x]=x;
  17536.             ELSE
  17537.                 teclas[x]=0;
  17538.             END
  17539.         END
  17540.         FRAME;
  17541.     END
  17542. END
  17543. {-}
  17544.  
  17545. Este programa se puede utilizar (pulsando con el ratón sobre el
  17546. texto "{Programa ejemplo:}" y después la tecla [{F10}]) para
  17547. averiguar el código que tiene alguna tecla en concreto.
  17548.  
  17549. Después podrá utilizarse dicho código numérico como parámetro de la
  17550. función {#128,key()}, para comprobar en el juego si dicha tecla está
  17551. pulsada en un momento determinado.
  17552.  
  17553. {/}Ver: {#1202,Constantes} - {#128,key()} - {#1110,scan_code} - {#1109,ascii} - {#1108,shift_status}
  17554.  
  17555. # ─────────────────────────────────────────────────────────────────────────────
  17556.  
  17557. {.1177,min_int}
  17558. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  17559.  
  17560. Constante: {min_int}
  17561. {/}
  17562.  
  17563. Esta constante define el valor mínimo que puede almacenar cualquier
  17564. dato en este lenguaje. Este valor es{ -2147483648}.
  17565.  
  17566. Todos los datos son {enteros} con signo de 32 bits en este lenguaje.
  17567. Por ello, únicamente se pueden manejar números enteros dentro del rango
  17568. ({ -2147483648} ...{ +2147483647} ).
  17569.  
  17570. Cuando el resultado de una operación aritmética exceda dicho rango,
  17571. el sistema no advertirá de ningún error, por lo que se deben extremar
  17572. las precauciones para que ésto no suceda.
  17573.  
  17574. {/}Ver: {#1202,Constantes} - {#1178,max_int}
  17575.  
  17576. # ─────────────────────────────────────────────────────────────────────────────
  17577.  
  17578. {.1178,max_int}
  17579. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  17580.  
  17581. Constante: {max_int}
  17582. {/}
  17583.  
  17584. Esta constante define el valor máximo que puede almacenar cualquier
  17585. dato en este lenguaje. Este valor es{ 2147483647}.
  17586.  
  17587. Todos los datos son {enteros} con signo de 32 bits en este lenguaje, de ahí
  17588. que, únicamente, se pueden manejar números enteros dentro del rango
  17589. ({ -2147483648} ...{ +2147483647} ).
  17590.  
  17591. Cuando el resultado de una operación aritmética exceda dicho rango,
  17592. el sistema no advertirá de ningún error, por lo que se deben extremar
  17593. las precauciones para que esto no suceda.
  17594.  
  17595. {/}Ver: {#1202,Constantes} - {#1177,min_int}
  17596.  
  17597. # ─────────────────────────────────────────────────────────────────────────────
  17598.  
  17599. {.1179,pi}
  17600. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  17601.  
  17602. Constante: {pi}
  17603. {/}
  17604.  
  17605. Esta constante define la equivalencia en {milésimas de grado} de la
  17606. constante matemática {pi} (aproximadamente {3.14159265} radianes).
  17607.  
  17608. Su valor es {180000} milésimas de grado (180 grados), equivalente a
  17609. {pi radianes}.
  17610.  
  17611. Se suele utilizar para definir ángulos; por ejemplo, se podría
  17612. definir {180 grados} como {pi},{ -90 grados} como{ -pi/2},
  17613. {45 grados} como {pi/4}, etc.
  17614.  
  17615. {/}Ver: {#1202,Constantes} - {#1044,Uso de ángulos en el lenguaje}
  17616.  
  17617. # ─────────────────────────────────────────────────────────────────────────────
  17618.  
  17619. {.1200,Datos globales predefinidos}
  17620. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  17621.  
  17622. A continuación se describe cada uno de los datos globales predefinidos.
  17623.  
  17624. {#1100,STRUCT mouse}     - Parámetros del ratón·
  17625. {#1101,STRUCT scroll[9]} - Control de las ventanas de scroll·
  17626. {#1102,STRUCT m7[9]}     - Control de las ventanas de modo 7·
  17627. {#1103,STRUCT joy}       - Parámetros del joystick·
  17628. {#1104,STRUCT setup}     - Control de la tarjeta de sonido·
  17629. {#1105,timer[9]}         - Contadores de tiempo·
  17630. {#1106,text_z}           - Plano de profundidad de los textos·
  17631. {#1107,fading}           - Indicador de fundido de pantalla·
  17632. {#1108,shift_status}     - Estado de las teclas especiales·
  17633. {#1109,ascii}            - Lectura de códigos ASCII del teclado·
  17634. {#1110,scan_code}        - Lectura de códigos del teclado·
  17635. {#1111,joy_filter}       - Filtro aplicado al joystick·
  17636. {#1112,joy_status}       - Estado del joystick·
  17637. {#1113,restore_type}     - Tipo de restauración de la pantalla·
  17638. {#1114,dump_type}        - Tipo de volcado de la pantalla·
  17639. {#1115,max_process_time} - Tiempo máximo de ejecución de un proceso·
  17640.  
  17641. {/}Ver: {#1202,Constantes} - {#1201,Datos locales} - {#1000,Sintaxis}
  17642.  
  17643. # ─────────────────────────────────────────────────────────────────────────────
  17644.  
  17645. {.1201,Datos locales predefinidos}
  17646. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  17647.  
  17648. A continuación se describe cada uno de los datos locales predefinidos.
  17649.  
  17650. {#1116,STRUCT reserved} - Parámetros internos de los procesos·
  17651. {#1117,father}          - Identificador de padre del proceso·
  17652. {#1118,son}             - Identificador del hijo del proceso·
  17653. {#1119,smallbro}        - Identificador del hermano pequeño del proceso·
  17654. {#1120,bigbro}          - Identificador del hermano mayor del proceso·
  17655. {#1121,priority}        - Prioridad de ejecución del proceso·
  17656. {#1122,ctype}           - Tipo de coordenadas utilizadas por el proceso·
  17657. {#1123,x}               - Coordenada horizontal del proceso·
  17658. {#1124,y}               - Coordenada vertical del proceso·
  17659. {#1125,z}               - Plano de profundidad del gráfico del proceso·
  17660. {#1126,graph}           - Código del gráfico asignado al proceso·
  17661. {#1127,flags}           - Indicadores de espejado y transparencia·
  17662. {#1128,size}            - Tamaño del gráfico del proceso·
  17663. {#1129,angle}           - ángulo del gráfico del proceso·
  17664. {#1130,region}          - Región de pantalla asignada al proceso·
  17665. {#1131,file}            - Código del fichero del gráfico del proceso·
  17666. {#1132,xgraph}          - OFFSET de la tabla gráfica del proceso·
  17667. {#1133,height}          - Altura del proceso en ventanas de modo 7·
  17668. {#1134,cnumber}         - Números de ventanas de scroll o modo 7·
  17669. {#1135,resolution}      - Resolución de las coordenadas del proceso·
  17670.  
  17671. {/}Ver: {#1202,Constantes} - {#1200,Datos globales} - {#1000,Sintaxis}
  17672.  
  17673. # ─────────────────────────────────────────────────────────────────────────────
  17674.  
  17675.  
  17676. {.1202,Constantes predefinidas}
  17677. Ver: {#4,Glosario} - {#3,Indice} - {#1032,Funciones}{/}
  17678.  
  17679. A continuación se describe cada una de las constantes predefinidas.
  17680.  
  17681. {#1150,m320x200 .. m1024x768} - Modos de vídeo·
  17682. {#1151,true}                  - Valor verdadero·
  17683. {#1152,false}                 - Valores falso·
  17684. {#1153,s_kill}                - Señal de matar procesos ·
  17685. {#1154,s_wakeup}              - Señal de despertar procesos·
  17686. {#1155,s_sleep}               - Señal de dormir procesos·
  17687. {#1156,s_freeze}              - Señal de congelar procesos·
  17688. {#1157,s_kill_tree}           - Señal de matar procesos e hijos·
  17689. {#1158,s_wakeup_tree}         - Señal de despertar procesos e hijos·
  17690. {#1159,s_sleep_tree}          - Señal de dormir procesos e hijos·
  17691. {#1160,s_freeze_tree}         - Señal de congelar procesos e hijos·
  17692. {#1161,all_text}              - Indicador de todos los textos·
  17693. {#1162,all_sound}             - Indicador de todos los sonidos·
  17694. {#1163,g_wide}                - Indicador de ancho·
  17695. {#1164,g_height}              - Indicador de alto·
  17696. {#1165,g_x_center}            - Indicador de centro horizontal·
  17697. {#1166,g_y_center}            - Indicador de centro vertical·
  17698. {#1167,c_screen}              - Coordenadas de pantalla·
  17699. {#1168,c_scroll}              - Coordenadas de ventana de scroll·
  17700. {#1169,c_m7}                  - Coordenadas de ventana de modo7·
  17701. {#1170,partial_dump}          - Volcado de fondo parcial·
  17702. {#1171,complete_dump}         - Volcado de fondo completo·
  17703. {#1172,no_restore}            - Restauración de pantalla desactivada·
  17704. {#1173,partial_restore}       - Restauración de pantalla parcial·
  17705. {#1174,complete_restore}      - Restauración de pantalla completa·
  17706. {#1175,c_0 .. c_9}            - Indicadores de ventanas·
  17707. {#1177,min_int}               - Valor mínimo de datos·
  17708. {#1178,max_int}               - Valor máximo de datos·
  17709. {#1179,pi}                    - Valor matemático de pi·
  17710.  
  17711. {#1176,Codigos de teclas}     - Códigos del teclado·
  17712.  
  17713. {/}Ver: {#1200,Datos globales} - {#1201,Datos locales} - {#1000,Sintaxis}
  17714.  
  17715. # ─────────────────────────────────────────────────────────────────────────────
  17716.  
  17717. {.1249,Ayuda sobre el lenguaje de programación.}
  17718.  
  17719. Ver: {#3,Indice general}{/}
  17720.  
  17721.   {#4,Glosario de términos.}·
  17722.   {#1000,Sintaxis de un programa.}·
  17723.   {#1017,Relación de sentencias.}·
  17724.   {#1032,Lista de funciones.}·
  17725.  
  17726.   {#1202,Constantes predefinidas.}·
  17727.   {#1200,Datos globales predefinidos.}·
  17728.   {#1201,Datos locales predefinidos.}·
  17729.  
  17730.   {#1035,Expresiones aritméticas.}·
  17731.   {#1037,Condiciones lógicas.}·
  17732.  
  17733.   {#1176,Códigos del teclado.}·
  17734.  
  17735. # ─────────────────────────────────────────────────────────────────────────────
  17736.  
  17737. {.1250,Ayuda sobre el sistema de menús}
  17738.  
  17739. Ver: {#3,Indice general}{/}
  17740.  
  17741.   {#1251,El menú de programas}·
  17742.   {#1252,El menú de edición}·
  17743.   {#1253,El menú de paletas}·
  17744.   {#1254,El menú de mapas}·
  17745.   {#1255,Menú de ficheros}·
  17746.   {#1256,Menú de fuentes}·
  17747.   {#1257,Menú de sonidos}·
  17748.   {#1258,Menú de sistema}·
  17749.   {#1259,Opción de ayuda}·
  17750.   {#1260,Trazador de programas}·
  17751.  
  17752. # ─────────────────────────────────────────────────────────────────────────────
  17753.  
  17754. {.1251,El menú de programas}
  17755. Ver: {#3,Indice} - {#1250,Ayuda sobre el sistema de menús}{/}
  17756.  
  17757. {+68,0}Este menú controla todo lo relacionado con los listados de los programas, su
  17758. edición y su ejecución. Permite abrir y guardar listados, ejecutar código o
  17759. editarlo.
  17760.  
  17761. Se puede ver en "{#1294,Comandos del editor}" la lista completa de teclas disponibles
  17762. para editar un programa. Cuando exista más de una ventana de programa, sólo
  17763. se podrá editar en la que esté seleccionada; para seleccionar otra se debe
  17764. pulsar con el ratón sobre ella.
  17765.  
  17766. A continuación se describen cada una de las opciones de este menú.{-}
  17767.  
  17768. {/}
  17769.  
  17770. {Nuevo...}
  17771.  
  17772. Es la opción utilizada para comenzar un nuevo programa (a escribir un
  17773. listado). Los primeros pasos se describen en el capítulo número 5 del libro
  17774. de DIV Games Studio (Manual de usuario).
  17775. Aparecerá un cuadro de diálogo en el que se debe especificar el nombre del
  17776. nuevo programa, por lo que se debe especificar el nombre de archivo para el
  17777. programa (se pueden utilizar hasta ocho caracteres), la extensión {PRG} se
  17778. añadirá automáticamente. Si se especifica el nombre de un archivo ya
  17779. existente, el programa preguntará si se desea sobreescribir el programa, si
  17780. se responde {Aceptar}, se borrará el programa existente, al crearse
  17781. nuevamente. Finalmente, aparecerá una nueva ventana de edición vacía
  17782. preparada para el nuevo programa.
  17783.  
  17784. {/}
  17785.  
  17786. {Abrir programa... (Tecla directa : F4)}
  17787.  
  17788. Es la opción para cargar un programa del disco. Se deberá especificar en un
  17789. cuadro de diálogo el nombre del archivo (con extensión {PRG}) con el programa,
  17790. que se puede seleccionar con el ratón o bien escribir su nombre. Cuando el
  17791. programa sea cargado en el entorno, aparecerá una ventana de edición con el
  17792. listado del mismo. Para ejecutar el programa se puede pulsar la tecla {F10}.
  17793.  
  17794. {/}
  17795.  
  17796. {Cerrar}
  17797.  
  17798. Cierra la ventana de edición seleccionada. El programa pedirá confirmación;
  17799. si ha modificado el programa y no lo ha guardado en el disco, seleccione
  17800. {Cancelar} y pulse la tecla {F2} para grabar el programa antes de cerrarlo,
  17801. ya que al cerrarse la ventana no se guarda automáticamente el programa. Por
  17802. lo tanto, si se modifica un listado y después se cierra sin guardarlo
  17803. previamente, se perderán las modificaciones.
  17804.  
  17805. {/}
  17806.  
  17807. {Guardar (Tecla directa : F2)}
  17808.  
  17809. Guarda el contenido de la ventana de edición seleccionada en el archivo de
  17810. extensión {PRG} correspondiente del disco, es decir, en el archivo indicado
  17811. al crear o abrir el programa. El gráfico del puntero del ratón se convertirá
  17812. en un reloj de arena por un instante, para indicar que se está realizando la
  17813. operación. Si se pretende guardar el programa con otro nombre, en otro
  17814. archivo, se debe utilizar la opción {Guardar como...} de este menú.
  17815.  
  17816. {/}
  17817.  
  17818. {Guardar como...}
  17819.  
  17820. Guarda la ventana de edición seleccionada en otro archivo (con otro nombre).
  17821. Se abrirá un cuadro de diálogo en el que se debe especificar el nuevo archivo
  17822. con extensión {PRG}. Si se elige un nombre de programa existente
  17823. anteriormente, el programa pedirá confirmación antes de sobreescribir el
  17824. programa del disco con el contenido de la ventana de edición. En realidad la
  17825. extensión {PRG} no es obligatoria, aunque sí conveniente.
  17826.  
  17827. {/}
  17828.  
  17829. {Menú de edición...}
  17830.  
  17831. Esta opción da acceso a un nuevo menú de opciones, el {#1252,menú de edición} de
  17832. programas.
  17833.  
  17834. {/}
  17835.  
  17836. {+69,0}{Ejecutar (Tecla directa : F10)}
  17837.  
  17838. Compila y ejecuta el programa de la ventana de edición seleccionada. Si el
  17839. programa tuviera algún error, el sistema situará el cursor de edición sobre
  17840. el mismo e indicará en un diálogo un mensaje descriptivo del error con dos
  17841. opciones:
  17842.  
  17843. * {Aceptar}. Se debe pulsar este botón cuando se haya comprendido el mensaje
  17844. del error, para volver a la ventana de edición y poder corregirlo.
  17845.  
  17846. * {Ayuda}. Cuando no se comprenda el mensaje de error emitido por el sistema,
  17847. este botón creará una ventana de ayuda en la que se explicará el error
  17848. encontrado mucho más detalladamente.
  17849.  
  17850. Si se pulsa {Aceptar}, retornando a la edición del programa, aún se está a
  17851. tiempo de obtener ayuda extendida sobre el error pulsando la tecla {F1}.
  17852.  
  17853. Cuando el programa no tenga errores, el sistema podrá finalizar la
  17854. compilación del mismo y ejecutarlo. Para retornar de un programa siempre se
  17855. puede pulsar la combinación de teclas {ALT+X}.{-}
  17856.  
  17857. {/}
  17858.  
  17859. {Compilar (Tecla directa : F11)}
  17860.  
  17861. Compila el programa de la ventana de edición seleccionada. No se ejecutará
  17862. el programa: esta opción es únicamente para comprobar si un programa tiene
  17863. algún error. Si se encuentra algún error, éste se indicará exactamente igual
  17864. que en la opción anterior, pudiendo acceder a la ayuda extendida sobre el
  17865. mismo cuando sea necesario.
  17866.  
  17867. {/}
  17868.  
  17869. {Trazar programa (Tecla directa : F12)}
  17870.  
  17871. Traza paso a paso el programa de la ventana de edición seleccionada. Se
  17872. denomina {trazar} un programa a ejecutarlo poco a poco, sentencia a sentencia
  17873. o imagen a imagen, para poder ir comprobando todo lo que va haciendo, cómo
  17874. van creándose los procesos, cambiando de valor las variables, etc.
  17875.  
  17876. Esto se lleva a cabo, normalmente, cuando un programa no realiza lo que se
  17877. pretendía que hiciera y no se sabe por qué, para poder encontrar de esta
  17878. forma el punto exacto en el que se encuentra un error del programa.
  17879.  
  17880. Con esta opción se accederá al {#1260,Trazador de programas}. También se puede
  17881. acceder a él durante la ejecución convencional de un programa pulsando la tecla
  17882. {F12} aunque, en este caso, se trazará el programa no desde el principio, sino
  17883. desde el punto en el que haya sido interrumpido.
  17884.  
  17885. Dentro del trazador de programas se verá el listado del programa ejecutado,
  17886. pero no podrá modificarse. Esta es una herramienta avanzada, que no conviene
  17887. utilizar hasta que se hayan comprendido bien las bases de la programación en
  17888. DIV.
  17889.  
  17890. {/}
  17891.  
  17892. {+72,0}{Crear instalación...}
  17893.  
  17894. La última opción del menú de programas es la utilizada para crear
  17895. automáticamente discos de instalación de los juegos creados en DIV Games
  17896. Studio. Con estos discos se podrá distribuir los juegos e instalarlos en
  17897. otros ordenadores de forma independiente, {sin requerir DIV Games Studio
  17898. para su ejecución}.{-}
  17899.  
  17900. {/}
  17901.  
  17902. {Sobre los derechos de autor. Importante}
  17903.  
  17904. Los juegos podrán ser distribuidos libremente, sin tener Hammer Technologies
  17905. derecho a {ningún pago o royaltie} por ello. Es posible utilizar los
  17906. programas creados en DIV Games Studio con cualquier fin, incluida la venta de
  17907. sus derechos a compañías distribuidoras, venta directa, publicaciones
  17908. shareware, freeware, etc.
  17909.  
  17910. Asimismo, no se obliga a los autores a la inclusión de ninguna mención en los
  17911. juegos a DIV Games Studio ni a Hammer Technologies, pudiendo hacerlo si así
  17912. lo desean voluntariamente, incluyendo el logotipo de DIV Games Studio o una
  17913. referencia al mismo.
  17914.  
  17915. El único componente de DIV requerido en las instalaciones es el archivo
  17916. {DIV32RUN.EXE}, que contiene la librería de enlace con las funciones internas
  17917. utilizadas en los programas. Este archivo será incluido siempre por el
  17918. sistema en las instalaciones realizadas. {DIV32RUN.EXE} es un programa
  17919. {freeware} de libre distribución.
  17920.  
  17921. También se permite la libre creación y distribución de utilidades o
  17922. herramientas auxiliares para este programa, para lo cual se muestra en el
  17923. {apéndice E} del libro de DIV Games Studio (Manual de usuario) el formato de
  17924. los archivos utilizados por DIV Games Studio.
  17925.  
  17926. {/}
  17927.  
  17928. Para crear los discos de instalación, el sistema debe, primero, compilar el
  17929. programa para cerciorarse de que no tiene errores y generar el archivo
  17930. ejecutable del juego (un archivo con extensión {EXE}).
  17931.  
  17932. Una vez compilado aparecerá un cuadro de diálogo en el cual se puede
  17933. configurar el programa de instalación. En la parte superior del mismo
  17934. aparecen dos casillas: la de la derecha nos permite definir si se deben crear
  17935. subdirectorios en la instalación (en caso contrario todos los archivos del
  17936. juego se instalarán en un solo directorio), y la de la izquierda define si se
  17937. debe incluir un programa de configuración del sistema sonido.
  17938.  
  17939. Este programa de configuración no suele ser necesario; si se decide
  17940. incluirlo, el sistema añadirá el último {SETUP_PROGRAM} compilado en el entorno.
  17941. Por defecto este programa es {SETUP.PRG}, que se encuentra en el directorio
  17942. {SETUP\} de DIV Games Studio, por si se desea modificar o adaptar a un juego en
  17943. concreto.
  17944.  
  17945. Tras las dos casillas superiores este diálogo para personalizar la
  17946. instalación permitirá, mediante una serie de cajas de texto, introducir la
  17947. siguiente información:
  17948.  
  17949. * {Nombre del programa instalado.} Por defecto aparecerá el nombre del
  17950. archivo PRG.
  17951.  
  17952. * {Nombre del programador.} Para introducir cualquier mensaje del tipo
  17953. "Programa por ..."
  17954.  
  17955. * {Copyright y nombre de la compañía.} Se puede introducir cualquier mensaje.
  17956.  
  17957. * {Unidad o directorio donde se deben crear los discos de instalación.}
  17958. Normalmente será una unidad de disquetes; se deben tener preparados
  17959. suficientes disquetes formateados para poder grabar en ellos el juego
  17960. comprimido.
  17961.  
  17962. * {Directorio por defecto de instalación.} Es el directorio donde, por
  17963. defecto, intentará instalarse el juego, a no ser que los usuarios lo cambien.
  17964.  
  17965. * {Mensaje que se utilizará como instrucciones de carga.} El sistema sugerirá
  17966. un mensaje apropiado, que indique cómo debe ejecutarse el juego una vez
  17967. instalado.
  17968.  
  17969. Por último, aparecen los botones de {Aceptar} y {Cancelar} para comenzar a
  17970. crear los discos de instalación o salir del diálogo sin crearlos.
  17971.  
  17972. Las instalaciones creadas de esta forma utilizarán el {Instalador universal}
  17973. de DIV Games Studio, que consiste en un programa {freeware}, de libre
  17974. distribución. Si se desea utilizar otros instaladores, la mejor forma de
  17975. hacerlo es partir de una copia del juego instalada con este Instalador
  17976. universal.
  17977.  
  17978. En los programas instalados ya no aparecen las ventanas informativas de
  17979. errores de DIV, ni hay acceso al {#1260,Trazador de programas} al pulsar la
  17980. tecla {F12}. Si se produce un error de ejecución en un programa instalado, se
  17981. detendrá el programa, retornando al sistema.
  17982.  
  17983. # ─────────────────────────────────────────────────────────────────────────────
  17984.  
  17985. {.1252,El menú de edición}
  17986. Ver: {#3,Indice} - {#1250,Ayuda sobre el sistema de menús}{/}
  17987.  
  17988. {+17,0}Este menú cuenta con una serie de opciones básicas para la edición, indicando
  17989. en todas ellas teclas directas, por lo que una vez que se aprendan no será
  17990. necesario acceder a este menú.
  17991.  
  17992. Existen más comandos de edición al margen de los aquí mostrados; ver
  17993. {#1294,comandos en el editor de programas} (comandos de teclado).
  17994. Las opciones que engloba el menú de edición son las siguientes:{-}
  17995.  
  17996. {/}
  17997.  
  17998. {Borrar línea (Tecla directa : Control+Y)}
  17999.  
  18000. Elimina la línea del programa en la que se encuentra el cursor de edición.
  18001.  
  18002. {/}
  18003.  
  18004. {Marcar bloque (Tecla directa : ALT+A)}
  18005.  
  18006. Marca el inicio o el final de un bloque de texto. Para marcar un bloque se
  18007. deben marcar ambos extremos con este comando; el orden es indiferente.
  18008. También se soporta el marcado de bloques del estándar EDIT, con mayúsculas y
  18009. con los cursores.
  18010.  
  18011. {/}
  18012.  
  18013. {Desmarcar (Tecla directa : ALT+U)}
  18014.  
  18015. Desmarca el bloque de texto. Los bloques seleccionados con el comando
  18016. anterior son persistentes, es decir, que permanecen hasta que se borren o se
  18017. desmarquen. Los bloques del estándar EDIT se desmarcan solos, al mover el
  18018. cursor.
  18019.  
  18020. {/}
  18021.  
  18022. {Copiar (Tecla directa : ALT+C)}
  18023.  
  18024. Copia el bloque de texto marcado a partir de la posición actual. Primero se
  18025. debe marcar el bloque original y situar el cursor en la posición en la que se
  18026. quiere insertar. Se realizará una copia del texto, permaneciendo marcado el
  18027. mismo por si se quieren realizar más copias.
  18028.  
  18029. {/}
  18030.  
  18031. {Mover (Tecla directa : ALT+M)}
  18032.  
  18033. Mueve el bloque de texto marcado a la posición actual. Esta operación es
  18034. similar a la anterior, salvo que se borrará el texto original tras copiarse a
  18035. la posición actual. El texto movido permanecerá también marcado, por lo que
  18036. se puede seguir moviendo o copiando.
  18037.  
  18038. {/}
  18039.  
  18040. {Borrar (Tecla directa : ALT+D)}
  18041.  
  18042. Borra el bloque de texto que se ha marcado. Esta operación no podrá
  18043. deshacerse, por lo que se debe utilizar con cuidado. Si se borra un bloque
  18044. grande por accidente, puede convenir volver a {Abrir} el programa del disco
  18045. (sin guardar la copia existente), marcar el bloque borrado en la nueva
  18046. ventana cargada, y copiarla a la ventana en la que se haya borrado
  18047. accidentalmente.
  18048.  
  18049. {/}
  18050.  
  18051. {+91,0}{Ir a... (Tecla directa : F5)}
  18052.  
  18053. Salta directamente a uno de los procesos del programa, es decir, sitúa el
  18054. cursor de edición de la ventana del programa en el inicio de uno de los
  18055. procesos.
  18056.  
  18057. Al utilizar este comando aparecerá un cuadro de diálogo con la lista de los
  18058. procesos encontrados en el programa, pudiéndose seleccionar uno con el ratón,
  18059. o bien pulsar la tecla {ESC} para permanecer en la posición actual.
  18060.  
  18061. Una casilla permitirá indicar el orden el que se muestra la lista de procesos,
  18062. siguiendo el orden en el que aparecen en el programa, o bien en orden
  18063. alfabético.
  18064.  
  18065. Los procesos son algo similar a las funciones de otros lenguajes, pero en DIV
  18066. están orientados hacia el control de los gráficos de los juegos (también
  18067. llamados sprites). Es decir, que básicamente se trata de bloques del programa
  18068. que rigen el comportamiento de un gráfico, o un tipo de gráficos, del juego.{-}
  18069.  
  18070. {/}
  18071.  
  18072. {+92,0}{Buscar... (Tecla directa : ALT+F)}
  18073.  
  18074. Busca una cadena de texto en el programa. Esta opción se utilizará para
  18075. localizar un punto del programa o un nombre dentro del mismo. Aparecerá un
  18076. diálogo con un cuadro de texto en el que se debe introducir la secuencia de
  18077. caracteres que se pretende localizar.{-}
  18078.  
  18079. Este diálogo contiene dos casillas para definir el tipo de búsqueda que se
  18080. debe realizar; éstas son las siguientes:
  18081.  
  18082. * {Palabra completa.} Indica (cuando está activada) que la cadena introducida
  18083. debe buscarse como una palabra completa y no como parte de una palabra mayor
  18084. (por ejemplo, que no se debe encontrar 'palabra' si pone 'pala').
  18085.  
  18086. * {Mayúsculas/minúsculas.} Indica que el texto se debe encontrar exactamente
  18087. como se ha escrito, que se debe diferenciar entre letras mayúsculas y
  18088. minúsculas.
  18089.  
  18090. Para iniciar la búsqueda del texto se debe pulsar {Aceptar} en este cuadro.
  18091. La búsqueda se realizará siempre a partir de la posición actual del cursor de
  18092. edición, por lo que si se quiere buscar el texto por todo el programa se
  18093. deberá situar primero el cursor al comienzo del mismo, en la línea 1 y
  18094. columna 1 (esto se puede hacer pulsando {Control+Re.Pág} y después {Inicio}).
  18095.  
  18096. {/}
  18097.  
  18098. {Repetir (Tecla directa : ALT+N)}
  18099.  
  18100. Repite la última búsqueda. Vuelve a buscar la última cadena de texto que se
  18101. buscó, a partir de la posición actual, es decir, busca la siguiente
  18102. ocurrencia de la misma en el programa.
  18103.  
  18104. Cuando no existan más ocurrencias del texto buscado en las líneas restantes
  18105. del programa, el sistema advertirá de ello.
  18106.  
  18107. {/}
  18108.  
  18109. {+93,0}{Reemplazar... (Tecla directa : ALT+R)}
  18110.  
  18111. Reemplaza una cadena de texto por otra en el programa. Esta opción se puede
  18112. utilizar, por ejemplo, para sustituir un nombre (de una variable, proceso,
  18113. etc.) por otro.
  18114.  
  18115. Se mostrará un diálogo similar al utilizado para buscar un texto, pero con
  18116. una segunda caja de texto en la que se debe indicar el texto con el que se
  18117. debe sustituir el texto indicado en la primera.
  18118.  
  18119. Nuevamente aparecen las dos casillas anteriores, cumpliendo la misma función.
  18120. Para sustituir un nombre por otro es conveniente activar la casilla de
  18121. Palabra completa.
  18122.  
  18123. La sustitución de texto se realizará a partir de la posición actual en el
  18124. programa del cursor de edición, ignorándose las ocurrencias anteriores.
  18125. Cuando se encuentre el texto a reemplazar, antes de hacerlo, el programa
  18126. ofrecerá las siguientes opciones en un diálogo (resaltando el texto
  18127. encontrado en la ventana del programa):
  18128.  
  18129. * {Si.} Para sustituir el texto en la posición resaltada y seguir buscando.
  18130.  
  18131. * {No.} Para no sustituir la ocurrencia resaltada, pero seguir buscando.
  18132.  
  18133. * {Todo.} Para sustituir automáticamente el resto de las ocurrencias,
  18134. incluyendo la actualmente resaltada.
  18135.  
  18136. * {Cancelar.} Para cancelar la operación de reemplazo de texto (no se harán
  18137. más sustituciones).
  18138.  
  18139. Si se pulsa la tecla {ESC} o se cierra este diálogo, el programa lo
  18140. interpretará también como que se quiere terminar la operación de reemplazo.{-}
  18141.  
  18142. # ─────────────────────────────────────────────────────────────────────────────
  18143.  
  18144. {.1253,El menú de paletas}
  18145. Ver: {#3,Indice} - {#1250,Ayuda sobre el sistema de menús}{/}
  18146.  
  18147. {+73,0}Este menú controla las operaciones relacionadas con la paleta de colores que
  18148. está usando DIV Games Studio. Permite cargar y grabar archivos de paleta
  18149. (con extensión {PAL}), editarla, ordenarla, etc.
  18150.  
  18151. Los conceptos básicos sobre la paleta de colores se exponen en
  18152. "{#1263,Paletas de colores}". En el entorno siempre hay una única paleta de color activa; para
  18153. visualizarla se debe utilizar la última opción de este menú ({paletas \
  18154. mostrar paleta}). Tener a la vista la paleta activa en el entorno es
  18155. conveniente para orientarse a la hora de realizar operaciones con ella.
  18156.  
  18157. Conviene definir al inicio de un nuevo proyecto (juego) cuál es la paleta de
  18158. colores que va a utilizar, ya que durante el juego todos los gráficos que se
  18159. visualicen en una misma pantalla deben haberse creado con la misma paleta de
  18160. colores. En caso contrario, éstos se visualizarían incorrectamente.{-}
  18161.  
  18162. {/}
  18163.  
  18164. {Abrir paleta...}
  18165.  
  18166. Carga la paleta de colores de un archivo. Al activarla se abrirá un cuadro de
  18167. diálogo en el que se debe indicar un archivo de uno de los siguientes tipos:
  18168. paletas ({PAL}), ficheros de gráficos ({FPG}), mapas gráficos ({MAP, PCX o
  18169. BMP}) o fuentes de letra ({FNT}). Si hay gráficos cargados en el escritorio
  18170. de DIV Games Studio el sistema preguntará si deben adaptarse a la nueva
  18171. paleta cargada: si se responde {Aceptar} pueden perder calidad, por ello, la
  18172. alternativa es cerrarlos y volver a abrirlos.
  18173.  
  18174. {/}
  18175.  
  18176. {Guardar paleta...}
  18177.  
  18178. Con esta opción se puede grabar en el disco un archivo con la paleta de
  18179. colores utilizada actualmente. Se abrirá un cuadro de diálogo en el que se
  18180. debe indicar el nombre del archivo en el que se va a guardar la paleta (se
  18181. utilizan para ello archivos con extensión {PAL}). No es posible guardar la
  18182. paleta de colores en ficheros de gráficos, mapas o fuentes. En los archivos
  18183. de paleta se guarda, además, información sobre las reglas de color definidas
  18184. dentro del editor gráfico.
  18185.  
  18186. {/}
  18187.  
  18188. {+74,0}{Editar paleta...}
  18189.  
  18190. Al elegir esta opción se abrirá un cuadro de diálogo con el editor de
  18191. paletas. En él se puede modificar la paleta actual del sistema o definir una
  18192. nueva. Mientras se edita la paleta pueden aparecer incorrectamente los
  18193. colores del escritorio; esto es normal y se solucionará al salir de este
  18194. diálogo.
  18195.  
  18196. Ocupando la mayor parte del cuadro aparecen todos los colores de la paleta
  18197. activa. Un pequeño cuadrado marcará uno de estos colores; éste es el color
  18198. seleccionado para edición, para seleccionar otro color se debe pulsar con el
  18199. ratón sobre él. En la parte derecha aparece la siguiente información sobre el
  18200. color seleccionado:
  18201.  
  18202. * Número de orden del color dentro de la paleta, éste aparece en decimal como
  18203. un número de 0 a 255, y en hexadecimal, de 00 a FF.
  18204.  
  18205. * Las componentes rojo, verde y azul que forman el color, como números de 0 a
  18206. 63.
  18207.  
  18208. * Tres barras de desplazamiento verticales, que se pueden utilizar para
  18209. modificar los tres componentes del color, en el mismo orden anterior.
  18210.  
  18211. En la parte inferior del cuadro aparecen tres casillas con la siguiente
  18212. función:
  18213.  
  18214. * {Gama:} Se utiliza para definir una gama gradual de colores; se debe pulsar
  18215. sobre el primer color de la gama y definirlo con las barras de
  18216. desplazamiento. Después, hacer lo mismo con el último color de la gama y,
  18217. finalmente (con el último color seleccionado) seleccionar esta casilla y
  18218. pulsar nuevamente sobre el primer color. El sistema definirá los colores
  18219. intermedios con una gama gradual.
  18220.  
  18221. * {Copiar:} Para copiar un color a otra posición de la paleta se debe primero
  18222. seleccionar el color, después esta casilla y finalmente la posición destino.
  18223.  
  18224. * {Cambiar:} Funciona de forma similar a copiar, sólo que intercambiará los
  18225. colores origen y destino, en lugar de copiar el origen al destino.
  18226.  
  18227. Finalmente, tres botones que permiten de izquierda a derecha, validar la
  18228. edición de paleta realizada, deshacer la última modificación y cancelar la
  18229. edición (deshacer todos los cambios desde que se entró en el editor).{-}
  18230.  
  18231. {/}
  18232.  
  18233. {+75,0}{Ordenar paleta...}
  18234.  
  18235. Permite ordenar paletas de colores. Esta opción es útil para editar mapas que
  18236. provengan de otros programas gráficos o de render, y que tengan una paleta de
  18237. colores desordenada. Esta operación facilitará el trabajo con estos mapas
  18238. dentro del editor gráfico, al poder localizar los colores más fácilmente. Un
  18239. cuadro de diálogo mostrará cuatro posibles ordenaciones de los colores de la
  18240. paleta, debiendo pulsar con el ratón en la ordenación que se considere más
  18241. apropiada. Este diálogo finaliza con dos botones que permiten confirmar la
  18242. selección realizada o cancelarla.{-}
  18243.  
  18244. {/}
  18245.  
  18246. {Fusionar paletas...}
  18247.  
  18248. Ésta es una operación avanzada; su utilidad consiste en crear una paleta de
  18249. colores a partir de dos. Se debe utilizar cuando se quieran utilizar en un
  18250. juego gráficos con paletas diferentes de forma simultánea. Primero, se debe
  18251. cargar en el entorno una de las paletas y, después, utilizar esta opción
  18252. para seleccionar un archivo con la otra.
  18253.  
  18254. El sistema creará una paleta mixta entre ambas; tras esta operación lo mejor
  18255. es grabar esta paleta en un archivo de paleta ({PAL}) para tenerla localizada
  18256. y no perderla. Tras esto, se deben cargar de nuevo los gráficos con las
  18257. paletas de color anteriores indicando que no deben cargarse sus paletas, sino
  18258. que deben adaptarse a la paleta del sistema para, finalmente, una vez
  18259. verificado que los gráficos de ambas paletas quedan bien con la nueva paleta,
  18260. volver a grabarlos en sus respectivos ficheros.
  18261.  
  18262. {/}
  18263.  
  18264. {+76,0}{Mostrar paleta}
  18265.  
  18266. Visualiza la paleta de colores activa en el entorno. Esta opción creará una
  18267. nueva ventana en el escritorio, donde se podrá ver en todo momento cuál es la
  18268. paleta de colores activa. Θnicamente puede haber una paleta de colores activa
  18269. en cada momento.{-}
  18270.  
  18271.  
  18272. # ─────────────────────────────────────────────────────────────────────────────
  18273.  
  18274. {.1254,El menú de mapas}
  18275. Ver: {#3,Indice} - {#1250,Ayuda sobre el sistema de menús}{/}
  18276.  
  18277. {+77,0}Este menú controla las operaciones relacionadas con los mapas. Los mapas,
  18278. también denominados gráficos o bitmaps (mapas de bits), son simplemente
  18279. imágenes de cualquier tamaño que pueden ser utilizadas en los juegos como
  18280. fondos, muñecos, objetos, pantallas, etc. Este menú da acceso a la carga y
  18281. grabación de mapas en disco, así como al editor gráfico, que es la
  18282. herramienta utilizada para crear o modificar estas imágenes.
  18283.  
  18284. Se pueden manejar, cargar múltiples mapas en el escritorio, etc, la única
  18285. limitación es que todos ellos utilicen la misma paleta de colores. Si dos
  18286. mapas deben utilizar paletas diferentes, se debe cerrar uno antes de abrir
  18287. el otro.
  18288.  
  18289. Al margen de las opciones de este menú, se pueden realizar otras operaciones
  18290. con las ventanas de mapas, si se quieren arrastrar se pulsa sobre ellas con
  18291. el botón izquierdo y, sin soltarlo, se mueve el ratón hasta la posición
  18292. destino. Estas operaciones son las siguientes:
  18293.  
  18294. * {Realizar una copia del mapa.} Arrastrar la ventana hasta el tapiz de fondo
  18295. del escritorio (a una zona de pantalla en la que no haya ninguna ventana).
  18296.  
  18297. * {Pegar un mapa en otro.} Arrastrar una ventana de mapa a otra; se entrará
  18298. en el editor gráfico donde se podrá pegar el mapa en la posición y
  18299. condiciones deseadas.
  18300.  
  18301. * {Cerrar un mapa.} Arrastrar la ventana hasta la papelera (primero se debe
  18302. activar la papelera con la opción {sistema \ papelera}). El sistema cerrará
  18303. el mapa sin pedir confirmación.
  18304.  
  18305. * {Incluir un mapa en un fichero de gráficos.} Arrastrar la ventana del mapa
  18306. hasta la ventana del fichero.
  18307.  
  18308. Varias opciones de este menú interaccionan únicamente con un mapa, aunque
  18309. haya muchos cargados. La acción se realizará sobre el mapa seleccionado entre
  18310. todos ellos; para seleccionar un mapa se debe pulsar sobre él con el botón
  18311. izquierdo del ratón.{-}
  18312.  
  18313. {/}
  18314.  
  18315. {+94,0}{Nuevo...}
  18316.  
  18317. Crea una nueva ventana con un mapa gráfico. La única información necesaria
  18318. para poder crear un mapa nuevo es el ancho y alto en puntos del mismo, que
  18319. se pedirá en un cuadro de diálogo. Cualquier tamaño, desde 1x1, es válido
  18320. con la única limitación de la memoria disponible en el sistema. Tras
  18321. seleccionar el tamaño y pulsar {Aceptar} aparecerá una nueva ventana de mapa
  18322. vacía (en negro) en el escritorio. Para editar el contenido de esta ventana
  18323. se puede realizar una doble pulsación con el botón izquierdo del ratón sobre
  18324. la misma.{-}
  18325.  
  18326. {/}
  18327.  
  18328. {Abrir mapa...}
  18329.  
  18330. Carga un mapa de un archivo del disco. El formato propio de DIV para los
  18331. mapas son los archivos de extensión {MAP}, pero pueden importarse con esta
  18332. opción archivos con extensión {PCX} y {BMP}, siempre que se trate de imágenes
  18333. en {256 colores}.
  18334.  
  18335. {/}
  18336.  
  18337. {Cerrar}
  18338.  
  18339. Cierra una ventana con un mapa. El sistema pedirá confirmación antes de
  18340. cerrar una ventana con un mapa. Si se desea guardar el contenido de la
  18341. ventana se debe utilizar la opción {Guardar...} previamente, para actualizar el
  18342. archivo del disco que contiene la imagen. Una vez cerrado un mapa, la única
  18343. forma de recuperarlo es volver a cargar el archivo (si ha sido guardado
  18344. previamente).
  18345.  
  18346. {/}
  18347.  
  18348. {Cerrar todos}
  18349.  
  18350. Esta opción cierra todas las ventanas de mapas que hubiera cargadas en el
  18351. escritorio, {excepto aquellas que hayan sido minimizadas}. El sistema pedirá
  18352. confirmación previamente. Esta opción es útil cuando se tiene el escritorio
  18353. lleno de mapas que han sido incluidos en un fichero de gráficos, o mapas del
  18354. generador de explosiones, para evitar tener que cerrarlos individualmente.
  18355.  
  18356. {/}
  18357.  
  18358. {Guardar}
  18359.  
  18360. Guarda el contenido actual del mapa seleccionado en su archivo; el puntero
  18361. del ratón aparecerá momentáneamente como un reloj de arena, para indicar que
  18362. se está realizando la operación. Si el mapa no tuviera un archivo en el
  18363. disco, el sistema mostrará un cuadro de diálogo en el que se debe especificar
  18364. un nombre para el nuevo archivo. Para guardar un mapa en otro archivo se debe
  18365. utilizar la opción {Guardar como...} de este menú.
  18366.  
  18367. {/}
  18368.  
  18369. {Guardar como...}
  18370.  
  18371. Esta opción permite guardar el contenido de la ventana de mapa seleccionada
  18372. en un nuevo archivo del disco. Aparecerá un cuadro de diálogo en el que se
  18373. debe especificar el nombre del archivo. Se pueden grabar archivos {MAP, PCX}
  18374. o {BMP} en función de la extensión que se le dé al nombre de archivo. Por
  18375. defecto, se grabarán archivos {MAP}, el formato propio de {DIV}. En los
  18376. programas creados en {DIV} únicamente se puede utilizar este formato, no
  18377. siendo posible cargar en ellos imágenes de archivos {PCX} o {BMP}.
  18378.  
  18379. {/}
  18380.  
  18381. {+78,0} {Reescalar...}
  18382.  
  18383. Reescala el mapa seleccionado a un nuevo tamaño, es decir, amplia o reduce la
  18384. imagen.Aparecerá un cuadro de diálogo en el que se debe introducir el nuevo
  18385. tamaño; en este aparecen dos casillas:
  18386.  
  18387. * {Porcentajes.} Por defecto, el nuevo tamaño se especificará en puntos, pero
  18388. si se activa esta casilla se puede entonces indicar en forma de porcentaje,
  18389. como un número entero. Por ejemplo, 100 es el tamaño original, 50 la mitad y
  18390. 200 el doble.
  18391.  
  18392. * {Escala de grises.} La nueva copia del mapa se creará en color por defecto,
  18393. pero se puede activar esta casilla para crearla en blanco y negro.
  18394.  
  18395. En los cuadros de texto {Ancho} y {Alto} se deben introducir los datos de
  18396. reescalado para los ejes horizontal y vertical. Tras indicar estos valores,
  18397. se debe pulsar {Aceptar} y el sistema creará el nuevo mapa.{-}
  18398.  
  18399. {/}
  18400.  
  18401. {Editar mapa}
  18402.  
  18403. Edita el mapa seleccionado. Se entrará directamente en el editor gráfico.
  18404. Esta operación puede realizarse también con una doble pulsación del botón
  18405. izquierdo sobre la ventana del mapa. Para salir de este editor se debe
  18406. pulsar el botón derecho del ratón o la tecla {ESC}.
  18407.  
  18408. {/}
  18409.  
  18410. {+79,0}{Generador de explosiones}
  18411.  
  18412. Esta opción da acceso a un cuadro de diálogo para generar automáticamente una
  18413. serie de fotogramas para una explosión. Cada uno de los fotogramas (o
  18414. imágenes) se creará en un mapa independiente. Los mapas se crearán con la
  18415. paleta de colores activa en el entorno, y si, después, no se quieren
  18416. conservar los mapas creados puede convenir utilizar la opción {Cerrar todos}
  18417. para eliminarlos.
  18418.  
  18419. En la parte superior del diálogo aparecen dos cuadros de texto en los que se
  18420. debe introducir el {Ancho} y {Alto} en puntos de los mapas que se van a
  18421. generar. Cuanto mayores sean estos mapas, más tardará el generador en
  18422. completar la secuencia de imágenes que conforman la explosión.
  18423.  
  18424. Pulsando sobre los cuadros que aparecen bajo el texto {Color} aparecerá un
  18425. diálogo con la paleta de colores, para poder seleccionar de este modo los
  18426. colores inicial (el más oscuro), medio y final (el más claro) de la
  18427. explosión, respectivamente. El generador utilizará tantos colores intermedios
  18428. como encuentre en la paleta activa.
  18429.  
  18430. Tres casillas denominadas {Tipo A}, {Tipo B} y {Tipo C} permiten elegir entre
  18431. tres algoritmos diferentes para generar la explosión, por orden de
  18432. complejidad, siendo el primer tipo el más básico y homogéneo, y el último el
  18433. más complejo.
  18434.  
  18435. Contiguos a estas casillas aparecen otros dos cuadros de texto. En el
  18436. primero, denominado {Imágenes}, se debe introducir el número de fotogramas de
  18437. los que debe constar la secuencia completa de la explosión. El segundo cuadro
  18438. de texto define el efecto de {Granulado} aplicado a la explosión; cuanto
  18439. mayor sea este valor, más "ruido" o "vibración" tendrá la explosión.
  18440.  
  18441. Cada vez que se genere una explosión ésta será diferente aunque se
  18442. introduzcan exactamente los mismos parámetros en este cuadro de diálogo; por
  18443. ello, se recomienda realizar varias pruebas hasta obtener la secuencia
  18444. definitiva.
  18445.  
  18446. Para visualizar la explosión animada se pueden utilizar las posibilidades de
  18447. animación del editor gráfico. Para ello se deberán ordenar las ventanas con
  18448. los fotogramas de la explosión (situando unas sobre otras, en orden), editar
  18449. la primera (con una doble pulsación del ratón sobre ella) y, una vez dentro
  18450. del editor, utilizar las teclas {TAB} y {Mayúsculas+TAB} para ver la
  18451. animación. Se puede utilizar la tecla Z para variar la escala a la que se
  18452. visualiza la animación y {ESC} para salir del editor gráfico.{-}
  18453.  
  18454. # ─────────────────────────────────────────────────────────────────────────────
  18455.  
  18456. {.1255,Menú de ficheros}
  18457. Ver: {#3,Indice} - {#1250,Ayuda sobre el sistema de menús}{/}
  18458.  
  18459. {+80,0}Este menú controla las operaciones realizadas con los ficheros de gráficos,
  18460. como crear nuevos ficheros, o cargar (abrir) los mapas de los mismos. Los
  18461. {ficheros FPG de gráficos} son archivos que contienen librerías o colecciones
  18462. completas de mapas.
  18463.  
  18464. Las únicas acciones de ficheros que no puede realizarse mediante este menú
  18465. son:
  18466.  
  18467. * {Añadir mapas a un fichero}, Esto debe realizarse arrastrando las ventanas
  18468. de los mapas a la ventana del fichero.
  18469.  
  18470. * {Copiar mapas de un fichero a otro.} Para lo que deben arrastrarse desde la
  18471. lista de un fichero hasta la del otro.
  18472.  
  18473. Los ficheros no se cargan en la memoria del ordenador pues suelen ocupar
  18474. mucho espacio, sino que su información permanece siempre en los {archivos con
  18475. extensión FPG} del disco que los contienen. Por lo tanto, no existe ninguna
  18476. opción para guardar los ficheros, ya que {éstos siempre están guardados}, es
  18477. decir, lo que se muestra en pantalla es exactamente lo que hay en el archivo
  18478. del disco.
  18479.  
  18480. {Importante:} Todos los mapas de un fichero deben usar {la misma paleta de
  18481. colores}, debiéndose adaptar a la paleta del fichero aquellos mapas que
  18482. utilicen otra diferente, si quieren incluirse en el mismo.{-}
  18483.  
  18484. {/}
  18485.  
  18486. {Nuevo...}
  18487.  
  18488. Crea un nuevo fichero FPG en el disco para contener mapas gráficos con la
  18489. paleta activa en el entorno. En un cuadro de diálogo se debe especificar el
  18490. nombre del archivo; el sistema le añadirá la extensión {FPG} automáticamente.
  18491. Si se especifica un nombre de fichero ya existente, se preguntará si se desea
  18492. sobreescribir éste, en cuyo caso se borrarán todos los mapas que contuviera
  18493. anteriormente el fichero.
  18494.  
  18495. {/}
  18496.  
  18497. {Abrir fichero...}
  18498.  
  18499. Abre una nueva ventana a partir de un fichero FPG del disco. En el cuadro de
  18500. diálogo de manejo de archivos se debe seleccionar el nombre de un archivo con
  18501. extensión FPG. Si el fichero tiene una paleta diferente a la activa en el
  18502. entorno en ese momento, el sistema ofrecerá como opciones cargar la nueva
  18503. paleta o cerrar el fichero. Se puede también abrir el fichero sin cargar su
  18504. paleta pero no se recomienda hacerlo, a no ser que sea un usuario experto.
  18505.  
  18506. {/}
  18507.  
  18508. {Cerrar}
  18509.  
  18510. Cierra la ventana de fichero seleccionada. Como el contenido de los ficheros
  18511. está siempre guardado en disco, nunca se perderá la información (los mapas)
  18512. de los mismos. Por ello, el sistema no pedirá confirmación para cerrar un
  18513. fichero, ya que se puede volver a recuperar siempre abriéndolo de nuevo.
  18514.  
  18515. {/}
  18516.  
  18517. {Guardar como...}
  18518.  
  18519. Esta opción permite guardar el fichero seleccionado con otro nombre (en otro
  18520. archivo FPG), es decir, que se hará una copia del fichero con un nuevo
  18521. nombre. Aparecerá un cuadro de diálogo en el que se debe introducir el nombre
  18522. del nuevo archivo FPG. Nuevamente, si se indica el nombre de un archivo ya
  18523. existente, se sustituirá su contenido por el contenido del fichero
  18524. seleccionado en el entorno.
  18525.  
  18526. {/}
  18527.  
  18528. {Cargar marcados}
  18529.  
  18530. Carga los mapas marcados en el fichero seleccionado al escritorio. Al
  18531. utilizar esta opción debe estar marcada la casilla {Marcar/Arrastrar} de la
  18532. ventana del fichero para, de esta forma, poder marcar antes los mapas que
  18533. quieren cargarse (abrirse) de la lista incluida en el fichero (pulsando con
  18534. el ratón sobre ellos). Se pueden desmarcar mapas pulsando nuevamente sobre
  18535. ellos. Se crearán tantas ventanas de mapas como se marquen en el fichero.
  18536. Esta opción resulta útil para modificar en el editor gráfico estos mapas y,
  18537. después, volver a arrastrarlos nuevamente al fichero.
  18538.  
  18539. Para cargar mapas individualmente, de uno en uno, se pueden arrastrar estos
  18540. directamente desde la ventana del fichero al escritorio.
  18541.  
  18542. {/}
  18543.  
  18544. {Borrar marcados}
  18545.  
  18546. Elimina los mapas marcados en el fichero seleccionado. Esta opción se
  18547. utiliza para quitar mapas de un fichero cuando ya no son necesarios. Deben
  18548. marcarse previamente los mapas exactamente igual que en la opción anterior.
  18549. Estos mapas no podrán recuperarse una vez borrados.
  18550.  
  18551. Para borrar mapas individualmente pueden arrastrarse desde la ventana del
  18552. fichero hasta la papelera del sistema (ésta se muestra con la opción {sistema
  18553. \ papelera}).
  18554.  
  18555.  
  18556. # ─────────────────────────────────────────────────────────────────────────────
  18557.  
  18558. {.1256,Menú de fuentes}
  18559. Ver: {#3,Indice} - {#1250,Ayuda sobre el sistema de menús}{/}
  18560.  
  18561. {+81,0}Este menú permite realizar acciones relacionadas con las fuentes de letras de
  18562. los juegos (o tipos de letra); entre ellas acceder al generador de fuentes
  18563. utilizado para crear nuevas fuentes. Las fuentes de letras se utilizan dentro
  18564. del editor gráfico y en los juegos, para escribir textos.
  18565.  
  18566. Asimismo, las fuentes se muestran en unas pequeñas ventanas que indican qué
  18567. conjuntos de caracteres tienen definidos. Los caracteres se dividen en los
  18568. siguientes grupos: dígitos numéricos, letras mayúsculas, letras minúsculas,
  18569. símbolos y caracteres extendidos.
  18570.  
  18571. Para visualizar una muestra de los caracteres contenidos en una fuente, se
  18572. debe pulsar con el botón izquierdo del ratón sobre su ventana.
  18573.  
  18574. Las fuentes se guardan en el disco en archivos {FNT} y se adaptan a la paleta
  18575. del entorno al cargarse y siempre que se cambie la paleta activa. Para ver
  18576. una fuente con su paleta original, se debe utilizar la opción {paletas \
  18577. abrir...} indicando el nombre del archivo FNT.
  18578.  
  18579. Las ventanas de fuentes siempre se corresponden con un archivo FNT del disco,
  18580. por lo tanto, no existe ninguna opción para guardar las fuentes, ya que éstas
  18581. {siempre están guardados}, es decir, lo que se muestra en pantalla es
  18582. exactamente lo que hay en el archivo del disco.{-}
  18583.  
  18584. {/}
  18585.  
  18586. {+82,0}{Generar fuente...}
  18587.  
  18588. Esta opción creará una nueva ventana con el generador de fuentes de letras.
  18589. Con esta herramienta se pueden crear nuevos tipos de letra para los juegos de
  18590. forma fácil y rápida. Para generar una nueva fuente se deben seguir los
  18591. siguientes pasos:
  18592.  
  18593. * Primero, seleccionar el nuevo archivo FNT en el que se debe guardar la
  18594. fuente de letra creado. Para ello, se debe pulsar en {Nueva fuente}, en el
  18595. botón con puntos suspensivos. Aparecerá un cuadro de diálogo para introducir
  18596. el nombre del archivo. Por defecto, la fuente se generará en el archivo
  18597. {NUEVOFNT.FNT} válido para realizar pruebas.
  18598.  
  18599. * Segundo, elegir el aspecto de la fuente. Pulsando en {Aspecto}, en el botón
  18600. con puntos suspensivos, se accederá a un diálogo para seleccionar el aspecto
  18601. de la fuente. Se debe seleccionar uno de los archivos con extensión {IFS} de
  18602. la lista. Pulsando sobre cualquiera de ellos se podrá ver una muestra en el
  18603. propio diálogo. Una vez localizado el aspecto deseado, se debe pulsar el
  18604. botón de {Aceptar}.
  18605.  
  18606. * En la parte superior derecha del cuadro, dos cajas de texto permiten
  18607. definir el tamaño de los caracteres de la fuente. Se debe definir el {Ancho}
  18608. y el {Alto} de los mismos como cualquier número entre 16 y 128. Para tamaños
  18609. menores a 16x16 se pueden utilizar únicamente los mostrados en la lista
  18610. contigua (8x8, 10x10, 12x12 o 14x14) que se pueden seleccionar pulsando
  18611. sobre la misma. Para fuentes mayores de 16x16 se pueden indicar dos medidas
  18612. diferentes para el ancho y el alto, deformándose el aspecto original.
  18613.  
  18614. * En la sección {Fuente} (central izquierda) seleccionar el color de tinta para
  18615. la fuente pulsando sobre el cuadro de color, o bien {arrastrar un mapa con la
  18616. textura} hasta este cuadro. Si se define de esta forma una textura como
  18617. relleno de la fuente de letras, se podrá seleccionar en la casilla {Mosaico}
  18618. si dicha textura debe repetirse cíclicamente; por defecto (sin la casilla
  18619. activada) la textura se reescalará al tamaño de los caracteres de la fuente.
  18620. Es decir, que para utilizar una textura en una fuente se debe primero abrir o
  18621. crear el mapa con la textura, y después arrastrarlo al generador de fuentes.
  18622.  
  18623. * En la sección {Reborde} (central media) se debe definir si se debe crear un
  18624. borde en los caracteres de la fuente; en caso afirmativo se tiene que
  18625. especificar en primer lugar el ancho en puntos de este reborde, utilizando
  18626. los botones{ -} y{ +}. A continuación, donde aparece una {X} entre otros dos
  18627. botones{ -} y{ +} se podrá especificar la dirección de la iluminación del
  18628. reborde (el símbolo {X} indica que no se va a iluminar el reborde). Por
  18629. último, se especificará el color o textura del reborde de la misma forma que
  18630. en la sección anterior.
  18631.  
  18632. * En la sección {Sombra} (central derecha) se define la sombra de los
  18633. caracteres; primero se debe indicar el desplazamiento horizontal de la misma
  18634. (en puntos), teniendo en cuenta que los números positivos están hacia la
  18635. derecha, y después el desplazamiento vertical (ahora los positivos están
  18636. hacia abajo). Si se dejan ambos desplazamientos a cero, no se crearán
  18637. sombras. Después, se debe elegir nuevamente el color o textura para las
  18638. sombras. Normalmente se especifica un color oscuro como relleno de las
  18639. sombras, pero {no el primer color de la paleta}, ya que éste es el color
  18640. transparente y, por lo tanto, no se visualiza.
  18641.  
  18642. * Con el botón denominado {Prueba} se puede ver en cualquier momento una
  18643. muestra de la fuente resultante para, de esta forma, ajustar mejor los
  18644. parámetros anteriores. En el cuadro de texto contiguo a este botón se puede
  18645. introducir el texto con el que se debe realizar la prueba.
  18646.  
  18647. * Finalmente, se debe pulsar en el botón {Generar} para que el sistema cree
  18648. en el {archivo FNT} indicado la nueva fuente de caracteres a color. Aparecerá
  18649. entonces un diálogo de confirmación en el que, además, se deben indicar
  18650. cuáles de los cinco conjuntos de caracteres se deben incluir en la fuente,
  18651. activando las correspondientes {casillas}. Para crear una fuente completa, se
  18652. deben activar todas las casillas. Si, por ejemplo, únicamente se van a
  18653. utilizar los dígitos numéricos de la fuente es mejor crearlo sólo con esos
  18654. caracteres, ya que de esta forma el archivo FNT ocupará mucho menos espacio
  18655. en el disco y en la memoria del ordenador.
  18656.  
  18657. Terminado el proceso, aparecerá una nueva ventana de fuente en el escritorio
  18658. del entorno, permaneciendo el generador de fuentes en el escritorio hasta que
  18659. se cierre su ventana.
  18660.  
  18661. Para cerrar el generador o cancelar el proceso de creación de una fuente, se
  18662. puede pulsar el botón {Cerrar} de la esquina inferior derecha del mismo; no
  18663. obstante, si se pretende continuar con el mismo más adelante, será mejor
  18664. minimizar la ventana del generador, ya que de esta forma no se perderá la
  18665. información introducida en el mismo hasta el momento.{-}
  18666.  
  18667. {/}
  18668.  
  18669. {Abrir fuente...}
  18670.  
  18671. Esta opción permite abrir un archivo FNT del disco con una fuente de
  18672. caracteres creada anteriormente para realizar alguna operación con ella o
  18673. utilizarlo en el editor gráfico. Un cuadro de diálogo para el manejo de
  18674. archivos nos permitirá seleccionar el archivo, entonces se creará una nueva
  18675. ventana de fuente en el escritorio. Se podrá visualizar una muestra de la
  18676. fuente pulsando con el ratón sobre esta ventana.
  18677.  
  18678. {/}
  18679.  
  18680. {Cerrar}
  18681.  
  18682. Cierra la ventana de fuente seleccionada. No se pedirá confirmación, ya que
  18683. el contenido de estas ventanas siempre está actualizado en el disco, por lo
  18684. tanto, siempre se podrá volver a recuperar la fuente volviéndolo a cargar del
  18685. archivo FNT del disco. Dentro del editor gráfico, en la opción de escribir
  18686. texto, se utilizará la fuente del editor de programas cuando no exista
  18687. ninguna fuente en el escritorio del entorno.
  18688.  
  18689. {/}
  18690.  
  18691. {+83,0}{Escribir texto...}
  18692.  
  18693. Crea un mapa nuevo con un texto escrito con la fuente seleccionada. Aparecerá
  18694. un cuadro de diálogo dentro del cual se debe introducir el texto que debe
  18695. contener el mapa gráfico. El sistema creará una nueva ventana de mapa con
  18696. este texto escrito. Esta opción no estará disponible si no hay en el
  18697. escritorio ninguna ventana de fuente seleccionada.
  18698. Esta opción es útil cuando se quiera utilizar una fuente de caracteres en un
  18699. juego únicamente para mostrar uno o dos mensajes, ya que ocuparán mucho menos
  18700. espacio los gráficos con estos textos que la fuente completa de caracteres.{-}
  18701.  
  18702. {/}
  18703.  
  18704. {Exportar mapa}
  18705.  
  18706. Las opciones de exportar e importar una fuente desde un mapa permitirán
  18707. retocar manualmente las fuentes creadas con el generador en el editor
  18708. gráfico. Esta opción creará una nueva ventana de mapa con todos los
  18709. caracteres de la fuente seleccionada. Para editar, entonces, los caracteres
  18710. de la fuente se debe realizar una doble pulsación del botón izquierdo del
  18711. ratón sobre la ventana del mapa, entrando en el editor. Es muy importante
  18712. respetar los márgenes exteriores de los caracteres, es decir, que se puede
  18713. retocar cada carácter pero respetando sus límites. Los caracteres no
  18714. incluidos en la fuente estarán representados en este mapa con un punto de
  18715. color 0 (el primer color de la paleta, que es el color transparente).
  18716.  
  18717. {/}
  18718.  
  18719. {Importar mapa}
  18720.  
  18721. Esta opción permite volver a obtener el {archivo FNT} a partir del mapa con
  18722. los caracteres. Si el mapa no es una fuente con todos sus caracteres, esta
  18723. opción no podrá obtener el archivo FNT a partir del mismo.
  18724.  
  18725. Los mapas con fuentes tienen un formato que debe ser respetado, con un color
  18726. para definir los márgenes exteriores (que puede ser cualquier color no
  18727. utilizado en la fuente) y 256 cajas cuadradas con los caracteres definidos en
  18728. la fuente ordenadas según su código ASCII, indicándose los caracteres no
  18729. definidos como cajas de 1 punto por 1 punto.
  18730.  
  18731. Si durante la edición de los caracteres en el editor gráfico se han
  18732. modificado los márgenes de los mismos, es posible que esta opción no pueda
  18733. volver a obtener la fuente. El sistema comprueba que en este mapa haya un
  18734. color exterior y, dentro de éste, 256 cajas ordenadas de izquierda a derecha
  18735. con un margen entre ellas de, al menos, un punto (del color exterior).
  18736.  
  18737. Si se respetan estas reglas, se puede incluso crear fuentes de letras a
  18738. partir de cero en el editor gráfico para, después, importarlas con esta
  18739. opción.
  18740.  
  18741. # ─────────────────────────────────────────────────────────────────────────────
  18742.  
  18743. {.1257,Menú de sonidos}
  18744. Ver: {#3,Indice} - {#1250,Ayuda sobre el sistema de menús}{/}
  18745.  
  18746. {+84,0}Este menú permite controlar las ventanas de efectos de sonido y realizar las
  18747. operaciones básicas con ellas, como cargar efectos, guardarlos con otro
  18748. nombre o escucharlos.
  18749.  
  18750. Las ventanas de sonidos siempre se corresponden con un archivo PCM del disco.
  18751. Por lo tanto, no existe ninguna opción para guardar los sonidos, ya que éstos
  18752. {siempre están guardados}, es decir, lo que se muestra en pantalla es
  18753. exactamente lo que hay en el archivo del disco.{-}
  18754.  
  18755. {/}
  18756.  
  18757. {Abrir sonido...}
  18758.  
  18759. Carga un efecto de sonido de un archivo del disco. Un cuadro de diálogo
  18760. permitirá indicar el nombre de un archivo con extensión {PCM} o {WAV}, no
  18761. obstante, cuando se cargue un archivo {WAV}, el sistema creará
  18762. automáticamente otro archivo con el mismo nombre pero con extensión (y
  18763. formato) {PCM}, ya que éste es el único formato permitido para las ventanas
  18764. de sonidos. Se creará entonces la nueva ventana de sonido que mostrará el
  18765. contenido del archivo {PCM} al que representa.
  18766.  
  18767. {/}
  18768.  
  18769. {Cerrar}
  18770.  
  18771. Cierra el efecto de sonido seleccionado. No se pedirá confirmación, ya que el
  18772. contenido de la ventana está siempre actualizado en el archivo del disco (en
  18773. esta primera versión del programa no se pueden editar los efectos de sonido).
  18774. Por ello, siempre se podrá recuperar esta ventana volviendo a abrir el
  18775. archivo del disco.
  18776.  
  18777. {/}
  18778.  
  18779. {Guardar como...}
  18780.  
  18781. Guarda el efecto de sonido seleccionado en otro archivo del disco, con otro
  18782. nombre. Aparecerá un cuadro de diálogo en el que se debe introducir el nombre
  18783. del nuevo archivo PCM, no siendo posible exportar sonidos a ficheros WAV. Si
  18784. se especifica el nombre de un archivo ya existente, el sistema pedirá
  18785. confirmación antes de sobreescribir el contenido de dicho archivo.
  18786.  
  18787. {/}
  18788.  
  18789. {Probar sonido}
  18790.  
  18791. Emite el efecto de sonido por el sistema de audio del ordenador. Se oirá
  18792. entonces el efecto de sonido seleccionado del escritorio. Esta acción también
  18793. se puede realizar pulsando con el ratón sobre la ventana del sonido.
  18794.  
  18795. # ─────────────────────────────────────────────────────────────────────────────
  18796.  
  18797. {.1258,Menú de sistema}
  18798. Ver: {#3,Indice} - {#1250,Ayuda sobre el sistema de menús}{/}
  18799.  
  18800. {+85,0}Desde este menú se controlan las acciones relacionadas con el propio entorno
  18801. de ventanas. Desde él, se puede configurar su apariencia (modo de vídeo,
  18802. fuentes, colores, tapiz de fondo, etc.), acceder a utilidades auxiliares,
  18803. solicitar información sobre el sistema o salir del mismo.{-}
  18804.  
  18805. {/}
  18806.  
  18807. {+86,0}{CDiv Player}
  18808.  
  18809. Esta opción mostrará en pantalla el reproductor de CD-Audio. Con esta
  18810. herramienta se puede controlar la reproducción de discos compactos de música
  18811. con la unidad de CD-ROM del ordenador. En la parte superior de la ventana del
  18812. reproductor se muestra información sobre la canción seleccionada y el tiempo.
  18813. Los botones de control permiten, de izquierda a derecha: pasar a la canción
  18814. anterior, rebobinar, parar la reproducción (stop), iniciar la reproducción
  18815. (play), avanzar y pasar a la siguiente canción.
  18816.  
  18817. Una vez iniciada la reproducción en una canción, ésta continuará hasta el
  18818. final del disco. Si una vez iniciada la reproducción se cierra la ventana del
  18819. reproductor, ésta no se detendrá; no obstante, también puede minimizarse el
  18820. reproductor.{-}
  18821.  
  18822. {/}
  18823.  
  18824. {+87,0}{Reloj}
  18825.  
  18826. Esta opción mostrará en pantalla un reloj con la hora actual. Éste aparecerá
  18827. dentro de una ventana que puede dejarse activa en todo momento, arrastrarse
  18828. hasta otra posición o cerrarse. Si se minimiza la ventana, el texto del icono
  18829. de la misma seguirá mostrando la hora actualizada.{-}
  18830.  
  18831. {/}
  18832.  
  18833. {+88,0}{Papelera}
  18834.  
  18835. Esta opción mostrará la ventana de la papelera en el escritorio. La papelera
  18836. sirve para borrar ventanas de mapas o mapas de ventanas de ficheros que sean
  18837. arrastradas hasta ella. No se pedirá confirmación antes de borrar los mapas
  18838. que sean arrastrados a la papelera.{-}
  18839.  
  18840. {/}
  18841.  
  18842. {Modo de vídeo... / Tapiz de fondo... / Configuración}
  18843.  
  18844. Estas tres opciones, permiten configurar la apariencia del entorno gráfico
  18845. de ventanas.
  18846.  
  18847. {Configuración del entorno}
  18848.  
  18849. {/}
  18850.  
  18851. {Fijando un modo de vídeo}
  18852.  
  18853. La opción {Sistema \ Modo de vídeo...} da acceso a un cuadro de diálogo que
  18854. permite modificar la resolución utilizada por el entorno gráfico de DIV
  18855. Games Studio.
  18856.  
  18857. Las resoluciones de vídeo se indican como el número de puntos en horizontal
  18858. y vertical existentes en la pantalla en dicho modo y varían entre 320x200
  18859. (baja resolución) y 1024x768 (máxima resolución). Para seleccionar una nueva
  18860. resolución se debe pulsar sobre la lista que aparecen en el cuadro y después
  18861. en el botón de {Aceptar}.
  18862.  
  18863. {+33,0}{Importante}: Algunos de estos modos de vídeo pueden visualizarse
  18864. incorrectamente en algunos equipos; en estos casos lo primero que debe
  18865. hacerse es salir del entorno pulsando la combinación {ESC+Control} y,
  18866. después, volver a entrar en DIV en el modo a prueba de fallos. Para ello se
  18867. debe, desde la línea de comandos de {MSDOS} y en el directorio (carpeta) en
  18868. la que se haya instalado el programa, ejecutar el siguiente comando :
  18869.  
  18870.     {D.EXE /SAFE}
  18871.  
  18872. De esta forma se entrará en el entorno en baja resolución (en 320x200, el
  18873. modo más compatible de todos). Para situarse desde la línea de comandos en el
  18874. directorio del programa, se debe ejecutar la siguiente sentencia (suponiendo
  18875. que el programa haya sido instalado en la unidad {C}, en la directorio {DIV}
  18876. dentro de {UTIL}):
  18877.  
  18878.     {C :}·
  18879.     {CD \UTIL\DIV}
  18880.  
  18881. En aquellos equipos en los que el sistema de vídeo no sea compatible con el
  18882. estándar {VESA} debe utilizarse un {driver vesa}. Para esto, debe contactar
  18883. con el proveedor o servicio técnico de su equipo hardware (un {driver} es un
  18884. pequeño programa que debe instalarse en el ordenador para dar soporte a
  18885. algunos dispositivos como, en este caso, el monitor).
  18886.  
  18887. Por problemas de incompatibilidad del {driver de ratón} es posible que en
  18888. algunos equipos el puntero del ratón se mueva a saltos; en estos casos, se
  18889. debe actualizar dicho {driver} o utilizar otro modo de vídeo para el entorno,
  18890. ya que en caso contrario no se podrá trabajar correctamente en el editor
  18891. gráfico.
  18892.  
  18893. Dos casillas permiten seleccionar la fuente utilizada por el sistema,
  18894. existiendo dos posibilidades:
  18895.  
  18896. {Fuente pequeña}. En este modo todas las ventanas, menús y cuadros se
  18897. verán en un tamaño menor, siendo el apropiado para modos de baja
  18898. resolución o equipos con un monitor lo suficientemente grande.
  18899.  
  18900. {Fuente grande}. Este modo {podrá ser activado únicamente en resoluciones
  18901. SVGA} (a partir de 640x480) y es el apropiado para estas resoluciones en
  18902. monitores de 14 pulgadas.
  18903.  
  18904. La fuente utilizada en los programas y en las ventanas de ayuda se define en
  18905. la ventana de configuración descrita más adelante.{-}
  18906.  
  18907. {/}
  18908.  
  18909. {Configurando el tapiz de fondo}
  18910.  
  18911. {+34,0}Para establecer el tapiz de fondo del escritorio se debe acceder a la opción
  18912. {Sistema \ Tapiz de fondo...}, que invocará el siguiente cuadro de diálogo:
  18913.  
  18914. Primeramente se debe pulsar sobre el botón '...' donde indica '{Apariencia} '
  18915. para seleccionar un archivo {MAP} con el gráfico que se quiere utilizar como
  18916. fondo. Si se quiere usar como fondo un archivo {PCX} o {BMP}, se debe cargar
  18917. primero éste con la opción {Mapas \ Abrir mapa...} y, después, guardarlo
  18918. ({Mapas \ Guardar como...}) indicando un nombre de archivo con la extensión
  18919. { .MAP}.
  18920.  
  18921. Mediante las siguientes casillas se indicará la apariencia de este gráfico.
  18922.  
  18923. {Mosaico}. Si se activa esta casilla el dibujo se mostrará a su tamaño
  18924. original, sin reescalar y, si es más pequeño que la pantalla, se repetirá
  18925. el dibujo hasta completar el fondo de la pantalla. Cuando esté desactivado,
  18926. el dibujo se reescalará (ampliándose o reduciéndose) para ajustarse al tamaño
  18927. de la pantalla.
  18928.  
  18929. {Color / Monocromo}. De estas dos casillas sólo podrá activarse una. La
  18930. primera señala que el dibujo se tomará en color, adaptándose a la paleta de
  18931. colores activa en el entorno (ésto suele desembocar en una pérdida de calidad
  18932. de dicho dibujo). Si se activa la segunda casilla, el dibujo se adaptará a
  18933. una gama de colores de la paleta, que se definirá con tres componentes:
  18934. {Rojo, Verde y Azul}.
  18935.  
  18936. Estos componentes, que pueden variar entre {0} y {9}, se modificarán con
  18937. los botones '{ -}' y '{ +}'. Serán aplicados únicamente cuando esté activada la
  18938. casilla que indica {Monocromo}, y definen el color más claro de la gama; a
  18939. continuación se muestran algunos ejemplos de combinaciones de estos valores y
  18940. cuál es el color resultante:
  18941.  
  18942. * Rojo=9, Verde=9 y Azul=9 definirán el color {blanco} como el color más
  18943. claro de la gama (se mostrará el tapiz de fondo en blanco y negro).
  18944.  
  18945. * Rojo=0, Verde=0 y Azul=9 definirán el color {azul puro}, mostrándose el
  18946. tapiz en diversos tonos de azul.
  18947.  
  18948. * Rojo=4, Verde=0 y Azul=0 definirán como el color más claro de la gama el
  18949. {rojo oscuro}, es decir, que el tapiz de fondo se verá en tonalidades oscuras
  18950. de rojo.
  18951.  
  18952. * Rojo=9, Verde=9 y Azul=0 definirán el color {amarillo} (rojo+verde), con lo
  18953. que se verá el fondo en una gama de colores definida entre el negro y el
  18954. amarillo.
  18955.  
  18956. Las gamas resultantes deben adaptarse a los colores disponibles en la paleta,
  18957. por lo que unas quedarán mejor que otras, debiéndose realizar normalmente
  18958. varias pruebas antes de encontrar una gama de color compatible con la paleta.
  18959.  
  18960. Los cambios realizados en el tapiz no serán visibles hasta que se finalice el diálogo
  18961. pulsando en el botón de {Aceptar}.{-}
  18962.  
  18963. {/}
  18964.  
  18965. {La ventana de configuración}
  18966.  
  18967. Mediante la opción {Sistema \ Configuración...} se accederá a un cuadro de
  18968. diálogo desde el que se pueden definir múltiples aspectos del entorno
  18969. gráfico.
  18970.  
  18971. {+35,0}Este cuadro de diálogo está dividido en varias secciones, que se muestran a
  18972. continuación. Estas opciones no tomarán efecto hasta que no se finalice el
  18973. diálogo.
  18974.  
  18975. {Colores de ventanas}. Esta primera sección establece los colores utilizados
  18976. por el entorno; se pueden indicar los colores de fondo, tinta y barra. Para
  18977. cambiar uno de estos colores se debe pulsar sobre la caja con el color,
  18978. apareciendo un cuadro de diálogo que mostrará todos los colores disponibles
  18979. en la paleta activa. Dentro de este cuadro se mostrará con una marca el color
  18980. seleccionado actualmente; para seleccionar otro color se debe pulsar sobre el
  18981. mismo con el ratón y después en el botón de {Aceptar}. El sistema no sólo
  18982. utiliza estos tres colores sino que, a partir de ellos, genera otros colores
  18983. intermedios para los textos, cursores, botones, etc.
  18984.  
  18985. {Editor de programas}. En esta sección es donde se establece la apariencia de
  18986. las ventanas de edición de programas. Se pueden seleccionar los tres colores
  18987. básicos (fondo de la ventana, tinta de los caracteres y el color del cursor)
  18988. y la fuente de edición (el tamaño del tipo de letra) desde 6x8 puntos hasta
  18989. 9x16 puntos. Todas las fuentes de edición son de espaciado fijo. Para
  18990. seleccionar otra fuente se deben utilizar los botones de la barra de
  18991. desplazamiento. Los bloques de texto marcados dentro del editor se verán con
  18992. los colores de tinta y fondo intercambiados.
  18993.  
  18994. {Programa de dibujo}. En esta sección se puede definir la cantidad de memoria
  18995. reservada para deshacer opciones en el editor gráfico y el puntero de ratón
  18996. empleado en la edición. La cantidad de memoria se especifica en Kbytes, por
  18997. defecto es 1088Kb (algo más de un mega), y no es necesario modificar este
  18998. valor a no ser que no se pueda realizar una operación en el editor gráfico
  18999. por falta de memoria de deshacer (en cuyo caso el programa advertirá de
  19000. ello). Cuanta más memoria de deshacer se reserve, menos memoria quedará
  19001. disponible en el sistema para el resto de acciones. Se puede seleccionar
  19002. entre tres juegos de punteros diferentes pulsando sobre el gráfico del
  19003. puntero mostrado en este cuadro.
  19004.  
  19005. {Opciones globales}. En la última sección aparecen tres casillas que, cuando
  19006. estén activadas, definirán las siguientes características:
  19007.  
  19008. {Ventanas emergentes}. Indica que todos los movimientos de ventanas deben
  19009. ser visualizados, cuando se abren, se cierren, se minimicen, etc. Si se
  19010. desactiva esta opción, el entorno perderá efectismo pero ganará velocidad de
  19011. respuesta.
  19012.  
  19013. {Mover ventanas completas}. Indica que al arrastrarse las ventanas a una
  19014. nueva posición se debe ver en todo momento el resultado final, pasando a
  19015. primer plano las ventanas que se vayan destapando y a segundo plano las que
  19016. se vayan tapando. Puede ser conveniente desactivar esta opción en los equipos
  19017. más lentos.
  19018.  
  19019. {Guardar sesión siempre}. Indica que al salir de DIV Games Studio se debe
  19020. guardar el estado del escritorio y todos sus objetos (programas, mapas,
  19021. sonidos, etc.). Si se desactiva esta opción la entrada y salida del entorno
  19022. será más rápida, pero se puede correr el riesgo de perder trabajos que no
  19023. hayan sido grabados al salir del entorno.
  19024.  
  19025. Si se cierra la ventana de configuración o se pulsa la tecla {ESC} se
  19026. perderán todos los cambios realizados en la misma, restableciéndose los
  19027. valores de la configuración anterior.{-}
  19028.  
  19029. {/}
  19030.  
  19031. {+89,0}{Información sistema}
  19032.  
  19033. Esta opción mostrará información en un cuadro de diálogo sobre los recursos
  19034. disponibles en el sistema. Se informará de la memoria libre disponible, la
  19035. memoria ocupada por las ventanas de mapas cargadas y, como tanto por ciento
  19036. de recursos, se indica cuántos objetos, mapas y ventanas de cualquier tipo
  19037. hay cargados en el escritorio del total que pueden llegar a cargarse.{-}
  19038.  
  19039. {/}
  19040.  
  19041. {Acerca de ...}
  19042.  
  19043. Esta opción muestra el cuadro de diálogo introductor con la información sobre
  19044. la versión actual del programa.
  19045.  
  19046. {/}
  19047.  
  19048. {Shell MS-DOS (Tecla directa: ALT+S)}
  19049.  
  19050. Ejecuta una sesión del sistema operativo MS-DOS, sin salir de DIV. Se podrán
  19051. utilizar comandos de este sistema y programas que sólo requieran memoria
  19052. base. Se debe teclear {EXIT} para finalizar la sesión de este sistema.
  19053.  
  19054. {/}
  19055.  
  19056. {+90,0}{Salir de DIV (Tecla directa: ALT+X)}
  19057.  
  19058. Sale del entorno de DIV Games Studio. El sistema pedirá confirmación antes
  19059. de salir definitivamente. Por defecto, el sistema guardará el contenido del
  19060. escritorio para las siguientes ejecuciones del entorno, por lo que {no se
  19061. perderá la información} que no se haya guardado antes de salir.{-}
  19062.  
  19063. # ─────────────────────────────────────────────────────────────────────────────
  19064.  
  19065. {.1259,Opción de ayuda}
  19066. Ver: {#3,Indice} - {#1250,Ayuda sobre el sistema de menús}{/}
  19067.  
  19068. Desde el menú principal se puede acceder al índice de este hipertexto de
  19069. ayuda del entorno seleccionando la última opción.
  19070.  
  19071. Las ventanas de ayuda se controlan con el ratón, utilizando la barra de
  19072. desplazamiento vertical de su derecha para moverse por cada una de las
  19073. páginas de ayuda. Para esto, se pueden utilizar también las siguientes
  19074. teclas:
  19075.  
  19076. * {Cursor arriba / abajo}. Desplazar el texto una línea hacia arriba o abajo.
  19077.  
  19078. * {Re.Pág / Av.Pág}. Desplazar el texto de la ayuda de página en página.
  19079.  
  19080. * {Backspace}. Volver a la página de ayuda anterior (esta tecla es la de
  19081. borrar el carácter anterior que está situada en el teclado sobre la tecla
  19082. {Enter}).
  19083.  
  19084. En las ventanas de ayuda se muestra el texto en tres colores:
  19085.  
  19086. * {Negro}. Éste es el cuerpo principal de la ayuda, se muestra en color negro
  19087. la mayoría del texto en las páginas de ayuda.
  19088.  
  19089. * {Gris}. En color gris aparecen aquellos textos que se han querido resaltar
  19090. por ser información especialmente relevante (como los textos en {negrita} de
  19091. un libro).
  19092.  
  19093. * {Blanco}. Aparecen de este color los textos o palabras que hacen referencia
  19094. a conceptos o términos que están explicados en otra página de la ayuda. Se
  19095. puede pulsar con el ratón sobre los mismos para acceder a esa página y,
  19096. después, utilizar la tecla {Backspace} para retornar al punto de la página
  19097. anterior en el que se detuvo la lectura.
  19098.  
  19099. Además de texto pueden aparecer {imágenes} o {ejemplos} en las ventanas de
  19100. ayuda. Los ejemplos son programas que comienzan con una línea en {blanco} y
  19101. tienen el texto en {azul oscuro}. Para extraer los ejemplos de las ventanas
  19102. de ayuda se debe pulsar sobre la línea en blanco inicial de los mismos.
  19103. Después, se podrán compilar y ejecutar pulsando la tecla {F10} y para abortar
  19104. la ejecución de los mismos se debe pulsar {ALT+X}.
  19105.  
  19106. En la esquina inferior derecha de la ventana de ayuda aparece un botón liso
  19107. que puede utilizarse para ampliar o reducir la ventana, pulsando sobre él y
  19108. arrastrando hacia arriba o hacia abajo.
  19109.  
  19110. # ─────────────────────────────────────────────────────────────────────────────
  19111.  
  19112. {.1260,Trazador de programas}
  19113. Ver: {#3,Indice} - {#1250,Ayuda sobre el sistema de menús}{/}
  19114.  
  19115. El trazador de programas es una herramienta avanzada y para utilizarla es
  19116. necesario comprender bien antes todos los conceptos de programación expuestos
  19117. a partir del capítulo 5 del libro de DIV Games Studio (Manual de usuario).
  19118.  
  19119. {+70,0}El trazador es un cuadro de diálogo que puede activarse durante la ejecución
  19120. de los programas por uno de los siguientes motivos:
  19121.  
  19122. * Se entró en el programa con la opción {programas \ trazar programa}.
  19123.  
  19124. * Se pulsó la tecla {F12} durante la ejecución de un programa.
  19125.  
  19126. * Se produjo un {error de ejecución} en el programa.
  19127.  
  19128. * Se encontró una sentencia {debug} en el programa ejecutado.
  19129.  
  19130. Esta herramienta, también llamada {debugger}, permite ejecutar el programa
  19131. sentencia a sentencia, comprobando cada vez que sea necesario el valor que
  19132. toman los diferentes datos del programa. Su utilidad principal reside en
  19133. poder, al revisar la ejecución del programa paso a paso, encontrar los fallos
  19134. que puedan tener los programas.
  19135.  
  19136. Por ser un diálogo con mucha información, se describen a continuación cada
  19137. una de las secciones del mismo de forma separada.{-}
  19138.  
  19139. {/}
  19140.  
  19141. {Línea informativa superior}
  19142.  
  19143. En la parte superior de la ventana aparecen dos mensajes. A la izquierda uno
  19144. que indica el {número de procesos activos en el programa} del {total que
  19145. pueden llegar a crearse}. Por ejemplo, si pone 23/3201 quiere decir que hay 23
  19146. procesos activos en el programa y que podrían llegar a crearse hasta 3201
  19147. antes de que se agotara la memoria disponible para procesos.
  19148.  
  19149. El número de procesos máximo varia de unos programas a otros en función del
  19150. número de variables locales y privadas de los mismos.
  19151.  
  19152. A la derecha se indica el {código identificador} del proceso seleccionado en
  19153. la lista, y su estado actual (Normal, muerto, dormido o congelado).
  19154.  
  19155. {/}
  19156.  
  19157. {Lista de procesos activos}
  19158.  
  19159. Esta lista aparece en la parte superior izquierda del trazador con una barra
  19160. de desplazamiento a su derecha. Se muestran en ella todos los procesos
  19161. activos en el programa; se entiende por activos los procesos que han sido
  19162. creados y todavía no han desaparecido. Por cada proceso aparece la siguiente
  19163. información:
  19164.  
  19165. * El nombre del proceso en el programa.
  19166.  
  19167. * Su código identificador entre paréntesis (en ocasiones puede no caber
  19168. entero).
  19169.  
  19170. * Una letra que indica su estado ({A}-Normal, {K}-Muerto, {S}-Dormido y
  19171. {F}-Congelado).
  19172.  
  19173. * El porcentaje de ejecución completada para la siguiente imagen.
  19174.  
  19175. Para desplazarse por la lista de procesos se debe utilizar la barra de
  19176. desplazamiento de la misma.
  19177.  
  19178. {Importante}: Uno de los procesos aparece con una punta de flecha de color
  19179. blanco señalando su nombre; este proceso es el que {se está ejecutando}
  19180. actualmente en el programa. Por lo tanto, la próxima sentencia del programa
  19181. será de este proceso.
  19182.  
  19183. Uno de los procesos aparece señalizado con una banda negra; éste es el
  19184. proceso del cual se muestra información en la parte derecha de la ventana
  19185. (al lado de esta lista de procesos). Este proceso puede seleccionarse con el
  19186. ratón, pulsando sobre la lista.
  19187.  
  19188. Es muy importante diferenciar entre el proceso que se está ejecutando y el
  19189. proceso sobre el que se muestra la información, ya que no tienen por qué ser
  19190. iguales. Para que se muestre la información sobre el proceso que se está
  19191. ejecutando se debe seleccionar al mismo (el de la flecha blanca) pulsando en
  19192. la lista con el botón izquierdo del ratón.
  19193.  
  19194. {/}
  19195.  
  19196. {Cuadro de información sobre el proceso señalizado}
  19197.  
  19198. A la derecha de la lista anterior se muestra información sobre el proceso
  19199. señalizado con una banda negra en la lista (no el proceso en ejecución). En
  19200. la línea superior se mostraba su código identificador y su estado.
  19201.  
  19202. En una caja de fondo oscuro se muestra el nombre completo del proceso, y bajo
  19203. la misma aparece otra caja con el gráfico de este proceso (éste se muestra
  19204. reducido cuando sea más grande para que entre en esta caja).
  19205.  
  19206. A la derecha del gráfico aparece el botón {Ver datos} que permite acceder a
  19207. otro cuadro de diálogo en el que se pueden consultar y modificar todos los
  19208. datos del proceso; éste se explica más adelante en el punto {Inspeccionando
  19209. los datos}.
  19210.  
  19211. A continuación de este botón se muestran siempre las coordenadas ({x},{y})
  19212. del proceso; el sistema de coordenadas empleado por el mismo (referidas a la
  19213. {pantalla}, a un {scroll} o a un {modo 7}) y las inversiones o transparencias
  19214. aplicadas al gráfico del proceso.
  19215.  
  19216. Por último, cuatro botones permiten acceder al proceso padre ({father}, el
  19217. proceso que llamó al que está seleccionado), el hijo ({son}, el último
  19218. proceso llamado por el seleccionado), el hermano menor ({smallbro}, el último
  19219. llamado por el padre antes que él) y el hermano mayor ({bigbro}, el siguiente
  19220. llamado por el padre tras él). Cuando estos botones no lleven a ningún otro
  19221. proceso, es porque no existe ninguno con dicha relación de parentesco.
  19222.  
  19223. {/}
  19224.  
  19225. {Controles de ejecución parcial}
  19226.  
  19227. Dos botones denominados {Ejec.Proceso} y {Sgte.FRAME} bajo el cuadro de
  19228. información anterior permiten ejecutar parcialmente el programa.
  19229.  
  19230. {Ejecución del proceso}. Este primer botón permite que el programa continúe
  19231. justo hasta que finalice el proceso actualmente en ejecución (el señalizado
  19232. en la lista con la flecha blanca). Se ejecutarán todas sus sentencias hasta
  19233. que llegue al próximo {FRAME} (hasta que el proceso esté listo para la
  19234. próxima imagen del juego).
  19235.  
  19236. {Siguiente FRAME}. El segundo botón ejecutará el programa hasta la siguiente
  19237. imagen del mismo, ejecutando todos los procesos pendientes primero y
  19238. visualizando (al fondo del trazador) la próxima imagen del juego. El trazador
  19239. se detendrá en la primera sentencia del primer proceso a ejecutar en la nueva
  19240. imagen. Se puede desplazar el cuadro de diálogo con el trazador (arrastrando
  19241. su barra de título) para contemplar el resultado de la imagen anterior del
  19242. juego.
  19243.  
  19244. {/}
  19245.  
  19246. {Cuadro de trazado del listado del programa}
  19247.  
  19248. En la parte inferior del trazador es donde se muestra el código del programa.
  19249. En la esquina superior izquierda aparece el código identificador del proceso
  19250. en ejecución (nuevamente, el señalizado con la flecha blanca en la lista).
  19251. Debajo aparecen tres botones y a la derecha la ventana de código.
  19252.  
  19253. En la {ventana de código}, otra flecha de color blanco indica la línea en la
  19254. que se encuentra la próxima sentencia a ejecutar por el proceso. Se puede
  19255. observar cómo la sentencia aparece también resaltada del resto del código en
  19256. color blanco.
  19257.  
  19258. El contenido de esta ventana se puede desplazar con las teclas de los
  19259. {cursores}. Se aprecia cómo con una banda negra se pueden señalar las líneas
  19260. del programa. No obstante, no es posible modificar el programa desde el
  19261. trazador, sino que para modificar el programa se debe finalizar su ejecución
  19262. (esto se puede hacer pulsando {ALT+X}) y retornando al editor del entorno.
  19263.  
  19264. El primer botón denominado {Proceso} permite saltar en la ventana de código a
  19265. uno de los procesos del programa directamente. Aparecerá una lista con todos
  19266. los procesos encontrados en el programa, debiéndose seleccionar con el ratón
  19267. el proceso deseado. No obstante, esto no alterará el proceso actualmente en
  19268. ejecución que seguirá siendo el mismo.
  19269.  
  19270. El segundo botón permite establecer un punto de {Ruptura} en el programa;
  19271. para ello se debe, primero, seleccionar con la banda negra la línea del
  19272. listado en la que se debe detener el programa cuando llegue a ella (con los
  19273. cursores) y, después, activar este botón; la línea aparecerá en color rojo.
  19274.  
  19275. No en todas las líneas del programa se pueden establecer puntos de ruptura,
  19276. sino  únicamente en aquellas para las que se haya generado código ejecutable
  19277. (en las que se realice alguna acción).
  19278.  
  19279. Se pueden establecer múltiples puntos de ruptura en el programa. Para
  19280. ejecutar después el programa hasta que llegue a uno de estos puntos basta
  19281. con cerrar el trazador o pulsar la tecla {ESC}.
  19282.  
  19283. Para {desactivar} un punto de ruptura se debe volver a seleccionar la línea y
  19284. pulsar nuevamente en el mismo botón.
  19285.  
  19286. El último botón, {Trazar}, es el que realmente permite trazar sentencia a
  19287. sentencia el programa; cada vez que se pulse el mismo se ejecutará una de
  19288. las sentencias del programa. Cuando un proceso finalice su ejecución, o
  19289. complete una imagen, se pasará a la primera sentencia a ejecutar del
  19290. siguiente proceso.
  19291.  
  19292. {/}
  19293.  
  19294. {Inspeccionando los datos}
  19295.  
  19296. {+71,0}Pulsando el botón {Ver datos} del trazador de programas se accede a este otro
  19297. cuadro de diálogo, en el que se pueden consultar los valores de los datos del
  19298. programa en el punto en el que se encuentra detenido e incluso modificarlos,
  19299. normalmente con la finalidad de realizar pruebas en el mismo.
  19300.  
  19301. La mayor parte de este cuadro está ocupado por la lista de datos; para cada
  19302. uno de ellos se muestra con su nombre y su valor numérico. Esta lista
  19303. aparece siempre en orden alfabético.
  19304.  
  19305. Mediante una serie de casillas se puede seleccionar el conjunto de datos que
  19306. aparecen en esta lista. Las dos casillas superiores definen los dos
  19307. siguientes conjuntos.
  19308.  
  19309. * {Predefinidos}. Cuando esté activada esta casilla se incluirán en la lista
  19310. todos los datos predefinidos en el lenguaje. Se podrá acceder de esta forma
  19311. a los datos locales predefinidos (como x, y, angle, size, ...), a los datos
  19312. globales predefinidas y a las constantes predefinidas.
  19313.  
  19314. * {Definidos por usuario}. Esta casilla selecciona todos los nuevos datos que
  19315. han sido definidos en el programa. Estos son las constantes, variables,
  19316. tablas y estructuras especificas de cada programa.
  19317.  
  19318. Además de poder seleccionar los datos según sean predefinidos o nuevos, se
  19319. pueden seleccionar según el ámbito en el que han sido declarados los mismos,
  19320. con las siguientes casillas.
  19321.  
  19322. * {CONST}. Esta casilla sirve para incluir las constantes en la lista, si
  19323. bien las constantes no son datos, sino sinónimos de un valor numérico, por lo
  19324. que no podrán ser modificadas.
  19325.  
  19326. * {GLOBAL}. Se incluirán en la lista los datos de ámbito global (accesibles
  19327. por todos los procesos) en la lista, cuando se active esta casilla.
  19328.  
  19329. * {LOCAL}. Con esta casilla activada se incluirán en la lista los datos de
  19330. ámbito local, es decir, los datos que tienen todos los procesos del programa.
  19331.  
  19332. * {PRIVATE}. Esta casilla selecciona para su inclusión en la lista los datos
  19333. específicos del proceso señalizado en la ventana del trazador, es decir, los
  19334. datos que tiene exclusivamente este proceso para su uso interno.
  19335.  
  19336. La lista de datos se puede desplazar con la barra de desplazamiento vertical
  19337. o con las teclas de los {cursores} y las teclas {Re.Pág / Av.Pág}.
  19338.  
  19339. El botón {Cambiar} permite modificar el valor del dato seleccionado, siendo
  19340. las constantes los únicos que no pueden modificarse. Aparecerá un nuevo
  19341. diálogo con una caja de texto en la que se debe introducir el nuevo valor
  19342. del dato. Se puede seleccionar cualquier dato de la lista con los {cursores}
  19343. o pulsando con el ratón sobre la misma.
  19344.  
  19345. Bajo este botón aparecen otros dos con los símbolos{ -} y{ +}; estos se
  19346. utilizan para {modificar el índice de tablas y estructuras}, lo que también
  19347. puede hacerse con las teclas {cursor derecha} e {izquierda}. Antes debe estar
  19348. seleccionada en la lista la tabla o estructura cuyo índice se quiere cambiar.
  19349. Esta es la forma de poder observar o modificar cualquier elemento de una
  19350. tabla o estructura.
  19351.  
  19352. Por último, en la parte inferior de este diálogo aparecen una serie de
  19353. botones que permiten visualizar el valor de un dato de una forma concreta,
  19354. estos son:
  19355.  
  19356. * {Angulo}. Este botón permite visualizar el dato como un ángulo. Los ángulos
  19357. se especifican internamente (en los programas) en milésimas de grado. El
  19358. valor del dato se visualizará como un ángulo en grados y radianes.
  19359.  
  19360. * {Proceso}. Si el dato es el {código identificador} de un proceso, al
  19361. seleccionar este filtro de visualización, aparecerá en la lista el nombre de
  19362. dicho proceso como valor del dato.
  19363.  
  19364. * {Texto}. Cuando el dato sea un texto, o un puntero a un texto (a un literal
  19365. del programa), pulsando este botón se mostrará en la lista dicho texto.
  19366.  
  19367. * {Lógico}. Si un dato contiene un valor lógico, al aplicarle este filtro se
  19368. mostrará en la lista superior si éste es falso ({false}) o cierto ({true}).
  19369. En el lenguaje, al evaluarlos como condiciones lógicas se consideran ciertos,
  19370. los números impares y falsos, los pares.
  19371.  
  19372. Una vez establecido el filtro de visualización de un dato, éste permanecerá
  19373. durante el resto de la ejecución del programa. Se debe pulsar dos veces el
  19374. mismo botón para volver a visualizar el contenido del dato como un valor
  19375. numérico.{-}
  19376.  
  19377. # ─────────────────────────────────────────────────────────────────────────────
  19378.  
  19379. {.1261,Ayuda sobre el editor gráfico.}
  19380.  
  19381. Ver: {#3,Indice general}{/}
  19382.  
  19383.   {#1262,Conceptos generales}·
  19384.   {#1263,Paletas de colores}·
  19385.   {#1264,Color transparente}·
  19386.   {#1265,Controles básicos}·
  19387.   {#1266,Iconos genéricos}·
  19388.   {#1267,Gamas de colores}·
  19389.   {#1268,Utilización de máscaras de color}·
  19390.  
  19391.   {#1270,Barras de punteado y lápiz}·
  19392.   {#1271,Barras para líneas y multilíneas}·
  19393.   {#1272,Barras para curvas y multicurvas}·
  19394.   {#1273,Barras de rectángulos y círculos}·
  19395.   {#1274,Barra de spray}·
  19396.   {#1275,Barra de relleno}·
  19397.   {#1276,Barra de edición de bloques}·
  19398.   {#1277,Barra de deshacer}·
  19399.   {#1278,Barra de texto}·
  19400.   {#1279,Barra de puntos de control}·
  19401.  
  19402.   {#1280,Edición de animaciones}·
  19403.   {#1281,Trucos y técnicas avanzadas de dibujo}·
  19404.  
  19405. # ─────────────────────────────────────────────────────────────────────────────
  19406.  
  19407. {.1262,Conceptos generales}
  19408. Ver: {#3,Indice} - {#1261,Ayuda sobre el editor gráfico} {/}
  19409.  
  19410. El editor gráfico es la herramienta para dibujar los gráficos de los juegos.
  19411. Con el ratón y los colores de una paleta se puede crear cualquier dibujo con
  19412. un poco de habilidad. Dibujar en un ordenador es bastante diferente a dibujar
  19413. en un papel; se requiere menos pulso y habilidad pero un poco más de
  19414. paciencia.
  19415.  
  19416. El editor únicamente trabaja con las ventanas de mapas (las que contiene
  19417. cualquier tipo de gráfico), y la manera más fácil de entrar en él es
  19418. realizando una doble pulsación con el botón izquierdo del ratón sobre un
  19419. mapa del escritorio. Una vez en el editor se ampliará el dibujo, cambiará el
  19420. puntero del ratón y aparecerá una barra de herramientas horizontal con varios
  19421. iconos y colores. Se puede salir del editor de varias formas: cerrando la
  19422. barra de herramientas, pulsando la tecla {ESC} o con el botón derecho del
  19423. ratón.
  19424.  
  19425. Este editor gráfico es una herramienta bastante completa, no obstante no
  19426. puede sustituir a muchos de los programas comerciales que han sido diseñados
  19427. específicamente para la creación de gráficos. Por ello, se permite importar
  19428. mapas en formato {PCX} o {BMP} (unos formatos ampliamente difundidos entre
  19429. las utilidades gráficas) para, de esta forma permitir, a quienes quieren
  19430. utilizar otras herramientas para crear los gráficos, utilizar en DIV Games
  19431. Studio las imágenes creadas con otros programas.
  19432.  
  19433. Aún así, se recomienda la lectura de la ayuda dedicada al editor
  19434. gráfico, ya que muchas operaciones resultarán más sencillas y se harán más
  19435. rápido desde DIV Games Studio que desde otros programas.
  19436.  
  19437. Si usted no dispone de otros programas para la creación de imágenes, no se
  19438. preocupe, ya que el editor gráfico de DIV reúne gran cantidad de potentes
  19439. herramientas de dibujo, muchas de las cuales superan en prestaciones a las
  19440. que ofrecen los programas específicos de dibujo, por lo que no será necesario
  19441. utilizar ningún otro programa para crear las imágenes y gráficos de los
  19442. juegos.
  19443.  
  19444. Antes de acceder a esta página, que describe los conceptos y términos de
  19445. dibujo básicos, se debe conocer el manejo de mapas y ficheros de mapas
  19446. descrito en el {#1254,menú de mapas} y el {#1255,menú de ficheros}.
  19447.  
  19448. Por ejemplo, para realizar las primeras pruebas cargue la paleta de colores
  19449. por defecto ({paletas \ abrir...} indicando el archivo {div.pal}) y cree un
  19450. mapa nuevo ({mapas \ nuevo...}) de cualquier tamaño en puntos, como pudiera
  19451. ser {200x200}, y acceda al editor con una doble pulsación sobre este mapa.
  19452.  
  19453. {/}
  19454.  
  19455. {Un paseo rápido por el editor}
  19456.  
  19457. {+101,0}La barra de herramientas tiene una pequeña barra de título a la izquierda con
  19458. la que se puede arrastrar la misma a cualquier posición de pantalla, para que
  19459. no tape la zona del dibujo sobre la que se trabaja.
  19460.  
  19461. Como primer icono aparece uno con tres puntos (esta es la barra de punteado);
  19462. pulse sobre este icono para que se abra un diálogo que muestra los diferentes
  19463. iconos de los modos disponibles. Seleccione el icono superior derecho de este
  19464. cuadro para utilizar la barra del lápiz.
  19465.  
  19466. El dibujo aparecerá en negro; para comenzar a pintar debe seleccionar un color
  19467. primero, puede hacerlo en la gama (en este momento de grises) de la barra, o
  19468. cualquier color de la paleta si pulsa la tecla {C} (color) para que aparezca
  19469. el diálogo de selección de color. En este cuadro puede seleccionar un color
  19470. de la paleta principal o, si pulsa en la parte derecha, seleccionar la gama
  19471. que debe aparecer en la barra de herramientas.
  19472.  
  19473. A la derecha del icono del lápiz aparecen las coordenadas del puntero sobre
  19474. el dibujo y, a continuación, un icono con una lupa para variar el nivel de
  19475. ampliación del mismo; esto también se puede hacer pulsando la tecla {Z}
  19476. (zoom).
  19477.  
  19478. Puede probar otros iconos y barras de herramientas; cuando haya dibujado algo
  19479. utilice la tecla {Backspace} (la tecla de borrado sobre {Enter}) para
  19480. retroceder en la creación del dibujo (deshacer) y después
  19481. {Mayúsculas+Backspace} para ir hacia adelante (rehacer).{-}
  19482.  
  19483. # ─────────────────────────────────────────────────────────────────────────────
  19484.  
  19485. {.1263,Paletas de colores}
  19486. Ver: {#3,Indice} - {#1261,Ayuda sobre el editor gráfico} {/}
  19487.  
  19488. La paleta de colores es la base de todo dibujo, pero en los juegos sólo se
  19489. podrán visualizar en pantalla {256 colores diferentes} de forma simultánea.
  19490. Estos colores son los que se eligen primero con la paleta de colores. Es muy
  19491. importante saber que todos los dibujos que se vayan a utilizar a la vez en un
  19492. juego deben haberse creado con la misma paleta de colores. Los juegos pueden
  19493. utilizar varias paletas, pero en cada momento {sólo puede haber una activa},
  19494. por ello sólo se verán correctamente en ese momento los gráficos que utilicen
  19495. la paleta que está activa.
  19496.  
  19497. También existe la posibilidad de {adaptar} un gráfico que haya sido creado
  19498. con una paleta de colores a otra. El sistema buscará para cada punto del
  19499. gráfico original el color más parecido en la nueva paleta y lo sustituirá,
  19500. pero debido a que en ocasiones no se encuentran colores parecidos, los
  19501. dibujos suelen perder calidad cuando son adaptados a otra paleta.
  19502.  
  19503. En el entorno DIV siempre hay también una única paleta activa; todos los
  19504. mapas del escritorio deben utilizar esta paleta. Por ello, cuando se intenta
  19505. abrir un mapa (o fichero de mapas) que utiliza una paleta diferente el
  19506. sistema pregunta primero si se debe activar la nueva paleta.
  19507.  
  19508. {+103,0}{Importante}: Si tiene información sin guardar en los mapas cargados,
  19509. responda {Cancelar} (no activar la nueva paleta, lo que podría dañar los
  19510. mapas cargados), cierre el mapa (o fichero) recién cargado, guarde todos los
  19511. mapas cargados en sus respectivos archivos, ciérrelos y entonces vuelva a
  19512. abrir el nuevo mapa.
  19513.  
  19514. Si responde {Aceptar} y se activa la nueva paleta, el sistema preguntará
  19515. entonces si desea adaptar los mapas anteriormente cargados a la nueva paleta;
  19516. si no quiere hacerlo, cierre después los mapas cargados, sin guardarlos
  19517. previamente (pues se guardarían incorrectamente, con una paleta de colores
  19518. que no es la suya). En resumen:
  19519.  
  19520. * Para {adaptar el mapa abierto a la paleta activa en el entorno} responda
  19521. {Cancelar} a activar la nueva paleta. Si no queda satisfecho con la
  19522. adaptación realizada, cierre el nuevo mapa sin guardarlo.
  19523.  
  19524. * Para {adaptar los mapas cargados a la paleta del mapa abierto}, responda
  19525. {Aceptar} a activar la nueva paleta y {Aceptar} a adaptar los mapas cargados.
  19526. Si no queda satisfecho con la adaptación realizada, cierre los mapas
  19527. anteriores sin guardarlos.
  19528.  
  19529. * Para {no adaptar ningún mapa a otra paleta}, guarde y cierre primero los
  19530. mapas cargados en el escritorio y después abra el nuevo respondiendo
  19531. {Aceptar} a activar la nueva paleta.
  19532.  
  19533. Cada vez que inicie un proyecto, debe decidir qué paleta de colores va a
  19534. utilizar para el mismo. Si le es indiferente, entonces use la paleta por
  19535. defecto de DIV Games Studio ({div.pal}), en caso contrario debe utilizar el
  19536. editor de paletas ({paletas \ editar paleta...}). Tras crear una nueva paleta
  19537. es conveniente guardarla en un archivo del disco, por si después se modifica
  19538. o cambia la misma accidentalmente, poder recuperarla del mismo.
  19539.  
  19540. DIV Games Studio viene con una librería con numerosos gráficos preparados
  19541. para crear nuevos juegos, pero debe tener en cuenta que muchos de estos
  19542. gráficos utilizan paletas diferentes, por lo que, para juntarlos en un juego,
  19543. deberá adaptar unos a la paleta de otros. La mejor opción es, una vez
  19544. definida su propia paleta, adaptar los gráficos de la librería a la misma
  19545. (los gráficos que quiera utilizar en el juego).
  19546.  
  19547. La opción {paletas \ fusionar paletas...} permite crear una paleta a partir
  19548. de dos, incluyendo en la paleta resultante los colores más representativos
  19549. de ambas. Esta es una muy buena opción para utilizar gráficos con varias
  19550. paletas, crear una paleta mixta y después adaptar todos los gráficos a la
  19551. misma. También se puede crear una paleta a partir de más de dos,
  19552. fusionándolas por parejas hasta que sólo quede una.
  19553.  
  19554. Ver el {#1253,menú de paletas}, que permite acceder a éstas y otras opciones.
  19555.  
  19556. # ─────────────────────────────────────────────────────────────────────────────
  19557.  
  19558. {.1264,Color transparente}
  19559. Ver: {#3,Indice} - {#1261,Ayuda sobre el editor gráfico} {/}
  19560.  
  19561. Se hablará más adelante muchas veces del {color transparente}; éste es el
  19562. primer color de la paleta. Los colores en la paleta se muestran siempre
  19563. ordenados, en 16 filas, desde la fila superior con los colores del 0
  19564. (izquierda) al 15 (derecha), hasta la inferior con los colores del 240 al
  19565. 255. Luego el color transparente es el superior izquierdo de la paleta.
  19566.  
  19567. Este color es normalmente {negro} y es el color que tienen todos los puntos
  19568. de un mapa al crearse. Esta tonalidad puede modificarse (en el editor de
  19569. paletas), pero no es recomendable hacerlo en un principio.
  19570.  
  19571. La denominación {transparente} viene de que los puntos de los gráficos que se
  19572. pinten (o se dejen de este color) {no aparecerán al pintarse los gráficos en
  19573. el juego}. Es decir, con este color se pintan las zonas que {no son opacas}
  19574. de los gráficos. Sin un color transparente todos los gráficos deberían ser
  19575. cuadrados, como los mapas que los contienen.
  19576.  
  19577. Otras utilidades también denominan a este color como {color de fondo o de
  19578. máscara}.
  19579.  
  19580. En el editor gráfico se puede reconocer el color transparente porque al
  19581. {pulsar la tecla B}, este color pasa de negro a un gris medio. Ésta es una
  19582. operación que se realiza muchas veces, para poder observar bien los
  19583. contornos de los gráficos (para poder reconocer las zonas transparentes de
  19584. los mismos). Para devolver el color transparente a negro, se debe pulsar la
  19585. tecla {B} otra vez.
  19586.  
  19587. Conviene, por tanto, tener {dos colores negros} en la paleta: primeramente,
  19588. el color 0 que será el transparente, y un segundo color negro (que puede
  19589. situar se en cualquier posición de la paleta) para pintar las zonas de los
  19590. gráficos que deban {ser negras de verdad} y no transparentes. Para pintar con
  19591. este negro se debe resaltar el color transparente con la tecla {B}
  19592. previamente, ya que de lo contrario no se verá nada. Este {negro opaco} es el
  19593. número 240 de la paleta por defecto de DIV (el de la esquina inferior
  19594. derecha).
  19595.  
  19596. Se puede realizar un pequeño experimento para comprobar el efecto del color
  19597. transparente y es el siguiente:
  19598.  
  19599. * Cree un mapa nuevo y pinte algo en él (unos pocos garabatos de colores).
  19600.  
  19601. * Salga del editor y cree una copia de este mapa (arrastre la ventana del
  19602. mapa hasta el tapiz de fondo).
  19603.  
  19604. * Y, por último, arrastre la copia que se ha creado (la nueva ventana de
  19605. mapa) al mapa original.
  19606.  
  19607. Se entrará en el editor para copiar el gráfico sobre sí mismo. Al moverlo
  19608. con el ratón se podrá observar cómo las zonas que se dejaron en color
  19609. transparente no aparecen ahora. Se puede obligar al programa de dibujo que
  19610. pinte las zonas de color transparente con su negro original, seleccionando el
  19611. icono que tiene el dibujo de un hombrecillo en la barra de herramientas.
  19612.  
  19613. En los juegos, el color transparente no se pintará nunca, por lo que se debe
  19614. pintar con el color {negro opaco} cuando se quieran mostrar partes de un
  19615. gráfico negras.
  19616.  
  19617.  
  19618. # ─────────────────────────────────────────────────────────────────────────────
  19619.  
  19620. {.1265,Controles básicos}
  19621. Ver: {#3,Indice} - {#1261,Ayuda sobre el editor gráfico} {/}
  19622.  
  19623. Casi todas las barras de herramientas disponen de una serie de comandos
  19624. comunes; a continuación se describen éstos y el funcionamiento general del
  19625. programa de dibujo.
  19626.  
  19627. El control se realiza básicamente con el ratón pero en la zona de dibujo,
  19628. cuando se requiera {precisión} en los movimientos, se puede mover el puntero
  19629. también con los {cursores} o las siguientes teclas:
  19630.  
  19631. {Q, A} Mover puntero arriba / abajo.
  19632. {O, P} Mover puntero izquierda / derecha.
  19633.  
  19634. La {barra espaciadora} puede hacer también las veces del botón izquierdo del
  19635. ratón, cuando se controle el puntero con el teclado, es decir que en la
  19636. mayoría de barras esta tecla permitirá pintar con el color seleccionado.
  19637.  
  19638. El control con teclado se realiza de un punto en un punto; para moverse más
  19639. deprisa se debe pulsar simultáneamente la tecla {Mayúsculas}. Si se tiene
  19640. activada la tecla {Bloq. Num}. del teclado numérico, los cursores moverán el
  19641. puntero de 8 en 8 puntos. Para moverlo de uno en uno se debe desactivar esta
  19642. tecla.
  19643.  
  19644. En la mayoría de barras se puede {tomar un color del dibujo} si se mantiene
  19645. pulsada la tecla {Mayúsculas} mientras se pulsa la {barra espaciadora} o el
  19646. {botón izquierdo del ratón} sobre un punto del mapa editado.
  19647.  
  19648. Para elegir un color, además del ratón, pueden utilizarse las teclas {W / S}
  19649. para elegir un color más claro o más oscuro de la gama seleccionada; si,
  19650. además, se mantiene pulsada la tecla {Mayúsculas}, se elegirá la gama que
  19651. aparece en la barra, en lugar del color. Estas acciones también pueden
  19652. realizarse si se mantiene pulsado {Control} mientras se utilizan los
  19653. {cursores}, seleccionando con {izquierda} o {derecha} el color de la gama y
  19654. con {arriba} o {abajo} la gama.
  19655.  
  19656. Para seleccionar momentáneamente el {color transparente} se puede pulsar la
  19657. tecla {0} (cero); si después se vuelve a pulsar se retornará al color
  19658. anterior. Esto también se puede hacer pulsando con el ratón sobre el
  19659. rectángulo negro situado justo antes de la gama de colores de la barra (a su
  19660. izquierda).
  19661.  
  19662. Para deshacer acciones ya se mencionó anteriormente la tecla {Backspace}, y
  19663. junto con {Mayúsculas} para rehacer nuevamente las acciones deshechas. El
  19664. {icono de deshacer} aparece como una flecha hacia la izquierda a continuación
  19665. del icono de la lupa (la ampliación o zoom de edición).
  19666.  
  19667. También se comentó el uso de la tecla {Z} para cambiar el nivel de ampliación
  19668. (se debe {apuntar con el ratón la zona a ampliar} cuando se pulse esta
  19669. tecla). Cuando los mapas se editen ampliados, muchas veces no cogerán en
  19670. pantalla; para moverse por el mapa completo simplemente se tiene {que
  19671. desplazar el ratón hacia fuera de la pantalla}.
  19672.  
  19673. Se puede {bloquear el desplazamiento} de pantalla pulsando sobre las
  19674. coordenadas de la barra de herramientas; éstas cambiarán su color {gris
  19675. claro} por un {gris oscuro}, bloqueando el desplazamiento de la zona
  19676. ampliada. Se debe pulsar en las coordenadas nuevamente para desbloquear el
  19677. desplazamiento.
  19678.  
  19679. Se puede salir de los cuadros de diálogo que se despliegan a partir de las
  19680. barras de herramientas de múltiples formas:
  19681.  
  19682. * Cerrando el cuadro (con el botón superior izquierdo del mismo).
  19683.  
  19684. * Pulsando la tecla {ESC}.
  19685.  
  19686. * Pulsando el botón izquierdo del ratón.
  19687.  
  19688. * Seleccionando nuevamente el icono que lo activó.
  19689.  
  19690. * Pulsando con el ratón sobre el mapa editado.
  19691.  
  19692. Un resumen con todas las teclas disponibles en el {editor gráfico} se puede
  19693. encontrar en "{#1295,Comandos del editor gráfico}".
  19694.  
  19695. # ─────────────────────────────────────────────────────────────────────────────
  19696.  
  19697. {.1266,Iconos genéricos}
  19698. Ver: {#3,Indice} - {#1261,Ayuda sobre el editor gráfico} {/}
  19699.  
  19700. {+102,0}El primer icono de todas las barras de herramientas es, como se mencionó
  19701. antes, el que indica la modalidad de dibujo. Cada barra se corresponde con
  19702. un modo de dibujo y, por lo tanto, tiene su propio icono inicial. Las barras
  19703. también se describen individualmente en esta ayuda. Para acceder a estas
  19704. barras, además de pulsar sobre el primer icono, se pueden utilizar las {teclas
  19705. de función}; a continuación se muestra la lista de teclas y un resumen de la
  19706. función de las barras de herramientas.{-}
  19707.  
  19708. * {F2}: {Lápiz}, para el trazo a mano alzada de bocetos y contornos.
  19709.  
  19710. * {F3}: {Líneas rectas}, para crear esquemas y figuras geométricas.
  19711.  
  19712. * {F4}: {Multilínea}, variación de la barra anterior para líneas encadenadas.
  19713.  
  19714. * {F5}: {Curvas bézier}, para el trazado de contornos y líneas curvas.
  19715.  
  19716. * {F6}: {Multicurva}, variación de la barra anterior para curvas encadenadas.
  19717.  
  19718. * {F7}: {Rectángulos}, para crear cajas o marcos cuadrados o rectángulares.
  19719.  
  19720. * {F8}: {Círculos}, para crear circunferencias, círculos o elipses.
  19721.  
  19722. * {F9}: {Spray}, herramienta para el retoque y el acabado artístico.
  19723.  
  19724. * {F10}: {Relleno}, para el relleno de varios tipos de superficies.
  19725.  
  19726. * {F11}: {Edición de bloques}, herramienta para la gestión de bloques
  19727. gráficos.
  19728.  
  19729. * {F12}: {Deshacer}, barra específica para hacer y deshacer acciones.
  19730.  
  19731. * {Mayúsculas+F1}: {Texto}, para escribir textos dentro de los mapas
  19732. editados.
  19733.  
  19734. * {Mayúsculas+F2}:  Barra para situar {Puntos de control} dentro de los
  19735. mapas.
  19736.  
  19737. * {Mayúsculas+F3}: Barra de {Punteado}, para edición precisa de gráficos
  19738. pequeños.
  19739.  
  19740. Otro de los iconos común a muchas de las barras es el {Cuentagotas} que
  19741. aparece normalmente después de la gama de colores y al pulsarlo, lleva
  19742. momentáneamente a otra pequeña barra utilizada para seleccionar un color del
  19743. mapa.
  19744.  
  19745. {+104,0}En la barra del cuentagotas se muestran las coordenadas, la lupa y el color
  19746. sobre el que se sitúa el puntero del ratón en el mapa. Cuando se pulse en el
  19747. mapa se tomará este color para dibujar, retornando automáticamente a la barra
  19748. anterior.
  19749.  
  19750. Se recuerda que para coger un color del mapa también se puede pulsar sobre el
  19751. mismo manteniendo pulsada la tecla {Mayúsculas} al mismo tiempo.{-}
  19752.  
  19753. Una gran parte de las barras muestran, tras del cuentagotas, el icono de
  19754. {porcentaje}; mediante este icono se controla la {cantidad de tinta} que se
  19755. añade al dibujo al pintar.
  19756.  
  19757. {+105,0}Al pulsar este icono aparecerá un cuadro de diálogo con una regla; se debe
  19758. pulsar sobre la misma para establecer el porcentaje. Un porcentaje de 100%
  19759. (el valor por defecto de la mayoría de barras) implicará que se pinte con
  19760. colores completamente sólidos, es decir, que no se mezclarán con el dibujo
  19761. anterior.
  19762.  
  19763. Se pueden obtener muy buenos resultados si se aprende a utilizar debidamente
  19764. esta técnica, ya que permite retocar, por ejemplo con la barra del lápiz, una
  19765. parte de un gráfico {añadiendo} un poco de un color. También resulta útil
  19766. pintar con un porcentaje bajo de color {negro} para oscurecer poco a poco
  19767. partes del dibujo, o con color {blanco} para aclararlas.{-}
  19768.  
  19769. Los iconos que pueden aparecer a continuación de estos dos en las distintas
  19770. barras de herramientas son normalmente {iconos de modo}, que ofrecen varias
  19771. modalidades de utilización de la herramienta. Generalmente, se despliega al
  19772. utilizarlos un nuevo diálogo con nuevos iconos, cada uno de ellos
  19773. representando una modalidad de utilización de la herramienta diferente.
  19774.  
  19775. Cuando aparezcan en la parte derecha de una barra unas {segundas
  19776. coordenadas}, éstas indicarán normalmente el ancho y alto del objeto que se
  19777. está dibujando con la herramienta, para poder realizar de esta forma
  19778. mediciones precisas.
  19779.  
  19780. # ─────────────────────────────────────────────────────────────────────────────
  19781.  
  19782. {.1267,Gamas de colores}
  19783. Ver: {#3,Indice} - {#1261,Ayuda sobre el editor gráfico} {/}
  19784.  
  19785. Para acceder al cuadro de diálogo de {Creación y selección de gamas de
  19786. colores} que se describe a continuación, se debe pulsar la tecla {C} o con el
  19787. {botón izquierdo} del ratón sobre el color seleccionado en la barra (es el
  19788. rectángulo situado justo después del icono de deshacer y antes del rectángulo
  19789. del color transparente). Una {gama de colores} es simplemente una secuencia
  19790. de colores de la paleta que se utiliza para dibujar en diversos tonos de un
  19791. color (una secuencia de grises, de rojos, etc.).
  19792.  
  19793. {+106,1}{-}
  19794. Aparecerá un cuadro bastante grande con muchos colores. Para retornar al
  19795. dibujo se puede pulsar {C} de nuevo, o pulsar sobre el color seleccionado
  19796. otra vez. Este cuadro se divide en tres grandes zonas: la paleta de colores
  19797. (superior izquierda), el editor de gamas (inferior) y la lista de gamas de
  19798. colores (superior derecha).
  19799.  
  19800. {/}
  19801.  
  19802. {La paleta de colores}
  19803.  
  19804. Esta sección se utiliza simplemente para seleccionar colores de la paleta,
  19805. pulsando con el ratón sobre la misma. A la derecha aparece información sobre
  19806. el color seleccionado o sobre el color donde se sitúe el ratón, si éste está
  19807. dentro de la paleta.
  19808.  
  19809. La información es el número de color en decimal, en hexadecimal, una muestra
  19810. del color y los niveles de rojo (red), verde (green.) y azul (blue) que
  19811. componen el color.
  19812.  
  19813. Desde este cuadro {no se puede modificar la paleta}, ya que esto sólo puede
  19814. hacerse desde el menú de paletas, fuera del editor gráfico.
  19815.  
  19816. {/}
  19817.  
  19818. {El editor de gamas}
  19819.  
  19820. Se pueden definir hasta 16 gamas de color diferentes para una paleta. La
  19821. gama seleccionada es la que aparece en la barra de herramientas y es la que
  19822. se puede editar con esta herramienta.
  19823.  
  19824. {Nota}: El editor de gamas {no modifica los colores} de la paleta, sino que
  19825. sólo los {reordena} para formar con ellos secuencias de colores útiles para
  19826. dibujar.
  19827.  
  19828. A la izquierda aparece una reproducción exacta de la gama que se encuentra en
  19829. la barra de herramientas y a la derecha tres botones rectangulares que
  19830. cambian de valor cuando se pulsan; éstas son sus funciones:
  19831.  
  19832. * El primero (arriba izquierda) define el número de colores que tiene la
  19833. gama, que puede conmutarse entre {8}, {16} o {32} colores.
  19834.  
  19835. * El segundo (arriba derecha) define si la gama es {editable} o {fija}, es
  19836. decir, si se va a modificar la gama o se quiere dejar tal como está. Cuando
  19837. la gama es {editable} aparece en la misma uno o varios pequeños {iconos con
  19838. una flecha gris hacia arriba}; éstos son los utilizados para establecer los
  19839. colores de la gama.
  19840.  
  19841. * El último botón (abajo) define el modo en el que se quiere definir la gama.
  19842. Los modos disponibles son los siguientes:
  19843.  
  19844. + Directa de la paleta. En este modo se define el primer color de la gama,
  19845. mientras que el resto se toman secuencialmente de la paleta.
  19846.  
  19847. + Editable cada color. En este modo se pueden definir individualmente cada
  19848. uno de los colores de la gama, seleccionándolos de la paleta y asignándolos
  19849. después a cada posición de la gama.
  19850.  
  19851. + Editable cada dos colores. Este modo es similar al anterior sólo que se
  19852. podrá definir únicamente uno de cada dos colores. Los colores intermedios los
  19853. definirá el sistema con el color de la paleta más cercano a la media de sus
  19854. dos colores adyacentes.
  19855.  
  19856. + Editable cada cuatro o cada ocho colores. Estos dos últimos modos son
  19857. prácticamente idénticos al anterior, sólo que definiendo aún menos colores.
  19858. Su utilidad consiste en que el sistema busque las gamas intermedias entre
  19859. cada dos colores definidos automáticamente.
  19860.  
  19861. Una vez definida una gama conviene hacerla {fija} para no correr el riesgo de
  19862. perderla accidentalmente. Cuando se guarda la paleta en un archivo, también
  19863. se guarda en él la información sobre las gamas de color utilizadas en la
  19864. misma.
  19865.  
  19866. {/}
  19867.  
  19868. {La lista de gamas de colores}
  19869.  
  19870. En la parte superior derecha del cuadro de diálogo aparecen las 16 gamas de
  19871. colores que pueden definirse. La utilidad de esta lista consiste en poder
  19872. seleccionar directamente la gama de color que interese en cada momento para
  19873. dibujar.
  19874.  
  19875. Se puede observar que una pequeña flecha blanca indica cuál es la gama de
  19876. colores seleccionada; ésta es también la que aparece en el editor de gamas y
  19877. la barra de herramientas.
  19878.  
  19879. A continuación de cada gama se muestran tres valores que resumen sus
  19880. características: {número de colores}, {modo de definición}, y si es
  19881. {Editable} o {Fija}.
  19882.  
  19883.  
  19884. # ─────────────────────────────────────────────────────────────────────────────
  19885.  
  19886. {.1268,Utilización de máscaras de color}
  19887. Ver: {#3,Indice} - {#1261,Ayuda sobre el editor gráfico} {/}
  19888.  
  19889. La utilización de máscaras de color es una técnica avanzada. Sirve para
  19890. proteger partes del dibujo que no deben modificarse, lo que se puede hacer
  19891. seleccionando un conjunto de colores de la paleta sobre los que no se podrá
  19892. pintar.
  19893.  
  19894. Por ejemplo, si en un mapa en su mayoría con fondo negro y con un dibujo en
  19895. el centro se define como máscara el color negro, entonces se protegerá el
  19896. color negro de forma que no se pueda pintar sobre él. Por lo tanto, se podrá
  19897. pintar posteriormente en el gráfico sin salirse, ya que las herramientas de
  19898. dibujo no pintarán fuera del gráfico.
  19899.  
  19900. Para acceder al diálogo de definición de máscaras se debe pulsar la tecla {M}
  19901. o con el {botón derecho} del ratón sobre el color seleccionado de la regla
  19902. (como para activar el diálogo de gamas de colores, pero con el otro botón del
  19903. ratón).
  19904.  
  19905. {+107,1}{-}
  19906. Aparecerá un diálogo con todos los colores de la paleta y dos botones en su
  19907. parte inferior. Pulsando con el botón izquierdo del ratón sobre la paleta se
  19908. podrán seleccionar y deseleccionar los colores que se quieran enmascarar.
  19909. Cuando aparezca un pequeño cuadrado en el centro de un color, querrá decir
  19910. que no se puede pintar en el mapa sobre dicho color. Si se seleccionan todos
  19911. los colores, no se podrá pintar con ninguna herramienta en el mapa.
  19912.  
  19913. También se pueden seleccionar (enmascarar) colores pulsando con el ratón
  19914. {sobre el mapa} editado (mientras está el diálogo de máscaras abierto).
  19915.  
  19916. Los dos botones de la parte inferior de este diálogo cumplen la siguiente
  19917. función:
  19918.  
  19919. {Invertir}. Se utiliza para invertir el estado de selección de todos los
  19920. colores de la paleta. Si, por ejemplo, se quiere pintar sólo sobre un color,
  19921. será más fácil seleccionar ese color y después invertir las selecciones
  19922. pulsando este botón que seleccionar todos los demás uno a uno.
  19923.  
  19924. {Borrar}. Se utiliza para quitar las máscaras definidas, es decir, para
  19925. deseleccionar todos los colores en este diálogo.
  19926.  
  19927. {Nota} : Es bastante común, tras enmascarar algunos colores, olvidarse de ello
  19928. y más adelante ver que el programa de dibujo no está funcionando
  19929. correctamente. Es porque se deben quitar las máscaras primero (lo que se
  19930. puede hacer pulsando la tecla {M} y después el botón {Borrar} del diálogo).
  19931.  
  19932. {/}
  19933.  
  19934. {Un ejemplo práctico}
  19935.  
  19936. * Cree un mapa nuevo ({mapas \ nuevo...}), entre en el editor (con una doble
  19937. pulsación sobre el mapa), seleccione la herramienta del Spray (que se accede
  19938. pulsando {F9}), y pinte algo utilizando varios colores en el centro del mapa.
  19939.  
  19940. * Acceda al diálogo de máscaras pulsando {M} y seleccione el {color
  19941. transparente} para enmascararlo (el primer color de la paleta, arriba a la
  19942. izquierda).
  19943.  
  19944. * Salga del editor pulsando {ESC} y cree una copia del mapa arrastrándolo
  19945. hacia el tapiz de fondo.
  19946.  
  19947. * Arrastre la copia recién creada hasta la ventana con el mapa original, para
  19948. copiar el gráfico sobre sí mismo.
  19949.  
  19950. Si realiza estos pasos observará cómo, al mover el gráfico, no se imprime el
  19951. mismo sobre el fondo negro, ya que se ha enmascarado este color para que no
  19952. se pueda modificar. No se olvide quitar la máscara para poder seguir
  19953. dibujando normalmente.
  19954.  
  19955. # ─────────────────────────────────────────────────────────────────────────────
  19956.  
  19957. {.1270,Barras de punteado y lápiz}
  19958. Ver: {#3,Indice} - {#1261,Ayuda sobre el editor gráfico} {/}
  19959.  
  19960. Éstas son las dos barras de dibujo básicas para iniciar los dibujos o definir
  19961. los detalles pequeños.
  19962.  
  19963. {+108,0}La {barra de punteado} se utiliza para poner y quitar puntos en un mapa. Se
  19964. entiende por {quitar} puntos, ponerlos nuevamente en color transparente. Este
  19965. modo se suele utilizar para crear de forma precisa detalles muy pequeños de
  19966. los gráficos.
  19967.  
  19968. Se utiliza normalmente controlando el puntero con las teclas (usando uno de
  19969. los dos juegos de teclas: {cursores} o {QA,OP}), utilizando el teclado
  19970. también para seleccionar los colores (con {control} y los {cursores}, o con
  19971. {W,S} si se utiliza el segundo juego de teclas) y para poner y quitar los
  19972. puntos ({barra espaciadora}). También se suele emplear la combinación
  19973. {Mayúsculas+Barra espaciadora} para tomar un color de propio dibujo.
  19974.  
  19975. Esta forma de dibujar punto a punto permite crear gráficos con gran
  19976. definición (y paciencia). Para ello, se utiliza la barra de punteado y no la
  19977. de lápiz precisamente por la facilidad que ofrece de quitar un punto,
  19978. volviendo a pulsar en la misma posición una segunda vez, cuando se ha puesto
  19979. éste incorrectamente o por equivocación.{-}
  19980.  
  19981. {+109,0}La {barra de lápiz} es bastante menos tortuosa y se suele utilizar ya con el
  19982. ratón. Es la herramienta de dibujo básica por excelencia, y la utilizada para
  19983. iniciar la mayoría de dibujos o bocetos. Se conseguirán mejores resultados si
  19984. se trabaja en un nivel de ampliación bastante alto, ya que, de esta forma,
  19985. resulta más fácil prestar atención a los detalles.
  19986.  
  19987. No existe la posibilidad de variar el grosor del trazo, siendo éste siempre
  19988. de un punto. Los grosores mayores de trazo de otras herramientas no suelen
  19989. servir más que para hacer garabatos en lugar de dibujos, creando malos
  19990. hábitos de dibujar rápido y mal.{-}
  19991.  
  19992. {+110,0}En esta barra aparece ya el icono de {Porcentaje} que permite regular la
  19993. cantidad de tinta. Con un buen nivel de ampliación, el trazo de un punto y un
  19994. porcentaje de tinta bajo se conseguirán fácilmente buenos resultados. El
  19995. {porcentaje} se suele dejar al 100% inicialmente, mientras se define el
  19996. dibujo, utilizando porcentajes menores para el acabado final.{-}
  19997.  
  19998. Existe otra utilidad accesible con la barra de lápiz y es {difuminar}. Esto
  19999. se consigue manteniendo pulsada la tecla {D} mientras se pinta con el lápiz
  20000. sobre el dibujo. En este modo {no se pintará con el color seleccionado} (por
  20001. lo que da igual cual sea éste) si no que se modificarán gradualmente los
  20002. colores del mapa para paliar los cambios bruscos de color y evitar que
  20003. algunos puntos puedan destacar en exceso.
  20004.  
  20005. No debe intentarse comenzar un dibujo con porcentajes de tinta bajos,
  20006. difuminados, sprays, etc.; estos acabados artísticos deben dejarse para el
  20007. final. Para comenzar, se deben definir los contornos y secciones del dibujo
  20008. con trazos sólidos y limpios para, una vez retocados, comenzar con el
  20009. coloreado, brillos, etc.
  20010.  
  20011. Para retocar los contornos hasta que queden bien se deben realizar
  20012. normalmente varias aproximaciones, borrando (pintando con el color de fondo o
  20013. utilizando el {deshacer}) los trazos que hayan salido mal, para poder
  20014. corregirlos a tiempo.
  20015.  
  20016. # ─────────────────────────────────────────────────────────────────────────────
  20017.  
  20018. {.1271,Barras para líneas y multilíneas}
  20019. Ver: {#3,Indice} - {#1261,Ayuda sobre el editor gráfico} {/}
  20020.  
  20021. Estas dos barras permiten dibujar líneas rectas y se utilizan para definir
  20022. las partes más geométricas de los bocetos iniciales o para acabados muy
  20023. puntuales.
  20024.  
  20025. {+111,0}Se debe seleccionar primero el color y, después, realizar dos pulsaciones con
  20026. el ratón en ambos extremos de la línea. Cuando se ha definido el primer
  20027. extremo se verá la línea tal y como va a quedar cuando se defina el segundo;
  20028. para cancelar la operación en este momento, pulse el {botón derecho} del
  20029. ratón. Para cancelar la línea una vez definidos los dos extremos se debe
  20030. utilizar el {icono de deshacer} (o la tecla {Backspace}).
  20031.  
  20032. A la derecha de estas barras aparecen dos valores numéricos que son el {ancho
  20033. de la línea dibujada} (superior) y el {alto} (inferior). Estos valores
  20034. aparecen únicamente cuando se ha definido el primer extremo de la línea, para
  20035. ayudar a realizar mediciones. Para los ajustes precisos se suelen utilizar
  20036. los {cursores} para posicionar los extremos de la línea.
  20037.  
  20038. Estas barras tienen todos los iconos convencionales, entre ellos, el de
  20039. {porcentaje} que en este caso sólo se utiliza para realizar algunos retoques
  20040. concretos.{-}
  20041.  
  20042. {+112,0}La barra de {multilínea} es prácticamente idéntica a la anterior; la única
  20043. diferencia estriba en que permite dibujar varias rectas enlazadas unas a
  20044. otras. Para finalizar la multilínea se debe pulsar el {botón derecho} del
  20045. ratón una vez definido el último extremo.
  20046.  
  20047. Por último, también existe la posibilidad de utilizar el {difuminado} con la
  20048. tecla {D}, que puede utilizarse para varios efectos, por ejemplo, para
  20049. dibujar líneas con antidentado, como se muestra en el siguiente ejercicio
  20050. práctico:
  20051.  
  20052. * Cree un mapa nuevo, entre en el editor, elija la herramienta de líneas (F3)
  20053. y seleccione el color blanco.
  20054.  
  20055. * Dibuje una línea de las coordenadas (10,10) hasta las coordenadas (68,47);
  20056. utilice los cursores para ajustar las coordenadas. Verá como la línea tiene
  20057. un aspecto dentado (se ven mucho los puntos).
  20058.  
  20059. * Ahora dibuje una segunda línea de las coordenadas (10,9) hasta las
  20060. coordenadas (68,46) (un punto más arriba), pero al definir el segundo
  20061. extremo, mantenga pulsada la tecla {D}.
  20062.  
  20063. * Realice la misma operación un punto más abajo de la línea original, verá
  20064. como al crear dos líneas difuminadas por encima y debajo de la original ha
  20065. conseguido disimular el dentado de la misma.{-}
  20066.  
  20067. # ─────────────────────────────────────────────────────────────────────────────
  20068.  
  20069. {.1272,Barras para curvas y multicurvas}
  20070. Ver: {#3,Indice} - {#1261,Ayuda sobre el editor gráfico} {/}
  20071.  
  20072. Las barras de curvas permiten realizar trazos curvos en los bocetos iniciales
  20073. de forma precisa, sin requerir buen pulso para ello (al contrario de cuando
  20074. se realizan con el lápiz).
  20075.  
  20076. {+113,0}La {barra de curvas} se utiliza de forma similar a la de líneas, salvo que
  20077. crea curvas {bézier} en lugar de rectas. Primero, se deben definir los
  20078. extremos inicial y final de la curva, al igual que en las rectas pero,
  20079. después, se deben concretar otros dos puntos más. El primero de ellos
  20080. definirá la pendiente de la curva en el extremo inicial (hacia donde sale la
  20081. curva), pero cuanto más se aleje este punto del extremo inicial, con más
  20082. pendiente partirá la curva de este extremo. El segundo especificará la
  20083. pendiente del extremo final de igual forma. Tras las cuatro pulsaciones del
  20084. botón izquierdo del ratón, la curva quedará definida.{-}
  20085.  
  20086. {+114,0}La {barra de multicurvas} funciona de una forma ligeramente distinta. Resulta
  20087. bastante práctica a la hora de definir contornos curvos en un gráfico. Se
  20088. define una curva compleja por tramos, a base de {esplines}.
  20089.  
  20090. El primer tramo se definirá siempre como una {recta} fijando, como siempre,
  20091. sus extremos inicial y final. Después, se deben ir definiendo diferentes
  20092. puntos a lo largo del recorrido del contorno y el ordenador los irá uniendo
  20093. formando una curva continua automáticamente.
  20094.  
  20095. Es muy importante utilizar las teclas{ +} y{ -} {del teclado numérico} para
  20096. ir variando la {fuerza} con la que la curva sale de cada uno de los puntos
  20097. del recorrido. Es decir, para cada nuevo tramo se debe fijar el punto destino
  20098. y la pendiente inicial del tramo. Si se disminuye al mínimo la fuerza, esta
  20099. herramienta se comportará prácticamente igual que la de multilíneas.
  20100.  
  20101. Estas dos barras de curvas permiten también graduar el {porcentaje} de tinta
  20102. y utilizar el {difuminado} al igual que en las barras anteriores.{-}
  20103.  
  20104. # ─────────────────────────────────────────────────────────────────────────────
  20105.  
  20106. {.1273,Barras de rectángulos y círculos}
  20107. Ver: {#3,Indice} - {#1261,Ayuda sobre el editor gráfico} {/}
  20108.  
  20109. Estas barras permiten dibujar las formas geométricas más básicas. Tienen
  20110. varias aplicaciones, entre ellas, las de utilizarlas como filtros de color.
  20111.  
  20112. {+115,0}La {barra de rectángulos} se utiliza de forma similar a la de líneas,
  20113. seleccionando el color primero, y definiendo las dos esquinas del rectángulo
  20114. con dos pulsaciones del botón izquierdo del ratón sobre el mapa. En la parte
  20115. derecha de la barra aparece el {ancho} y el {alto} en puntos del rectángulo
  20116. que se está definiendo.{-}
  20117.  
  20118. {+117,0}Un nuevo icono, a la izquierda de las dimensiones del rectángulo, permite
  20119. seleccionar dos modos de funcionamiento de esta barra para dibujar
  20120. rectángulos o cajas sólidas (por defecto se dibujarán cajas).
  20121.  
  20122. Para dibujar cuadrados (o cajas cuadradas) se debe mantener pulsada la tecla
  20123. {Control} mientras se define el segundo extremo; de esta forma se forzará a
  20124. que el ancho y alto sean iguales.
  20125.  
  20126. Esta barra permite también establecer el {porcentaje} de tinta. Cuando se
  20127. dibujen cajas sólidas con un porcentaje de tinta menor al 100% sobre un
  20128. dibujo de fondo, se conseguirá el efecto de aplicar un {filtro de color}
  20129. sobre dicho dibujo. Según se está definiendo la caja se puede ir variando el
  20130. porcentaje de tinta (pulsando sobre el icono de porcentaje) hasta conseguir
  20131. el efecto deseado.{-}
  20132.  
  20133. {+116,0}La {barra de círculos} funciona prácticamente igual que la de rectángulos, ya
  20134. que  permite también dibujar círculos (rellenos) o circunferencias (sin
  20135. rellenar), aplicar filtros con el porcentaje, etc.
  20136.  
  20137. Los círculos se definen con {dos radios}, uno horizontal y otro vertical,
  20138. creando una especie de elipses que no son más que círculos achatados. Para
  20139. crear círculos perfectos, con los dos radios iguales, se debe mantener
  20140. pulsada la tecla {Control}, al igual que con los rectángulos.{-}
  20141.  
  20142. {+118,0}El icono selector de modo de los círculos permite, además de elegir entre
  20143. círculos o circunferencias, definirlos de dos modos:
  20144.  
  20145. * De esquina a esquina, definiendo la esquina superior izquierda e inferior
  20146. derecha de la caja que engloba al círculo.
  20147.  
  20148. * Del centro al radio, definiendo el punto central del círculo y después la
  20149. longitud de su radio (o las de sus radios, si no se pulsa {Control}).
  20150.  
  20151. Los iconos selectores de modo de ambas barras aparecen en un pequeño diálogo
  20152. que se despliega de la barra de herramientas, y sus dibujos son
  20153. autoexplicativos.{-}
  20154.  
  20155.  
  20156. # ─────────────────────────────────────────────────────────────────────────────
  20157.  
  20158. {.1274,Barra de spray}
  20159. Ver: {#3,Indice} - {#1261,Ayuda sobre el editor gráfico} {/}
  20160.  
  20161. Esta barra de herramientas permite utilizar el equivalente informático de un
  20162. spray de pintura (un aerosol o difusor) para realizar acabados artísticos e
  20163. irregulares. Es casi tan fácil de utilizar como un spray de verdad, se debe
  20164. seleccionar el color y pulsar con el ratón sobre el mapa a la vez que se
  20165. desplaza el puntero.
  20166.  
  20167. {+119,0}Es {imprescindible} utilizar el icono de {porcentaje} en esta barra para
  20168. regular la cantidad de pintura que suelta el spray. Por defecto, está fijado
  20169. a un 25% de opacidad. Para conseguir acabados precisos es mejor utilizar
  20170. porcentajes muy pequeños (incluso menores que el 25%) para, de esta forma, ir
  20171. retocando poco a poco el dibujo.{-}
  20172.  
  20173. {+120,0}En esta barra aparece un nuevo icono en el extremo derecho que sirve para
  20174. regular el {grosor del trazo} del spray, que ahora sí es necesario. Pulsando
  20175. sobre este icono, se extenderá un nuevo diálogo en el que se muestran los
  20176. grosores disponibles; se debe seleccionar el deseado pulsando con el ratón
  20177. sobre él.
  20178.  
  20179. Como siempre, se conseguirán mejores resultados con un nivel de ampliación
  20180. grande ({x4} o {x8}) con un spray de los pequeños y un porcentaje de tinta
  20181. bajo. También es importante aprender a utilizar las máscaras de color
  20182. (descritas en el punto 3.7) junto al spray para no salirse de las zonas en
  20183. las que se quiere aplicar el efecto.
  20184.  
  20185. El spray tiene varias aplicaciones interesantes, más para el retoque que para
  20186. el dibujo, por ejemplo, utilizar el spray sobre un gráfico mientras se
  20187. mantiene pulsada la tecla {D}, para {difuminar} de forma irregular el
  20188. gráfico.
  20189.  
  20190. Otra utilidad consiste en que sobre gráficos ya dibujados, aplicar {brillos
  20191. irregulares} con el spray, seleccionando el color blanco o el color negro
  20192. (según se quieran luces o sombras) y fijando el porcentaje de tinta al
  20193. mínimo.{-}
  20194.  
  20195. # ─────────────────────────────────────────────────────────────────────────────
  20196.  
  20197. {.1275,Barra de relleno}
  20198. Ver: {#3,Indice} - {#1261,Ayuda sobre el editor gráfico} {/}
  20199.  
  20200. Ésta es una de las barras más útiles del editor gráfico si se aprende a
  20201. utilizar debidamente, lo que requiere un poco de práctica. Tiene una
  20202. apariencia muy similar a las barras anteriores, pero una aplicación muy
  20203. diferente.
  20204.  
  20205. {+121,0}La {barra de relleno} sirve, como su nombre indica, para rellenar de colores
  20206. partes de los dibujos. Tiene cuatro modos distintos de funcionamiento que
  20207. conviene diferenciar; éstos se activan pulsando sobre el icono que está a la
  20208. derecha de la barra y seleccionando el modo de relleno con uno de los iconos
  20209. que aparecen.{-}
  20210.  
  20211. {/}
  20212.  
  20213. {Relleno convencional}
  20214.  
  20215. {+122,0}El primer modo (que se corresponde con el icono seleccionado por defecto) es
  20216. el relleno que tienen la mayoría de herramientas gráficas. Se selecciona un
  20217. color y se pulsa sobre una parte del dibujo; el programa pintará con el color
  20218. seleccionado todos los puntos del dibujo que sean del mismo color que el
  20219. punto sobre el que se ha pulsado y estén {pegados} o {unidos} a él.
  20220.  
  20221. {Ejemplo}: Se puede hacer una prueba en un mapa nuevo, dibujando un contorno
  20222. irregular cerrado con la herramienta del lápiz, seleccionando un color de
  20223. relleno y pulsando dentro del contorno en este modo de relleno. Si el
  20224. contorno está cerrado, se rellenará su interior con el color seleccionado. Se
  20225. puede realizar la misma operación también con el exterior.
  20226.  
  20227. Ésta es la herramienta utilizada para colorear los bocetos. Se debe tener
  20228. cuidado, cuando se vaya a utilizar el relleno, que todas las secciones a
  20229. rellenar estén {cerradas}, pues si existe algún hueco o fisura en su
  20230. contorno, el relleno también {saldrá al exterior} de la sección.{-}
  20231.  
  20232. {/}
  20233.  
  20234. {Relleno por diagonales}
  20235.  
  20236. {+123,0}Este modo es similar al anterior pero con una diferencia importante. Cuando,
  20237. en el relleno convencional, se seleccionan los puntos {unidos} al original
  20238. (al punto donde se inicia el relleno) se consideran únicamente los puntos
  20239. desde los cuales {se puede llegar al punto original}, sin pasar por un punto
  20240. de otro color, y con movimientos individuales en {línea recta} (pasando de
  20241. cada punto al siguiente por uno de los cuatro laterales).
  20242.  
  20243. Este relleno considera puntos unidos aquellos del mismo color que se unan
  20244. por una {diagonal}, además de los unidos por un {lateral}.
  20245.  
  20246. {Ejemplo}: En un mapa nuevo, dibuje un cuadrado de cualquier color con la
  20247. herramienta de rectángulos (sólo el borde, no una rellena del color). Dibuje
  20248. con el mismo color una circunferencia (tampoco rellena) en el interior del
  20249. cuadrado. Ahora seleccione otro color este modo de relleno y pulse en el
  20250. interior de la circunferencia. Verá como el relleno {se ha escapado} por las
  20251. esquinas de la circunferencia (por las diagonales) pero no del cuadrado (ya
  20252. que del mismo no puede salir ni por un lateral ni por una diagonal de ningún
  20253. punto).
  20254.  
  20255. La utilidad de este relleno consiste en poder cambiar de color gráficos de
  20256. líneas de puntos, ya que éstos consisten en puntos unidos tanto por laterales
  20257. como por diagonales, y el relleno convencional no podría recorrerlos.
  20258.  
  20259. {Ejemplo}: En un mapa nuevo dibuje un garabato (cualquiera) con la
  20260. herramienta del lápiz (en un solo color). Ahora seleccione otro color y, con
  20261. este modo de relleno, pulse sobre un punto del garabato; verá cómo se rellena.
  20262. Puede realizar la prueba con el modo de relleno convencional y comprobará
  20263. como en ese caso únicamente se consigue rellenar uno de los segmentos que
  20264. forman el garabato (ya que el relleno convencional no se escapa por las
  20265. diagonales).{-}
  20266.  
  20267. {/}
  20268.  
  20269. {Relleno hasta un límite}
  20270.  
  20271. {+124,0}El tercer modo de relleno es el más fuerte de todos, aunque que no el más
  20272. útil. En lugar de rellenar un color con otro (como los dos anteriores),
  20273. rellena con un color todos los colores que se encuentre, hasta que se
  20274. encuentre con un borde del mismo color.
  20275.  
  20276. {Ejemplo}: En un mapa con varios dibujos, seleccione un color que no utilicen
  20277. los mismos (un morado, un verde claro, etc.) y, sobre ellos, dibuje con el
  20278. lápiz un contorno cerrado, dejando parte de los dibujos dentro del contorno y
  20279. parte fuera. Finalmente, con el mismo color, seleccione este modo de relleno y
  20280. pulse dentro del contorno. Se rellenará el contorno interior, sin importar
  20281. los dibujos que hubiera dentro.
  20282.  
  20283. Si en una mapa de fondo negro hay dibujados varios gráficos, se elige este
  20284. modo de relleno (con el color negro del fondo seleccionado) y se pulsa en uno
  20285. de los gráficos; éste se borrará. Esto sucede porque el programa ha rellenado
  20286. con el color negro hasta que se ha encontrado un borde del mismo color (el
  20287. exterior del gráfico).{-}
  20288.  
  20289. {/}
  20290.  
  20291. {Relleno con un gradiente}
  20292.  
  20293. {+125,0}Es el modo de relleno más apreciado por todo dibujante y, además, uno de los
  20294. más difíciles de encontrar en otros programas de dibujo. Requiere un poco de
  20295. técnica, pero después se pueden conseguir con él resultados fantásticos.
  20296.  
  20297. En este modo se rellena una sección de un color con un {gradiente} de colores
  20298. de la {gama seleccionada} en la barra de herramientas (ver la ayuda sobre
  20299. las {#1267,gamas de colores} para saber cómo definir y seleccionar estas gamas). {Se utilizarán
  20300. colores más claros o más oscuros de la gama en función de la luminosidad de
  20301. los colores que delimitan la sección rellenada}.
  20302.  
  20303. {Ejemplo}: En un mapa nuevo, seleccione una gama de colores uniforme (por
  20304. ejemplo, cualquiera de las definidas en la paleta por defecto de DIV). Ahora
  20305. dibuje una circunferencia (y no un círculo relleno) con uno de los colores
  20306. más oscuros de la gama de unos 50 por 50 puntos (no muy grande) y, dentro de
  20307. la misma, un pequeño círculo (relleno) con el color más claro de la gama.
  20308. Finalmente, seleccione este modo de relleno (con la gama de colores en la
  20309. barra de herramientas) y pulse entre el círculo y la circunferencia.
  20310.  
  20311. Aparecerá {una nueva barra} de herramientas con dos iconos, una flecha simple
  20312. y otra doble. Debe pulsar uno de estos dos iconos para que se comience a
  20313. realizar el gradiente. La {flecha simple} avanza un paso y la {doble} varios.
  20314. Cuando esté satisfecho con el resultado, pulse el {botón derecho} del ratón
  20315. para volver a la barra de relleno.
  20316.  
  20317. Es recomendable realizar varias pruebas rellenando formas diferentes para
  20318. observar los resultados que se pueden llegar a obtener. Debe tener en cuenta
  20319. que lo que provoca el gradiente es que, en el contorno de la zona rellenada,
  20320. haya colores claros y colores oscuros. En realidad lo que se consigue con
  20321. este modo es rellenar una sección con la media de colores que definen su
  20322. contorno, interpolando su luminosidad.
  20323.  
  20324. El efecto {tardará más cuanto más grande sea la zona} a rellenar, por lo que
  20325. se debe procurar dividir las zonas grandes en varias pequeñas, siempre que
  20326. sea posible.
  20327.  
  20328. No siempre se consiguen mejores resultados cuanto más tiempo se esté
  20329. aplicando el gradiente, sino que muchas veces, al aplicarlo en exceso, se
  20330. acaban apreciando demasiado los contornos de la sección, con lo que el
  20331. resultado empeora.
  20332.  
  20333. No hay muchas reglas fijas para obtener buenos resultados con los gradientes
  20334. aunque, en gran medida, depende de la {uniformidad} y {número de colores de
  20335. la gama} (es mejor utilizar gamas de 32 colores siempre que sea posible) y de
  20336. la sección a rellenar. Es una herramienta bastante "artesanal", por definirla
  20337. de alguna manera, por lo que la práctica resulta imprescindible para llegar a
  20338. dominarla.
  20339.  
  20340. {Nota}: La barra de edición de bloques descrita a continuación también se
  20341. puede utilizar para hacer otros tipos de rellenos de color muy efectivos.{-}
  20342.  
  20343. # ─────────────────────────────────────────────────────────────────────────────
  20344.  
  20345. {.1276,Barra de edición de bloques}
  20346. Ver: {#3,Indice} - {#1261,Ayuda sobre el editor gráfico} {/}
  20347.  
  20348. Ésta es la barra principal del editor gráfico y la más importante de todas.
  20349. Sirve principalmente para seleccionar zonas del dibujo y permite acceder a
  20350. otras barras de herramientas para realizar distintas operaciones con estas
  20351. zonas.
  20352.  
  20353. {+126,0}Es la herramienta gráfica de cortar y pegar pero su funcionalidad no queda
  20354. ahí, sino que permite rotar, escalar, aclarar, suavizar, invertir, etc.
  20355.  
  20356. La primera acción a realizar siempre será {seleccionar la zona} con la que se
  20357. quiere trabajar. Un icono en la parte derecha de la barra con el dibujo de
  20358. {un cuadrado punteado} indica el modo en el que se va a realizar esta
  20359. selección. Pulsando en dicho icono se desplegará un diálogo con seis iconos
  20360. que indican las posibles formas de seleccionar una zona de un gráfico.{-}
  20361.  
  20362. {+144,0}Aprender a seleccionar partes de los mapas de estas seis formas será de gran
  20363. ayuda para conseguir soltura en el manejo del editor gráfico, por lo que se
  20364. describirá a continuación la {forma de seleccionar zonas} en cada uno de estos
  20365. modos. Más adelante se explicarán las operaciones que pueden realizarse con
  20366. estas zonas una vez seleccionadas. Puede probar todos estos modos sobre un
  20367. mapa con algunos dibujos; una vez seleccionada la zona con un modo, pulse la
  20368. tecla {ESC} para poder probar a seleccionar con otro de los modos.
  20369.  
  20370. {/}
  20371.  
  20372. {Selección por caja}
  20373.  
  20374. {+127,0}Esta forma de seleccionar una zona del mapa editado es la más sencilla.
  20375. Consiste en marcar una simple caja (o rectángulo) del mismo; para hacerlo se
  20376. debe pulsar en dos de los extremos de la misma con el botón izquierdo.
  20377.  
  20378. Una vez definida la caja inicial, se podrá ajustar ésta pulsando cerca de sus
  20379. esquinas para situarlas en una nueva posición, o bien pulsando cerca del
  20380. punto central de uno de sus cuatro laterales para ampliar o reducir la caja
  20381. por ese lado.{-}
  20382.  
  20383. {/}
  20384.  
  20385. {Selección por relleno}
  20386.  
  20387. {+128,0}Ésta es una selección muy versátil. Permite seleccionar una zona de un mapa
  20388. seleccionando un conjunto de colores a partir de uno o varios puntos. Se debe
  20389. pulsar sobre la zona a marcar varias veces, o ir desplazando por la misma el
  20390. puntero del ratón con el botón izquierdo del ratón pulsado, hasta seleccionar
  20391. la zona completa.
  20392.  
  20393. Requiere practicarse para poder comprender bien su funcionamiento. Una vez
  20394. marcada la zona del mapa, se pueden seguir añadiendo más colores o zonas.
  20395. Esta selección no es siempre adecuada pero, en muchas ocasiones, permite
  20396. seleccionar zonas complejas rápidamente. Es muy similar a la {varita mágica}
  20397. de otros programas de dibujo, que así es como la denominan.
  20398.  
  20399. Si, por ejemplo, se pulsa con el ratón sobre un punto amarillo, se
  20400. seleccionarán todos los puntos amarillos que estén unidos al original. Si,
  20401. después, se pulsa en un punto rojo, seleccionarán todos los puntos amarillos
  20402. o rojos unidos a los originales (al rojo y amarillo original). Y así
  20403. indefinidamente.{-}
  20404.  
  20405. {/}
  20406.  
  20407. {Selección poligonal}
  20408.  
  20409. {+129,0}La selección poligonal es otras de las más comunes en los programas de
  20410. dibujo. Consiste en marcar la zona dibujando su contorno. Esto se puede hacer
  20411. de dos formas: definiendo varios puntos (pulsando con botón izquierdo el
  20412. ratón) alrededor de la zona que el ordenador unirá con líneas rectas, o bien
  20413. dibujando a pulso el contorno de la misma (moviendo el puntero con el botón
  20414. izquierdo pulsado).
  20415.  
  20416. La selección no se completará hasta que no {se cierre el contorno} por
  20417. completo. Esto se puede hacer también de dos formas: llegando hasta el punto
  20418. inicial del contorno nuevamente, o pulsando el {botón derecho} del ratón (o
  20419. la tecla {ESC}) para que el ordenador una los extremos inicial y final del
  20420. contorno.
  20421.  
  20422. Una vez cerrada la selección poligonal ésta no podrá modificarse, por lo que
  20423. si se ha definido incorrectamente, se debe pulsar otra vez el {botón derecho}
  20424. (o la tecla {ESC}) {para desmarcar la zona} y poder de este modo volver a
  20425. definir la selección.{-}
  20426.  
  20427. {/}
  20428.  
  20429. {Selección por varias cajas}
  20430.  
  20431. {+130,0}Ésta es otra forma rápida de seleccionar partes de un mapa. Se comienza
  20432. definiendo una caja simple, como en el primer modo, pero una vez definida la
  20433. misma, en lugar de poder ajustarla, se podrán definir más cajas. La unión de
  20434. todas las cajas marcadas formará la zona seleccionada.
  20435.  
  20436. Se utiliza para marcar rápidamente dibujos que no pueden marcarse con un caja
  20437. simple porque se incluiría en la misma una parte de otro dibujo que no se
  20438. quiere seleccionar. Por ejemplo, un gráfico en forma de "L" se podría marcar
  20439. fácilmente con dos cajas.{-}
  20440.  
  20441. {/}
  20442.  
  20443. {Selección por caja automática}
  20444.  
  20445. {+131,0}Este modo de selección y el siguiente son los más rápidos de todos. Se pueden
  20446. utilizar únicamente para seleccionar un dibujo dentro de mapa con varios
  20447. separados. Es imprescindible que el fondo principal del mapa sea de {color
  20448. transparente}. Es decir, que los puntos exteriores a los dibujos sean del
  20449. primer color (el 0) de la paleta.
  20450.  
  20451. Si se pulsa sobre cualquier punto de un dibujo del mapa, se seleccionará
  20452. instantáneamente la {mínima caja que lo contiene} (una zona rectangular que
  20453. contenga este gráfico). Los dibujos deben estar lo suficientemente separados
  20454. unos de otros como para que se pueda definir una caja que no "pille" a los
  20455. gráficos adyacentes.
  20456.  
  20457. Si una vez definida la selección se vuelve a pulsar sobre el mismo dibujo,
  20458. {la caja se ampliará un punto} por sus cuatro laterales, es decir, incluirá
  20459. al dibujo con un margen añadido de un punto. Si entonces se vuelve a pulsar
  20460. otra vez, volverá a su tamaño original, o bien se ampliará aún más si ha
  20461. encontrado otra parte del gráfico cerca de la original.
  20462.  
  20463. En cambio, si se pulsa sobre otro dibujo diferente del mapa al inicialmente
  20464. seleccionado, se desmarcará el original y se seleccionará el nuevo gráfico.{-}
  20465.  
  20466. {/}
  20467.  
  20468. {Selección por relleno automático}
  20469.  
  20470. {+132,0}Esta selección es similar a la anterior, pero utilizando técnicas de relleno
  20471. en lugar de cajas. Es como si en la selección por relleno antes comentada
  20472. estuvieran preseleccionados todos los colores menos el transparente, es
  20473. decir, al pulsar sobre un punto del dibujo {se incluirán todos los puntos
  20474. unidos al original que no sean del color transparente}.
  20475.  
  20476. Esta es una herramienta de selección realmente potente, que puede facilitar
  20477. mucho el trabajo con el editor gráfico. Además, una vez definida la selección
  20478. inicial, se pueden seguir añadiendo selecciones a la misma, es decir, que se
  20479. pueden marcar tantos dibujos del mapa original como sea necesario.
  20480.  
  20481. {/}
  20482.  
  20483. {Controles comunes a todos los modos de selección}
  20484.  
  20485. * Todas estas selecciones, una vez definidas, pueden desplazarse por pantalla
  20486. si se mantiene pulsada la tecla Control a la vez que se pulsa con el {botón
  20487. izquierdo del} ratón sobre una posición del mapa editado.
  20488.  
  20489. * Para cancelar cualquier selección (desmarcarla) se debe, simplemente,
  20490. pulsar el {botón derecho} del ratón o la tecla {ESC}. Entonces se devolverá
  20491. la barra de edición a su estado original, pudiendo {volver a definir la
  20492. selección} desde el principio, cambiar el modo de selección, o salir de esta
  20493. barra de herramientas.
  20494.  
  20495. * Según se selecciona una zona se puede consultar siempre el {ancho} y {alto}
  20496. de la misma en el extremo derecho de la barra de edición.
  20497.  
  20498. * Puede resultar útil, según se está definiendo la selección, utilizar la
  20499. tecla {Z} para variar el nivel de ampliación y así poder observar mejor
  20500. cuáles son los puntos que se están incluyendo en la misma.
  20501.  
  20502. {/}
  20503.  
  20504. {Una vez definida la selección}
  20505.  
  20506. En cuanto haya una zona del mapa seleccionada, aparecerán tres nuevos iconos
  20507. en la barra. Éstos son los iconos de {mover}, {efectos} y {cortar a ventana},
  20508. respectivamente, de izquierda a derecha.
  20509.  
  20510. {+133,0}El icono de {cortar a ventana} es el más sencillo de los tres. Al pulsarse
  20511. {se crea una nueva ventana de mapa} en el escritorio {y se pega la zona
  20512. seleccionada} en el mismo. Dentro del editor gráfico únicamente se verá cómo
  20513. {se desmarcará la selección} pero, al salir del mismo, aparecerá la nueva
  20514. ventana de mapa en el entorno.
  20515.  
  20516. Este icono es realmente útil ya que permite una gran flexibilidad en las
  20517. operaciones con bloques gráficos, por ejemplo:
  20518.  
  20519. * {Copiar secciones de unos mapas a otros}. Extrayendo la selección a un
  20520. nuevo mapa y, después, arrastrándolo al mapa en el que se quiere copiar.
  20521.  
  20522. * {Editar gráficos en mapas más grandes}. Los mapas son como escritorios de
  20523. trabajo que deben ser amplios. Por ejemplo, crear un dibujo de 20 por 20
  20524. puntos en un mapa del mismo tamaño permite muy pocas comodidades. Resulta más
  20525. fácil crear este dibujo en un mapa de 200 por 200 puntos que permite tener
  20526. varias copias, texturas y pruebas del mismo para, cuando se finalice el
  20527. dibujo, extraerlo al  mapa de 20 por 20 puntos.
  20528.  
  20529. * {Extraer un gráfico o textura de un mapa}. Se suelen utilizar los mapas
  20530. para crear muchos dibujos, no sólo uno. Finalmente, para incluir estos
  20531. gráficos en el juego, se seleccionarán, se cortarán, a mapas individuales y
  20532. se meterán en un {fichero FPG} que pueda ser cargado en el juego.
  20533.  
  20534. Si se pulsa el icono de {mover} o el de {efectos}, se accederá a nuevas
  20535. barras de herramientas, para mover y copiar la zona seleccionada o para
  20536. aplicarle efectos gráficos. A continuación se describen estas dos nuevas
  20537. barras.{-}
  20538.  
  20539. {/}
  20540.  
  20541. {Mover la zona seleccionada}
  20542.  
  20543. {+134,0}Una vez seleccionada una zona de un mapa, pulsando sobre el icono de mover
  20544. (que muestra una mano sobre un hombrecillo), se accederá a la barra para
  20545. cortar, copiar y pegar bloques gráficos.
  20546.  
  20547. {Nota}: Ésta es también la barra que aparece cuando se arrastra un mapa hasta
  20548. otro en el escritorio del entorno.
  20549.  
  20550. En ella se moverá la selección con el puntero del ratón (una mano) por el
  20551. mapa; para {copiar} el bloque a una nueva posición se debe pulsar el {botón
  20552. izquierdo} del ratón; para ocultar el gráfico del puntero del ratón (para ver
  20553. cómo quedaría el bloque en una posición, sin la mano encima) se puede pulsar
  20554. la tecla {H} (de {hide}, ocultar en inglés).
  20555.  
  20556. Para retornar de esta barra se pueden utilizar los comandos usuales, como son
  20557. el {botón derecho} del ratón, o la tecla {ESC}.{-}
  20558.  
  20559. {+136,0}En esta barra hay bastantes iconos nuevos; a continuación de las coordenadas
  20560. están los iconos de ampliación y deshacer, como en la mayoría de barras,
  20561. apareciendo a su derecha los siguientes:
  20562.  
  20563. * {Opacidad / Semiopaco}. Pulsando en este icono se conmutará entre dos
  20564. formas de copiar el gráfico: opaco (por defecto) o semi-opaco. La única
  20565. limitación a la hora de copiar el gráfico semiopaco (con un efecto de
  20566. transparencia), es que no siempre se encuentran en la paleta los colores
  20567. necesarios para crear el efecto, por lo que se utilizan los más aproximados.
  20568.  
  20569. * {Color transparente}. Este icono se debe pulsar cuando no se quiera que el
  20570. primer color de la paleta se muestre como {transparente}. Es decir, cuando se
  20571. quiera mover la selección como un bloque rectangular compacto, sin huecos.
  20572. Sirve para evitar que se mezcle el bloque copiado con lo que haya en el fondo
  20573. del mapa.
  20574.  
  20575. * {Inversión horizontal}. El tercer icono invertirá el bloque horizontalmente
  20576. (lo espejará). Si se vuelve a pulsar, se devolverá el bloque a su posición
  20577. original.
  20578.  
  20579. * {Inversión vertical}. Este icono es el complementario del anterior. Se
  20580. invertirá el gráfico verticalmente cuando se pulse.
  20581.  
  20582. * {Rotación angular}. Al pulsar en este icono aparecerá una {nueva barra} que
  20583. se utiliza para rotar el bloque (girarlo). Su funcionamiento es muy simple;
  20584. primero se debe situar el bloque en una posición cualquiera del mapa y pulsar
  20585. el {botón izquierdo} del ratón. Ahora, moviendo el ratón alrededor del
  20586. gráfico, se definirá el nuevo ángulo del mismo. Para fijar el ángulo se debe
  20587. pulsar el {botón izquierdo} nuevamente, mientras que para cancelar la
  20588. rotación se debe pulsar el {botón derecho}.
  20589.  
  20590. * {Escalado del bloque}. Éste es el icono para cambiar el tamaño del bloque
  20591. (ampliarlo o reducirlo). Funciona prácticamente igual que el de rotación,
  20592. también aparece una {nueva barra}; primero se pulsa sobre una posición del
  20593. mapa y después, moviendo el ratón, se selecciona el nivel de ampliación para,
  20594. finalmente, fijarlo pulsando nuevamente con el {botón izquierdo} en el mapa.
  20595.  
  20596. * {Borrar la selección original}. El último icono borrará la zona original en
  20597. el mapa. {Se borrará con el color seleccionado en la barra de edición de
  20598. bloques}. Por lo que, si se quiere borrar con el {color transparente}, se
  20599. deberá seleccionar éste primero (antes de entrar en la barra de mover). Este
  20600. icono se utiliza para {mover un bloque}, primero se selecciona la zona,
  20601. después el icono de mover para acceder a esta barra, entonces se borra el
  20602. bloque de su posición original con este icono y, finalmente, se copia en la
  20603. nueva posición.
  20604.  
  20605. Todos estos iconos son compatibles entre sí, es decir, se pueden seleccionar
  20606. todos los efectos necesarios para conseguir el resultado deseado.
  20607.  
  20608. Se puede observar que el icono de borrar la selección original se puede
  20609. utilizar como herramienta de relleno, seleccionando el color en la barra de
  20610. herramientas y la zona a rellenar (con cualquiera de los modos de selección)
  20611. para que, al pulsar este icono, se rellene la selección con el color elegido.{-}
  20612.  
  20613. {/}
  20614.  
  20615. {Aplicar efectos a la selección}
  20616.  
  20617. {+135,0}Una vez seleccionada una zona de un mapa, pulsando sobre el icono de efectos
  20618. (con las letras {FX}) se accederá a la barra de herramientas para aplicar
  20619. efectos al bloque seleccionado.
  20620.  
  20621. En esta barra se seguirá viendo la línea de puntos que delimita la selección.
  20622. Para volver de esta barra se pueden utilizar igualmente el {botón derecho}
  20623. del ratón o la tecla {ESC}.{-}
  20624.  
  20625. {+137,0}También aparecen nuevos iconos en esta barra a partir del icono de deshacer
  20626. (que se debe utilizar cuando con un efecto no se obtenga el resultado
  20627. deseado). Estos iconos se describen a continuación, de izquierda a derecha:
  20628.  
  20629. * {Pasar a la gama seleccionada}. Se convertirán todos los colores de la zona
  20630. seleccionada a los colores de la gama seleccionada en la barra de
  20631. herramientas (de edición). Por ello, antes de entrar en la barra de efectos
  20632. se debe haber seleccionado la gama de colores. La conversión se realiza en
  20633. función de los niveles de luminosidad de los puntos seleccionados y de los
  20634. colores de la gama.
  20635.  
  20636. * {Invertir colores}. Crea el negativo de la zona seleccionada, cambiando los
  20637. colores claros por oscuros y los oscuros por claros.
  20638.  
  20639. * {Crear un borde}. En primer lugar, se tiene que seleccionar un gráfico con,
  20640. al menos, un margen de un punto, y el color del que se quiere crear el borde.
  20641. Después, al seleccionar este icono, se creará un borde de dicho color por
  20642. todo el contorno del gráfico.
  20643.  
  20644. * {Aclarar}. Aclara todos los puntos seleccionados, es decir, incrementa
  20645. ligeramente su luminosidad. Con la única limitación de los colores
  20646. disponibles en la paleta.
  20647.  
  20648. * {Oscurecer}. Es la operación contraria a la anterior; resta luminosidad a
  20649. todos los puntos de la zona seleccionada. Si se aclara o se oscurece en
  20650. exceso, se debe utilizar el icono de deshacer, y no la operación inversa, ya
  20651. que, en ese caso, se degradarían cada vez más los colores del dibujo
  20652. original.
  20653.  
  20654. * {Suavizar}. El icono más a la derecha permite suavizar todos los puntos de
  20655. la zona seleccionada. Se debe utilizar para efectos en zonas muy concretas,
  20656. ya que sobre dibujos completos crearía el efecto de que éstos están borrosos.
  20657. Para evitar que algunos puntos de un gráfico se vean en exceso es mejor
  20658. utilizar las herramientas para difuminar de forma localizada (herramientas
  20659. como el lápiz o el spray, manteniendo la tecla {D} pulsada).{-}
  20660.  
  20661. # ─────────────────────────────────────────────────────────────────────────────
  20662.  
  20663. {.1277,Barra de deshacer}
  20664. Ver: {#3,Indice} - {#1261,Ayuda sobre el editor gráfico} {/}
  20665.  
  20666. {+138,0}La barra de deshacer, a la que se accede por el icono con una doble flecha o
  20667. la tecla {F12} dentro del editor, sirve para deshacer o volver a repetir
  20668. todas las acciones hechas en el editor gráfico.
  20669.  
  20670. Deshacer acciones se puede realizar desde prácticamente todas las barras, con
  20671. la tecla {Backspace} (la tecla de borrado situada encima de {Enter}), y para
  20672. repetirlas nuevamente se debe mantener pulsada {Mayúsculas} mientras se pulsa
  20673. la misma tecla.
  20674.  
  20675. Por lo tanto, normamente no es necesario acceder a esta barra. Pero cuando se
  20676. deban deshacer muchas acciones será más cómodo, pues dispone de cuatro
  20677. botones para deshacer y repetir acciones a dos velocidades diferentes. Los
  20678. iconos de esta barra son autoexplicativos: las flechas hacia la izquierda son
  20679. para deshacer y las flechas hacia la derecha para repetir (rehacer).{-}
  20680.  
  20681. {+139,0}Resulta bastante divertido, una vez se ha creado un dibujo en un mapa,
  20682. utilizar esta barra para deshacer y repetir el trabajo, como si de un vídeo
  20683. se tratara.
  20684.  
  20685. El límite de acciones que se pueden recuperar lo marca la {memoria de
  20686. deshacer}, que se puede definir en la ventana de configuración (con la opción
  20687. {sistema \ configuración...}). El límite por defecto es 1088Kb, que será casi
  20688. siempre suficiente, pero puede convenir ampliarlo si se está trabajando con
  20689. mapas muy grandes.
  20690.  
  20691. {Importante:} Cuando se trabaja en varios mapas es vital saber que sólo se
  20692. podrán deshacer acciones en el último mapa en el que se ha trabajado. Por
  20693. ejemplo, si se tienen dos mapas, se entra en uno para dibujar un círculo y
  20694. después en el otro para dibujar un cuadrado; no se podrá deshacer el círculo
  20695. a no ser que se deshaga primero el cuadrado. Es decir, que sólo se pueden
  20696. deshacer las acciones en el orden contrario al que se han hecho.{-}
  20697.  
  20698. # ─────────────────────────────────────────────────────────────────────────────
  20699.  
  20700. {.1278,Barra de texto}
  20701. Ver: {#3,Indice} - {#1261,Ayuda sobre el editor gráfico} {/}
  20702.  
  20703. {+140,0}La barra de texto sirve para {escribir textos} en los mapas con las fuentes
  20704. de los archivos {FNT}, o las creadas con el {Generador de fuentes} (explicado
  20705. en el {#1256,menú de fuentes}).
  20706.  
  20707. La apariencia de esta barra es, prácticamente, idéntica al resto de
  20708. herramientas. Para escribir con una fuente (un tipo de letra) debe existir en
  20709. el entorno alguna {ventana de fuentes de letras} activada (ver el menú de
  20710. fuentes).
  20711.  
  20712. * {Si no existe una ventana de este tipo}, se podrá escribir con {la fuente
  20713. de letras utilizada por el editor de programas} (se puede seleccionar en
  20714. {sistema \ configuración...} entre varios tamaños de fuente para el editor).
  20715. Para escribir con la fuente de editor, se debe seleccionar el color para las
  20716. letras primero y, después, pulsar sobre cualquier parte del mapa (con el
  20717. {botón izquierdo}) para introducir el texto. Una vez introducido el texto se
  20718. debe pulsar la tecla {ESC} o el {botón derecho} del ratón.
  20719.  
  20720. * {Si existe una ventana de fuente activada} entonces se escribirá con ella.
  20721. En este caso, {se debe selecionar el color transparente} para escribir un
  20722. texto. Si se selecciona otro color diferente, se mostrará la {fuente tintada}
  20723. con él. Es decir, que para utilizar los colores naturales de la fuente, se
  20724. debe seleccionar el primer color de la paleta.
  20725.  
  20726. Mientras se introduce el texto, se puede posicionar el cursor pulsando con el
  20727. ratón en otra parte del mapa.
  20728.  
  20729. Cuando se está introduciendo un texto se puede borrar el carácter anterior
  20730. con la tecla {Backspace}, y la tecla {Enter} saltará a la línea siguiente.
  20731.  
  20732. {Nota}: Esta barra también dispone del icono de {porcentaje} de tinta, que
  20733. puede utilizarse para escribir textos traslúcidos en lugar de opacos. De esta
  20734. forma se pueden conseguir efectos de rotulación atractivos, al escribir sobre
  20735. diferentes texturas.{-}
  20736.  
  20737. # ─────────────────────────────────────────────────────────────────────────────
  20738.  
  20739. {.1279,Barra de puntos de control}
  20740. Ver: {#3,Indice} - {#1261,Ayuda sobre el editor gráfico} {/}
  20741.  
  20742. {+141,0}La última barra de herramientas accesible no es una barra de dibujo, sino que
  20743. se utiliza para definir {puntos de control} dentro de los mapas que se van a
  20744. utilizar en los juegos para tener, de esta forma, localizadas ciertas
  20745. posiciones en los mismos.
  20746.  
  20747. Hay diferentes aplicaciones que se les pueden dar a estos puntos dentro de
  20748. los programas de DIV.
  20749.  
  20750. Esta barra de puntos de control permite situar hasta 1000 puntos diferentes
  20751. dentro de un gráfico, y cada uno será identificado por su número (del 0 al
  20752. 999).{-}
  20753.  
  20754. {+142,1}{-}
  20755. Para situar uno de estos puntos, basta con seleccionar el número de punto con
  20756. los {iconos flecha izquierda} y {flecha derecha} y, después, pulsar sobre el
  20757. gráfico.
  20758.  
  20759. Para {borrar} (deseleccionar) un punto de control, se debe volver a pulsar
  20760. sobre el mismo en el mapa una segunda vez.
  20761.  
  20762. El único punto de control que utiliza el sistema es el punto de control
  20763. {número 0} (el primero); éste es el punto que define cuál es el {centro
  20764. virtual} del gráfico y que tiene múltiples aplicaciones dentro del lenguaje.
  20765.  
  20766. Cuando no se defina el punto de control número 0, el sistema actuará como si
  20767. el {centro virtual} del gráfico fuera el {centro real} del mismo (un punto
  20768. situado en la mitad del ancho y la mitad del alto del gráfico).
  20769.  
  20770. {Nota}: Una vez definidos los puntos de control, para que éstos tengan efecto
  20771. dentro de un programa, debe guardarse nuevamente el {mapa} (archivo {MAP}) o
  20772. volverse a incluir el mismo en el fichero de gráficos (archivo {FPG})
  20773. arrastrándolo hasta el mismo (según cuál de ambos archivos se cargue en el
  20774. programa).
  20775.  
  20776. # ─────────────────────────────────────────────────────────────────────────────
  20777.  
  20778. {.1280,Edición de animaciones}
  20779. Ver: {#3,Indice} - {#1261,Ayuda sobre el editor gráfico} {/}
  20780.  
  20781. El editor gráfico de DIV también permite crear y editar secuencias de
  20782. animación. La secuencia de imágenes se creará en una serie de mapas {todos
  20783. del mismo tamaño en puntos}, es decir, que si se quiere crear una animación
  20784. de un tamaño de 100 por 100 puntos y 8 {fotogramas}, se deben crear primero
  20785. los 8 mapas de 100 por 100 puntos en el escritorio.
  20786.  
  20787. La manera más fácil de crear varios mapas del mismo tamaño es crear el
  20788. primero (con la opción {mapas \ nuevo...}), y entonces arrastrar el mismo
  20789. varias veces al tapiz.
  20790.  
  20791. {+143,0}Después se deben {ordenar las ventanas de los mapas}; esto se hace,
  20792. simplemente, colocando todas las ventanas solapadas, unas sobre otras. Se
  20793. coloca en cualquier parte del escritorio la última, sobre ésta la
  20794. antepenúltima, etc. No es aconsejable colocar cada ventana {justo encima} de
  20795. la anterior, sino más bien ligeramente desplazada, por ejemplo, un poco más
  20796. a la derecha y un poco más abajo.
  20797.  
  20798. {Importante}: Si existen más mapas del mismo tamaño en el escritorio
  20799. (continuando con el ejemplo anterior, algún otro mapa de 100 por 100 puntos
  20800. que no deba formar parte de la animación), {se deben minimizar sus ventanas}
  20801. para que el programa sepa que no deben incluirse en la animación. Una vez
  20802. editada la animación, podrán volver a {maximizarse} estos mapas.
  20803.  
  20804. Una vez colocadas todas las ventanas en orden se podrá comenzar a editar la
  20805. animación. Para ello, simplemente se debe editar la ventana superior de todas
  20806. las que forman parte de la animación (la que está sobre todas las demás) con
  20807. una doble pulsación sobre la misma. Y, una vez dentro del editor gráfico, se
  20808. podrá pasar al fotograma siguiente con la tecla {TAB} y al anterior con
  20809. {Mayúsculas+TAB}.{-}
  20810.  
  20811. {/}
  20812.  
  20813. {Ejemplo práctico}
  20814.  
  20815. Continuando con el mismo ejemplo, una vez creados los ocho mapas de 100 por
  20816. 100 puntos (todos ellos vacíos, en negro) se colocarán en orden según se ha
  20817. explicado (da igual el orden en el que se coloquen los mapas ya que todos
  20818. están vacíos, por lo que cualquiera puede ser el primero, el segundo, el
  20819. último, etc).
  20820.  
  20821. Entonces, se realiza una doble pulsación con el ratón para editar el mapa
  20822. superior (el último que se ha colocado). Ahora seleccione un color cualquiera
  20823. y la herramienta del lápiz. Dibuje en el mapa un 1 en grande (da igual cómo
  20824. le quede el número), ahora pulse {TAB} y dibuje en el segundo fotograma un
  20825. dos, pulse {TAB} nuevamente y dibuje un tres, ... y así hasta el ocho.
  20826.  
  20827. Ya está creada la animación; puede utilizar la tecla {TAB} (con o sin
  20828. presionar {Mayúsculas}) para visualizar la animación. Si deja pulsada esta
  20829. tecla, verá la animación seguida; utilice la tecla {Z} para variar el nivel
  20830. de ampliación en el que se ve la animación. Puede seguir editando cualquiera
  20831. de sus fotogramas.
  20832.  
  20833. {Nota:} Si sale del {editor gráfico} en un fotograma que no sea el primero,
  20834. por ejemplo en el cuarto, verá que las ventanas están colocadas {en otro
  20835. orden}, con el cuarto fotograma sobre los demás. No se preocupe, siguen
  20836. estando ordenados, pero ahora {cuando quiera volver a editar la animación
  20837. pulse sobre el fotograma superior de todos}, el cuarto, para no
  20838. descolocarlos.
  20839.  
  20840. {/}
  20841.  
  20842. {Algunos consejos sobre las animaciones}
  20843.  
  20844. Si quiere crear un gráfico animado, la mejor forma suele ser crear primero
  20845. una animación esquemática, dibujando unos cuantos palotes que representen al
  20846. gráfico. Cuando la animación en esquema quede bien, entonces edite el primer
  20847. fotograma y dibuje en detalle el gráfico definitivo sobre el esquema de
  20848. palotes. Después, utilice las mismas técnicas y herramientas para completar
  20849. el resto de fotogramas.
  20850.  
  20851. Cuando se retocan animaciones largas (de muchos fotogramas) es conveniente,
  20852. en ocasiones, concentrarse en una parte concreta de la animación, para ello
  20853. minimice el resto de los fotogramas.
  20854.  
  20855. La mejor forma de guardar en disco las animaciones es hacerlo en un {fichero
  20856. FPG}. Si no tiene ningún fichero todavía, cree uno nuevo ({ficheros \
  20857. nuevo...}). Entonces arrastre hasta la ventana del fichero el primer
  20858. fotograma e introduzca un código y una descripción para el mismo. Después,
  20859. el resto en orden (el programa le sugerirá códigos consecutivos para el resto
  20860. de fotogramas). Cuando quiera volver a trabajar sobre esta animación, marque
  20861. todos los fotogramas en la ventana del fichero y utilice la opción {ficheros
  20862. \ cargar marcados}.
  20863.  
  20864. Si la animación no consta de muchos fotogramas, y estos no son muy grandes,
  20865. puede utilizar un pequeño truco para ordenar los fotogramas de la animación
  20866. sin tener que colocar los mapas unos sobre otros; éste consiste {en pasar el
  20867. puntero del ratón sobre todos los mapas en orden inverso} (primero sobre el
  20868. último, después sobre el penúltimo, etc.) hasta que llegue al primero.
  20869. Entonces entre en el editor gráfico con una doble pulsación, los fotogramas
  20870. estarán igualmente ordenados. El único problema es que se desordenarán los
  20871. mismos si sale del editor gráfico y mueve el puntero del ratón sobre el
  20872. escritorio de forma desordenada.
  20873.  
  20874. # ─────────────────────────────────────────────────────────────────────────────
  20875.  
  20876. {.1281,Trucos y técnicas avanzadas de dibujo}
  20877. Ver: {#3,Indice} - {#1261,Ayuda sobre el editor gráfico} {/}
  20878.  
  20879. En este último punto dedicado al {editor gráfico} se describen algunos trucos
  20880. y técnicas que han empleado los artistas gráficos de Hammer Technologies para
  20881. conseguir mejores resultados en los gráficos de los juegos adaptados, por
  20882. supuesto, a las posibilidades del editor gráfico de DIV Games Studio.
  20883.  
  20884. Se recomienda abordar este punto únicamente cuando se conozcan ya
  20885. perfectamente todas las posibilidades de este editor.
  20886.  
  20887. {/}
  20888.  
  20889. {Uso de escalados}
  20890.  
  20891. Esta primera técnica consiste en realizar gráficos al doble de su tamaño
  20892. para, después, reducirlos a la mitad, con lo que se gana bastante calidad y
  20893. definición en los mismos.
  20894.  
  20895. Por ejemplo, para crear un dibujo de 100 por 100 puntos se hace éste a 200
  20896. por 200 puntos y, después, se reescala a su verdadero tamaño (con la opción
  20897. {mapas \ reescalar...}).
  20898.  
  20899. Pruebe por ejemplo a realizar un dibujo de trazos, en color blanco sobre el
  20900. fondo negro, dividido en pequeñas secciones cerradas; después, coloree estas
  20901. secciones (con la herramienta de relleno normal y colores diversos), elimine
  20902. los trazos blancos (con la herramienta de relleno por diagonales y el color
  20903. negro) y, finalmente, reduzca el mapa a la mitad de su tamaño.
  20904.  
  20905. Otra técnica curiosa. En el dibujo anterior, en lugar de eliminar los trazos
  20906. blancos, selecciónelos con la herramienta de edición de bloques (con la
  20907. selección por relleno, pulsando sobre estos trazos) y aplíqueles el efecto
  20908. de suavizar varias veces (con la barra de efectos)...
  20909.  
  20910. {/}
  20911.  
  20912. {Uso de máscaras para sustituir colores}
  20913.  
  20914. En ocasiones se quiere sustituir un color de un mapa por otro diferente. Esto
  20915. se puede conseguir como se muestra a continuación.
  20916.  
  20917. Por ejemplo, cree un mapa con varios garabatos de lápiz en diferentes
  20918. colores. Ahora, para sustituir uno de los colores por otro seleccione el
  20919. diálogo de máscaras (tecla {M}), seleccione el color a cambiar (puede pulsar
  20920. sobre el mapa para ello) y pulse el botón de {Invertir} (para proteger contra
  20921. escritura todos los colores menos el que quiere cambiar). Finalmente,
  20922. seleccione la herramienta de rectángulos (cajas rellenas), seleccione el
  20923. nuevo color y dibuje un rectángulo que ocupe el mapa completo (de esquina a
  20924. esquina) ... ¡ah !, y no se olvide de quitar la máscara para seguir
  20925. trabajando.
  20926.  
  20927. {/}
  20928.  
  20929. {Empleo de las ventanas}
  20930.  
  20931. Esto más que una técnica es un consejo. Utilice siempre las posibilidades de
  20932. ventanas del entorno para guardar copias de seguridad del trabajo. Cuando
  20933. vaya a intentar "mejorar un gráfico", puede convenir seleccionarlo y
  20934. cortarlo a una nueva ventana de mapa. De esta forma, siempre podrá recuperar
  20935. el gráfico original "si la mejora no lo mejora". Cuando ya no necesite estas
  20936. copias de seguridad, cierre las ventanas.
  20937.  
  20938. {/}
  20939.  
  20940. {Usar las teclas para ajustar bloques}
  20941.  
  20942. Cuando esté creando un fondo mapeado para un juego, es decir, creando un
  20943. decorado a partir de bloques básicos que se repiten varias veces, utilice los
  20944. cursores para ajustar correctamente los bloques, ya que estos siempre
  20945. ofrecerán más seguridad en los movimientos que el ratón. Recuerde que la
  20946. tecla {Bloq. Núm.} del teclado numérico debe estar desactivada para que los
  20947. cursores muevan el bloque de un punto en un punto.
  20948.  
  20949. {/}
  20950.  
  20951. {Creando gamas de colores}
  20952.  
  20953. Una vez definida la paleta de colores para el juego. La apropiada definición
  20954. de gamas de colores puede simplificar mucho el trabajo dentro del editor
  20955. gráfico.
  20956.  
  20957. Cuando necesite en un dibujo realizar una {transición de un color a otro},
  20958. acceda al editor de gamas de colores (tecla {C}) y seleccione una de las
  20959. gamas que no esté utilizando para redefinirla. Defina una gama de {16 o 32
  20960. colores y editable cada 8 colores}; entonces sitúe uno de los colores en una
  20961. de las posiciones de la gama (pulsando sobre los pequeños iconos con una
  20962. flecha gris hacia arriba) y el otro en la siguiente posición (ocho colores
  20963. más a la derecha o izquierda). El programa buscará por usted {la mejor
  20964. transición} posible en la paleta de un color al otro (los colores
  20965. intermedios entre ambos). Esto será útil para encontrar transiciones entre
  20966. distintos colores, como de un rojo a un azul, de un verde a un marrón, etc.
  20967.  
  20968. Realice siempre pruebas seleccionando colores de la gama y reasignándolos a
  20969. otra posición de la misma (pulsando primero sobre un color de la gama y
  20970. después sobre uno de los pequeños iconos grises), para obtener diferentes
  20971. secuencias de colores que puedan serle útiles.
  20972.  
  20973. {/}
  20974.  
  20975. {Redefinir el color transparente para evitar pixelaciones}
  20976.  
  20977. Se denomina pixelación a cuando se aprecian demasiado los puntos del contorno
  20978. de un gráfico. Si el juego se va a desarrollar sobre un fondo de un color
  20979. determinado, o sobre unos ciertos tonos de color, se pueden crear gráficos
  20980. cuyos contornos se disimulen mejor en el fondo con la técnica aquí expuesta.
  20981.  
  20982. Por ejemplo, cree un mapa nuevo de 80 por 80 puntos y dibuje algún gráfico
  20983. (pueden servir un círculo blanco y otro en un color oscuro separados) pero
  20984. deje, al menos, un margen libre de un punto alrededor del gráfico (vacío, en
  20985. color negro). Suponiendo ahora que éste es un gráfico que debe aparecer sobre
  20986. un fondo azul de un cielo en el juego, siga los siguientes pasos:
  20987.  
  20988. * Entre en el editor de paletas ({paletas \ editar paleta..}), seleccione el
  20989. color transparente (el color negro de arriba a la izquierda) y modifíquelo
  20990. para que sea del color del supuesto fondo del juego (el azul que prefiera,
  20991. por ejemplo, un 25 de verde y un 50 de azul, crearán un azul cielo). Ahora
  20992. pulse {Aceptar} y responda {Cancelar} a la pregunta de si desea adaptar los
  20993. mapas.
  20994.  
  20995. * Edite el gráfico, verá el gráfico sobre el fondo azul, con el contorno del
  20996. mismo pixelado. En el diálogo de máscaras (tecla {M}), enmascare el color
  20997. transparente (pulse sobre el primer color de la paleta, el azul). Con esto
  20998. evita modificar el exterior del gráfico.
  20999.  
  21000. * Ahora, para suavizar las pixelaciones, seleccione el lápiz, amplie el
  21001. dibujo (con la lupa, zoom por 8) y cuidadosamente páselo por el contorno
  21002. del gráfico con la tecla {D} (difuminar) pulsada. Se acercarán los colores
  21003. del contorno del gráfico al color del fondo. Continúe aplicando el efecto el
  21004. tiempo necesario.
  21005.  
  21006. * Para finalizar, quite la máscara (volviendo a pulsar sobre el color
  21007. transparente en el diálogo de máscaras), vuelva al editor de paletas,
  21008. redefina el color transparente otra vez a negro, pulse {Aceptar} y vuelva a
  21009. responder {Cancelar} a la pregunta para que no se adapten los mapas.
  21010.  
  21011. Se puede redefinir el color transparente siempre que se quiera ver el
  21012. contorno de los gráficos sobre un color concreto. Recuerde que siempre puede
  21013. resaltar el color transparente con la tecla {B} dentro del editor gráfico.
  21014.  
  21015. {/}
  21016.  
  21017. {Relleno con texturas}
  21018.  
  21019. Para rellenar un gráfico con una textura, en lugar de un color sólido se
  21020. puede utilizar la posibilidad de mover las selecciones con la tecla
  21021. {Control}, por ejemplo:
  21022.  
  21023. * Ponga en un mapa una textura a un lado (si no tiene ninguna puede crearla
  21024. rápidamente con la barra del spray) y, al otro lado, dibuje un círculo de
  21025. cualquier color (relleno). La textura debe ser más grande que el círculo.
  21026.  
  21027. * Ahora, para rellenar el círculo con la textura, utilice la barra de edición
  21028. de bloques y seleccione el círculo (con el modo de selección por relleno).
  21029.  
  21030. * Con la tecla {Control} pulsada, mueva la selección del círculo hasta la
  21031. textura, pulse entonces el icono de mover y desplace el bloque de nuevo hasta
  21032. el círculo.
  21033.  
  21034. {/}
  21035.  
  21036. {Pasar gráficos de un mapa a otro con TAB}
  21037.  
  21038. La posibilidad que ofrecen las animaciones de cambiar de mapa, dentro del
  21039. editor gráfico, pulsando la tecla {TAB}, puede utilizarse para muchas otras
  21040. acciones.
  21041.  
  21042. Si tiene varios mapas {del mismo tamaño}, con diversos gráficos en cada uno,
  21043. puede seleccionar un gráfico en uno de los mapas, pulsar el icono de {mover}
  21044. de la barra de edición y, entonces, utilizar la tecla {TAB} para copiar el
  21045. gráfico a otro mapa.
  21046.  
  21047. También se puede utilizar esto para conseguir el relleno con texturas
  21048. explicado en el punto anterior, teniendo la textura en otro mapa. Seleccione
  21049. el gráfico a rellenar en uno de los mapas, pulse {TAB} para pasar la
  21050. selección al mapa con la textura, corte en él el bloque (con el icono de
  21051. {mover}) y vuelva otra vez al mapa con el gráfico pulsando nuevamente la
  21052. misma tecla.
  21053.  
  21054. {En resumen}
  21055.  
  21056. Con todo esto, más la posibilidad de fusionar paletas, el generador de
  21057. explosiones, las  fuentes de letras y controlando el relleno con gradiente,
  21058. las operaciones de bloques, los reescalados, el editor de gamas, ..., puede
  21059. considerarse ya usted un grafista profesional, siempre que no tenga la mala
  21060. suerte de ser daltónico.
  21061.  
  21062. # ─────────────────────────────────────────────────────────────────────────────
  21063.  
  21064. {.1290,Ayuda sobre los comandos de teclado.}
  21065.  
  21066. Ver: {#3,Indice general}{/}
  21067.  
  21068.   {#1291,Comandos en el entorno gráfico}·
  21069.   {#1292,Comandos comunes en los juegos}·
  21070.   {#1293,Comandos en el trazador de programas}·
  21071.   {#1294,Comandos en el editor de programas}·
  21072.   {#1295,Comandos en el editor gráfico}·
  21073.  
  21074. # ─────────────────────────────────────────────────────────────────────────────
  21075.  
  21076. {.1291,Comandos en el entorno gráfico}
  21077. Ver: {#3,Indice} - {#1290,Ayuda sobre los comandos de teclado}{/}
  21078.  
  21079. {Comandos en el entorno gráfico}
  21080.  
  21081. {/}
  21082.  
  21083. {ALT+X}         - Salir del entorno gráfico al sistema operativo.·
  21084. {ESC+Control}   - Salir directamente del entorno y de los programas.·
  21085.  
  21086. {ALT+S}         - Ejecutar una sesión del sistema operativo MS-DOS.·
  21087.  
  21088. {ESC}           - Para anular o cancelar un cuadro de diálogo.·
  21089. {TAB}           - Para elegir el control seleccionado de una ventana o cuadro.·
  21090. {Enter}         - Para activar el control seleccionado.·
  21091.  
  21092. {F1}            - Invocar la ventana de ayuda.·
  21093.  
  21094. {F2}            - Guardar el programa seleccionado.·
  21095. {F4}            - Abrir un programa.·
  21096. {F10}           - Guardar y ejecutar el programa seleccionado.·
  21097. {F11}           - Compilar el programa seleccionado.·
  21098. {F12}           - Guardar y trazar el programa seleccionado.·
  21099.  
  21100. {Control+ALT+P} - Grabar una captura del entorno gráfico (DIV_*.PCX)·
  21101.  
  21102. # ─────────────────────────────────────────────────────────────────────────────
  21103.  
  21104. {.1292,Comandos comunes en los juegos}
  21105. Ver: {#3,Indice} - {#1290,Ayuda sobre los comandos de teclado}{/}
  21106.  
  21107. {Comandos comunes en los juegos}
  21108.  
  21109. {/}
  21110.  
  21111. {ALT+X}        - Salir del juego.·
  21112. {ESC+Control}  - Salir del juego.·
  21113.  
  21114. {Contro+ALT+P} - Grabar una captura del juego (SNAP*.PCX)·
  21115. {F12}          - Invocar al trazador de programas.·
  21116. {Pausa}        - Detener el juego momentáneamente.·
  21117.  
  21118. # ─────────────────────────────────────────────────────────────────────────────
  21119.  
  21120. {.1293,Comandos en el trazador de programas}
  21121. Ver: {#3,Indice} - {#1290,Ayuda sobre los comandos de teclado}{/}
  21122.  
  21123. {Comandos en el trazador de programas}
  21124.  
  21125. {/}
  21126.  
  21127. {Cursores.} - Movimiento por el listado.·
  21128. {Re.Pág.}   - Página anterior.·
  21129. {Av.Pag.}   - Siguiente página.·
  21130.  
  21131. {F5}        - Ver el listado de un proceso.·
  21132. {F6}        - Ejecutar el proceso actual.·
  21133. {F7}        - Ver o editar datos.·
  21134. {F8}        - Trazar sentencia.·
  21135. {F9}        - Fijar un punto de ruptura.·
  21136. {F12}       - Invocar al trazador / Avanzar imágenes.·
  21137.  
  21138. {F}             - Ejectuar hasta la siguiente imágen.·
  21139.  
  21140. {TAB}           - Seleccionar botón.·
  21141. {Enter}         - Activar botón.·
  21142. {ESC}           - Salir del trazador.·
  21143.  
  21144. # ─────────────────────────────────────────────────────────────────────────────
  21145.  
  21146. {.1294,Comandos en el editor de programas}
  21147. Ver: {#3,Indice} - {#1290,Ayuda sobre los comandos de teclado}{/}
  21148.  
  21149. {Comandos en el editor de programas}
  21150.  
  21151. {/}
  21152.  
  21153. {Comandos genéricos.}
  21154.  
  21155. {/}
  21156.  
  21157. {F5}        - Saltar al inicio de un proceso del programa.·
  21158. {Control+Z} - Ampliar la ventana de programa seleccionada.·
  21159.  
  21160. {/}
  21161.  
  21162. {Comandos de movimiento y edición básicos.}
  21163.  
  21164. {/}
  21165.  
  21166. {Cursores}                  - Movimiento básico del cursor.·
  21167. {Inicio}                    - Saltar al inicio de la línea.·
  21168. {Fin}                       - Saltar al final de la línea.·
  21169. {Av.Pág.}                   - Siguiente página.·
  21170. {Re.Pág.}                   - Página anterior.·
  21171. {Insertar}                  - Conmutar entre inserción y sobreescritura.·
  21172. {Suprimir}                  - Borrar el carácter del cursor.·
  21173. {Borrar}                    - Borrar el carácter anterior al cursor.·
  21174. {TAB}                       - Saltar a la siguiente tabulación.·
  21175. {Mayúsculas+TAB}            - Destabular.·
  21176. {Control+Borrar, Control+Y} - Borrar línea actual.·
  21177. {Control+Derecha}           - Siguiente palabra.·
  21178. {Control+Izquierda}         - Palabra anterior.·
  21179. {Control+Re.Pág.}           - Saltar al inicio del programa.·
  21180. {Control+Av.Pág.}           - Saltar al final delprograma.·
  21181. {Control+Inicio}            - Saltar al incio de la página.·
  21182. {Control+Fin}               - Saltar al final de la página.·
  21183.  
  21184. {/}
  21185.  
  21186. {Comandos de búsqueda y sustitución.}
  21187.  
  21188. {/}
  21189.  
  21190. {ALT+F, Control+F}     - Buscar un texto.·
  21191. {ALT+N, F3, Control+L} - Repetir búsqueda.·
  21192. {ALT+R, Control+R}     - Sustituir texto.·
  21193.  
  21194. {/}
  21195.  
  21196. {Comandos de bloques tipo QEDIT.}
  21197.  
  21198. {/}
  21199.  
  21200. {ALT+A}        - Marcar el inicio o final de un bloque permanente.·
  21201. {ALT+U}        - Desmarcar el bloque permanente.·
  21202. {ALT+C}        - Copiar el bloque a la posición actual.·
  21203. {ALT+M}        - Mover el bloque a la posición actual.·
  21204. {ALT+D, ALT+G} - Borrar el bloque.·
  21205.  
  21206. {/}
  21207.  
  21208. {Comandos de bloques tipo EDIT.}
  21209.  
  21210. {/}
  21211.  
  21212. {Mayúsculas+Movimiento}    - Marcar bloque volátil (Teclas de movimiento:
  21213. {Cursores, Control + Derecha, Control + Izquierda, Re.Pág, Av.Pág., Inicio,
  21214. Fin}).·
  21215.  
  21216. {Mayúsculas+Insertar} - Pegar bloque.·
  21217. {Control+Insertar}    - Copiar bloque.·
  21218. {Mayúsculas+Suprimir} - Cortar bloque.·
  21219.  
  21220. {Control+X}           - Cortar bloque.·
  21221. {Control+C}           - Copiar bloque.·
  21222. {Control+V}           - Pegar bloque.·
  21223.  
  21224. {Suprimir}            - Borrar bloque.·
  21225.  
  21226. # ─────────────────────────────────────────────────────────────────────────────
  21227.  
  21228. {.1295,Comandos en el editor gráfico}
  21229. Ver: {#3,Indice} - {#1290,Ayuda sobre los comandos de teclado}{/}
  21230.  
  21231. {Comandos en el editor gráfico}
  21232.  
  21233. {/}
  21234.  
  21235. {Comandos genéricos.}
  21236.  
  21237. {/}
  21238.  
  21239. {F1}                    - Invocar la ventana de ayuda.·
  21240.  
  21241. {ESC}                   - Salir del editor gráfico.·
  21242.  
  21243. {Cursores, OP/QA}       - Movimiento del cursor.·
  21244. {Barra espaciadora}     - Equivale a pulsar con botón izquierdo del ratón.·
  21245. {Mayúsculas+Movimiento} - Movimiento de 8 en 8 puntos.·
  21246. {Mayúsculas+Botón izq.} - Coger color de pantalla.·
  21247.  
  21248. {W, S}                  - Elegir color dentro de la gama actual.·
  21249. {Mayúsculas+W, S}       - Elegir gama actual.·
  21250. {Control+Cursores}      - Elegir color y gama.·
  21251.  
  21252. {Borrar}                - Deshacer.·
  21253. {Mayúsculas+Borrar}     - Repetir acción (rehacer).·
  21254.  
  21255. {0}                     - Seleccionar el color transparente.·
  21256. {B}                     - Resaltar el color transparente.·
  21257. {C}                     - Ventana de colores.·
  21258. {M}                     - Ventana de máscara.·
  21259. {Z}                     - Cambiar nivel de ampliación.·
  21260.  
  21261. {/}
  21262.  
  21263. {Comandos de selección de herramienta.}
  21264.  
  21265. {/}
  21266.  
  21267. {F2}             - Lápiz, para el trazo a mano alzada.·
  21268. {F3}             - Líneas rectas.·
  21269. {F4}             - Multilínea, líneas encadenadas.·
  21270. {F5}             - Curvas bézier.·
  21271. {F6}             - Multicurva, curvas encadenadas.·
  21272. {F7}             - Rectángulos y cajas.·
  21273. {F8}             - Círculos y circunferencias.·
  21274. {F9}             - Spray de pintura.·
  21275. {F10}            - Relleno de superficies.·
  21276. {F11}            - Edición de bloques.·
  21277. {F12}            - Deshacer y rehacer acciones.·
  21278. {Mayúsculas+F1}  - Escribir textos.·
  21279. {Mayúsculas+F2}  - Situar puntos de control.·
  21280. {Mayúsculas+F3}  - Barra de punteado.·
  21281.  
  21282. {/}
  21283.  
  21284. {Comandos específicos.}
  21285.  
  21286. {/}
  21287.  
  21288. {Control}  - Mover selección (barra: seleccionar bloque).·
  21289. {Control}  - Igualar ancho y alto (barras: rectángulos y círculos).·
  21290. {D}        - Difuminar (barras: lápiz, líneas, curvas y spray).·
  21291. {H}        - Esconder cursor (barra: mover bloque).·
  21292. { +, -}    - Variar tensión (barra: multicurva).·
  21293.  
  21294. # ─────────────────────────────────────────────────────────────────────────────
  21295.  
  21296. {.1300,Preguntas comunes sobre DIV}
  21297. Ver: {#3,Indice general}{/}
  21298.  
  21299. {¿Como obtener ayuda sobre ... ?}
  21300.  
  21301. Es importante saber como está organizada la ayuda, todas las opciones accesibles
  21302. desde cualquier menú de opciones se describen en la {#1250,Ayuda sobre los menús
  21303. de opciones}. Por ejemplo se podrá obtener ayuda sobre el generador de fuentes de letras
  21304. en la ayuda sobre el menú de fuentes. La ayuda se divide en cuatro bloques
  21305. unidos por el índice general.
  21306.  
  21307. {#1290,Teclas} - Muestra las combinaciones de teclas accesibles para realizar
  21308. ciertas acciones en distintos puntos del programa.
  21309.  
  21310. {#1250,Menús} - Ayuda general sobre cada uno de los menús de opciones, y
  21311. específica sobre cada opción accesible a través de los mismos.
  21312.  
  21313. {#1261,Dibujo} - Ayuda y tutoriales sobre el programa de dibujo, se divide
  21314. en la ayuda genérica (conceptos básicos) y la ayuda avanzada (específica de
  21315. cada barra de herramientas).
  21316.  
  21317. {#1249,Lenguaje} - Toda la información sobre el lenguaje de programación y la
  21318. creación de programas. Dispone de varios nexos principales, como son el glosario
  21319. de términos y la sintaxis de los programas (su estructura general).
  21320.  
  21321. {¿Cómo puedo volver a la página anterior en la ayuda?}
  21322.  
  21323. Se puede siempre volver a la página anterior pulsando la tecla Borrar
  21324. (también llamada "BackSpace", que es la tecla para borrar que está sobre Enter).
  21325.  
  21326. {¿Porqué me dice "No se reconoce el tipo de fichero"?}
  21327.  
  21328. Es posible que esté intentando cargar un archivo con el menú incorrecto, es
  21329. decir, el menú de paletas sólo sirve para cargar paletas, el de ficheros sólo
  21330. para cargar ficheros de gráficos (grupos de gráficos), el de programas para
  21331. cargar programas o archivos de texto, etc.
  21332.  
  21333. También es posible que esté intentando cargar un mapa PCX o BMP True Color,
  21334. esta versión de DIV únicamente puede trabajar a 256 colores, no siendo posible
  21335. importar este tipo de archivos. Deberá convertir el gráfico que quiere cargar
  21336. en DIV a 256 colores con otra herramienta primero.
  21337.  
  21338. {/}
  21339.  
  21340. {¿Como se debe arrastrar un gráfico?}
  21341.  
  21342. Para arrastrar un gráfico se debe pulsar con el botón izquierdo del ratón sobre
  21343. la ventana del mapa, pero no sobre la barra de título, sino sobre el propio
  21344. gráfico contenido en la ventana. Después bastará con mover el ratón hasta la
  21345. posición en la que se desea dejar el gráfico y soltar entonces el botón izquierdo
  21346. (se pueden arrastrar mapas a ficheros, a la papelera, al tapiz de fondo, a otros
  21347. mapas o al generador de fuentes).
  21348.  
  21349. {¿Como extraer un gráfico contenido en otro?}
  21350.  
  21351. {+126,0}Se debe acceder a la barra de edición de bloques para seleccionar
  21352. la parte del gráfico que se quiere extraer. La selección se puede realizar
  21353. de varias formas, como un rectángulo, dibujando el contorno, etc.{-}
  21354.  
  21355. {+133,0}Una vez realizada la selección aparecerán algunos iconos nuevos
  21356. en la barra de herramientas, entre ellos el icono de {cortar a ventana}.
  21357. Al pulsar sobre este icono {se crea una nueva ventana de mapa} en el escritorio
  21358. {y se pega la zona seleccionada} en el mismo.{-}
  21359.  
  21360. {¿Como se cortan y copian gráficos?}
  21361.  
  21362. Ver también la pregunta anterior. Para cortar y mover gráficos se debe acceder
  21363. a la {#1276,barra de edición de bloques}, dentro del programa de dibujo,
  21364. seleccionando el icono que muestra unas tijeras.
  21365.  
  21366. Desde el escritorio se pueden realizar algunas operaciones, como copiar
  21367. un gráfico a otro, esto se puede hacer arrastrando el primer gráfico hasta
  21368. el segundo. También se puede crear una copia de un gráfico si se arrastra
  21369. el mismo hasta el tapiz de fondo (una zona del escritorio que no contenga
  21370. ninguna ventana).
  21371.  
  21372. {/}
  21373.  
  21374. {¿Porqué no escucho los sonidos en mi ordenador?}
  21375.  
  21376. Si, disponiendo de una tarjeta de sonido compatible con Sound Blaster
  21377. o Gravis Ultrasound, al ejecutar los juegos ejemplo no oyera los efectos
  21378. de los mismos, entonces puede probar a configurar su tarjeta de sonido
  21379. con el programa SETUP.PRG (que se encuentra en el directorio SETUP
  21380. de DIV Games Studio).
  21381.  
  21382. Cargue este programa con F4 y pulse F10 para ejecutarlo. Aparecerá
  21383. el programa de configuración del sistema sonido. Introduzca los
  21384. parámetros de su tarjeta y pulse sobre el botón denominado "Save&Exit".
  21385.  
  21386. {¿Que debo hacer si el sistema se vuelve inestable?}
  21387.  
  21388. DIV Games Studio es un programa muy complejo y, aunque es bastante
  21389. sólido en su ejecución, puede que el algún equipo de algún error
  21390. al realizar una acción determinada, o bien se bloquee el ordenador.
  21391.  
  21392. En estos casos, para volver el sistema a su estado original, debe
  21393. cargar DIV desde la línea de comandos de MSDOS indicando el
  21394. parámetro{ /SAFE} (introduciendo el comando D.EXE /SAFE desde el directorio
  21395. en el que se instaló el programa), para entrar en el "Modo a prueba
  21396. de fallos".
  21397.  
  21398. {/}
  21399.  
  21400. {¿Que debo hacer para aprender a programar?}
  21401.  
  21402. Los conceptos básicos no se explican en esta ayuda, sino en el manual
  21403. de usuario de DIV Games Studio, en los capítulos 5, 6, 7 y 8.
  21404.  
  21405. Además se puede aprender mucho de los ejemplos de las funciones del
  21406. lenguaje (ver la lista de funciones en la ayuda sobre el lenguaje)
  21407. y de los tutoriales, que son unos mini-juegos muy sencillos y
  21408. diseñados para facilitar el aprendizaje del lenguaje (estos tutoriales
  21409. se pueden encontrar en el directorio PRG\TUTOR de DIV Games Studio).
  21410.  
  21411. {¿Cómo se cargan los gráficos en los juegos?}
  21412.  
  21413. En un juego se pueden utilizar los gráficos contenidos en los mapas
  21414. (archivos MAP), cargándolos de uno en uno con la función {#174,load_map()},
  21415. o bien metiendo varios gráficos en un fichero FPG de gráficos
  21416. (ver el {#1255,menú de ficheros}) y cargándolos después con la
  21417. función {#132,load_fpg()}, esta última opción tiene la ventaja
  21418. de que se pueden cargar y descargar muchos gráficos de golpe en
  21419. el juego.
  21420.  
  21421. Después se suelen utilizar los gráficos para asignárselos a la variable
  21422. {#1126,LOCAL graph} de los procesos del juego.
  21423.  
  21424. {¿Como mostrar un nuevo gráfico en un juego?}
  21425.  
  21426. Para crear un nuevo gráfico o "sprite" en un juego, se debe primero
  21427. crear un nuevo proceso ({#1016,PROCESS}) con las órdenes que regirán
  21428. el comportamiento del mismo en el juego, después cada vez que se
  21429. quiera crear un proceso de dicho tipo, se deberá llamar al proceso
  21430. (ver como se hace una {#1033,llamada a un proceso}).
  21431.  
  21432. {¿Como eliminar un proceso?}
  21433.  
  21434. Para eliminar o "matar" a un proceso del juego, se puede ejecutar
  21435. una sentencia {#1028,RETURN} desde el mismo o bien, desde otro
  21436. proceso, enviarle una señal s_kill (ver la función {#158,signal()},
  21437. que es la empleada para esto).
  21438.  
  21439. {¿Cuales son las funciones para manejar el ratón?}
  21440.  
  21441. El ratón no se controla con ninguna función, sino con la estructura global
  21442. {#1100,mouse}, puede acceder a la ayuda sobre {lenguaje} / {datos globales} para
  21443. ver el resto de estructuras que controlan otros aspectos importantes de los
  21444. juegos.
  21445.  
  21446. {¿De donde carga todos los archivos DIV?}
  21447.  
  21448. Cuando en un programa se llama a una función como load_fpg( ... )
  21449. el gestor interno de DIV intenta localizar este archivo siguiendo
  21450. el siguiente esquema (supongamos que se intenta cargar el archivo
  21451. "DIR\FICHERO.EXT"):
  21452.  
  21453. - Primero se sitúa donde se encuentra el ejecutable (EXE) del juego,
  21454. o en el directorio principal de DIV (donde está D.EXE) en caso de
  21455. estar ejecutando el juego desde el entorno.
  21456.  
  21457. - Después se intenta abrir desde este directorio el archivo según
  21458. se ha especificado a la función ("DIR\FICHERO.EXT").
  21459.  
  21460. - En caso de no poder cargar este fichero, se intentará cargar el
  21461. fichero dentro de un directorio que tenga como nombre la extensión
  21462. del propio fichero, es decir "EXT\DIR\FICHERO.EXT".
  21463.  
  21464. - Si tampoco se ha encontrado este, se probará a cargar el fichero
  21465. sin indicar ninguna ruta, es decir "FICHERO.EXT".
  21466.  
  21467. - Y por último, si no se ha localizado el fichero en ninguno de los
  21468. anteriores directorios, se intentará buscar directamente en el
  21469. directorio cuyo nombre coincide con la extensión del fichero, obviando
  21470. la ruta de acceso que se le pasó a la función, es decir "EXT\FICHERO.EXT".
  21471.  
  21472. # ─────────────────────────────────────────────────────────────────────────────
  21473.  
  21474. {.2047,Ultimo término posible dentro de este hipertexto}
  21475.