| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- /* bounce2d 1.0
- * bounce a character (default is 'o') around the screen
- * defined by some parameters
- *
- * user input: s slow down x component, S: slow y component
- * f speed up x component, F: speed y component
- * Q quit
- *
- * blocks on read, but timer tick sends SIGALRM caught by ball_move
- * build: cc bounce2d.c set_ticker.c -lcurses -o bounce2d
- */
- #include <curses.h>
- #include <signal.h>
- #include "bounce.h"
- struct ppball the_ball ;
- /** the main loop **/
- void set_up();
- void wrap_up();
- int main()
- {
- int c;
- set_up();
- while ( ( c = getchar()) != 'Q' ){
- if ( c == 'f' ) the_ball.x_ttm--;
- else if ( c == 's' ) the_ball.x_ttm++;
- else if ( c == 'F' ) the_ball.y_ttm--;
- else if ( c == 'S' ) the_ball.y_ttm++;
- }
- wrap_up();
- }
- void set_up()
- /*
- * init structure and other stuff
- */
- {
- void ball_move(int);
- the_ball.y_pos = Y_INIT;
- the_ball.x_pos = X_INIT;
- the_ball.y_ttg = the_ball.y_ttm = Y_TTM ;
- the_ball.x_ttg = the_ball.x_ttm = X_TTM ;
- the_ball.y_dir = 1 ;
- the_ball.x_dir = 1 ;
- the_ball.symbol = DFL_SYMBOL ;
- initscr();
- noecho();
- crmode();
- signal( SIGINT , SIG_IGN );
- mvaddch( the_ball.y_pos, the_ball.x_pos, the_ball.symbol );
- refresh();
-
- signal( SIGALRM, ball_move );
- set_ticker( 1000 / TICKS_PER_SEC ); /* send millisecs per tick */
- }
- void wrap_up()
- {
- set_ticker( 0 );
- endwin(); /* put back to normal */
- }
- void ball_move(int signum)
- {
- int y_cur, x_cur, moved;
- signal( SIGALRM , SIG_IGN ); /* dont get caught now */
- y_cur = the_ball.y_pos ; /* old spot */
- x_cur = the_ball.x_pos ;
- moved = 0 ;
- if ( the_ball.y_ttm > 0 && the_ball.y_ttg-- == 1 ){
- the_ball.y_pos += the_ball.y_dir ; /* move */
- the_ball.y_ttg = the_ball.y_ttm ; /* reset*/
- moved = 1;
- }
- if ( the_ball.x_ttm > 0 && the_ball.x_ttg-- == 1 ){
- the_ball.x_pos += the_ball.x_dir ; /* move */
- the_ball.x_ttg = the_ball.x_ttm ; /* reset*/
- moved = 1;
- }
- if ( moved ){
- mvaddch( y_cur, x_cur, BLANK );
- mvaddch( y_cur, x_cur, BLANK );
- mvaddch( the_ball.y_pos, the_ball.x_pos, the_ball.symbol );
- bounce_or_lose( &the_ball );
- move(LINES-1,COLS-1);
- refresh();
- }
- signal( SIGALRM, ball_move); /* for unreliable systems */
- }
- int bounce_or_lose(struct ppball *bp)
- {
- int return_val = 0 ;
- if ( bp->y_pos == TOP_ROW ){
- bp->y_dir = 1 ;
- return_val = 1 ;
- } else if ( bp->y_pos == BOT_ROW ){
- bp->y_dir = -1 ;
- return_val = 1;
- }
- if ( bp->x_pos == LEFT_EDGE ){
- bp->x_dir = 1 ;
- return_val = 1 ;
- } else if ( bp->x_pos == RIGHT_EDGE ){
- bp->x_dir = -1;
- return_val = 1;
- }
- return return_val;
- }
|