サイトトップへ
OSASK.NET
  サイトトップへ       新掲示板(閉鎖済)   Wiki(凍結済)   旧掲示板(廃止済)   ニュース(廃止済)  
1: 2004-05-05 (水) 21:37:40 ソース 2: 2004-05-06 (木) 00:54:11 ソース
Line 1: Line 1:
* lib_getsigのページ * lib_getsigのページ
-(2004.05.05 by [[K]]) -(2004.05.05 by [[K]])
--みんなのソースを見ていると、誰もがgetsignal()やgetsignalw()を作って使っています。しかし中身は僕が作ったときのままで、手を加えたものを見たことがありません。 +-みんなのソースを見ていると、誰もがgetsignal()やgetsignalw()を作って使っています。しかし中身は僕が作ったときのままで、手を加えたものはめったにありません。 
--これを考えて僕は反省しています。確かにgetsignalにほとんど創意工夫の余地がありません。そんなものを毎回書かせていたことは、ソースをむやみに長くして読みにくくしていただけでしょう。 +-これを見て僕は反省しています。確かにgetsignalにはほとんど創意工夫の余地がありません。そんなものを毎回書かせていたことは、ソースをむやみに長くして読みにくくしていただけでしょう。 
--ということで、lib_getsig系の関数を作りました。良かったこれを使ってください。またintroでの説明も順次こちらの説明に切り替えようと思っています。また、たいていの場合、lib_getsig系を使うほうがコンパクトで速くなります(わずかな差ですが)。+-ということで、lib_getsig系の関数を作りました。良かったらこれを使ってください。introでの説明も順次こちらの説明に切り替えようと思っています。また、たいていの場合、今までのgetsignalを使うよりもlib_getsig系を使うほうがコンパクトで速くなります(わずかな差ですが)。
*** ダウンロード *** ダウンロード
-osa_dir3以降にバンドルされますが、osa_dir3が出るまで待つ必要はないので、待てない人はこちらからどうぞ。 -osa_dir3以降にバンドルされますが、osa_dir3が出るまで待つ必要はないので、待てない人はこちらからどうぞ。
---http://k.hideyosi.com/test061.lzh (18.8KB)+--http://k.hideyosi.com/test061.lzh (19.2KB)
* 関数一覧 * 関数一覧
Line 42: Line 42:
* 使用例 * 使用例
 + /* "movec2.c" */
 + /*  stack:4k malloc:2k */
 +
 + #include <guigui00.h>
 + #define AUTO_MALLOC      0
 +
 + /* シグナルボックス関係 */
 + #define REWIND_CODE      1
 + #define initsignalbox()  lib_initsignalbox0_256(REWIND_CODE)
 + #define getsignalw()    lib_getsig0w(lib_sigbox_256)
 +
 + void OsaskMain()
 + {
 +     struct LIB_WINDOW *window;
 +     struct LIB_TEXTBOX *wintitle, *textbox;
 +     int x, y, c;
 +
 +     /* ライブラリ初期化&シグナルボックス初期化 */
 +     initsignalbox();
 +
 +     /* ウィンドウオープン */
 +     window = lib_openwindow(AUTO_MALLOC, 0x0200, 20 * 8, 8 * 16);
 +     wintitle = lib_opentextbox(0x1000, AUTO_MALLOC, 0,  6, 1, 0, 0, window, 0x00c0, 0);
 +     textbox  = lib_opentextbox(0x0001, AUTO_MALLOC, 0, 20, 8, 0, 0, window, 0x00c0, 0);
 +     lib_putstring_ASCII(0x0000, 0, 0, wintitle, 0, 0, "movec2");
 +
 +     /* シグナル定義 */
 +     lib_definesignal1p0(3, 0x0100, 0x00ac, window, 4); /* カーソルキー(計4つ) */
 +     lib_definesignal1p0(0, 0x0100, ' ',    window, 8); /* スペースバー */
 +     lib_definesignal0p0(0, 0, 0, 0);
 +
 +     /* まず表示 */
 +     x = 9; y = 3; c = 11;
 +     lib_putstring_ASCII(0x0000, x, y, textbox, c, 0, "O");
 +
 +     /* メインループ */
 +     for (;;) {
 +         int ox = x, oy = y, oc = c, sig;
 +         sig = getsignalw();
 +         if (sig == 4) { /* left */
 +             if (x > 0)
 +                 x--;
 +         }
 +         if (sig == 5) { /* right */
 +             if (x < 19)
 +                 x++;
 +         }
 +         if (sig == 6) { /* up */
 +             if (y > 0)
 +                 y--;
 +         }
 +         if (sig == 7) { /* down */
 +             if (y < 7)
 +                 y++;
 +         }
 +         if (sig == 8) { /* chagne */
 +             c = (c + 1) & 0x0f;
 +         }
 +         /* 何らかの変化があれば表示し直す */
 +         if (x != ox || y != oy || c != oc) {
 +             lib_putstring_ASCII(0x0000, ox, oy, textbox, 0, 0, " ");
 +             lib_putstring_ASCII(0x0000, x,  y,  textbox, c, 0, "O");
 +         }
 +     }
 + }
 +
 +* マウスシグナルとかを扱いたい場合は?
 +-マウスシグナルとかを扱いたい場合、getparam系の関数が必要になります。そういう人は、
 + /* シグナルボックス関係 */
 + #define REWIND_CODE      1
 + #define initsignalbox()  lib_initsignalbox0_4k(REWIND_CODE)
 + #define getsignalw()    lib_getsig0w(lib_sigbox_4k)
 + #define sig_ptr          lib_sigptr_4k
 +-として、sig_ptrを使えるようにしてください。これがあればgetparamを作るのは簡単です。以下に例を示します。
 + int getparam()
 + {
 +     int param = *sig_ptr++;
 +     lib_waitsignal(0x0000, 1, 0);
 +     return param;
 + }
 +-もちろんgetparam系の関数など作らずに、たとえば、
 +     x = sig_ptr[0];
 +     y = sig_ptr[1];
 +     sig_ptr += 2;
 +     lib_waitsignal(0x0000, 2, 0);
 +-とやるほうがより高速です。
 +
 +* lib_initsignalbox0_256の中身
 +-execcmd化の参考などに
 + void lib_initsignalbox0_256(int rewind)
 + {
 +     static struct {
 +         int rewind, dummy;
 +         int *ptr;
 +         int box[256 / 4]; /* ここが4kだったり64kだったりする */
 +     } sigstr = {
 +         0, 0, sigstr.box, { 0 }
 +     };
 +     static struct LIB_WORK lib_work256;
 +     sigstr.rewind = rewind; /* lib_getsigが参照するので保存しておく */
 +     lib_init_nm(&lib_work256);
 +     lib_opensignalbox_nm(256, sigstr.box, 0, rewind);
 + }
 +
 + /* sigstr.ptrがlib_sigptr_256, sigstr.boxがlib_sigbox_256 */
