横スクロールについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ひよこ

横スクロールについて

#1

投稿記事 by ひよこ » 16年前

横スクロールを作っているのですが、エラーが出て困っています。どうすればいいでしょうか?
エラー(error C2078: 初期化子の数が多すぎます。)
ソース
#include "DxLib.h"

#define MAP_SIZE	64			// マップチップ一つのドットサイズ

#define MAP_WIDTH	21			// マップの幅			// マップの縦長さ

#define MOVE_FRAME	32			// 移動にかけるフレーム数

// マップのデータ
int MapData[ MAP_WIDTH ] =
{
	{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1} ,
	
} ;

// プレイヤーの位置
int PlayerX=0; int PlayerY=320;

// 移動しているかどうかのフラグ( 1:停止中  1:移動中 )
int Move ;

// 各方向に移動する量
int MoveX ;

// 移動し始めてから何フレーム経過したかを保持する変数
int MoveCounter ;
//キャラクター
int  PlayerGraph=LoadGraph( "star1.bmp" ) ;
// マップとプレイヤーの描画関数
void GraphDraw( int ScrollX )
{
	int j ;
	int MapDrawPointX ;		// 描画するマップ座標値
	int DrawMapChipNumX  ;	// 描画するマップチップの数

	// 描画するマップチップの数をセット
	DrawMapChipNumX = 640 / MAP_SIZE + 2 ;

	// 画面左上に描画するマップ座標をセット
	MapDrawPointX = PlayerX - ( DrawMapChipNumX / 2 - 1 ) ;
		for( j = -1 ; j < DrawMapChipNumX ; j ++ )
		{
			// 画面からはみ出た位置なら描画しない
			if( j + MapDrawPointX < 1 || 
				j + MapDrawPointX >= MAP_WIDTH  ) continue ;

			// マップデータが0だったら四角を描画する
		
		
	}

	// プレイヤーの描画
	 DrawGraph( PlayerX , PlayerY , PlayerGraph , TRUE ) ;// プレイヤーを描画する
}

// WinMain関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
						 LPSTR lpCmdLine, int nCmdShow )
{
	
	int ScrollX ;

	SetGraphMode( 641 , 481 , 16 ) ;
	if( DxLib_Init() == -1 )	// DXライブラリ初期化処理
	{
		 return -1;				// エラーが起きたら直ちに終了
	}
char Key[256];
	// 描画先画面を裏画面にする
	SetDrawScreen( DX_SCREEN_BACK ) ;

	// プレイヤーの初期位置をセット
	PlayerX = 2 ;
	PlayerY = 2 ;

	// 最初は停止中(1)にしておく
	Move = 1 ;

	// ループ
	while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE])

	{
		// 画面を初期化
		ClearDrawScreen() ;

		// 移動中ではない場合キー入力を受け付ける
		if( Move == 1 )
		{
			

			// キー入力に応じてプレイヤーの座標を移動
			if(Key[KEY_INPUT_LEFT]== 1)
			{
				Move = 1 ;
				MoveX = -1 ;
				
			}
			if( Key[KEY_INPUT_RIGHT]== 1 )
			{
				Move = 1 ;
				MoveX = 1 ;
				
			}
			

			// 進入不可能なマップだった場合は移動できない
			if( Move == 1 )
			{
				if( MapData[ PlayerX + MoveX ] == 1 )
				{
					Move = 1 ;
				}
				else
				{
					MoveCounter = 1 ;
				}
			}

			// 停止中は画面のスクロールは行わない
			ScrollX = 0 ;
		}

		// 移動中の場合は移動処理を行う
		if( Move == 1 )
		{
			MoveCounter ++ ;

			// 移動処理が終了したら停止中にする
			if( MoveCounter == MOVE_FRAME )
			{
				Move = 0 ;

				// プレイヤーの位置を変更する
				PlayerX += MoveX ;
				

				// 停止中は画面のスクロールは行わない
				ScrollX = 0 ;
				
			}
			else
			{
				// 経過時間からスクロール量を算出する
				ScrollX = -( MoveX * MAP_SIZE * MoveCounter / MOVE_FRAME ) ;
				
			}
		}

		// マップとプレイヤーを描画
		GraphDraw( ScrollX) ;

		// 裏画面の内容を表画面に映す
		ScreenFlip() ;
	}

	DxLib_End() ;				// DXライブラリ使用の終了処理

	return 1 ;					// ソフトの終了
}

バグ

Re:横スクロールについて

#2

投稿記事 by バグ » 16年前

全部は見てないけど、気になったとこだけ…


int MapData[MAP_WIDTH][MAP_WIDTH] = {{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1} ,};


こうじゃないですか?

SCI

Re:横スクロールについて

#3

投稿記事 by SCI » 16年前

