ブロックが表示されない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
cupa
記事: 117
登録日時: 2年前

ブロックが表示されない

#1

投稿記事 by cupa » 2年前

コード:

#include "../../DxLib/DxLib.h"

#define SCREEN_WIDTH	640
#define SCREEN_HEIGHT	480

#define FIELD_BORDER	2
#define FIELD_WIDTH		10+FIELD_BORDER
#define FIELD_HEIGHT	20+FIELD_BORDER

#define TILE_NUM		10
#define TILE_SIZE		16

#define SHAPE_NUM		7
#define SHAPE_SIZE		4

//1=壁、9は何もなし
byte gField[FIELD_HEIGHT][FIELD_WIDTH]={
//	 1 2 3 4 5 6 7 8 9 10 11 12
	{7,7,7,7,7,7,7,7,7,7,7,7},//1
	{7,9,9,9,9,9,9,9,9,9,9,7},//2
	{7,9,9,9,9,9,9,9,9,9,9,7},//3
	{7,9,9,9,9,9,9,9,9,9,9,7},//4
	{7,9,9,9,9,9,9,9,9,9,9,7},//5
	{7,9,9,9,9,9,9,9,9,9,9,7},//6
	{7,9,9,9,9,9,9,9,9,9,9,7},//7
	{7,9,9,9,9,9,9,9,9,9,9,7},//8
	{7,9,9,9,9,9,9,9,9,9,9,7},//9
	{7,9,9,9,9,9,9,9,9,9,9,7},//10
	{7,9,9,9,9,9,9,9,9,9,9,7},//11
	{7,9,9,9,9,9,9,9,9,9,9,7},//12
	{7,9,9,9,9,9,9,9,9,9,9,7},//13
	{7,9,9,9,9,9,9,9,9,9,9,7},//14
	{7,9,9,9,9,9,9,9,9,9,9,7},//15
	{7,9,9,9,9,9,9,9,9,9,9,7},//16
	{7,9,9,9,9,9,9,9,9,9,9,7},//17
	{7,9,9,9,9,9,9,9,9,9,9,7},//18
	{7,9,9,9,9,9,9,9,9,9,9,7},//19
	{7,9,9,9,9,9,9,9,9,9,9,7},//20
	{7,9,9,9,9,9,9,9,9,9,9,7},//21
	{7,7,7,7,7,7,7,7,7,7,7,7}//22
};

byte gShape[SHAPE_NUM][SHAPE_SIZE][SHAPE_SIZE]={
	//Ⅰミノ
	{
		{0,0,0,0},
		{0,0,0,0},
		{1,1,1,1},
		{0,0,0,0}
	},
	//Oミノ
	{
		{0,0,0,0},
		{0,1,1,0},
		{0,1,1,0},
		{0,0,0,0}
	},
	//Sミノ
	{
		{0,0,0,0},
		{0,1,1,0},
		{1,1,0,0},
		{0,0,0,0}
	},
	//Zミノ
	{
		{0,0,0,0},
		{1,1,0,0},
		{0,1,1,0},
		{0,0,0,0}
	},
	//Jミノ
	{
		{0,0,0,0},
		{1,0,0,0},
		{1,1,1,0},
		{0,0,0,0}
	},
	//Lミノ
	{
		{0,0,0,0},
		{0,0,1,0},
		{1,1,1,0},
		{0,0,0,0}
	},
	//Tミノ
	{
		{0,0,0,0},
		{0,1,0,0},
		{1,1,1,0},
		{0,0,0,0}
	}
};

void put(int x,int y,int ang,byte type);

int gTile[TILE_NUM];
int gTileSz=TILE_SIZE*1.25;
int gX,gY;

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
	SetGraphMode(SCREEN_WIDTH,SCREEN_HEIGHT,32);
	ChangeWindowMode(TRUE);
	SetMainWindowText("Tetris");
	if (DxLib_Init()==-1) return -1;
	SetDrawMode(DX_SCREEN_BACK);
	
	LoadDivGraph("../assets/tile.png",10,10,1,TILE_SIZE,TILE_SIZE,gTile);
	
	for (int y=0;y<FIELD_HEIGHT;y++) {
		for (int x=0;x<FIELD_WIDTH;x++) {
			DrawExtendGraph(x*gTileSz,y*gTileSz,x*gTileSz+gTileSz,y*gTileSz+gTileSz,gTile[gField[y][x]],FALSE);
		}
	}
	
	put(3,5,0,1);
	
	ScreenFlip();
	WaitKey();
	DxLib_End();
	return 0;
}

void put(int x,int y,int ang,byte type) {
	for (int y=0;y<SHAPE_SIZE;y++) {
		for (int x=0;x<SHAPE_SIZE;x++) {
			if (gShape[type][y][x])
				gField[y+gY][x+gX]=type;
		}
	}
}
現在、テトリス風のゲームを作っているのですが、ブロックが描画できません。
その処理を行っている関数は一番下のput()という関数です。
このたびもよろしくお願いします。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: ブロックが表示されない

#2

投稿記事 by みけCAT » 2年前

put()の呼び出し以降に描画処理が全く無いようですね。
gFieldを参照した描画処理をしているforループのにput()を呼び出すべきではないでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

cupa
記事: 117
登録日時: 2年前

Re: ブロックが表示されない

