////////////////////////////////////////////////////////////////////////////// //Groboプログラム // //satt_f.c // //環境 grace FreeBSD 8.3 R //rkito 2012/07/05 // //Grobo(satt)用関数ファイル. ///////////////////////////////////////////////////////////////////////////// #ifndef INCLUDED_SATT_H #include "satt_h.h" #endif void set_up_win(void) { d = XOpenDisplay( NULL );//Xサーバーに接続する screen=DefaultScreen(d); white=WhitePixel( d, screen ); black=BlackPixel( d, screen ); //ウインドウの作成 w = XCreateSimpleWindow( d, RootWindow(d,screen), WIN_X, WIN_Y, WIN_W, WIN_H,//ウインドウのサイズ BORDER,black,//枠の設定 white);//背景色の色番号 //ウインドウ名の設定 XStoreName(d, w, "test Window"); XSetIconName(d, w, "test Window"); //グラフィックコンテキストを取得 gc = XCreateGC( d, RootWindow( d,screen ), 0, 0); //イベントマスクを登録 XSelectInput( d, w,ExposureMask); //マップして表示 XMapWindow( d, w ); } void exit_x(void) { XFreeGC( d, gc ); XDestroyWindow( d, w ); XCloseDisplay( d ); } void set_up_font(void) { /* ロケールを設定する(現在システムに設定されているロケールを使用) */ setlocale( LC_CTYPE, "" ); /* Xlib が現在のロケールを扱えるかどうかを判断する */ XSupportsLocale(); XSetBackground( d, gc, white ); XSetForeground( d, gc, black ); /* フォントセットを生成する */ fs1 = XCreateFontSet( d, "-*-fixed-medium-r-normal--150-*-*-*", &missing_list, &missing_count, &def_string ); fs2 = XCreateFontSet( d, "-*-fixed-medium-r-normal--50-*-*-*", &missing_list, &missing_count, &def_string ); XFreeStringList( missing_list ); } void set_up_button(Window *pbutton,int wx,int wy,int ww,int wh,XFontSet fs,int x,int y ,char str[]) { //ボタン作成---------------------------------------------------------------------- //ウィンドウをウインドウの中に作成してボタンにする *pbutton=XCreateSimpleWindow( d, w, wx,wy,ww,wh,//ウインドウのサイズ BORDER,black,//枠の設定 WhitePixel(d,screen));//背景色の色番号 //マップして表示 XMapWindow( d, *pbutton ); //イベントマスクを登録 XSelectInput( d, *pbutton,ButtonPressMask | ButtonReleaseMask); //---------------------------------------------------------------------- XmbDrawString( d, *pbutton,fs, gc, x, y, str, strlen(str)); } int button_effect(void) { if(XPending(d) != 0) { XNextEvent( d, &event ); switch(event.type) { case ButtonPress://画面上でマウスのボタンが押された時 if(button1==event.xany.window)//ボタンのイベントかどうかの判定 { XSetWindowBorderWidth( d, event.xany.window, BORDER+1 );//ボーダーラインを太くする } if(button2==event.xany.window)//ボタンのイベントかどうかの判定 { XSetWindowBorderWidth( d, event.xany.window, BORDER+1 );//ボーダーラインを太くする } if(button3==event.xany.window)//ボタンのイベントかどうかの判定 { XSetWindowBorderWidth( d, event.xany.window, BORDER+1 );//ボーダーラインを太くする } XFlush( d ); break; case ButtonRelease://画面上でマウスのボタンが離された時 if(button1==event.xany.window)//ボタンのイベントかどうかの判定 { XSetWindowBorderWidth( d, event.xany.window, BORDER );//ボーダーラインを細くする return 1; } if(button2==event.xany.window)//ボタンのイベントかどうかの判定 { XSetWindowBorderWidth( d, event.xany.window, BORDER );//ボーダーラインを太くする return 2; } if(button3==event.xany.window)//ボタンのイベントかどうかの判定 { XSetWindowBorderWidth( d, event.xany.window, BORDER );//ボーダーラインを太くする return 3; } default: break; } return 0; } } //レベル設定画面表示 void set_up_level (void) { set_up_button(&button1,B_WIN_X,B_WIN_Y,B_WIN_W,B_WIN_H,fs2,10,75,"HARD"); set_up_button(&button2,B_WIN_X+250,B_WIN_Y,B_WIN_W,B_WIN_H,fs2,10,75,"NORMAL"); set_up_button(&button3,B_WIN_X+500,B_WIN_Y,B_WIN_W,B_WIN_H,fs2,10,75,"EASY"); sprintf(string,"レベル設定"); XmbDrawString( d, w, fs1, gc, 0, 200, string, strlen( string ) ); while(flg) { switch(button_effect()) { case 1: sprintf(level,"HARD"); up_time=H_UP_TIME; interval_time=H_I_TIME; flg=0; break; case 2: sprintf(level,"NORMAL"); up_time=N_UP_TIME; interval_time=N_I_TIME; flg=0; break; case 3: sprintf(level,"EASY"); up_time=E_UP_TIME; interval_time=E_I_TIME; flg=0; break; default: break; } } XDestroyWindow(d,button1); XDestroyWindow(d,button2); XDestroyWindow(d,button3); XClearWindow(d,w); flg=1; } void set_up_time(void) { set_up_button(&button1,B_WIN_X+250,B_WIN_Y,B_WIN_W,B_WIN_H,fs2,5,75,"強制終了"); set_up_button(&target1,600,350,50,50,fs2,10,35,"1"); set_up_button(&target2,660,350,50,50,fs2,10,35,"2"); set_up_button(&target3,600,410,50,50,fs2,10,35,"3"); set_up_button(&target4,660,410,50,50,fs2,10,35,"4"); time(&time1); sprintf(string,"あと%d秒",TIME_LIMIT); XmbDrawString( d, w, fs1, gc, 100, 200, string, strlen( string ) ); } void time_limit(void) { time(&time2); d_time1=(int)difftime(time2,time1); if(d_time1 != d_time2) { if(TIME_LIMIT+1-d_time1>=0) { sprintf(string,"あと%d秒",TIME_LIMIT+1-d_time1); } else { flg=0; } XClearArea(d,w,0,0,WIN_W,WIN_H,0); } XmbDrawString( d, w, fs1, gc, 100, 200, string, strlen( string ) ); d_time2=(int)difftime(time2,time1); if(button_effect()==1) { exit_x(); exit(0); } } void game_start(void) { set_up_button(&button1,B_WIN_X+250,B_WIN_Y,B_WIN_W,B_WIN_H,fs2,10,75,"START"); sprintf(string,"レベル"); XmbDrawString( d, w, fs2, gc, 0, 50, string, strlen( string ) ); XmbDrawString( d, w, fs1, gc, 100, 200, level, strlen(level)); while(flg) { if(button_effect()==1) { flg=0; } } XDestroyWindow(d,button1); XClearWindow(d,w); flg=1; } void score_show() { XDestroyWindow(d,button1); XClearWindow(d,w); set_up_button(&button1,B_WIN_X+250,B_WIN_Y,B_WIN_W,B_WIN_H,fs2,30,75,"採点へ"); sprintf(string,"終了終了"); XmbDrawString( d, w, fs1, gc, 100, 200, string, strlen( string ) ); while(flg) { if(button_effect()==1) { flg=0; } } flg=1; XDestroyWindow(d,button1); XClearWindow(d,w); set_up_button(&button1,B_WIN_X,B_WIN_Y,B_WIN_W,B_WIN_H,fs2,1,75,"もう一度"); set_up_button(&button2,B_WIN_X+250,B_WIN_Y,B_WIN_W,B_WIN_H,fs2,50,75,"終了"); sprintf(string,"あなたの得点は"); XmbDrawString( d, w, fs2, gc, 0, 50, string, strlen( string ) ); sprintf(string,"%d/%d点",score,t_count); XmbDrawString( d, w, fs1, gc, 100, 200, string, strlen(string)); while(flg) { if(button_effect()==1) { flg=1; XDestroyWindow(d,button1); XDestroyWindow(d,button2); XDestroyWindow(d,target1); XDestroyWindow(d,target2); XDestroyWindow(d,target3); XDestroyWindow(d,target4); XClearWindow(d,w); d_time1=0; d_time2=0; t_count=0; score=0; break; } if(button_effect()==2) { flg=0; break; } } } void output(u_int8_t val) { for(i=0;i<50;i++) { ioctl(fd,PPISDATA,&val); usleep(2500); ioctl(fd,PPISDATA,&val_0); usleep(2500); } } void get_number(void) { time(&i_time2); if((int)difftime(i_time2,i_time1) >= interval_time) { while(flg) { number = rand() % 4; if(target[number] == 2) { break; } } switch(number) { case 0: out_val=0x01; output(out_val); time(&t_time[0]); target[0]=1; break; case 1: out_val=0x02; output(out_val); time(&t_time[1]); target[1]=1; break; case 2: out_val=0x04; output(out_val); time(&t_time[2]); target[2]=1; break; case 3: out_val=0x08; output(out_val); time(&t_time[3]); target[3]=1; break; default: break; } time(&i_time1); t_count++; } } void input(void) { ioctl(fd, PPIGSTATUS, &in_val); if(in_val != temp_val) { switch(temp_val ^ in_val) { printf("%X\n",temp_val ^ in_val); case 0x10: if(target[3]==1) { out_val=0x08; output(out_val); target[3]=2; score=score+1; break; } case 0x20: if(target[2]==1) { out_val=0x02; output(out_val); target[2]=2; score=score+1; break; } case 0x40: if(target[0]==1) { out_val=0x04; output(out_val); target[0]=2; score=score+1; break; } case 0x80: if(target[1]==1) { out_val=0x08; output(out_val); target[1]=2; score=score+1; break; } default: break; } } } void down_target(void) { for(i=0;i<4;i++) { time(&t_time[4]); if(target[i]==1 && (int) difftime(t_time[4],t_time[i]) >= up_time) { switch(i) { case 0: out_val=0x01; output(out_val); target[0]=2; break; case 1: out_val=0x02; output(out_val); target[1]=2; break; case 2: out_val=0x04; output(out_val); target[2]=2; break; case 3: out_val=0x08; output(out_val); target[3]=2; break; default: break; } } } } void finish_target(void) { out_val=0x00; for(i=0;i<4;i++) { if(target[i]==2) { switch(i) { case 0: out_val=out_val | 0x01; target[0]=1; break; case 1: out_val=out_val | 0x02; target[1]=1; break; case 2: out_val=out_val | 0x04; target[2]=1; break; case 3: out_val=out_val | 0x08; target[3]=1; break; default: break; } } } output(out_val); } void target_test(void) { for(i=0;i<4;i++) { if(target[i]==1) { switch(i) { case 0: XSetWindowBorderWidth( d, target1, BORDER+1); break; case 1: XSetWindowBorderWidth( d, target2, BORDER+1); break; case 2: XSetWindowBorderWidth( d, target3, BORDER+1); break; case 3: XSetWindowBorderWidth( d, target4, BORDER+1); break; default: break; } } else { switch(i) { case 0: XSetWindowBorderWidth( d, target1, BORDER); break; case 1: XSetWindowBorderWidth( d, target2, BORDER); break; case 2: XSetWindowBorderWidth( d, target3, BORDER); break; case 3: XSetWindowBorderWidth( d, target4, BORDER); break; default: break; } } } }