変数MapDataは一次元配列です。
正しくは以下のようになります。
// マップのデータ
int MapData[ MAP_WIDTH ] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};

ひよこ

Re:横スクロールについて

#4

投稿記事 by ひよこ » 16年前

教えてくださったおかげで実行はできるようになったのですが、
四角が動きません。どこがいけないのでしょうか?
#include "DxLib.h"

#define MAP_SIZE	64			// マップチップ一つのドットサイズ

#define MAP_WIDTH	21			// マップの幅			// マップの縦長さ

#define MOVE_FRAME	32			// 移動にかけるフレーム数

// マップのデータ
// マップのデータ
int MapData[ MAP_WIDTH ] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};


// プレイヤーの位置
int PlayerX=50; int PlayerY=320;

// 移動しているかどうかのフラグ( 0:停止中  1:移動中 )
int Move ;

// 各方向に移動する量
int MoveX ;

// 移動し始めてから何フレーム経過したかを保持する変数
int MoveCounter ;
//キャラクター
int  PlayerGraph=LoadGraph( "star1.bmp" ) ;
// マップとプレイヤーの描画関数
void GraphDraw( int ScrollX )
{
	int j ;
	int MapDrawPointX ;		// 描画するマップ座標値
	int DrawMapChipNumX  ;	// 描画するマップチップの数

	// 描画するマップチップの数をセット
	DrawMapChipNumX = 640 / MAP_SIZE + 2 ;

	// 画面左上に描画するマップ座標をセット
	MapDrawPointX = PlayerX - ( DrawMapChipNumX / 2 - 1 ) ;
		for( j = -1 ; j < DrawMapChipNumX ; j ++ )
		{
			// 画面からはみ出た位置なら描画しない
			if( j + MapDrawPointX < 0 || 
				j + MapDrawPointX >= MAP_WIDTH  ) continue ;

			
		
		
	}

	// プレイヤーの描画
	 DrawBox( PlayerX , PlayerY ,PlayerX+20,PlayerY+20 ,GetColor(255,0,0), FALSE) ;// プレイヤーを描画する
}

// WinMain関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
						 LPSTR lpCmdLine, int nCmdShow )
{
	
	int ScrollX ;

	SetGraphMode( 641 , 481 , 16 ) ;
	if( DxLib_Init() == -1 )	// DXライブラリ初期化処理
	{
		 return -1;				// エラーが起きたら直ちに終了
	}
char Key[256];
	// 描画先画面を裏画面にする
	SetDrawScreen( DX_SCREEN_BACK ) ;

	// プレイヤーの初期位置をセット
	PlayerX = 2 ;
	PlayerY = 2 ;

	// 最初は停止中(0)にしておく
	Move = 0 ;

	// ループ
	while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE])

	{
		// 画面を初期化
		ClearDrawScreen() ;

		// 移動中ではない場合キー入力を受け付ける
		if( Move == 1 )
		{
			

			// キー入力に応じてプレイヤーの座標を移動
			if(Key[KEY_INPUT_LEFT]== 1)
			{
				Move = 1 ;
				MoveX = -1 ;
				
			}
			if( Key[KEY_INPUT_RIGHT]== 1 )
			{
				Move = 1 ;
				MoveX = 1 ;
				
			}
			

			// 進入不可能なマップだった場合は移動できない
			if( Move == 1 )
			{
				if( MapData[ PlayerX + MoveX ] ==0 )
				{
					Move = 0 ;
				}
				else
				{
					MoveCounter = 0 ;
				}
			}

			// 停止中は画面のスクロールは行わない
			ScrollX = 0 ;
		}

		// 移動中の場合は移動処理を行う
		if( Move == 1 )
		{
			MoveCounter ++ ;

			// 移動処理が終了したら停止中にする
			if( MoveCounter == MOVE_FRAME )
			{
				Move = 0 ;

				// プレイヤーの位置を変更する
				PlayerX += MoveX ;
				

				// 停止中は画面のスクロールは行わない
				ScrollX = 0 ;
				
			}
			else
			{
				// 経過時間からスクロール量を算出する
				ScrollX = -( MoveX * MAP_SIZE * MoveCounter / MOVE_FRAME ) ;
				
			}
		}

		// マップとプレイヤーを描画
		GraphDraw( ScrollX) ;
		// 裏画面の内容を表画面に映す
		ScreenFlip() ;
	}

	DxLib_End() ;				// DXライブラリ使用の終了処理

	return 1 ;					// ソフトの終了
}

SCI

Re:横スクロールについて

#5

投稿記事 by SCI » 16年前

// 移動中ではない場合キー入力を受け付ける
    if( Move == 1 )
ここは0ではないですか?

ひよこ

Re:横スクロールについて

#6

投稿記事 by ひよこ » 16年前

動くようになりました。
バグさん、SCIさんありがとうございました。

閉鎖

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