You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

пре 21 година
пре 21 година
пре 21 година
пре 21 година
пре 21 година
пре 21 година
пре 21 година
пре 21 година
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519
  1. /*
  2. * demo demo using libee
  3. * Copyright (c) 2003 Sam Hocevar <sam@zoy.org>
  4. * All Rights Reserved
  5. *
  6. * $Id$
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation; either version 2 of the License, or
  11. * (at your option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program; if not, write to the Free Software
  20. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  21. */
  22. #include "config.h"
  23. #include <math.h>
  24. #include <string.h>
  25. #include "ee.h"
  26. static void display_menu(void);
  27. static void demo_all(void);
  28. static void demo_dots(void);
  29. static void demo_lines(void);
  30. static void demo_thin_lines(void);
  31. static void demo_circles(void);
  32. static void demo_ellipses(void);
  33. static void demo_triangles(void);
  34. static void demo_outlined_triangles(void);
  35. static void demo_sprites(void);
  36. int force_clipping = 0;
  37. struct ee_sprite *sprite = NULL;
  38. int main(int argc, char **argv)
  39. {
  40. void (*demo)(void) = NULL;
  41. int quit = 0;
  42. if(ee_init())
  43. {
  44. return 1;
  45. }
  46. /* Initialize data */
  47. sprite = ee_load_sprite("data/bar_boss");
  48. /* Main menu */
  49. display_menu();
  50. /* Go ! */
  51. while(!quit)
  52. {
  53. char key = ee_get_key();
  54. if(key && demo)
  55. {
  56. display_menu();
  57. demo = NULL;
  58. }
  59. else if(key)
  60. {
  61. switch(key)
  62. {
  63. case 'q':
  64. demo = NULL;
  65. quit = 1;
  66. break;
  67. case '0':
  68. ee_clear();
  69. demo = demo_all;
  70. break;
  71. case '1':
  72. ee_clear();
  73. demo = demo_dots;
  74. break;
  75. case '2':
  76. ee_clear();
  77. demo = demo_lines;
  78. break;
  79. case '3':
  80. ee_clear();
  81. demo = demo_thin_lines;
  82. break;
  83. case '4':
  84. ee_clear();
  85. demo = demo_circles;
  86. break;
  87. case '5':
  88. ee_clear();
  89. demo = demo_ellipses;
  90. break;
  91. case '6':
  92. ee_clear();
  93. demo = demo_triangles;
  94. break;
  95. case '7':
  96. ee_clear();
  97. demo = demo_outlined_triangles;
  98. break;
  99. case '8':
  100. ee_clear();
  101. demo = demo_sprites;
  102. break;
  103. }
  104. }
  105. if(demo)
  106. demo();
  107. }
  108. /* Clean up */
  109. ee_free_sprite(sprite);
  110. ee_end();
  111. return 0;
  112. }
  113. static void display_menu(void)
  114. {
  115. int xo = ee_get_width() - 2;
  116. int yo = ee_get_height() - 2;
  117. ee_clear();
  118. ee_color(EE_WHITE);
  119. ee_draw_line(xo, yo, 1, yo, '.');
  120. ee_draw_line(1, yo, 1, 1, ':');
  121. ee_draw_line(xo, 1, xo, yo, ':');
  122. ee_draw_line(1, 1, xo, 1, '.');
  123. ee_goto((xo - strlen("libee demo")) / 2, 3);
  124. ee_putstr("libee demo");
  125. ee_goto((xo - strlen("============")) / 2, 4);
  126. ee_putstr("============");
  127. ee_goto(4, 6);
  128. ee_putstr("0: complete demo");
  129. ee_goto(4, 7);
  130. ee_putstr("1: dots demo");
  131. ee_goto(4, 8);
  132. ee_putstr("2: lines demo");
  133. ee_goto(4, 9);
  134. ee_putstr("3: thin lines demo");
  135. ee_goto(4, 10);
  136. ee_putstr("4: circles demo");
  137. ee_goto(4, 11);
  138. ee_putstr("5: ellipses demo");
  139. ee_goto(4, 12);
  140. ee_putstr("6: triangles demo");
  141. ee_goto(4, 13);
  142. ee_putstr("7: outlined triangles demo");
  143. ee_goto(4, 14);
  144. ee_putstr("8: sprites demo");
  145. ee_goto(4, yo - 2);
  146. ee_putstr("q: quit");
  147. ee_refresh();
  148. }
  149. static void demo_all(void)
  150. {
  151. static int i = 0;
  152. int j, xo, yo, x1, y1, x2, y2, x3, y3;
  153. i++;
  154. ee_clear();
  155. /* Draw the sun */
  156. ee_color(EE_YELLOW);
  157. xo = ee_get_width() / 4;
  158. yo = ee_get_height() / 4 + 5 * sin(0.03*i);
  159. for(j = 0; j < 16; j++)
  160. {
  161. x1 = xo - (30 + sin(0.03*i) * 8) * sin(0.03*i + M_PI*j/8);
  162. y1 = yo + (15 + sin(0.03*i) * 4) * cos(0.03*i + M_PI*j/8);
  163. ee_draw_thin_line(xo, yo, x1, y1);
  164. }
  165. ee_color(EE_WHITE);
  166. for(j = 15 + sin(0.03*i) * 8; j--;)
  167. {
  168. ee_draw_circle(xo, yo, j, '#');
  169. }
  170. ee_color(EE_YELLOW);
  171. ee_draw_circle(xo, yo, 15 + sin(0.03*i) * 8, '#');
  172. /* Draw the pyramid */
  173. xo = ee_get_width() * 5 / 8;
  174. yo = 2;
  175. x1 = ee_get_width() / 8 + sin(0.03*i) * 5;
  176. y1 = ee_get_height() / 2 + cos(0.03*i) * 5;
  177. x2 = ee_get_width() - 10 - cos(0.02*i) * 10;
  178. y2 = ee_get_height() * 3 / 4 - 5 + sin(0.02*i) * 5;
  179. x3 = ee_get_width() / 4 - sin(0.02*i) * 5;
  180. y3 = ee_get_height() * 3 / 4 + cos(0.02*i) * 5;
  181. ee_color(EE_GREEN);
  182. ee_fill_triangle(xo, yo, x2, y2, x1, y1, '%');
  183. ee_color(EE_YELLOW);
  184. ee_draw_thin_line(xo, yo, x2, y2);
  185. ee_draw_thin_line(x2, y2, x1, y1);
  186. ee_draw_thin_line(x1, y1, xo, yo);
  187. ee_color(EE_RED);
  188. ee_fill_triangle(x1, y1, x2, y2, x3, y3, '#');
  189. ee_color(EE_YELLOW);
  190. ee_draw_thin_line(x1, y1, x2, y2);
  191. ee_draw_thin_line(x2, y2, x3, y3);
  192. ee_draw_thin_line(x3, y3, x1, y1);
  193. ee_color(EE_BLUE);
  194. ee_fill_triangle(xo, yo, x2, y2, x3, y3, '%');
  195. ee_color(EE_YELLOW);
  196. ee_draw_thin_line(xo, yo, x2, y2);
  197. ee_draw_thin_line(x2, y2, x3, y3);
  198. ee_draw_thin_line(x3, y3, xo, yo);
  199. /* Draw a background triangle */
  200. x1 = 2;
  201. y1 = 2;
  202. x2 = ee_get_width() - 3;
  203. y2 = ee_get_height() / 2;
  204. x3 = ee_get_width() / 3;
  205. y3 = ee_get_height() - 3;
  206. ee_color(EE_BLUE);
  207. // ee_fill_triangle(x1, y1, x2, y2, x3, y3, '.');
  208. ee_color(EE_CYAN);
  209. ee_draw_thin_line(x1, y1, x3, y3);
  210. ee_draw_thin_line(x2, y2, x1, y1);
  211. ee_draw_thin_line(x3, y3, x2, y2);
  212. xo = ee_get_width() / 2 + cos(0.027*i) * ee_get_width() / 3;
  213. yo = ee_get_height() / 2 - sin(0.027*i) * ee_get_height() / 2;
  214. ee_draw_thin_line(x1, y1, xo, yo);
  215. ee_draw_thin_line(x2, y2, xo, yo);
  216. ee_draw_thin_line(x3, y3, xo, yo);
  217. /* Draw a sprite behind the pyramid */
  218. ee_draw_sprite(xo, yo, sprite);
  219. /* Draw a trail behind the foreground sprite */
  220. for(j = i - 60; j < i; j++)
  221. {
  222. int delta = ee_rand(-5, 5);
  223. ee_color(ee_rand(1, 10));
  224. ee_goto(ee_get_width() / 2
  225. + cos(0.02*j) * (delta + ee_get_width() / 4),
  226. ee_get_height() / 2
  227. + sin(0.02*j) * (delta + ee_get_height() / 3));
  228. ee_putchar('#');
  229. }
  230. /* Draw foreground sprite */
  231. ee_draw_sprite(ee_get_width() / 2 + cos(0.02*i) * ee_get_width() / 4,
  232. ee_get_height() / 2 + sin(0.02*i) * ee_get_height() / 3,
  233. sprite);
  234. ee_refresh();
  235. }
  236. static void demo_dots(void)
  237. {
  238. int xmax = ee_get_width() - 1;
  239. int ymax = ee_get_height() - 1;
  240. int i;
  241. for(i = 1000; i--;)
  242. {
  243. /* Putpixel */
  244. ee_color(ee_rand(1, 10));
  245. ee_goto(ee_rand(0, xmax), ee_rand(0, ymax));
  246. ee_putchar('#');
  247. }
  248. ee_refresh();
  249. }
  250. static void demo_lines(void)
  251. {
  252. int w = ee_get_width();
  253. int h = ee_get_height();
  254. /* Draw lines */
  255. ee_color(ee_rand(1, 10));
  256. if(force_clipping)
  257. {
  258. ee_draw_line(ee_rand(- w, 2 * w), ee_rand(- h, 2 * h),
  259. ee_rand(- w, 2 * w), ee_rand(- h, 2 * h), '#');
  260. }
  261. else
  262. {
  263. ee_draw_line(ee_rand(0, w - 1), ee_rand(0, h - 1),
  264. ee_rand(0, w - 1), ee_rand(0, h - 1), '#');
  265. }
  266. ee_refresh();
  267. }
  268. static void demo_thin_lines(void)
  269. {
  270. int w = ee_get_width();
  271. int h = ee_get_height();
  272. /* Draw lines */
  273. ee_color(ee_rand(1, 10));
  274. if(force_clipping)
  275. {
  276. ee_draw_thin_line(ee_rand(- w, 2 * w), ee_rand(- h, 2 * h),
  277. ee_rand(- w, 2 * w), ee_rand(- h, 2 * h));
  278. }
  279. else
  280. {
  281. ee_draw_thin_line(ee_rand(0, w), ee_rand(0, h),
  282. ee_rand(0, w), ee_rand(0, h));
  283. }
  284. ee_refresh();
  285. }
  286. static void demo_circles(void)
  287. {
  288. int w = ee_get_width();
  289. int h = ee_get_height();
  290. /* Draw circles */
  291. if(force_clipping)
  292. {
  293. ee_color(ee_rand(1, 10));
  294. ee_draw_circle(ee_rand(- w, 2 * w),
  295. ee_rand(- h, 2 * h),
  296. ee_rand(0, (w + h) / 2),
  297. '#');
  298. }
  299. else
  300. {
  301. int x = ee_rand(0, w);
  302. int y = ee_rand(0, h);
  303. int r = ee_rand(0, (w + h) / 2);
  304. if(x - r < 0 || x + r >= w || y - r < 0 || y + r >= h)
  305. {
  306. demo_circles();
  307. return;
  308. }
  309. ee_color(ee_rand(1, 10));
  310. ee_draw_circle(x, y, r, '#');
  311. }
  312. ee_refresh();
  313. }
  314. static void demo_ellipses(void)
  315. {
  316. int w = ee_get_width();
  317. int h = ee_get_height();
  318. /* Draw circles */
  319. if(force_clipping)
  320. {
  321. ee_color(ee_rand(1, 10));
  322. ee_draw_ellipse(ee_rand(- w, 2 * w),
  323. ee_rand(- h, 2 * h),
  324. ee_rand(0, w),
  325. ee_rand(0, h),
  326. '#');
  327. }
  328. else
  329. {
  330. int x = ee_rand(0, w);
  331. int y = ee_rand(0, h);
  332. int a = ee_rand(0, w);
  333. int b = ee_rand(0, h);
  334. if(x - a < 0 || x + a >= w || y - b < 0 || y + b >= h)
  335. {
  336. demo_ellipses();
  337. return;
  338. }
  339. ee_color(ee_rand(1, 10));
  340. ee_draw_ellipse(x, y, a, b, '#');
  341. }
  342. ee_refresh();
  343. }
  344. static void demo_triangles(void)
  345. {
  346. int w = ee_get_width();
  347. int h = ee_get_height();
  348. /* Draw lines */
  349. ee_color(ee_rand(1, 10));
  350. if(force_clipping)
  351. {
  352. ee_fill_triangle(ee_rand(- w, 2 * w), ee_rand(- h, 2 * h),
  353. ee_rand(- w, 2 * w), ee_rand(- h, 2 * h),
  354. ee_rand(- w, 2 * w), ee_rand(- h, 2 * h), '#');
  355. }
  356. else
  357. {
  358. ee_fill_triangle(ee_rand(0, w - 1), ee_rand(0, h - 1),
  359. ee_rand(0, w - 1), ee_rand(0, h - 1),
  360. ee_rand(0, w - 1), ee_rand(0, h - 1), '#');
  361. }
  362. ee_refresh();
  363. }
  364. static void demo_outlined_triangles(void)
  365. {
  366. int w = ee_get_width();
  367. int h = ee_get_height();
  368. int x1, y1, x2, y2, x3, y3;
  369. /* Draw lines */
  370. ee_color(ee_rand(1, 10));
  371. if(force_clipping)
  372. {
  373. x1 = ee_rand(- w, 2 * w);
  374. y1 = ee_rand(- h, 2 * h);
  375. x2 = ee_rand(- w, 2 * w);
  376. y2 = ee_rand(- h, 2 * h);
  377. x3 = ee_rand(- w, 2 * w);
  378. y3 = ee_rand(- h, 2 * h);
  379. }
  380. else
  381. {
  382. x1 = ee_rand(0, w - 1);
  383. y1 = ee_rand(0, h - 1);
  384. x2 = ee_rand(0, w - 1);
  385. y2 = ee_rand(0, h - 1);
  386. x3 = ee_rand(0, w - 1);
  387. y3 = ee_rand(0, h - 1);
  388. }
  389. ee_fill_triangle(x1, y1, x2, y2, x3, y3, '#');
  390. ee_color(ee_rand(1, 10));
  391. ee_draw_thin_line(x1, y1, x2, y2);
  392. ee_draw_thin_line(x2, y2, x3, y3);
  393. ee_draw_thin_line(x3, y3, x1, y1);
  394. ee_refresh();
  395. }
  396. static void demo_sprites(void)
  397. {
  398. ee_draw_sprite(ee_rand(0, ee_get_width() - 1),
  399. ee_rand(0, ee_get_height() - 1), sprite);
  400. ee_refresh();
  401. }
  402. static void demo_pyramid(void)
  403. {
  404. static int i = 0;
  405. int xo, yo, x1, y1, x2, y2, x3, y3;
  406. i++;
  407. xo = ee_get_width() * 5 / 8;
  408. yo = 2;
  409. x1 = ee_get_width() / 8 + sin(0.03*i) * 5;
  410. y1 = ee_get_height() / 2 + cos(0.03*i) * 5;
  411. x2 = ee_get_width() - 10 - cos(0.02*i) * 10;
  412. y2 = ee_get_height() - 5 + sin(0.02*i) * 5;
  413. x3 = ee_get_width() / 4 - sin(0.02*i) * 5;
  414. y3 = ee_get_height() + cos(0.02*i) * 5;
  415. ee_clear();
  416. ee_color(EE_GREEN);
  417. ee_fill_triangle(xo, yo, x2, y2, x1, y1, '%');
  418. ee_color(EE_YELLOW);
  419. ee_draw_thin_line(xo, yo, x2, y2);
  420. ee_draw_thin_line(x2, y2, x1, y1);
  421. ee_draw_thin_line(x1, y1, xo, yo);
  422. ee_color(EE_RED);
  423. ee_fill_triangle(x1, y1, x2, y2, x3, y3, '#');
  424. ee_color(EE_YELLOW);
  425. ee_draw_thin_line(x1, y1, x2, y2);
  426. ee_draw_thin_line(x2, y2, x3, y3);
  427. ee_draw_thin_line(x3, y3, x1, y1);
  428. ee_color(EE_BLUE);
  429. ee_fill_triangle(xo, yo, x2, y2, x3, y3, '%');
  430. ee_color(EE_YELLOW);
  431. ee_draw_thin_line(xo, yo, x2, y2);
  432. ee_draw_thin_line(x2, y2, x3, y3);
  433. ee_draw_thin_line(x3, y3, xo, yo);
  434. ee_refresh();
  435. }