1: 2004-01-22 (木) 23:28:42 [6] | 2: 2004-01-23 (金) 00:15:46 [7] | ||
---|---|---|---|
Line 4: | Line 4: | ||
"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"の説明だけをするものです。最初に読むべきドキュ | ||
Line 19: | Line 19: | ||
このアクセス方法は2つの手順で構成されます。まず、指定されたバッファ内に自由に | このアクセス方法は2つの手順で構成されます。まず、指定されたバッファ内に自由に | ||
- | 読み書きします。このバッファはグラフィックボックスに対応しており、1バイトが1ド | + | 読み書きします。このバッファはグラフィックボックスに対応しており、4バイトが1ド |
ットになっています(パックドピクセル)。そして一通りのアクセスが済んだらいじった | ットになっています(パックドピクセル)。そして一通りのアクセスが済んだらいじった | ||
部分をflushします。flushというのは、メモリ内のバッファの内容を画面に確実に反映 | 部分をflushします。flushというのは、メモリ内のバッファの内容を画面に確実に反映 | ||
Line 88: | Line 88: | ||
るようになるまではちょっと無理かもしれません。・・・それでもマシンパワーのある | るようになるまではちょっと無理かもしれません。・・・それでもマシンパワーのある | ||
マシンなら、なんとかゲームにはなるかもしれません。 | マシンなら、なんとかゲームにはなるかもしれません。 | ||
+ | |||
+ | // "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 | ||
+ | -たぶん僕の言う「そのうち」はなかなかこないので、上記をコピーして自分のソースに貼り付けてもいいです。 |
(This host) = http://osask.net