ページ 11

続テトリス作成

Posted: 2008年1月19日(土) 22:18
by ぜt
http://www.nhk.or.tv/kow/program/program_128.php
//画面表示
void ShowGameField()・・・・・
で落下していくブロックを表示するときに
for(i=0;i<21;i++)
{
for(j=0;j<12;j++)
{
for(field[j] == 1)
{
DrawExtendGraph(x,y,x,y,画像名,TRUE);
}
}
}
とブロックを表示しているのですが、これだと全種類のブロックが
同じ画像になります。
ブロックの種類ごとに色を変えたいと思っているのですが全く思いつきません
考え方だけでもご教授いただけないでしょうか。お願いいたします。

Re:続テトリス作成

Posted: 2008年1月19日(土) 23:25
by
考え方:
元のコードが存在するなら、色(画像)はどこで設定している?
そこを抜き出して、色々と変えてみる。

これはWindowsゲームプログラミングと同じ手法のようなので(勝手に仮定

まず、DirectXは使わず、BMPを使用しやるやり方をお勧めします。
DirectXでもいけるかもしれませんが・・・

かなり、コードに手を加える必要があるので少々面倒なはずです。
//データに応じてブロックや空白を画面表示
for(i = 0; i<21; i++) {
	for(j = 0; j < 12; j++) {

		switch(field[j]) {
		case 0:
		printf("");
		break;
		case 9:
		printf("□");
		break;
		default:
		printf("■");
		break;
	}
}

一様ここで設定しているので、ここをいじります。(多分

色々と面倒そうなので、昔作ったのを添付しておきます。
全然きれいじゃありませんが、どうぞ。
完成品は、ソースファイルが無かったので、完成品ではありませんがご容赦を。

Re:続テトリス作成

Posted: 2008年1月20日(日) 08:46
by ぜt
すいません理解できませんでした。

Re:続テトリス作成

Posted: 2008年1月20日(日) 09:06
by バグ
今はint型のblockという変数にblockの状態が入っていますよね?

0 = Block無
1 = Block有

という感じになっています。
そこにちょっと手を入れて…

0 = Block無
1 = 青
2 = 緑
3 = 水
4 = 赤
5 = 紫
6 = 黄
7 = 白
9 = 壁

みたいに適当に色を割り振ってやり、block_listという変数の初期化の段階で好きな色にあたる数値を代入してやればいいはずです。今は0か1…つまり有・無のどちらかで設定されてますよね?

それで、表示する時(ShowGameField関数内のswitch文)にそれぞれの数値に対応した画像を描画してやれば好きな色で表示される訳です。

幸い、消去判定が『1行に存在する全てのblockが0ではないとき』という条件なので、これだけの変更で対応できると思いますよ。

Re:続テトリス作成

Posted: 2008年1月20日(日) 09:27
by ぜt
ありがとうございます。
何とか理解できました。早速してみたいとおもいます。

Re:続テトリス作成

Posted: 2008年1月21日(月) 12:35
by ぜt
すいません理解したっていいいながらできませんでした。
http://www.nhk.or.tv/kow/program/program_128.php
でバグさん言われた通りブロックを初期値を
//七種類のブロックのデータ
int block_list[7][4][4]=
{
{
{0,1,0,0},
{0,1,0,0},
{0,1,0,0},
{0,1,0,0}
},
{
{0,0,0,0},
{0,2,2,0},
{0,2,0,0},
{0,2,0,0}
},
{
{0,0,3,0},
{0,3,3,0},
{0,3,0,0},
{0,0,0,0}
},
{
{0,4,0,0},
{0,4,4,0},
{0,0,4,0},
{0,0,0,0}
},
{
{0,0,0,0},
{0,5,0,0},
{5,5,5,0},
{0,0,0,0}
},
{
{0,0,0,0},
{0,6,6,0},
{0,6,6,0},
{0,0,0,0}
},
{
{0,0,0,0},
{0,7,7,0},
{0,0,7,0},
{0,0,7,0}
}
};
と変えて画像も1なら赤・・・という風に変えたのですが、
ブロックが1以外の時は落下されません。
ほかに変更する点はあるのでしょうか?

Re:続テトリス作成

Posted: 2008年1月21日(月) 12:50
by バグ
うーん、元になったソースコードを見る限りでは原因が分かりません…(-_-;)
ぜtさんの書かれたソースコードを提示していただけませんか?

Re:続テトリス作成

Posted: 2008年1月21日(月) 13:15
by やそ
printf("■");
レベルの表示でいいなら・・・

printf("\x1b[%02dm",block_list[j][k]+30);
printf("\x1b[m");

とかでエスケープシーケンスを利用してみては?

エスケープシーケンスの各色は30mから37mで試してみてください。

的外れならゴメンナサイ^^;

Re:続テトリス作成

Posted: 2008年1月21日(月) 13:34
by ぜt
バグさん>>変更しているのは画像とキー処理だけですので処理はそのまま使っています。

やそさん>> VC++でDxライブラリを使っています。<!--2

ダイアログボックスについて質問

Posted: 2008年2月02日(土) 19:10
by りょうちん
現在、VS2005 C++ でダイアログボックスを作っているのですが、
ダイアログボックスを呼び出すと、コントロールのみが表示されて、
をれ以外の画面が表示されないのですが、原因としてはどんな事が
考えられますか?

どなたか教えてください。よろしくお願いします。

Re:自己解決しました。

Posted: 2008年2月02日(土) 22:48
by りょうちん
お騒がせしました。自己解決できました。

ダイアログのプロシージャにreturn FALSE; を記述してなかったのが
原因でした。

すいませんでした。