1: 2004-01-22 (木) 23:28:42 |
2: 2004-01-23 (金) 00:15:46 |
| "mt_xor1.c"の解説 | | "mt_xor1.c"の解説 |
| 2004/01/22 | | 2004/01/22 |
- | ベイサイド(bayside_yokohama@yahoo.co.jp) | + | ベイサイド(bayside_yokohama@yahoo.co.jp) |
| | | |
| このドキュメントは、"mt_xor1.c"の説明だけをするものです。最初に読むべきドキュ | | このドキュメントは、"mt_xor1.c"の説明だけをするものです。最初に読むべきドキュ |
| | | |
| このアクセス方法は2つの手順で構成されます。まず、指定されたバッファ内に自由に | | このアクセス方法は2つの手順で構成されます。まず、指定されたバッファ内に自由に |
- | 読み書きします。このバッファはグラフィックボックスに対応しており、1バイトが1ド | + | 読み書きします。このバッファはグラフィックボックスに対応しており、4バイトが1ド |
| ットになっています(パックドピクセル)。そして一通りのアクセスが済んだらいじった | | ットになっています(パックドピクセル)。そして一通りのアクセスが済んだらいじった |
| 部分をflushします。flushというのは、メモリ内のバッファの内容を画面に確実に反映 | | 部分をflushします。flushというのは、メモリ内のバッファの内容を画面に確実に反映 |
| るようになるまではちょっと無理かもしれません。・・・それでもマシンパワーのある | | るようになるまではちょっと無理かもしれません。・・・それでもマシンパワーのある |
| マシンなら、なんとかゲームにはなるかもしれません。 | | マシンなら、なんとかゲームにはなるかもしれません。 |
| + | |
| + | // "mt_xor1.c" |
| + | // stack:4k malloc:6k |
| + | // copyright(C) 2004 ベイサイド |
| + | |
| + | #include <guigui00.h> |
| + | |
| + | #define AUTO_MALLOC 0 |
| + | |
| + | /* ちょっとしたマクロ */ |
| + | #define pixel(x, y) *(p + (y) * 100 + (x)) |
| + | |
| + | /* 基本的なアルゴリズム */ |
| + | /* 1.グラフィックボックスをオープンする */ |
| + | /* 2.(int *) graphicbox + 16以降のバイトは、x_size * y_size * 4のcharのバッファになっているので |
| + | そこを好きなようにいじる(リードしてもライトしてもいい) */ |
| + | /* 3.いじり終ったら、バッファをflushしなければいけない。この時点で画面に反映される */ |
| + | |
| + | void OsaskMain() |
| + | { |
| + | struct LIB_WINDOW *window; |
| + | struct LIB_TEXTBOX *wintitle; |
| + | struct LIB_GRAPHBOX *graphicbox; |
| + | int i, j; |
| + | int *p; |
| + | |
| + | lib_init(AUTO_MALLOC); |
| + | window = lib_openwindow(AUTO_MALLOC, 0x0200, 136, 48); |
| + | wintitle = lib_opentextbox(0x1000, AUTO_MALLOC, 0, 7, 1, 0, 0, window, 0x00c0, 0); |
| + | lib_putstring_ASCII(0x0000, 0, 0, wintitle, 0, 0, "Mt.Xor0"); |
| + | |
| + | /* グラフィックボックスをウィンドウに用意する */ |
| + | graphicbox = lib_opengraphbox(1, AUTO_MALLOC, 4, 8, 100, 48, 18, 0, window); |
| + | /* パラメーターの意味は以下の通り: |
| + | opt : 1(固定) |
| + | mode : 4(固定) |
| + | mode_opt : 初期の背景色(バッファはこのバイトで初期化される) |
| + | x_size : グラフィックボックスの大きさ(ドット単位) |
| + | y_size : グラフィックボックスの大きさ(ドット単位) |
| + | x_pos : グラフィックボックスの位置(ドット単位) |
| + | y_pos : グラフィックボックスの位置(ドット単位) |
| + | */ |
| + | |
| + | p = (int *) graphicbox + 16; |
| + | |
| + | /* 頂点に一つ点を打つ */ |
| + | pixel(49, 0) = 0; /* 黒い点 */ |
| + | |
| + | /* ちょっとした演算 */ |
| + | for (j = 0; j < 47; j++) { |
| + | for (i = 1; i < 99; i++) |
| + | pixel(i, j + 1) = ((pixel(i - 1, j) == 0) ^ (pixel(i + 1, j) == 0)) ? 0 : 0xC6C6C6; |
| + | } |
| + | |
| + | j = 0; |
| + | for (;;) { |
| + | |
| + | /* バッファの内容を確実に画面に反映させる */ |
| + | lib_flushgraphbox(0x8024, window, 18, 0, 100, 48, 0, p); |
| + | /* パラメーターの意味は以下の通り: |
| + | opt : 0x8001(固定) |
| + | win : グラフィックボックスが所属するウィンドウ |
| + | x : グラフィックボックスのx_pos |
| + | y : グラフィックボックスのy_pos |
| + | sx : グラフィックボックスのx_size |
| + | sy : グラフィックボックスのy_size |
| + | skip : 0(固定) |
| + | p : (int *) graphbox + 16 |
| + | |
| + | なお、上記の例はグラフィックボックス全体をflushしている |
| + | */ |
| + | |
| + | lib_waitsignaltime(0x0007, 0, 0, 0x80000000, 0, 0); /* 500msec.-wait */ |
| + | |
| + | /* 色変更 */ |
| + | j = (j + 1) & 0x868686; |
| + | for (i = 0; i < 48 * 100; i++) { |
| + | if (p[i] != 0xC6C6C6) |
| + | p[i] = j; |
| + | } |
| + | |
| + | } |
| + | } |
| + | |
| + | *** [[K]]の落書き |
| + | -こんなのをそのうち<guigui00.h>に追加しようと思います。 |
| + | #if (!defined(LIB_GBOX_BUF)) |
| + | #define LIB_GBOX_BUF(gbox) ((void *) ((char *) (gbox) + 64)) |
| + | #define LIB_GBOX_BUF8(gbox) ((unsigned char *) LIB_GBOX_BUF(gbox)) |
| + | #define LIB_GBOX_BUF16(gbox) ((unsigned short *) LIB_GBOX_BUF(gbox)) |
| + | #define LIB_GBOX_BUF32(gbox) ((unsigned int *) LIB_GBOX_BUF(gbox)) |
| + | #endif |
| + | -たぶん僕の言う「そのうち」はなかなかこないので、上記をコピーして自分のソースに貼り付けてもいいです。 |