void dealMouse(BALL* ball) { static int iCapture = -1, mx, my; int i; mouse_msg mouse = {0}; while (mousemsg()) { double dx, dy; mouse = getmouse(); dx = (mouse.x - mx) * 1.0f; dy = (mouse.y - my) * 1.0f; mx = mouse.x; my = mouse.y; if(iCapture == -1 && mouse.msg == mouse_msg_down) { for(i = MAXBALL - 1; i > -1; --i) if(ball[i].resmouse(mouse, dx, dy)) { iCapture = i; break; } } else if (iCapture >= 0 && (mouse.msg == mouse_msg_up || mouse.msg == mouse_msg_move) ) { if(ball[iCapture].resmouse(mouse, dx, dy) == 0) iCapture = -1; } } if (iCapture >= 0) { mouse.msg = (mouse_msg_e)0; ball[iCapture].resmouse(mouse, 0, 0); } }
// 主函数 int main( int argc, char* argv[] ) { int i, ms_x = -1024, ms_y = -1024, exitflag = 0; int fps = 60; double dtime; int mode = preinit( argc, argv ); // 记录初始化模式 if ( mode < 0 ) return 0; randomize(); // 初始化随机种子 initgraph( -1, -1 ); // 打开图形窗口,以全屏模式 showmouse( mode ); sc_width = getwidth(); sc_heigh = getheight(); // 初始化所有星星 for ( i = 0; i < g_max; i++ ) { InitStar( i ); star[i].x = randomf(); } // 绘制星空,按任意键或移动鼠标退出 setfont( 12, 6, "宋体" ); setrendermode( RENDER_MANUAL ); dtime = fclock(); while ( kbmsg() ) getkey(); for ( ; !exitflag && is_run() && kbmsg() == 0; delay_fps( fps ) ) { //每秒画120帧,kbhit(1)是获取键盘任意键的消息,详见pdf // 如果有鼠标消息 while ( mousemsg() ) { mouse_msg msg = getmouse(); if ( ms_x <= -1024 ) { ms_x = msg.x; ms_y = msg.y; } // 处理鼠标,移动超出范围就退出 if ( mode == 0 ) { // 仅全屏模式才处理鼠标 int x = msg.x, y = msg.y; x -= ms_x; y -= ms_y; if ( x * x + y * y > 400 ) exitflag = 1; } } // 显示星星 double dt = 1.0 / fps; //fclock() - dtime; dtime += dt; for ( int i = 0; i < g_max; i++ ) { MoveStar( i, dt ); } // 显示FPS { char str[60]; sprintf( str, "%8.2f FPS", getfps()); outtextxy( 0, 0, str ); //显示fps } } closegraph(); // 关闭图形窗口 return 0; }
bool run_game(){ mouse_msg msg = {0}; gen_pos(pos); while(mousemsg()){ msg = getmouse(); if(msg.is_down() && get_current_status() == C_BLACK_S ){ C_POS c_pos; int board_x,board_y; get_right_pos(msg.x,msg.y,&board_x,&board_y); c_pos.x = pos[board_x][board_y].x; c_pos.y = pos[board_x][board_y].y; draw_chess(&c_pos,BLACK); update_board_status(board_x,board_y,C_BLACK); if(is_win(board_x,board_y,C_BLACK)) xyprintf(480,120,black_win); update_status(white_status); } else if(msg.is_down() && get_current_status() == C_WHITE_S){ C_POS c_pos; int board_x,board_y; get_right_pos(msg.x,msg.y,&board_x,&board_y); c_pos.x = pos[board_x][board_y].x; c_pos.y = pos[board_x][board_y].y; draw_chess(&c_pos,WHITE); update_board_status(board_x,board_y,C_WHITE); if(is_win(board_x,board_y,C_WHITE)) xyprintf(480,120,white_win); update_status(black_status); } } return true; }