source: ttyvaders/trunk/test/demo.c @ 134

Last change on this file since 134 was 134, checked in by Sam Hocevar, 17 years ago
  • test/demo.c: + Ellipses demo.
  • Property svn:keywords set to Id
File size: 12.3 KB
Line 
1/*
2 *   demo          demo using libee
3 *   Copyright (c) 2003 Sam Hocevar <sam@zoy.org>
4 *                 All Rights Reserved
5 *
6 *   $Id: demo.c 134 2003-11-10 18:23:23Z sam $
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
23#include "config.h"
24
25#include <math.h>
26#include <string.h>
27
28#include "ee.h"
29
30static void display_menu(void);
31
32static void demo_all(void);
33
34static void demo_dots(void);
35static void demo_lines(void);
36static void demo_thin_lines(void);
37static void demo_circles(void);
38static void demo_ellipses(void);
39static void demo_triangles(void);
40static void demo_outlined_triangles(void);
41static void demo_sprites(void);
42
43int force_clipping = 0;
44struct ee_sprite *sprite = NULL;
45
46int main(int argc, char **argv)
47{
48    void (*demo)(void) = NULL;
49    int quit = 0;
50
51    if(ee_init())
52    {
53        return 1;
54    }
55
56    /* Initialize data */
57    sprite = ee_load_sprite("data/bar_boss");
58
59    /* Main menu */
60    display_menu();
61
62    /* Go ! */
63    while(!quit)
64    {
65        char key = ee_get_key();
66        if(key && demo)
67        {
68            display_menu();
69            demo = NULL;
70        }
71        else if(key)
72        {
73            switch(key)
74            {
75            case 'q':
76                demo = NULL;
77                quit = 1;
78                break;
79            case '0':
80                ee_clear();
81                demo = demo_all;
82                break;
83            case '1':
84                ee_clear();
85                demo = demo_dots;
86                break;
87            case '2':
88                ee_clear();
89                demo = demo_lines;
90                break;
91            case '3':
92                ee_clear();
93                demo = demo_thin_lines;
94                break;
95            case '4':
96                ee_clear();
97                demo = demo_circles;
98                break;
99            case '5':
100                ee_clear();
101                demo = demo_ellipses;
102                break;
103            case '6':
104                ee_clear();
105                demo = demo_triangles;
106                break;
107            case '7':
108                ee_clear();
109                demo = demo_outlined_triangles;
110                break;
111            case '8':
112                ee_clear();
113                demo = demo_sprites;
114                break;
115            }
116        }
117
118        if(demo)
119            demo();
120    }
121
122    /* Clean up */
123    ee_free_sprite(sprite);
124    ee_end();
125
126    return 0;
127}
128
129static void display_menu(void)
130{
131    int xo = ee_get_width() - 2;
132    int yo = ee_get_height() - 2;
133
134    ee_clear();
135    ee_color(EE_WHITE);
136    ee_draw_line(xo, yo, 1, yo, '.');
137    ee_draw_line(1, yo, 1, 1, ':');
138    ee_draw_line(xo, 1, xo, yo, ':');
139    ee_draw_line(1, 1, xo, 1, '.');
140
141    ee_goto((xo - strlen("libee demo")) / 2, 3);
142    ee_putstr("libee demo");
143    ee_goto((xo - strlen("============")) / 2, 4);
144    ee_putstr("============");
145
146    ee_goto(4, 6);
147    ee_putstr("0: complete demo");
148    ee_goto(4, 7);
149    ee_putstr("1: dots demo");
150    ee_goto(4, 8);
151    ee_putstr("2: lines demo");
152    ee_goto(4, 9);
153    ee_putstr("3: thin lines demo");
154    ee_goto(4, 10);
155    ee_putstr("4: circles demo");
156    ee_goto(4, 11);
157    ee_putstr("5: ellipses demo");
158    ee_goto(4, 12);
159    ee_putstr("6: triangles demo");
160    ee_goto(4, 13);
161    ee_putstr("7: outlined triangles demo");
162    ee_goto(4, 14);
163    ee_putstr("8: sprites demo");
164
165    ee_goto(4, yo - 2);
166    ee_putstr("q: quit");
167
168    ee_refresh();
169}
170
171static void demo_all(void)
172{
173    static int i = 0;
174
175    int j, xo, yo, x1, y1, x2, y2, x3, y3;
176
177    i++;
178
179    ee_clear();
180
181    /* Draw the sun */
182    ee_color(EE_YELLOW);
183    xo = ee_get_width() / 4;
184    yo = ee_get_height() / 4 + 5 * sin(0.03*i);
185
186    for(j = 0; j < 16; j++)
187    {
188        x1 = xo - (30 + sin(0.03*i) * 8) * sin(0.03*i + M_PI*j/8);
189        y1 = yo + (15 + sin(0.03*i) * 4) * cos(0.03*i + M_PI*j/8);
190        ee_draw_thin_line(xo, yo, x1, y1);
191    }
192
193    ee_color(EE_WHITE);
194    for(j = 15 + sin(0.03*i) * 8; j--;)
195    {
196        ee_draw_circle(xo, yo, j, '#');
197    }
198
199    ee_color(EE_YELLOW);
200    ee_draw_circle(xo, yo, 15 + sin(0.03*i) * 8, '#');
201
202    /* Draw the pyramid */
203    xo = ee_get_width() * 5 / 8;
204    yo = 2;
205
206    x1 = ee_get_width() / 8 + sin(0.03*i) * 5;
207    y1 = ee_get_height() / 2 + cos(0.03*i) * 5;
208
209    x2 = ee_get_width() - 10 - cos(0.02*i) * 10;
210    y2 = ee_get_height() * 3 / 4 - 5 + sin(0.02*i) * 5;
211
212    x3 = ee_get_width() / 4 - sin(0.02*i) * 5;
213    y3 = ee_get_height() * 3 / 4 + cos(0.02*i) * 5;
214
215    ee_color(EE_GREEN);
216    ee_fill_triangle(xo, yo, x2, y2, x1, y1, '%');
217    ee_color(EE_YELLOW);
218    ee_draw_thin_line(xo, yo, x2, y2);
219    ee_draw_thin_line(x2, y2, x1, y1);
220    ee_draw_thin_line(x1, y1, xo, yo);
221
222    ee_color(EE_RED);
223    ee_fill_triangle(x1, y1, x2, y2, x3, y3, '#');
224    ee_color(EE_YELLOW);
225    ee_draw_thin_line(x1, y1, x2, y2);
226    ee_draw_thin_line(x2, y2, x3, y3);
227    ee_draw_thin_line(x3, y3, x1, y1);
228
229    ee_color(EE_BLUE);
230    ee_fill_triangle(xo, yo, x2, y2, x3, y3, '%');
231    ee_color(EE_YELLOW);
232    ee_draw_thin_line(xo, yo, x2, y2);
233    ee_draw_thin_line(x2, y2, x3, y3);
234    ee_draw_thin_line(x3, y3, xo, yo);
235
236    /* Draw a background triangle */
237    x1 = 2;
238    y1 = 2;
239
240    x2 = ee_get_width() - 3;
241    y2 = ee_get_height() / 2;
242
243    x3 = ee_get_width() / 3;
244    y3 = ee_get_height() - 3;
245
246    ee_color(EE_BLUE);
247//    ee_fill_triangle(x1, y1, x2, y2, x3, y3, '.');
248    ee_color(EE_CYAN);
249    ee_draw_thin_line(x1, y1, x3, y3);
250    ee_draw_thin_line(x2, y2, x1, y1);
251    ee_draw_thin_line(x3, y3, x2, y2);
252
253    xo = ee_get_width() / 2 + cos(0.027*i) * ee_get_width() / 3;
254    yo = ee_get_height() / 2 - sin(0.027*i) * ee_get_height() / 2;
255
256    ee_draw_thin_line(x1, y1, xo, yo);
257    ee_draw_thin_line(x2, y2, xo, yo);
258    ee_draw_thin_line(x3, y3, xo, yo);
259
260    /* Draw a sprite behind the pyramid */
261    ee_draw_sprite(xo, yo, sprite);
262
263    /* Draw a trail behind the foreground sprite */
264    for(j = i - 60; j < i; j++)
265    {
266        int delta = ee_rand(-5, 5);
267        ee_color(ee_rand(1, 10));
268        ee_goto(ee_get_width() / 2
269                 + cos(0.02*j) * (delta + ee_get_width() / 4),
270                ee_get_height() / 2
271                 + sin(0.02*j) * (delta + ee_get_height() / 3));
272        ee_putchar('#');
273    }
274
275    /* Draw foreground sprite */
276    ee_draw_sprite(ee_get_width() / 2 + cos(0.02*i) * ee_get_width() / 4,
277                   ee_get_height() / 2 + sin(0.02*i) * ee_get_height() / 3,
278                   sprite);
279
280    ee_refresh();
281}
282
283static void demo_dots(void)
284{
285    int xmax = ee_get_width() - 1;
286    int ymax = ee_get_height() - 1;
287    int i;
288
289    for(i = 1000; i--;)
290    {
291        /* Putpixel */
292        ee_color(ee_rand(1, 10));
293        ee_goto(ee_rand(0, xmax), ee_rand(0, ymax));
294        ee_putchar('#');
295    }
296    ee_refresh();
297}
298
299static void demo_lines(void)
300{
301    int w = ee_get_width();
302    int h = ee_get_height();
303
304    /* Draw lines */
305    ee_color(ee_rand(1, 10));
306    if(force_clipping)
307    {
308        ee_draw_line(ee_rand(- w, 2 * w), ee_rand(- h, 2 * h),
309                     ee_rand(- w, 2 * w), ee_rand(- h, 2 * h), '#');
310    }
311    else
312    {
313        ee_draw_line(ee_rand(0, w - 1), ee_rand(0, h - 1),
314                     ee_rand(0, w - 1), ee_rand(0, h - 1), '#');
315    }
316    ee_refresh();
317}
318
319static void demo_thin_lines(void)
320{
321    int w = ee_get_width();
322    int h = ee_get_height();
323
324    /* Draw lines */
325    ee_color(ee_rand(1, 10));
326    if(force_clipping)
327    {
328        ee_draw_thin_line(ee_rand(- w, 2 * w), ee_rand(- h, 2 * h),
329                          ee_rand(- w, 2 * w), ee_rand(- h, 2 * h));
330    }
331    else
332    {
333        ee_draw_thin_line(ee_rand(0, w), ee_rand(0, h),
334                          ee_rand(0, w), ee_rand(0, h));
335    }
336    ee_refresh();
337}
338
339static void demo_circles(void)
340{
341    int w = ee_get_width();
342    int h = ee_get_height();
343
344    /* Draw circles */
345    if(force_clipping)
346    {
347        ee_color(ee_rand(1, 10));
348        ee_draw_circle(ee_rand(- w, 2 * w),
349                       ee_rand(- h, 2 * h),
350                       ee_rand(0, (w + h) / 2),
351                       '#');
352    }
353    else
354    {
355        int x = ee_rand(0, w);
356        int y = ee_rand(0, h);
357        int r = ee_rand(0, (w + h) / 2);
358
359        if(x - r < 0 || x + r >= w || y - r < 0 || y + r >= h)
360        {
361            demo_circles();
362            return;
363        }
364
365        ee_color(ee_rand(1, 10));
366        ee_draw_circle(x, y, r, '#');
367    }
368
369    ee_refresh();
370}
371
372static void demo_ellipses(void)
373{
374    int w = ee_get_width();
375    int h = ee_get_height();
376
377    /* Draw circles */
378    if(force_clipping)
379    {
380        ee_color(ee_rand(1, 10));
381        ee_draw_ellipse(ee_rand(- w, 2 * w),
382                        ee_rand(- h, 2 * h),
383                        ee_rand(0, w),
384                        ee_rand(0, h),
385                        '#');
386    }
387    else
388    {
389        int x = ee_rand(0, w);
390        int y = ee_rand(0, h);
391        int a = ee_rand(0, w);
392        int b = ee_rand(0, h);
393
394        if(x - a < 0 || x + a >= w || y - b < 0 || y + b >= h)
395        {
396            demo_ellipses();
397            return;
398        }
399
400        ee_color(ee_rand(1, 10));
401        ee_draw_ellipse(x, y, a, b, '#');
402    }
403
404    ee_refresh();
405}
406
407static void demo_triangles(void)
408{
409    int w = ee_get_width();
410    int h = ee_get_height();
411
412    /* Draw lines */
413    ee_color(ee_rand(1, 10));
414    if(force_clipping)
415    {
416        ee_fill_triangle(ee_rand(- w, 2 * w), ee_rand(- h, 2 * h),
417                         ee_rand(- w, 2 * w), ee_rand(- h, 2 * h),
418                         ee_rand(- w, 2 * w), ee_rand(- h, 2 * h), '#');
419    }
420    else
421    {
422        ee_fill_triangle(ee_rand(0, w - 1), ee_rand(0, h - 1),
423                         ee_rand(0, w - 1), ee_rand(0, h - 1),
424                         ee_rand(0, w - 1), ee_rand(0, h - 1), '#');
425    }
426    ee_refresh();
427}
428
429static void demo_outlined_triangles(void)
430{
431    int w = ee_get_width();
432    int h = ee_get_height();
433    int x1, y1, x2, y2, x3, y3;
434
435    /* Draw lines */
436    ee_color(ee_rand(1, 10));
437    if(force_clipping)
438    {
439        x1 = ee_rand(- w, 2 * w);
440        y1 = ee_rand(- h, 2 * h);
441        x2 = ee_rand(- w, 2 * w);
442        y2 = ee_rand(- h, 2 * h);
443        x3 = ee_rand(- w, 2 * w);
444        y3 = ee_rand(- h, 2 * h);
445    }
446    else
447    {
448
449        x1 = ee_rand(0, w - 1);
450        y1 = ee_rand(0, h - 1);
451        x2 = ee_rand(0, w - 1);
452        y2 = ee_rand(0, h - 1);
453        x3 = ee_rand(0, w - 1);
454        y3 = ee_rand(0, h - 1);
455    }
456
457    ee_fill_triangle(x1, y1, x2, y2, x3, y3, '#');
458
459    ee_color(ee_rand(1, 10));
460    ee_draw_thin_line(x1, y1, x2, y2);
461    ee_draw_thin_line(x2, y2, x3, y3);
462    ee_draw_thin_line(x3, y3, x1, y1);
463
464    ee_refresh();
465}
466
467static void demo_sprites(void)
468{
469    ee_draw_sprite(ee_rand(0, ee_get_width() - 1),
470                   ee_rand(0, ee_get_height() - 1), sprite);
471    ee_refresh();
472}
473
474static void demo_pyramid(void)
475{
476    static int i = 0;
477
478    int xo, yo, x1, y1, x2, y2, x3, y3;
479
480    i++;
481
482    xo = ee_get_width() * 5 / 8;
483    yo = 2;
484
485    x1 = ee_get_width() / 8 + sin(0.03*i) * 5;
486    y1 = ee_get_height() / 2 + cos(0.03*i) * 5;
487
488    x2 = ee_get_width() - 10 - cos(0.02*i) * 10;
489    y2 = ee_get_height() - 5 + sin(0.02*i) * 5;
490
491    x3 = ee_get_width() / 4 - sin(0.02*i) * 5;
492    y3 = ee_get_height() + cos(0.02*i) * 5;
493
494    ee_clear();
495
496    ee_color(EE_GREEN);
497    ee_fill_triangle(xo, yo, x2, y2, x1, y1, '%');
498    ee_color(EE_YELLOW);
499    ee_draw_thin_line(xo, yo, x2, y2);
500    ee_draw_thin_line(x2, y2, x1, y1);
501    ee_draw_thin_line(x1, y1, xo, yo);
502
503    ee_color(EE_RED);
504    ee_fill_triangle(x1, y1, x2, y2, x3, y3, '#');
505    ee_color(EE_YELLOW);
506    ee_draw_thin_line(x1, y1, x2, y2);
507    ee_draw_thin_line(x2, y2, x3, y3);
508    ee_draw_thin_line(x3, y3, x1, y1);
509
510    ee_color(EE_BLUE);
511    ee_fill_triangle(xo, yo, x2, y2, x3, y3, '%');
512    ee_color(EE_YELLOW);
513    ee_draw_thin_line(xo, yo, x2, y2);
514    ee_draw_thin_line(x2, y2, x3, y3);
515    ee_draw_thin_line(x3, y3, xo, yo);
516
517    ee_refresh();
518}
519
Note: See TracBrowser for help on using the repository browser.