#3

投稿記事 by cupa » 2年前

put()ではgFieldに代入しただけで描画してませんでしたね。
初歩的なミスでした。
この度もありがとうございました。

cupa
記事: 117
登録日時: 2年前

Re: ブロックが表示されない

#4

投稿記事 by cupa » 2年前

追加で質問してもいいでしょうか、少し改変してみたのですがブロックが回転した状態出てきます。

コード:

#include "../../DxLib/DxLib.h"

#define SCREEN_WIDTH	640
#define SCREEN_HEIGHT	480

#define FIELD_BORDER	2
#define FIELD_WIDTH		10+FIELD_BORDER
#define FIELD_HEIGHT	20+FIELD_BORDER

#define TILE_NUM		10
#define TILE_SIZE		16

#define SHAPE_NUM		7
#define SHAPE_SIZE		4

//1=壁、9は何もなし
byte gField[FIELD_HEIGHT][FIELD_WIDTH]={
//	 1 2 3 4 5 6 7 8 9 10 11 12
	{7,7,7,7,7,7,7,7,7,7,7,7},//1
	{7,9,9,9,9,9,9,9,9,9,9,7},//2
	{7,9,9,9,9,9,9,9,9,9,9,7},//3
	{7,9,9,9,9,9,9,9,9,9,9,7},//4
	{7,9,9,9,9,9,9,9,9,9,9,7},//5
	{7,9,9,9,9,9,9,9,9,9,9,7},//6
	{7,9,9,9,9,9,9,9,9,9,9,7},//7
	{7,9,9,9,9,9,9,9,9,9,9,7},//8
	{7,9,9,9,9,9,9,9,9,9,9,7},//9
	{7,9,9,9,9,9,9,9,9,9,9,7},//10
	{7,9,9,9,9,9,9,9,9,9,9,7},//11
	{7,9,9,9,9,9,9,9,9,9,9,7},//12
	{7,9,9,9,9,9,9,9,9,9,9,7},//13
	{7,9,9,9,9,9,9,9,9,9,9,7},//14
	{7,9,9,9,9,9,9,9,9,9,9,7},//15
	{7,9,9,9,9,9,9,9,9,9,9,7},//16
	{7,9,9,9,9,9,9,9,9,9,9,7},//17
	{7,9,9,9,9,9,9,9,9,9,9,7},//18
	{7,9,9,9,9,9,9,9,9,9,9,7},//19
	{7,9,9,9,9,9,9,9,9,9,9,7},//20
	{7,9,9,9,9,9,9,9,9,9,9,7},//21
	{7,7,7,7,7,7,7,7,7,7,7,7}//22
};

byte gShape[SHAPE_NUM][SHAPE_SIZE][SHAPE_SIZE]={
	//Ⅰミノ
	{
		{0,0,0,0},
		{0,0,0,0},
		{1,1,1,1},
		{0,0,0,0}
	},
	//Oミノ
	{
		{0,0,0,0},
		{0,1,1,0},
		{0,1,1,0},
		{0,0,0,0}
	},
	//Sミノ
	{
		{0,0,0,0},
		{0,1,1,0},
		{1,1,0,0},
		{0,0,0,0}
	},
	//Zミノ
	{
		{0,0,0,0},
		{1,1,0,0},
		{0,1,1,0},
		{0,0,0,0}
	},
	//Jミノ
	{
		{0,0,0,0},
		{1,0,0,0},
		{1,1,1,0},
		{0,0,0,0}
	},
	//Lミノ
	{
		{0,0,0,0},
		{0,0,1,0},
		{1,1,1,0},
		{0,0,0,0}
	},
	//Tミノ
	{
		{0,0,0,0},
		{0,1,0,0},
		{1,1,1,0},
		{0,0,0,0}
	}
};

void put(int x,int y,int ang,byte type);

int gTile[TILE_NUM];
int gTileSz=TILE_SIZE*1.25;
int gX,gY;

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
	SetGraphMode(SCREEN_WIDTH,SCREEN_HEIGHT,32);
	ChangeWindowMode(TRUE);
	SetMainWindowText("Tetris");
	if (DxLib_Init()==-1) return -1;
	SetDrawMode(DX_SCREEN_BACK);
	
	LoadDivGraph("../assets/tile.png",10,10,1,TILE_SIZE,TILE_SIZE,gTile);
	
	put(0,0,0,2);
	
	for (int y=0;y<FIELD_HEIGHT;y++) {
		for (int x=0;x<FIELD_WIDTH;x++) {
			DrawExtendGraph(x*gTileSz,y*gTileSz,x*gTileSz+gTileSz,y*gTileSz+gTileSz,gTile[gField[y][x]],FALSE);
		}
	}
	
	ScreenFlip();
	WaitKey();
	DxLib_End();
	return 0;
}

void put(int x,int y,int ang,byte type) {
	for (int i=0;i<SHAPE_SIZE;i++) {
		for (int j=0;j<SHAPE_SIZE;j++) {
			if (gShape[type][i][j])
				gField[j+y+gY][i+x+gX]=type;
		}
	}
}
よろしくおねがいします

cupa
記事: 117
登録日時: 2年前

Re: ブロックが表示されない

#5

投稿記事 by cupa » 2年前

自己解決しました

返信

“C言語何でも質問掲示板” へ戻る