/*This shows how you can make a background very easily. */ <1>/* Graphics Not Rendered in HTML */ <2>/* Graphics Not Rendered in HTML */ CDC *background; #define BALL_TIME 0.2 #define FANS_NUM 10 I64 x[FANS_NUM], y[FANS_NUM]; Bool hit[FANS_NUM]; F64 theta[FANS_NUM], ball_t; I64 target_x, target_y, pitcher_x, pitcher_y; U0 DrawIt(CTask *,CDC *dc) { I64 i, *r; F64 xx, yy, t0; background->flags |= DCF_NO_TRANSPARENTS; GrBlot(dc, 0, 0, background); for (i = 0; i < FANS_NUM; i++) Sprite3ZB(dc, x[i], y[i], 0, <fan>, theta[i]); if (ball_t) { t0 = (tS - ball_t) / BALL_TIME; if (t0 > 1.0) ball_t = 0; else { xx = t0 * target_x + (1.0 - t0) * pitcher_x; yy = t0 * target_y + (1.0 - t0) * pitcher_y; xx /= 1.5 - t0; yy /= 1.5 - t0; r = Mat4x4New(dc->r, dc->mem_task); Mat4x4Scale(r, 1.5 - t0); Free(dc->r); DCMat4x4Set(dc,r); dc->flags |= DCF_TRANSFORMATION; Sprite3ZB(dc, xx, yy, 0, <ball>, t0); } } dc->color = RED; GrPrint(dc, FONT_WIDTH, FONT_HEIGHT, "Peg the Fans"); } U0 AnimateTask(I64) { I64 i; F64 xx, yy, t0; while (TRUE) { if (ball_t) { t0 = (tS - ball_t) / BALL_TIME; xx = t0 * target_x + (1.0 - t0) * pitcher_x; yy = t0 * target_y + (1.0 - t0) * pitcher_y; } for (i = 0; i < FANS_NUM; i++) { if (ball_t) if (Sqr(x[i] - xx) + Sqr(y[i] - yy) < 200) { hit[i] = TRUE; theta[i] = -pi / 2; } if (!hit[i]) { x[i] += SignI64(RandI16); y[i] += SignI64(RandI16); theta[i] += Sign(RandI16) / 25.0; if (!(0 <= x[i] < GR_WIDTH)) x[i] = GR_WIDTH / 2; if (!(10 <= y[i] < 100)) y[i] = 50; if (!(-0.75 <= theta[i] < 0.75)) theta[i] = 0; } } Sleep(10); } } U0 Init() { I64 i; for (i = 0; i < FANS_NUM; i++) { x[i] = RandU16 % GR_WIDTH; y[i] = 50; theta[i] = 0; hit[i] = FALSE; } } U0 Stadium() { I64 message_code, arg1, arg2, ch = 0; SettingsPush; //See SettingsPush Cd(__DIR__); Fs->win_inhibit |= WIG_DBL_CLICK; MenuPush( "File {" " Abort(,CH_SHIFT_ESC);" " Exit(,CH_ESC);" "}" "Play {" " Restart(,'\n');" "}" ); AutoComplete; WinBorder; WinMax; DocCursor; DocClear; Init; Fs->animate_task = Spawn(&AnimateTask, NULL, "Animate",, Fs); background = GRRead("StadiumBG"); Fs->draw_it = &DrawIt; do { message_code = MessageGet(&arg1, &arg2, 1 << MESSAGE_KEY_DOWN + 1 << MESSAGE_MS_L_DOWN); if (message_code == MESSAGE_KEY_DOWN) { ch = arg1; if (ch == '\n') Init; } else { target_x = arg1; target_y = arg2; pitcher_x = GR_WIDTH / 2; pitcher_y = GR_HEIGHT; ball_t = tS; } } while (ch != CH_SHIFT_ESC && ch != CH_ESC); MessageGet(,, 1 << MESSAGE_KEY_UP); DCDel(background); SettingsPop; MenuPop; } Stadium;