* こめんと欄 * こめんと欄
 +-lib_initとlib_opensignalboxをくっつけるのはなんかビミョーな気がします。。いや、便利だけどね。。 -- [[あっきぃ]] SIZE(10){2004-05-05 (水) 23:21:09}
 +-いい意見!lib_initの直後にlib_opensignalboxをやりなさいっていうルールがありますが、たまに忘れそうになるので、ひとつにまとめちゃいました。 -- [[K]] SIZE(10){2004-05-05 (水) 23:32:05}
 +-いつものoptスイッチ仕様じゃなくて、サイズ別関数名にしたのには意味があるのかな?可読性はよさそうだけど。 -- [[名無しさん]] SIZE(10){2004-05-05 (水) 23:52:53}
 +-それは実は情けない理由があって、上記の例のように関数内にstatic配列を確保する関係上、変数で値を指定されると厄介だったのです。・・・が、まあ、とりあえずちょっとだけ読みやすい気がしますし、256じゃなくて200じゃないと困るとかそういうことは多分ないので、大目に見てください。 -- [[K]] SIZE(10){2004-05-06 (木) 00:07:52}
 +-ちなみに従来のgetsignalwの直接記述よりも常に優れているというわけではなく、状況によっては、ソースサイズは小さくなるけど実行ファイルはでかくなる、こともあるそうです。われながらイマイチですね。512キャンペーンに使えるかどうかは、試してみないと分からないようです。とりあえず初心者向けではあるかな。 -- [[K]] SIZE(10){2004-05-06 (木) 00:11:28}
 +-getsignalがあるならばput(send?)signalとかありそうだなどと言ってみるテスト。・・・自分自身に送るってのあるけど、これは別アプリには届かないのかな? -- [[名無しさん]] SIZE(10){2004-05-06 (木) 00:54:10}
 +
#comment #comment

トップ   差分 バックアップ 複製 名前変更 リロード印刷に適した表示   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ
新着

目次
メンバー一覧


最新の20件
2016-10-01 2016-09-08
  • @MenuBar.
2016-09-07 2016-09-04 2016-08-15 2015-09-23 2014-07-30 2014-07-04 2014-02-04 2013-10-26 2013-06-21 2013-06-17 2013-06-15 2013-04-02 2013-02-09 2013-02-04 2012-12-25 2012-12-01 2012-05-28 2012-03-31

トピック一覧
一般用コメント最新
新掲示板lina
2016/9/5 20:58
SandBoxゲスト
2016/9/4 12:01
RecentDeletedlina
2015/6/2 19:29
Old-OSASK-MLlina
2014/6/29 9:14
hideyosi/メールhideyosi
2014/1/6 20:17
hideyosi/募集中lina
2013/11/8 19:56

このサイトは川合秀実から委託を受けて、OSASKコミュニティによって管理・運営されています。