しかし、新しいブロックが画面に出てきた時に、既に積まれているブロックの色も新しく出てきたブロックの色に変わってしまい、ブロックすべてが同じ色になるという結果になってしまいます。
原因はどの部分にあるのでしょうか。
投げやりで申し訳ありませんが、教えていただけると大変助かります。
int gameoverに関してはまだ手を付けてないので無視でおねがいします。
#include<DxLib.h>
char KeyBuf[256];
int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key[i]==1) GetHitKeyStateAll_InputKey[i]++;
else GetHitKeyStateAll_InputKey[i]=0;
}
return 0;
}
//ステージ・フィールドの定義
int stage[21][12] = {0};
int field[21][12] = {0};
//ブロックの定義
int Block[7] = {0};//ブロックの画像を格納する配列
int block[4][4] = {0};
//ブロックの
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,1,1,0},
{0,1,1,0},
{0,0,0,0}},
{{0,0,1,0},
{0,1,1,0},
{0,1,0,0},
{0,0,0,0}},
{{0,1,0,0},
{0,1,1,0},
{0,0,1,0},
{0,0,0,0}},
{{0,0,0,0},
{0,1,0,0},
{1,1,1,0},
{0,0,0,0}},
{{0,0,0,0},
{0,1,1,0},
{0,0,1,0},
{0,0,1,0}},
{{0,0,0,0},
{0,1,1,0},
{0,1,0,0},
{0,1,0,0}}};
//グローバル変数
int x = 120, y = 0;
int gameover = 0;
int block_type;
//ブロックの落下時間の調整変数
int time = 0;
//関数プロトタイプ宣言
void Initialize();
int CreateBlock();
void ShowGameField();
void MoveBlock(int, int);
int CheckOverlap(int, int);
void LockBlock();
void ControlBlock();
int TurnBlock();
int TimeProcessing();//時間関係の処理
void CheckLines();
//初期化------------------------------------------------------------------------------------------------
void Initialize()
{
//ブロック画像のロード
Block[0] = LoadGraph("block1.png");
Block[1] = LoadGraph("block2.png");
Block[2] = LoadGraph("block3.png");
Block[3] = LoadGraph("block4.png");
Block[4] = LoadGraph("block5.png");
Block[5] = LoadGraph("block6.png");
Block[6] = LoadGraph("block7.png");
int i,j;//forループ制御用
//画面と壁の初期設定
for(i = 0; i <= 20; i++){
for(j = 0; j <= 11; j++){
if((j == 0) || (j == 11) || (i == 20)){
field[i][j] = stage[i][j] = 8;
}
else{
field[i][j] = stage[i][j] = 0;
}
}
}
CreateBlock();//ブロック初期位置の設定・ブロックの生成
}
//ブロックの生成-----------------------------------------------------------------------------
int CreateBlock()
{
x = 4, y = 0;
int i,j;//forループ制御用
//ブロックの種類用。0~6の乱数を格納
block_type = GetRand(6);//乱数の数値を格納
for(i = 0; i < 4; i++){
for(j = 0; j < 4; j++){
block[i][j] = 0;
block[i][j] = block_list[block_type][i][j];
}
}
//壁+ブロックをフィールドへ
for(i = 0; i < 4; i++){
for(j = 0; j < 4; j++){
field[i][j+4] = stage[i][j+4] + block[i][j];
//初期位置に固定ブロックがあったらゲームオーバー
if(field[i][j+4] > 1){
gameover = 1;
return 1;
}
}
}
ShowGameField();
return 0;
}
//画面の表示--------------------------------------------------------------------
void ShowGameField()
{
if(gameover){//ゲームオーバーの処理
}
//ブロックの描画
for(int y = 0; y < 21; y++){
for(int x = 0; x < 12; x++){
if(field[y][x] == 1){
switch(block_type){
case 0:
DrawGraph(x*20+40, y*20,Block[field[y][x]+1], FALSE);
break;
case 1:
DrawGraph(x*20+40, y*20,Block[field[y][x]], FALSE);
break;
case 2:
DrawGraph(x*20+40, y*20,Block[field[y][x]+1], FALSE);
break;
case 3:
DrawGraph(x*20+40, y*20,Block[field[y][x]+2], FALSE);
break;
case 4:
DrawGraph(x*20+40, y*20,Block[field[y][x]+3], FALSE);
break;
case 5:
DrawGraph(x*20+40, y*20,Block[field[y][x]+4], FALSE);
break;
case 6:
DrawGraph(x*20+40, y*20,Block[field[y][x]+5], FALSE);
break;
}
}
}
}
}
//ブロックの落下--------------------------------------------------------------------
void MoveBlock(int x2, int y2)
{
int i,j;//forループ制御用
//今までのブロックを消去
for(i = 0; i < 4; i++){
for(j = 0; j < 4; j++){
field[y+i][x+j] -= block[i][j];
}
}
//ブロックの座標更新
x = x2;
y = y2;
//新しい座標でブロックを入れなおす
for(i = 0; i < 4; i++){
for(j = 0; j < 4; j++){
field[y+i][x+j] += block[i][j];
}
}
ShowGameField();
}
//ブロックの移動操作------------------------------------------------------------------------
void ControlBlock()
{
if(!CheckOverlap(x+1, y)){
if(KeyBuf[KEY_INPUT_RIGHT] ){
MoveBlock(x+1, y);
WaitTimer( 130 ) ;//1マスずつ移動させるため
}
}
if(!CheckOverlap(x-1, y)){
if(KeyBuf[KEY_INPUT_LEFT] ){
MoveBlock(x-1, y);
WaitTimer( 130 ) ;//1マスずつ移動させるため
}
}
if(!CheckOverlap(x, y+1)){
if(KeyBuf[KEY_INPUT_DOWN] ){
MoveBlock(x, y+1);
WaitTimer( 50 ) ;//1マスずつ移動させるため
}
}
if(!CheckOverlap(x, y)){
if(KeyBuf[KEY_INPUT_Z] ){
TurnBlock();
WaitTimer( 180 ) ;
}
}
}
//ブロックの回転処理--------------------------------------------------------------------------
int TurnBlock()
{
int i,j;//forループ制御用
int temp[4][4] = {0};//ブロックを一時保存するための配列
//ブロックを回転する前にtempに保存
for(i = 0; i < 4; i++){
for(j = 0; j < 4; j++){
temp[i][j] = block[i][j];
}
}
//ブロックの回転
for(i = 0; i < 4; i++){
for(j = 0; j < 4; j++){
block[i][j] = temp[3-j][i];
}
}
//重なっているブロックが出たらブロックを回転前に戻して中止
if(CheckOverlap(x,y)){
for(i = 0; i < 4; i++){
for(j = 0; j < 4; j++){
block[i][j] = temp[i][j];
}
}
return 1;
}
//一旦フィールドからブロックを消して回転後のブロックを再表示
for(i = 0; i < 4; i++){
for(j = 0; j < 4; j++){
field[y+i][x+j] -= temp[i][j];
field[y+i][x+j] += block[i][j];
}
}
ShowGameField();
return 0;
}
//ブロックが重なったかどうかの検査----------------------------------------------------------------------------------------
int CheckOverlap(int x2, int y2)
{
int i,j;//forループ制御用
///ブロックが向かう位置に固定ブロックもしくは壁があるかを検査
for(i = 0; i < 4; i++){
for(j = 0; j < 4; j++){
if(block[i][j]){
if(stage[y2+i][x2+j] != 0){
return 1;
}
}
}
}
return 0;
}
//ブロックの壁化---------------------------------------------------------
void LockBlock()
{
int i,j;//forループ制御用
//ブロックを壁に加える
for(i = 0; i < 21; i++){
for(j = 0; j < 12; j++){
stage[i][j] = field[i][j];
}
}
CheckLines();//横一列が揃ったが判定し処理する関数を呼ぶ
//列完成判定後の壁をフィールドへ
for(i = 0; i < 21; i++){
for(j = 0; j < 12; j++){
field[i][j] = stage[i][j];
}
}
}
//時間の処理・ブロックの落下----------------------------------------------------------------------------------------------------------
int TimeProcessing()
{
//時間加算
if((time <= 30) && (gameover == 0)){
time++;
}
else{
//重なりがなければ移動
if(!CheckOverlap(x, y+1)){
MoveBlock(x, y+1);
}
//重なりがあれば壁化
else{
LockBlock();
CreateBlock();
}
time = 0;
}
return 0;
}
//横一列が完成しているかの確認。揃った場合その列を消し上のブロックを下す-----------------------------------------------------------------------
void CheckLines()
{
int i,j,k;//forループ制御用
int comp;//横一列揃っていれば1、1つでも隙間があれば0
while(1){
for(i = 0; i < 20; i++){
comp = 1;
for(j = 0; j < 11; j++){
if(stage[i][j] == 0){
comp = 0;
}
}
if(comp == 1){
break;
}
}
if(comp == 0){
break;
}
//列を消去
for(j = 1; j < 11; j++){
stage[i][j] = 0;
}
//消えた列より上にあった固定ブロックえお列の消えたところへ下す
for(k = i; k > 0; k--){
for(j = 1; j <11; j++){
stage[k][j] = stage[k-1][j];
}
}
}
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
//画面のサイズ
SetWindowSize(580,400);
//画面タイトル
SetWindowText("test");
//このウィンドウなどの内部的な初期化
if(DxLib_Init() == -1)return -1;
//タイムの初期化
time = 0;
//ステージ初期化
Initialize();
//ブロック・背景のロード
int a;
a = LoadGraph("背景.png");
// 描画先画面を裏画面にセット
SetDrawScreen( DX_SCREEN_BACK ) ;
while(!ProcessMessage() && !CheckHitKey(KEY_INPUT_SPACE)){
ClsDrawScreen();//裏画面の初期化
GetHitKeyStateAll(KeyBuf);//入力値の格納
//-------------------------------------//
//背景の画像表示
DrawGraph(60,0,a,TRUE);
//ブロック操作
ControlBlock();
//ブロック・画面の設定
ShowGameField();
//時間関係処理
TimeProcessing();
//--MainEnd--------------------------//
ScreenFlip(); //裏画面を表画面に反映
}
DxLib_End() ; // DXライブラリ使用の終了処理
return (0) ; // ソフトの終了
}