<1>/* Graphics Not Rendered in HTML */ #define APPLES_NUM 128 I64 x[APPLES_NUM],y[APPLES_NUM], cur_apple,cur_dist; Bool trigger; U0 DrawIt(CTask *,CDC *dc) { I64 i,best_dist=I64_MAX,best_apple=0; dc->flags|=DCF_LOCATE_NEAREST; dc->cur_x=ms.pos.x; dc->cur_y=ms.pos.y; dc->cur_z=0; for (i=0;i<APPLES_NUM;i++) { Sprite3(dc,x[i],y[i],0,<1>); if (dc->nearest_dist<=best_dist) { //Distance to nearest pix, squared //Sqrt() is expensive so we work with distance squared. best_dist=dc->nearest_dist; best_apple=i; } } if (trigger) { cur_apple=best_apple; cur_dist=best_dist; trigger=FALSE; } GrPrint(dc,FONT_WIDTH,FONT_HEIGHT,"Dist Squared:%d",cur_dist); } U0 Pick() { I64 i,msg_code,arg1,arg2,delta_x,delta_y; for (i=0;i<APPLES_NUM;i++) { x[i]=RandU16%GR_WIDTH; y[i]=RandU16%(GR_HEIGHT-FONT_HEIGHT*3)+FONT_HEIGHT*3; } SettingsPush; //See SettingsPush AutoComplete; DocCursor; DocClear; trigger=FALSE; cur_apple=cur_dist=0; Fs->draw_it=&DrawIt; Fs->win_inhibit=WIG_TASK_DFT-WIF_SELF_FOCUS-WIF_SELF_BORDER; try { while (TRUE) { if (GetMsg(&arg1,&arg2,1<<MSG_KEY_DOWN|1<<MSG_MS_L_DOWN)==MSG_KEY_DOWN) goto pi_done; //Wait for window mgr to call DrawIt() trigger=TRUE; do Refresh; while (trigger); //Use scrn coordinates, not window (arg1,arg2) //ms.pos.x and ms.pos.y are global vars updated //updated by the window mgr to hold the //scrn coordinates of the mouse. delta_x=x[cur_apple]-ms.pos.x; delta_y=y[cur_apple]-ms.pos.y; do { msg_code=GetMsg(&arg1,&arg2, 1<<MSG_KEY_DOWN|1<<MSG_MS_MOVE|1<<MSG_MS_L_UP); if (msg_code==MSG_KEY_DOWN) goto pi_done; x[cur_apple]=ms.pos.x+delta_x; y[cur_apple]=ms.pos.y+delta_y; } while (msg_code!=MSG_MS_L_UP); } pi_done: GetMsg(,,1<<MSG_KEY_UP); } catch PutExcept; SettingsPop; } Pick;