<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 = mouse.pos.x; dc->cur_y = mouse.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, message_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_DEFAULT - WIF_SELF_FOCUS - WIF_SELF_BORDER; try { while (TRUE) { if (MessageGet(&arg1, &arg2, 1 << MESSAGE_KEY_DOWN | 1 << MESSAGE_MS_L_DOWN) == MESSAGE_KEY_DOWN) goto pi_done; //Wait for window mgr to call DrawIt() trigger = TRUE; do Refresh; while (trigger); //Use screen coordinates, not window (arg1,arg2) //mouse.pos.x and mouse.pos.y are global variables updated //updated by the window mgr to hold the //screen coordinates of the mouse. delta_x = x[cur_apple] - mouse.pos.x; delta_y = y[cur_apple] - mouse.pos.y; do { message_code = MessageGet(&arg1, &arg2, 1 << MESSAGE_KEY_DOWN | 1 << MESSAGE_MS_MOVE | 1 << MESSAGE_MS_L_UP); if (message_code == MESSAGE_KEY_DOWN) goto pi_done; x[cur_apple] = mouse.pos.x + delta_x; y[cur_apple] = mouse.pos.y + delta_y; } while (message_code != MESSAGE_MS_L_UP); } pi_done: MessageGet(,, 1 << MESSAGE_KEY_UP); } catch PutExcept; SettingsPop; } Pick;