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