home *** CD-ROM | disk | FTP | other *** search
/ FreeWare Collection 2 / FreeSoftwareCollection2pd199x-jp.img / watch / watch.c < prev    next >
Text File  |  1990-06-14  |  8KB  |  226 lines

  1.  
  2.   /* 魔女の アナログ  時計 */
  3.  
  4.  #include <EGB.h>    /* グラフィック */
  5.  #include <math.h>   /* sin,cos */
  6.  #include <time.h>   /* time */
  7.  #include <mos.h>    /* マウス */
  8.  #include <stdlib.h>
  9.  #include <stdio.h>
  10.  #include <snd.h>
  11.  
  12.  #define PI 3.14159265358979323846
  13.  typedef unsigned int usint;
  14.  
  15. void main() 
  16.  {
  17.    char *fn = "MAJO.SND";       /*音声データの読込*/
  18.    char *mp;
  19.    FILE *fp;
  20.    mp  = malloc(60000);
  21.    fp = fopen(fn,"rb");
  22.    fread(mp,1,59999,fp);
  23.    fclose(fp);
  24.    *(int *)(mp + 20) = 0;
  25.       
  26.    char    *Gbuf;            /* TIF データの読込       */
  27.    char *fm = "MAJO.TIF";
  28.    Gbuf = malloc(154112);
  29.    fp = fopen(fm,"rb" );
  30.    fread(Gbuf,1,154112,fp);
  31.    fclose(fp);
  32.  
  33.    char swork[16384];           /* サウンド作業域       */
  34.    char work[1536];             /* グラフィック作業域   */
  35.    char mwork[4096];            /* マウス作業域         */
  36.    char para[64];
  37.    int t1,t2,t3;
  38.    double s1,s2,s3,sa,sb,sc;           /* 秒 分 時 */
  39.    int cnt,o,chm,xm,ym;
  40.    double i,j,a;
  41.    struct tm *newtime;
  42.    time_t ltime;
  43.    static int moji[12]={0x2330,0x2331,0x2332,0x2331,0x2332,0x2333,
  44.                         0x2334,0x2335,0x2336,0x2337,0x2338,0x2339};
  45.  
  46.    int    tifx,tify;
  47.    int    c, off;
  48.    tifx = *(Gbuf+31);
  49.    tifx <<= 8;
  50.    tifx |= *(Gbuf+30);                     /* X Size        */
  51.    tify = *(Gbuf+43);
  52.    tify <<= 8;
  53.    tify |= *(Gbuf+42);                     /* Y Size        */
  54.    
  55.    EGB_init(work,1536);                  /* 初期化              */
  56.    EGB_resolution(work,0,3);             /* 仮想画面の設定      */
  57.    EGB_resolution(work,1,10);
  58.    EGB_displayPage(work,0,1);            /* 表示ページの指定    */
  59.    EGB_writePage(work,1);                /* Write to Page 1    */
  60.     EGB_writeMode(work,0);
  61.     EGB_color(work,1,0);             /* 背景色 : Black    */
  62.     EGB_color(work,0,15);            /* 前景色 : L_White    */
  63.     EGB_clearScreen(work);
  64.     EGB_displayStart(work,1,0,0);    /* 仮想画面位置    */
  65.     EGB_displayStart(work,0,0,0);    /* 表示開始位置    */
  66.     EGB_displayStart(work,2,2,2);    /* 画面の拡大         */
  67.     EGB_displayStart(work,3,319,239);/* 画面の大きさ     */
  68.         off = 0x200;
  69.         for (c=0;c<tify;c++)
  70.              {
  71.             DWORD(para+0) = (usint)Gbuf+off;
  72.             WORD(para+4)  = 0x14;
  73.             WORD(para+6)  = 0;
  74.             WORD(para+8)  = c;
  75.             WORD(para+10) = tifx-1;
  76.             WORD(para+12) = c;
  77.             EGB_putBlock(work,0,para);
  78.             off += (tifx * 2);
  79.          }
  80.    EGB_writePage(work,0);
  81.    EGB_paintMode(work,0x22);           /* 面塗りモードの指定            */
  82.    EGB_color(work,2,0);                /* 面色の設定   色=黒            */
  83.    EGB_color(work,0,15);               /* 線色の設定   色=明るい白      */
  84.    EGB_color(work,1,8);                /* 背景色の設定 色=灰色          */
  85.    EGB_writeMode(work,0);              /* 描画モードの設定              */
  86.    EGB_pen(work,0);                    /* ペンの設定                    */
  87.    EGB_penSize(work,2);                /* ペンの太さ                    */
  88.    
  89.    WORD(para+0)=300;                   /* 時計の外枠 線色=明るい白のまま*/
  90.    WORD(para+2)=250;                   /*            面色=黒のまま      */
  91.    WORD(para+4)=205; 
  92.    EGB_circle(work,para);
  93.    
  94.    EGB_color(work,2,8);                /*面色で塗る 色=灰色             */
  95.    WORD(para+0)=10;
  96.    WORD(para+2)=10;
  97.    WORD(para+4)=1;
  98.    WORD(para+6)=0;
  99.    WORD(para+8)=15;                    /* 色=明るい白の回り             */
  100.    EGB_closePaint(work,para);
  101.   
  102.    cnt=-1;
  103.    for (i=0;i<60;i=i+1)                /* 目盛を書く                    */
  104.        { 
  105.          a=PI*6*i/180;
  106.          cnt=cnt+1;
  107.          WORD(para+0)=2;
  108.          WORD(para+2)=300-205*cos(a);
  109.          WORD(para+4)=250-205*sin(a);        
  110.          
  111.          if(cnt%5==0)
  112.            {
  113.             WORD(para+6)=300-195*cos(a);
  114.             WORD(para+8)=250-195*sin(a);
  115.            }         
  116.          else
  117.            {
  118.             WORD(para+6)=300-200*cos(a);
  119.             WORD(para+8)=250-200*sin(a);
  120.            }
  121.          EGB_unConnect(work,para);              
  122.         } 
  123.    
  124.    j=0;                               /*1-12の文字を書く             */
  125.    for(o=0;o<12;o=o+1)
  126.       {
  127.        j=j+1;
  128.        WORD(para+0)=300-175*cos(30*PI*j/180)-20;
  129.        WORD(para+2)=250-175*sin(30*PI*j/180)+20;
  130.        if(o<3)
  131.          {
  132.           EGB_textZoom(work,1,20,40);  /*10-12を書く                  */ 
  133.           WORD(para+4)=2;
  134.           WORD(para+6)=0x2331;
  135.           WORD(para+8)=moji[o];
  136.          } 
  137.        else  
  138.          {                             /*1-9を書く                    */
  139.           EGB_textZoom(work,1,40,40);
  140.           WORD(para+4)=1;
  141.           WORD(para+6)=moji[o];
  142.          }
  143.        EGB_penSize(work,4);            /* ペンの太さ                  */
  144.        EGB_color(work,0,7);            /* 線色の設定 色=白            */
  145.        EGB_jisString(work,para);
  146.       }
  147.    SND_init(swork);
  148.    SND_pcm_mode_set(8);                /* 音声モードチャンネルの設定 */            SND_volume_change(64,127);          /* チャンネル音量設定         */
  149.    SND_elevol_all_mute(0);             /* オールミュート             */
  150.    SND_elevol_mute(1);                 /* 電子ボリュームミュート設定 */
  151.    SND_elevol_all_mute(1);             /* オールミュート             */
  152.    MOS_start(mwork,4096);              /* マウスインターフェイスの動作開始 */
  153.    MOS_resolution(0,3);                /* マウス仮想画面の設定       */
  154.    MOS_disp(1);                        /* マウスカソールの表示の設定 */
  155. /* 針を書く */
  156.    do
  157.      {
  158.        ltime = time( NULL ) ;                       /* 時間     */
  159.        newtime = localtime( <ime ) ;
  160.        t1 = newtime->tm_sec ;  
  161.        t2 = newtime->tm_min ;
  162.        t3 = newtime->tm_hour ;
  163.  
  164.        s1=(90+t1*6)*PI/180;
  165.        sa=(90+(t1-1)*6)*PI/180;
  166.        s2=(90+t2*6)*PI/180;
  167.        sb=(90+(t2-1)*6)*PI/180;
  168.        s3=(90+t3*30+t2*0.5)*PI/180;
  169.        sc=(90+t3*30+(t2-3)*0.5)*PI/180;
  170.  
  171.        WORD(para+0)=2;
  172.        WORD(para+2)=300;
  173.        WORD(para+4)=250;
  174.  
  175.        if(t2==0 && t1==0){
  176.             EGB_displayPage(work,0,2);          /* 表示ページの指定   */
  177.             SND_pcm_play(64,64,127,mp);         /* 再生               */
  178.             while(0 != SND_pcm_status(64));     /* 再生状態のチェック */
  179.             EGB_displayPage(work,0,1);          /* 表示ページの指定   */
  180.                  }      
  181.        else{
  182.        EGB_color(work,0,14);                    /* 秒針  色=黄色      */
  183.        EGB_penSize(work,1);
  184.        WORD(para+6)=300-165*cos(s1);
  185.        WORD(para+8)=250-165*sin(s1);
  186.        EGB_unConnect(work,para);             
  187.        EGB_unConnect(work,para);             
  188.        EGB_unConnect(work,para);  
  189.       
  190.        EGB_color(work,0,15);                     /* 色=明るい白       */
  191.        EGB_penSize(work,2);
  192.        WORD(para+6)=300-150*cos(s2);             /* 分針              */
  193.        WORD(para+8)=250-150*sin(s2);
  194.        EGB_unConnect(work,para);  
  195.        EGB_unConnect(work,para);              
  196.        EGB_unConnect(work,para);              
  197.      
  198.        EGB_color(work,0,7);                      /* 色=白             */
  199.        EGB_penSize(work,2);
  200.        WORD(para+6)=300-120*cos(s3);             /* 時針              */
  201.        WORD(para+8)=250-120*sin(s3);
  202.        EGB_unConnect(work,para);  
  203.        EGB_unConnect(work,para);  
  204.        EGB_unConnect(work,para);  
  205.        }
  206.      /* 過ぎ去った針を消す*/   
  207.        EGB_color(work,0,0);                      /* 色=黒             */
  208.        EGB_penSize(work,1);                      /* 秒針              */
  209.        WORD(para+6)=300-165*cos(sa);
  210.        WORD(para+8)=250-165*sin(sa);
  211.        EGB_unConnect(work,para);             
  212.        EGB_penSize(work,2);                      /* 分針              */
  213.        WORD(para+6)=300-150*cos(sb);
  214.        WORD(para+8)=250-150*sin(sb);
  215.        EGB_unConnect(work,para);             
  216.        EGB_penSize(work,2);                      /* 時針              */
  217.        WORD(para+6)=300-120*cos(sc);
  218.        WORD(para+8)=250-120*sin(sc);
  219.        EGB_unConnect(work,para);             
  220.        MOS_rdpos(&chm,&xm,&ym);                  /*マウス状態の読み取り*/
  221.       }while(chm !=3);                           /*マウス両ボタンで終了*/
  222.    MOS_end();                                    /*マウス動作終了の設定*/
  223.    free(mp); 
  224.    SND_end();
  225.   }  /* main */
  226.