MOTOR.C
上传用户:sunrenlu
上传日期:2022-06-13
资源大小:1419k
文件大小:2k
源码类别:

操作系统开发

开发平台:

DOS

  1. /*
  2.  * motor - balls will attempt to catch up with the user's mouse
  3.  *
  4.  */
  5. #include <dos.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <rtos.h>
  9. #include "mouse.h"
  10. #define MAXBALLS 10
  11. #define MAXX 80
  12. #define MAXY 25
  13. typedef struct {
  14.     BYTE color;
  15.     WORD x, y;
  16. } ball_str;
  17. ball_str balls[ MAXBALLS ];
  18. int idealx = 0, idealy = 0;
  19. void put_on_screen( int x, int y, WORD ch, WORD opt_attr )
  20. {
  21.     static WORD far *screen = 0xb8000000;
  22.     WORD ofs;
  23.     ofs = y * 80 + x;
  24.     screen[ ofs ] = (WORD)ch | ((WORD)opt_attr)<<8;
  25. }
  26. void ball( DWORD num )
  27. {
  28.     ball_str *b;
  29.     int tempx, tempy;
  30.     b = &balls[ num ];
  31.     b->color = (num % 7) + 9;
  32.     b->x = MAXX / 2;
  33.     b->y = MAXY / 2;
  34.     do {
  35.         /* get new locaton */
  36.         tempx = b->x;
  37.         if ( tempx < idealx ) tempx++;
  38.         else if ( tempx > idealx ) tempx--;
  39.         tempy = b->y;
  40.         if ( tempy < idealy ) tempy++;
  41.         else if ( tempy > idealy ) tempy--;
  42.         /* erase old and accept new */
  43.         if ( (b->y != tempy ) || (b->x != tempx )) {
  44.             put_on_screen( b->x, b->y, ' ', 0 );
  45.             b->x = tempx;
  46.             b->y = tempy;
  47.         }
  48.         /* draw the ball */
  49.         put_on_screen( b->x, b->y, 9, b->color );
  50.         rt_sleep( 30 * num );
  51.     } while ( 1 );
  52. }
  53. void mouse_thread( DWORD dummy )
  54. {
  55.     int x, y, buttons;
  56.     do {
  57.         mouse_posn( &x, &y, &buttons );
  58.         idealx = x / 8;
  59.         idealy = y / 8;
  60.         rt_sleep( 10 );
  61.     } while ( 1 );
  62. }
  63. main(int argc, char **argv )
  64. {
  65.     int temp, max;
  66.     DWORD dummy;
  67.     char buf[128];
  68.     rt_init( 100 );
  69.     max = 10;
  70.     rt_timerfreq( 100 );
  71.     if ( mouse_init() == 0 )
  72.         rt_halt( "you need a mouse attached and the mouse driver loadedrn");
  73.     mouse_show( 1 );
  74.     clrscr();
  75.     cputs("move your mouse and the balls will follow it at varying speedsrn");
  76.     rt_newthread( &mouse_thread, 0, 1024, 0, "the mouse");
  77.     for ( temp = 0 ; temp < max; ++temp )
  78.         rt_newthread( &ball, temp, 1024, 0, "a ball");
  79.     while ( 1 ) {
  80.         if ( kbhit() ) break;
  81.         rt_sleep( 1000 );
  82.     }
  83.     /* clean up */
  84.     mouse_show( 0 );
  85. }
  86.