UWSCでタートルグラフィック(ロゴ言語もどき)
UWSC公式掲示板に、Linersさん作のタートルグラフィックがあった。
いやー、懐かしい!
せっかくだから、キャンバスサイズ変更とか、色変更とかを追加してみた。
XPと7でのみ動作確認(日本語版のみ)
スクリプト
OPTION EXPLICIT // Turtle_Graphics? June版 for UWSC Ver 0.1 // 簡単な命令で美しい図形を描くことが出来ます。 // 命令は TG.FD(n) nピクセル前進描画; TG.PEN(down) ペン上げ下げ; TG.RT(r) r度右回転; TG.LT(r) r度左回転 TG.Startup() DIM i, j TG.COLOR(255, 0, 0) for i = 200 to 6 step -2; TG.FD(i); TG.RT(89); next // よくある四角渦巻き TG.COLOR(0, 255, 0) TG.PEN(FALSE); TG.LT(82); TG.MV(147.4); TG.PEN(TRUE) for i = 1 to 5 ; TG.FD(200); TG.RT(144); next // お星様 TG.COLOR(0, 0, 255) TG.PEN(FALSE); TG.MV(250); TG.PEN(TRUE) for i = 1 to 36; TG.FD(200); TG.RT(170); next // 明るいお星様? TG.COLOR(0, 0, 0) TG.PEN(FALSE); TG.RT(180); TG.MV(250); TG.LT(90); TG.MV(251.52); TG.PEN(TRUE) For i=1 To 8; For j=1 To 8; TG.FD(40); TG.RT(45); Next; TG.RT(45); Next // 八角形集合体 TG.PEN(FALSE); TG.LT(90); TG.MV(250); TG.PEN(TRUE) For i=1 To 12; For j=1 To 4; TG.FD(80); TG.RT(90); Next; TG.RT(30); Next // 四角形集合体 IF MSGBOX("Exit?", BTN_YES OR BTN_NO) = BTN_YES THEN TG.Dispose() // タートルグラフィック・モジュール MODULE TG DIM _xp = 100, _yp = 200, _direction = 0 // x座標 , y座標, 角度 DIM _pen = TRUE, _wid = -1 DIM _o[5] const Deg2rad = 3.14159265 / 180 // 度数(デグリー)・ラジアン変換定数 DEF_DLL PostMessageW(DWORD, DWORD, DWORD, DWORD): BOOL: user32 Procedure Startup() _wid = exec("mspaint") _xp = 100 _yp = 200 _o[0] = STATUS(_wid, ST_X) _o[1] = STATUS(_wid, ST_Y) _o[2] = STATUS(_wid, ST_WIDTH) _o[3] = STATUS(_wid, ST_HEIGHT) acw(_wid, 0, 0, 1025, 805) // Paint固定・アクティブ ※キャンパスサイズは800*600以上で SCKEY(_wid, VK_CTRL, E) DIM title = "イメージのプロパティ" IF KINDOFOS() = 13 THEN title = "キャンバスの色とサイズ" DIM wid = GETID(title, "#32770") IFB wid > -1 THEN IFB GETITEM(wid, ITM_EDIT) > 1 THEN _o[4] = ALL_ITEM_LIST[0] _o[5] = ALL_ITEM_LIST[1] ENDIF SENDSTR(wid, 800, 1, TRUE) SENDSTR(wid, 650, 2, TRUE) CLKITEM(wid, "OK") ENDIF Fend Procedure Dispose() IFB _wid > -1 THEN SCKEY(_wid, VK_CTRL, E) DIM title = "イメージのプロパティ" IF KINDOFOS() = 13 THEN title = "キャンバスの色とサイズ" DIM wid = GETID(title, "#32770") IFB wid > -1 THEN SENDSTR(wid, _o[4], 1, TRUE) SENDSTR(wid, _o[5], 2, TRUE) CLKITEM(wid, "OK") ENDIF acw(_wid, _o[0], _o[1], _o[2], _o[3]) CTRLWIN(_wid, CLOSE) SCKEY(GETID("ペイント", "#32770"), N) ENDIF Fend Procedure COLOR(r, g, b) IFB PostMessageW(IDTOHND(_wid), $111, $1ad5, 0) THEN DIM wid = GETID("色の編集", "#32770") IFB wid > -1 THEN DIM title = "色の作成(D) >>" IF CHKBTN(wid, title) = 0 THEN CLKITEM(wid, title) SLEEP(0.1) SENDSTR(wid, r, 2, TRUE) SENDSTR(wid, g, 4, TRUE) SENDSTR(wid, b, 6, TRUE) CLKITEM(wid, "OK") ENDIF ENDIF Fend Procedure FD(x) IF _pen THEN BTN(LEFT, DOWN, _xp, _yp) This.MV(x) IF _pen THEN BTN(LEFT, UP, _xp, _yp) Fend Procedure PEN(down) _pen = down Fend Procedure RT(r) _direction = (_direction + r) MOD 360 Fend Procedure LT(r) This.RT(-r) Fend Procedure MV(n) _xp = _xp + n * COS(_direction * Deg2rad) _yp = _yp + n * SIN(_direction * Deg2rad) MMV(_xp, _yp) Fend EndModule
JP命令は廃止して、PEN命令によりペンの上げ下げを可能にした。
StartupとDispose命令でペイントの呼び出し・終了を可能にした。
COLOR命令で色設定可能にした。
小技
XPと7共通のダイアログ呼び出し方法を考えるのが面倒でした。
- キャンバスサイズ変更のダイアログは、Ctrl+eで
- 色編集のダイアログは、WM_COMMANDの0x1ad5で