Without WonderWitch Lib その5

ワンダースワンゲームプログラミング」なかなか良い本です。

https://www.amazon.co.jp/dp/4797314109/

サンプルプログラムを16色カラー表示にしてみます。

https://web.archive.org/web/20090328071323/http://page.freett.com:80/gameboy/wwpoka.html

f:id:tanam:20180102103118j:image:w360

魔女本のソースをWSSIM 0.8a対応にしたやつ(c06)

http://www.geocities.jp/parallel_computer_inc/c06stg.zip

void main() {
	int i, j;
	static unsigned short cmap;

	srand(1);

	wwc_set_color_mode(COLOR_MODE_16PACKED);
	display_control(DCM_SCR1 | DCM_SPR);

/* lcd_set_segments(LCDSEG_VERTICAL); */

	sprite_set_range(0, 128);

/* 画像を登録 */
	wwc_font_set_colordata(0, 4, bmp_bg);
	wwc_font_set_colordata(4, 9, bmp_own);
	wwc_font_set_colordata(13, 2, bmp_shot);
	wwc_font_set_colordata(15, 9, bmp_enemy1);
	wwc_font_set_colordata(24, 9, bmp_enemy2);
	wwc_font_set_colordata(33, 9, bmp_enemy3);
	wwc_font_set_colordata(42, 4, bmp_deth);

/* パレットを登録 */
	for (i = 0; i < 16; i++) {
		wwc_palette_set_color(1, i, pal_bg[i]);
		wwc_palette_set_color(13, i, pal_bg[i]);
		wwc_palette_set_color(12, i, pal_bg[i]);
	}

START:
/*
スプライトを128個使用する準備。
全て画面外に置いておき、使用状況監視テーブルを0でクリア。
*/
	for(i = 0; i < 128; i++) {
		sprite_set_location(i, 225, 145);
		used_sprites[i] = 0;
	}

/* キャラクタ管理テーブルを初期化 */
	for(i = 0; i < 100; i++) {
		objs[i].x = objs[i].y = objs[i].z = objs[i].w = objs[i].h = objs[i].enemy_flag
			= objs[i].hit_x = objs[i].hit_y = objs[i].hit_w = objs[i].hit_h = 0;
		for(j = 0; j < SMAP_MAX; j++)
			objs[i].sp_map[j] = 0;
		objs[i].move = NULL;
	}

/* 各キャラクタを定義 */
	set_base_obj();

/* 自機を生成 */
	create_obj(0, 60, 60);

/* 背景に宇宙空間を作成 */
	for(i = 0; i < 32; i++)
		for(j = 0; j < 32; j++) {
			cmap = ((abs(rand()) % 4) << 14) | (0x200);
			if(abs(rand()) % 4 == 0)
				cmap |= abs(rand()) % 4;
			screen_set_char(SCREEN1, i, j, 1, 1, &cmap);
		}
/* メインループ */
	for(scr1_x = 0, scr1_y = 30, j = 0; 1; scr1_x++) {
/* wait */
		for(i = 0; i < 5000; i++);
/* 全キャラクタ移動。STARTボタンが押されたら終了。 */
		if(move_obj())
			break;

/* 新たな敵機登場 */
		new_obj();
/* 当たり判定。自機が当ったら、少し待って終了。 */
		if(obj_hit())
			j = 50;
/* 画面を更新 */
		update_obj();
/* 背景スクロール */
		screen_set_scroll(SCREEN1, scr1_x, scr1_y);
/* 自機が当ったら、少し待って終了 */
		if(j)
			j--;
		if(j == 1)
			break;
	}
	goto START;
}