ページ 11

マップチップで画面をを左右にスクロールさせる

Posted: 2011年6月21日(火) 23:25
by chalaza
ものすごい初歩的なことなのかもしれませんが…
DXライブラリ置き場のサンプル、マップのスクロールを参考にさせていただき、
マップチップを使ったアクションゲームでの左右へのスクロールを作ろうと思い、
とりあえず横40マス(2画面分)、縦15マス分の画面を作ってみました。
サンプルの仕組みは理解したつもりですが、
自分であらかじめ組んでいたプログラムに取り付けるようにスクロール処理をつけたせいか間違っているようで、
キャラは中心から表示できたもののマップが表示されなく、さらにキャラごと高速移動するような結果になってしまいました…
サンプルひとつひとつが理解できてもこんがらがってくるのでちょっと困っているところです…
おかしいところがいくつかあると思うのですが…まず考え方が違ったのでしょうか…

コード:

#include "DxLib.h"


//構造体

			//プレイヤー構造体	
	struct Playerdata{
			int X, Y, img;
	}Player;

////

int Key[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;
}


#define MAP_SIZE	32			// マップチップ一つのドットサイズ
#define MAP_WIDTH	40			// マップの幅
#define MAP_HEIGHT	15			// マップの縦長さ
// マップのデータ
int MapData[ MAP_HEIGHT ][ MAP_WIDTH ] =
	{
		{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
		{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
		{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
		{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
		{ 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
		{ 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
		{ 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
		{ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
		{ 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
		{ 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
		{ 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
		{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
		{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
		{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
		{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
} ;

 /////

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

	
// 画像をロード
		//マップ
	int lenga1 = LoadGraph( "image/map/lenga1.png" );
	int statesbar = LoadGraph( "image/statesbar.png" );
	int haikei1 = LoadGraph( "image/haikei1.png" );
	int testimg = LoadGraph( "image/testimg.png" );
	//キャラ関係
	int chara[24];		//キャラ画像
	int HPgazou[11];	//HPの画像
	LoadDivGraph( "image/chara.png" , 24 , 6 , 4 , 64 , 64 , chara );//プレイヤー
	LoadDivGraph( "image/HP.png" , 11 , 1 , 11 , 224 , 32 , HPgazou );//体力


//関数

	Player.X = 32 , Player.Y = 288 ;	//プレイヤー座標

	int JumpPower = 0 ;			//ジャンプパワー
	int Jump = 0 ;				//ジャンプ状態か
	int walkdirection = 1 ;		//歩く向き
	int walkanime = 0 ;			//歩くアニメーション用

	int HP = 10 ;				//HP
	int HPimg ;					//HP画像
	int i , j ;					//座標用
	int MapDrawPointX , MapDrawPointY ;		// 描画するマップ座標値
	int DrawMapChipNumX , DrawMapChipNumY ;	// 描画するマップチップの数
	// 描画するマップチップの数をセット
	DrawMapChipNumX = 640 / MAP_SIZE + 1 ;
	DrawMapChipNumY = 480 / MAP_SIZE + 1 ;

	// 画面左上に描画するマップ座標をセット
	MapDrawPointX = Player.X - DrawMapChipNumX / 2 ;
	MapDrawPointY = Player.Y - DrawMapChipNumY / 2 ;



    while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
          //↑メッセージ処理          ↑画面をクリア           ↑入力状態を保存       ↑ESCが押されていない
 
//ココから
		//背景を描画
	DrawGraph( 0, 0, haikei1, FALSE ); // 背景

		// マップを描画
		for( i = 0 ; i < DrawMapChipNumY ; i ++ )
			{
			for( j = 0 ; j < DrawMapChipNumX ; j ++ )
				{
				// 画面からはみ出た位置なら描画しない
				if( j + MapDrawPointX < 0 || i + MapDrawPointY < 0 ||
					j + MapDrawPointX >= MAP_WIDTH || i + MapDrawPointY >= MAP_HEIGHT ) continue ;
				//1のとき壁を描画
				if( MapData[ i + MapDrawPointY ][ j + MapDrawPointX ] == 1 )
				{
					DrawGraph( j * MAP_SIZE , i * MAP_SIZE , lenga1 , FALSE ) ;
				}
			}
		}

			// ジャンプ状態じゃなく、ジャンプボタンを押して地面についていたらジャンプ
		if ( Jump==0 && (Key[KEY_INPUT_SPACE] >=1 ) && JumpPower <= 0)
			if(MapData[(Player.Y+64)/32][(Player.X + 16)/32] != 0
				||MapData[(Player.Y+64)/32][(Player.X + 47)/32] != 0)
					{
			JumpPower = 16 ;
			Jump = 1 ;
		}

			//ジャンプ状態で右向きなら右ジャンプの画像
		if ( walkdirection == 1 && Jump == 1 ){
			Player.img=chara[5];
		}

			//ジャンプ状態で左向きなら左ジャンプの画像
		if ( walkdirection == 0 && Jump == 1 ){
			Player.img=chara[11];
		}


        if( Key[ KEY_INPUT_RIGHT ] >= 1 ) {		//右キーが押されて
			if(MapData[(Player.Y)/32][(Player.X + 48)/32] == 0		//右が壁じゃなかったら
				&&MapData[(Player.Y+31)/32][(Player.X + 48)/32] == 0
				&&MapData[(Player.Y+32)/32][(Player.X + 48)/32] == 0
				&&MapData[(Player.Y+63)/32][(Player.X + 48)/32] == 0)
			Player.X+=3 ;	//右に動く
			walkdirection = 1 ;
		}

        if( Key[ KEY_INPUT_RIGHT ] >= 1 && Jump== 0 ){	// 右キーが押されていてジャンプ状態じゃなかったら
					walkanime++;
					Player.img=chara[(walkanime/10)%4 +1];//右に歩くアニメ
		}

		if( walkdirection == 1 && ( Key[ KEY_INPUT_RIGHT ] == 0 )&& Jump== 0 )// 右キーが離されてジャンプ状態じゃなかったら
				Player.img=chara[0];		//右を向く
		

		if( Key[ KEY_INPUT_LEFT ] >= 1 ){// 左キーが押されて
			if(MapData[(Player.Y)/32][(Player.X+15)/32] == 0
				&&MapData[(Player.Y+31)/32][(Player.X+15)/32] == 0
				&&MapData[(Player.Y+32)/32][(Player.X+15)/32] == 0
				&&MapData[(Player.Y+63)/32][(Player.X+15)/32] == 0)		//左が壁じゃなかったら
			Player.X-=3 ;	//左に動く
			walkdirection = 0 ;
	}

		if( Key[ KEY_INPUT_LEFT  ] >= 1 && Jump== 0 ){	// 左キーが押されていてジャンプ状態じゃなかったら
					walkanime++;
					Player.img=chara[(walkanime/10)%4 +7];//右に歩くアニメ
		}

		if( walkdirection == 0 && ( Key[ KEY_INPUT_LEFT ] == 0 ) && Jump== 0 )	// 左キーが離されてジャンプ状態じゃなかったら
				Player.img=chara[6];		//左を向く

		if( Key[ KEY_INPUT_RIGHT ] >= 1 && Key[ KEY_INPUT_LEFT  ] >= 1)//左右両方押されてたら右向く
			Player.img=chara[0];



		// ジャンプ中ならキャラの落下処理
		if(Jump == 1){
			Player.Y -= JumpPower ;
			JumpPower -= 1 ;
		}

	//補正//
	//床にめりこんだら上に補正
			if(JumpPower < 0)
				if(MapData[(Player.Y+64)/32][(Player.X + 16)/32] != 0
				||MapData[(Player.Y+64)/32][(Player.X + 47)/32] != 0)
	{
		Player.Y = ((Player.Y+65)/32) * 32 - 65 + 1 ;
	}
	//天井にめりこんだら下に補正
			if(JumpPower > 0)
				if(MapData[(Player.Y-1)/32][(Player.X + 16)/32] != 0
				||MapData[(Player.Y-1)/32][(Player.X + 47)/32] != 0)
	{
		Player.Y = ((Player.Y+65)/32) * 32 - 65 + 32 + 1 ;
		JumpPower = 0 ;
	}

	//右の壁にめりこんだら左に補正
			if(MapData[(Player.Y)/32][(Player.X + 48)/32] != 0
				||MapData[(Player.Y+63)/32][(Player.X + 48)/32] != 0)	
	{
		Player.X = ((Player.X+65)/32) * 32 - 65 + 16 + 1 ;
	}
	//左の壁にめりこんだら右に補正
			if(MapData[(Player.Y)/32][(Player.X+15)/32] != 0
				||MapData[(Player.Y+63)/32][(Player.X+15)/32] != 0)
	{
		Player.X = ((Player.X+65)/32) * 32 - 65 + 16 + 1 ;
	}




	// ジャンプ中にキャラが地面についたら落下をやめる
		if(Jump == 1 && JumpPower < 0 )
			if(MapData[(Player.Y+64)/32][(Player.X + 16)/32] != 0
				||MapData[(Player.Y+64)/32][(Player.X + 47)/32] != 0)
	{
		JumpPower = 0 ;
		Jump = 0 ;
	}

	//歩いているときに踏み外したらジャンプ状態にする
		if(Jump == 0)
			if(MapData[(Player.Y+64)/32][(Player.X + 16)/32] == 0
				&&MapData[(Player.Y+64)/32][(Player.X + 47)/32] == 0)
	{
		Jump = 1 ;
	}
	
		DrawGraph( ( Player.X - MapDrawPointX ) * MAP_SIZE,( Player.Y - MapDrawPointY ) * MAP_SIZE, Player.img, TRUE ); // キャラを描画

	//HP
	if( HP==10 )
		HPimg = HPgazou[10];

			//画像


	//ステータスバー背景
	for(int y=0 ; y<1 ; y++){
		for(int x=0 ; x<20 ; x++){
			DrawGraph(x*32+0,y*32+418,statesbar,FALSE);
			}
	}

	DrawGraph( 0, 420, HPimg, TRUE ); // HPバー
 
 	DrawGraph( 0, 0, testimg, FALSE ); // テストイメージ
 
        ScreenFlip();
    }
 
    DxLib_End();
    return 0;
}

Re: マップチップで画面をを左右にスクロールさせる

Posted: 2011年6月22日(水) 00:52
by jay
ひとまずサンプルと見比べてみて大きく違うと思われる所は

コード:

    // 描画するマップチップの数をセット
    DrawMapChipNumX = 640 / MAP_SIZE + 1 ;
    DrawMapChipNumY = 480 / MAP_SIZE + 1 ;
 
    // 画面左上に描画するマップ座標をセット
    MapDrawPointX = Player.X - DrawMapChipNumX / 2 ;
    MapDrawPointY = Player.Y - DrawMapChipNumY / 2 ;
この処理ですね
サンプルでは毎フレーム毎、描画する前にこの処理を行っているようです
恐らくPlayerXとPlayerYの値を元に描画する座標を計算しているのでしょうね


chalazaさんの場合初期化は最初だけで
あとはずっとwhile文でループしているようなのでPlayer.XとPlayer.Yの値が更新されてもそれが反映されていないのでは、と思いました。

Re: マップチップで画面をを左右にスクロールさせる

Posted: 2011年6月23日(木) 23:04
by chalaza
試行錯誤していたら間が空いてしまいました…
座標の位置の考え方を検索してみたらこの掲示板の過去板に同じような質問があり、
それのキャラの位置とカメラ視点のX座標の位置の計算をなんとか理解することができました。
そしてそれと左上座標の忠告を参考にさせていただき、なんとかスクロールができるようになりました。

これでこの質問は解決なのですが…疑問点がいくつか出たのでついでに聞かせてもらってはいけないでしょうか…

まず、マップをスクロールすることはできたのですが、たとえばドアに入ったら違うマップに移動するという場合、
マップチップはどう分けたらよいのでしょうか…横にしかスクロールしないようにして、ドアに入ったら縦に1画面分動かす…というような考え方でよいのですか?

それと…初心者なので戻り値無いということしか知らないVoidのことなんですが…
void GameMain(){ …というように皆使っていますが、これはプログラムを見やすくする以外に何か深い意味があるのでしょうか…
関係ないこと聞いてすいません。


ちなみにスクロールできたコードです。一応貼っておきます。

コード:

#include "DxLib.h"
 
 
//構造体
 
            //プレイヤー構造体  
    struct Playerdata{
            int X, Y, img;
    }Player;
 
////
 
int Key[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;
}
 
 

#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480
#define CHIP_SIZE 32
#define MAP_PIXEL_WIDTH 1280
#define MAP_PIXEL_HEIGHT 480
#define MAP_WIDTH (MAP_PIXEL_WIDTH/CHIP_SIZE)
#define MAP_HEIGHT (MAP_PIXEL_HEIGHT/CHIP_SIZE)

// マップのデータ
int MapData[ 15 ][ 40 ] =
    {
        { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
		{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
        { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
        { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
        { 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
        { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
        { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
        { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
        { 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
        { 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
        { 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
        { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
        { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
        { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
        { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
} ;
 
 /////
int ScrollX,OnGround;


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
 
	Player.X = 640/2;
	Player.Y = 480/2;

    
// 画像をロード
        //マップ
    int lenga1 = LoadGraph( "image/map/lenga1.png" );
    int statesbar = LoadGraph( "image/statesbar.png" );
    int haikei1 = LoadGraph( "image/haikei1.png" );
    //キャラ関係
    int chara[24];      //キャラ画像
    LoadDivGraph( "image/chara.png" , 24 , 6 , 4 , 64 , 64 , chara );//プレイヤー
    int HPgazou[11];    //HPの画像
    LoadDivGraph( "image/HP.png" , 11 , 1 , 11 , 224 , 32 , HPgazou );//体力
 
 
//関数
 
    Player.X = 32 , Player.Y = 288 ;    //プレイヤー座標
	int PlayerViewX ;
	int CameraX;

    int JumpPower = 0 ;         //ジャンプパワー
    int Jump = 0 ;              //ジャンプ状態か
    int walkdirection = 1 ;     //歩く向き
    int walkanime = 0 ;         //歩くアニメーション用
 
    int HP = 10 ;               //HP
    int HPimg ;                 //HP画像
    int i , j ;                 //座標用
 
 
 
    while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
          //↑メッセージ処理          ↑画面をクリア           ↑入力状態を保存       ↑ESCが押されていない
 
//ココから
        //背景を描画
    DrawGraph( 0, 0, haikei1, FALSE ); // 背景
 
        // マップを描画
        for( i = 0 ; i < MAP_HEIGHT ; i ++ )
        {
            for( j = 0 ; j < MAP_WIDTH ; j ++ )
            {
                if( MapData[ i ][ j ] == 1 ) //1のとき壁を描画
                {
                    DrawGraph( j*CHIP_SIZE-CameraX, i*CHIP_SIZE , lenga1 , FALSE ) ;
                }
            }
        }
 
            // ジャンプ状態じゃなく、ジャンプボタンを押して地面についていたらジャンプ
        if ( Jump==0 && (Key[KEY_INPUT_SPACE] >=1 ) && JumpPower <= 0)
            if(MapData[(Player.Y+64)/32][(Player.X + 16)/32] != 0
                ||MapData[(Player.Y+64)/32][(Player.X + 47)/32] != 0)
                    {
            JumpPower = 16 ;
            Jump = 1 ;
        }
 
            //ジャンプ状態で右向きなら右ジャンプの画像
        if ( walkdirection == 1 && Jump == 1 ){
            Player.img=chara[5];
        }
 
            //ジャンプ状態で左向きなら左ジャンプの画像
        if ( walkdirection == 0 && Jump == 1 ){
            Player.img=chara[11];
        }
 
 
        if( Key[ KEY_INPUT_RIGHT ] >= 1 ) {     //右キーが押されて
            if(MapData[(Player.Y)/32][(Player.X + 48)/32] == 0      //右が壁じゃなかったら
                &&MapData[(Player.Y+31)/32][(Player.X + 48)/32] == 0
                &&MapData[(Player.Y+32)/32][(Player.X + 48)/32] == 0
                &&MapData[(Player.Y+63)/32][(Player.X + 48)/32] == 0)
            Player.X+=3 ;   //右に動く
            walkdirection = 1 ;
        }
 
        if( Key[ KEY_INPUT_RIGHT ] >= 1 && Jump== 0 ){  // 右キーが押されていてジャンプ状態じゃなかったら
                    walkanime++;
                    Player.img=chara[(walkanime/10)%4 +1];//右に歩くアニメ
        }
 
        if( walkdirection == 1 && ( Key[ KEY_INPUT_RIGHT ] == 0 )&& Jump== 0 )// 右キーが離されてジャンプ状態じゃなかったら
                Player.img=chara[0];        //右を向く
        
 
        if( Key[ KEY_INPUT_LEFT ] >= 1 ){// 左キーが押されて
            if(MapData[(Player.Y)/32][(Player.X+15)/32] == 0
                &&MapData[(Player.Y+31)/32][(Player.X+15)/32] == 0
                &&MapData[(Player.Y+32)/32][(Player.X+15)/32] == 0
                &&MapData[(Player.Y+63)/32][(Player.X+15)/32] == 0)     //左が壁じゃなかったら
            Player.X-=3 ;   //左に動く
            walkdirection = 0 ;
    }
 
        if( Key[ KEY_INPUT_LEFT  ] >= 1 && Jump== 0 ){  // 左キーが押されていてジャンプ状態じゃなかったら
                    walkanime++;
                    Player.img=chara[(walkanime/10)%4 +7];//右に歩くアニメ
        }
 
        if( walkdirection == 0 && ( Key[ KEY_INPUT_LEFT ] == 0 ) && Jump== 0 )  // 左キーが離されてジャンプ状態じゃなかったら
                Player.img=chara[6];        //左を向く
 
        if( Key[ KEY_INPUT_RIGHT ] >= 1 && Key[ KEY_INPUT_LEFT  ] >= 1)//左右両方押されてたら右向く
            Player.img=chara[0];
 
	CameraX = Player.X - SCREEN_WIDTH/2;
    
    if(CameraX < 0) CameraX = 0;
    if(CameraX > (MAP_PIXEL_WIDTH-SCREEN_WIDTH)) CameraX = (MAP_PIXEL_WIDTH-SCREEN_WIDTH);
    
    PlayerViewX = Player.X - CameraX;

 
        // ジャンプ中ならキャラの落下処理
        if(Jump == 1){
            Player.Y -= JumpPower ;
            JumpPower -= 1 ;
        }
 
    //補正//
    //床にめりこんだら上に補正
            if(JumpPower < 0)
                if(MapData[(Player.Y+64)/32][(Player.X + 16)/32] != 0
                ||MapData[(Player.Y+64)/32][(Player.X + 47)/32] != 0)
    {
        Player.Y = ((Player.Y+65)/32) * 32 - 65 + 1 ;
    }
    //天井にめりこんだら下に補正
            if(JumpPower > 0)
                if(MapData[(Player.Y-1)/32][(Player.X + 16)/32] != 0
                ||MapData[(Player.Y-1)/32][(Player.X + 47)/32] != 0)
    {
        Player.Y = ((Player.Y+65)/32) * 32 - 65 + 32 + 1 ;
        JumpPower = 0 ;
    }
 
    //右の壁にめりこんだら左に補正
            if(MapData[(Player.Y)/32][(Player.X + 48)/32] != 0
                ||MapData[(Player.Y+63)/32][(Player.X + 48)/32] != 0)   
    {
        Player.X = ((Player.X+65)/32) * 32 - 65 + 16 + 1 ;
    }
    //左の壁にめりこんだら右に補正
            if(MapData[(Player.Y)/32][(Player.X+15)/32] != 0
                ||MapData[(Player.Y+63)/32][(Player.X+15)/32] != 0)
    {
        Player.X = ((Player.X+65)/32) * 32 - 65 + 16 + 1 ;
    }
 
 
 
 
    // ジャンプ中にキャラが地面についたら落下をやめる
        if(Jump == 1 && JumpPower < 0 )
            if(MapData[(Player.Y+64)/32][(Player.X + 16)/32] != 0
                ||MapData[(Player.Y+64)/32][(Player.X + 47)/32] != 0)
    {
        JumpPower = 0 ;
        Jump = 0 ;
    }
 
    //歩いているときに踏み外したらジャンプ状態にする
        if(Jump == 0)
            if(MapData[(Player.Y+64)/32][(Player.X + 16)/32] == 0
                &&MapData[(Player.Y+64)/32][(Player.X + 47)/32] == 0)
    {
        Jump = 1 ;
    }
    
 
 
    //HP
    if( HP==10 )
        HPimg = HPgazou[10];
 
            //画像
 
    DrawGraph(PlayerViewX, Player.Y, Player.img, TRUE ); // x,y の位置にキャラを描画
 
 
    //ステータスバー背景
    for(int y=0 ; y<1 ; y++){
        for(int x=0 ; x<20 ; x++){
            DrawGraph(x*32+0,y*32+418,statesbar,FALSE);
            }
    }
 
    DrawGraph( 0, 420, HPimg, TRUE ); // HPバー
 
 
        ScreenFlip();
    }
 
    DxLib_End();
    return 0;
}

Re: マップチップで画面をを左右にスクロールさせる

Posted: 2011年6月23日(木) 23:24
by softya(ソフト屋)
chalaza さんが書きました:まず、マップをスクロールすることはできたのですが、たとえばドアに入ったら違うマップに移動するという場合、
マップチップはどう分けたらよいのでしょうか…横にしかスクロールしないようにして、ドアに入ったら縦に1画面分動かす…というような考え方でよいのですか?
何面もあるようなアクションゲームを作る場合は、マップを別の配列に分ける必要があると思います。
理由はステージごとに多分、横の長さが変わると思うからです。

あるいは、マップの情報をファイルにしてしまう方法があります。これはステージが変わるごとに読み込む方法ですね。
マップ作成ツールを使えばマップ作成が容易になるので検討されたほうが良いでしょう。

マップ作成ツールの例。
「Platinumの詳細情報 : Vector ソフトを探す!」
http://www.vector.co.jp/soft/win95/game/se231004.html
chalaza さんが書きました:それと…初心者なので戻り値無いということしか知らないVoidのことなんですが…
void GameMain(){ …というように皆使っていますが、これはプログラムを見やすくする以外に何か深い意味があるのでしょうか…
関係ないこと聞いてすいません。
voidは値を返さない関数という意味です。
関数は処理結果を返したりする事があるので、その場合は
inf func(int x) {
などと定義します。
それに対して
void func(int x) {
は値を返さない関数です。

Re: マップチップで画面をを左右にスクロールさせる

Posted: 2011年6月24日(金) 21:25
by chalaza
マップを移動するステージを作る時のことで、
たとえばマップデータをもう一つ分けて用意するというやり方の場合のことなんですが…
マップの縦横のサイズとマップデータをコピーしてもう一つのマップデータ2を作った場合、
そのままだと最初のマップデータとコピーしたマップデータ2の表示位置が重なってしまうのはまぁ当たり前のことなんですが…
そういう場合、画面にマップデータを表示する位置を変える時はマップデータのどこの数値をいじれば良いのでしょうか…
マップデータの縦の長さ、横の長さ、チップの大きさ以外になにか足したりするのでしょうか…

Re: マップチップで画面をを左右にスクロールさせる

Posted: 2011年6月24日(金) 22:55
by softya(ソフト屋)
えーと説明がよく分からないのですが、マップ1からマップ2に移る場合の問題点の事でしょうか?
マップ1に対してマップ2が単なるコピーならマップ2を用意する意味が無いと思うのですが、縦横サイズが同じというだけの意味ですか?

>表示位置が重なってしまうのはまぁ当たり前のことなんですが…
同時に表示しないと重なりません。

>そういう場合、画面にマップデータを表示する位置を変える時はマップデータのどこの数値をいじれば良いのでしょうか…
参照する配列を切り替えれば良いと思います。

>マップデータの縦の長さ、横の長さ、チップの大きさ以外になにか足したりするのでしょうか…
足し引きの問題ではないと思います。

たぶん、私はchalazaさんの言いたいことが理解できていないと思います。

Re: マップチップで画面をを左右にスクロールさせる

Posted: 2011年6月25日(土) 13:10
by chalaza
説明不足ですみません…
私が説明したかったのは簡単にいうと、マップデータを作って表示すると必ず画面座標の0.0から右下にマップデータが表示されますが、
たとえばそれを画面座標の0.480から右下にマップデータを表示したりはできないのかということです。
でも今考えてみればたぶんそんな考え方はいらないと思いました。
画面を移動するときは表示するマップチップを変えれば良いということですね。
そういう場合は、マップデータ1とマップデータ2を作って、最初はマップデータ2は表示せず、
扉にはいったらマップデータ1をマップデータ2にしてプレイヤーのY座標を変更すれば良いということですかね?

Re: マップチップで画面をを左右にスクロールさせる

Posted: 2011年6月25日(土) 13:18
by chalaza
やっと理解できましたと思います…
たとえばマップデータ1とマップデータ2と、「stage」という変数を作っておいて
stageが1の場合はマップデータ1を表示して、マップデータ1との当たり判定。
扉にはいったらstageを2にして、プレイヤーのY座標を動かす。
stageが2の場合はマップデータ2を表示して、マップデータ2との当たり判定。
という考え方で合ってますか?

Re: マップチップで画面をを左右にスクロールさせる

Posted: 2011年6月25日(土) 17:29
by softya(ソフト屋)
基本的には、そういう事ですがポインタで管理するほうが合理的ですよ。
あとマップ配列の作成方法もちゃんと検討したほうが良いです。

参考。毎フレーム2つのマップが切り替わるのでチラつきます。
このコードでは、マップチップはマップ1とマップ2では切り替えていませんが本来は切り替える必要があるでしょう。

コード:

#include "DxLib.h"


//構造体

//プレイヤー構造体  
struct Playerdata{
	int X, Y, img;
}Player;

////

int Key[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;
}



#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480
#define CHIP_SIZE 32
#define MAP_PIXEL_WIDTH 1280
#define MAP_PIXEL_HEIGHT 480
#define MAP_WIDTH (MAP_PIXEL_WIDTH/CHIP_SIZE)
#define MAP_HEIGHT (MAP_PIXEL_HEIGHT/CHIP_SIZE)

// マップのデータ
int MapData1[ 15 ][ 40 ] =
{
	{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
	{ 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
	{ 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
	{ 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
	{ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
	{ 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
	{ 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
	{ 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
	{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
	{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
	{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
	{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
} ;

int MapData2[ 15 ][ 40 ] =
{
	{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
	{ 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
	{ 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
	{ 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
	{ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
	{ 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
	{ 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
	{ 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
	{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
	{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
	{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
	{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
} ;


/////
int ScrollX,OnGround;


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
	ChangeWindowMode(TRUE);//ウィンドウモード
	if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

	Player.X = 640/2;
	Player.Y = 480/2;


	// 画像をロード
	//マップ
	int lenga1 = LoadGraph( "image/map/lenga1.png" );
	int statesbar = LoadGraph( "image/statesbar.png" );
	int haikei1 = LoadGraph( "image/haikei1.png" );
	//キャラ関係
	int chara[24];      //キャラ画像
	LoadDivGraph( "image/chara.png" , 24 , 6 , 4 , 64 , 64 , chara );//プレイヤー
	int HPgazou[11];    //HPの画像
	LoadDivGraph( "image/HP.png" , 11 , 1 , 11 , 224 , 32 , HPgazou );//体力


	//関数

	Player.X = 32 , Player.Y = 288 ;    //プレイヤー座標
	int PlayerViewX ;
	int CameraX;

	int JumpPower = 0 ;         //ジャンプパワー
	int Jump = 0 ;              //ジャンプ状態か
	int walkdirection = 1 ;     //歩く向き
	int walkanime = 0 ;         //歩くアニメーション用

	int HP = 10 ;               //HP
	int HPimg ;                 //HP画像
	int i , j ;                 //座標用

	//	マップ配列参照用のポインタ
	int (*Stage)[40];

	//	マップのポインタを初期化
	Stage = MapData1;

	while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
		//↑メッセージ処理          ↑画面をクリア           ↑入力状態を保存       ↑ESCが押されていない

		//ココから
		//背景を描画
		DrawGraph( 0, 0, haikei1, FALSE ); // 背景

		// マップを描画
		for( i = 0 ; i < MAP_HEIGHT ; i ++ )
		{
			for( j = 0 ; j < MAP_WIDTH ; j ++ )
			{
				if( Stage[ i ][ j ] == 1 ) //1のとき壁を描画
				{
					DrawGraph( j*CHIP_SIZE-CameraX, i*CHIP_SIZE , lenga1 , FALSE ) ;
				}
			}
		}

		// ジャンプ状態じゃなく、ジャンプボタンを押して地面についていたらジャンプ
		if ( Jump==0 && (Key[KEY_INPUT_SPACE] >=1 ) && JumpPower <= 0) {
			if(Stage[(Player.Y+64)/32][(Player.X + 16)/32] != 0
				||Stage[(Player.Y+64)/32][(Player.X + 47)/32] != 0)
			{
				JumpPower = 16 ;
				Jump = 1 ;
			}
		}

		//ジャンプ状態で右向きなら右ジャンプの画像
		if ( walkdirection == 1 && Jump == 1 ){
			Player.img=chara[5];
		}

		//ジャンプ状態で左向きなら左ジャンプの画像
		if ( walkdirection == 0 && Jump == 1 ){
			Player.img=chara[11];
		}


		if( Key[ KEY_INPUT_RIGHT ] >= 1 ) {     //右キーが押されて
			if(Stage[(Player.Y)/32][(Player.X + 48)/32] == 0      //右が壁じゃなかったら
				&&Stage[(Player.Y+31)/32][(Player.X + 48)/32] == 0
				&&Stage[(Player.Y+32)/32][(Player.X + 48)/32] == 0
				&&Stage[(Player.Y+63)/32][(Player.X + 48)/32] == 0)
				Player.X+=3 ;   //右に動く
			walkdirection = 1 ;
		}

		if( Key[ KEY_INPUT_RIGHT ] >= 1 && Jump== 0 ){  // 右キーが押されていてジャンプ状態じゃなかったら
			walkanime++;
			Player.img=chara[(walkanime/10)%4 +1];//右に歩くアニメ
		}

		if( walkdirection == 1 && ( Key[ KEY_INPUT_RIGHT ] == 0 )&& Jump== 0 )// 右キーが離されてジャンプ状態じゃなかったら
			Player.img=chara[0];        //右を向く


		if( Key[ KEY_INPUT_LEFT ] >= 1 ){// 左キーが押されて
			if(Stage[(Player.Y)/32][(Player.X+15)/32] == 0
				&&Stage[(Player.Y+31)/32][(Player.X+15)/32] == 0
				&&Stage[(Player.Y+32)/32][(Player.X+15)/32] == 0
				&&Stage[(Player.Y+63)/32][(Player.X+15)/32] == 0)     //左が壁じゃなかったら
				Player.X-=3 ;   //左に動く
			walkdirection = 0 ;
		}

		if( Key[ KEY_INPUT_LEFT  ] >= 1 && Jump== 0 ){  // 左キーが押されていてジャンプ状態じゃなかったら
			walkanime++;
			Player.img=chara[(walkanime/10)%4 +7];//右に歩くアニメ
		}

		if( walkdirection == 0 && ( Key[ KEY_INPUT_LEFT ] == 0 ) && Jump== 0 )  // 左キーが離されてジャンプ状態じゃなかったら
			Player.img=chara[6];        //左を向く

		if( Key[ KEY_INPUT_RIGHT ] >= 1 && Key[ KEY_INPUT_LEFT  ] >= 1)//左右両方押されてたら右向く
			Player.img=chara[0];

		CameraX = Player.X - SCREEN_WIDTH/2;

		if(CameraX < 0) CameraX = 0;
		if(CameraX > (MAP_PIXEL_WIDTH-SCREEN_WIDTH)) CameraX = (MAP_PIXEL_WIDTH-SCREEN_WIDTH);

		PlayerViewX = Player.X - CameraX;


		// ジャンプ中ならキャラの落下処理
		if(Jump == 1){
			Player.Y -= JumpPower ;
			JumpPower -= 1 ;
		}

		//補正//
		//床にめりこんだら上に補正
		if(JumpPower < 0) {
			if(Stage[(Player.Y+64)/32][(Player.X + 16)/32] != 0
				||Stage[(Player.Y+64)/32][(Player.X + 47)/32] != 0)
			{
				Player.Y = ((Player.Y+65)/32) * 32 - 65 + 1 ;
			}
		}
		//天井にめりこんだら下に補正
		if(JumpPower > 0) {
			if(Stage[(Player.Y-1)/32][(Player.X + 16)/32] != 0
				||Stage[(Player.Y-1)/32][(Player.X + 47)/32] != 0)
			{
				Player.Y = ((Player.Y+65)/32) * 32 - 65 + 32 + 1 ;
				JumpPower = 0 ;
			}
		}

		//右の壁にめりこんだら左に補正
		if(Stage[(Player.Y)/32][(Player.X + 48)/32] != 0
			||Stage[(Player.Y+63)/32][(Player.X + 48)/32] != 0)   
		{
			Player.X = ((Player.X+65)/32) * 32 - 65 + 16 + 1 ;
		}
		//左の壁にめりこんだら右に補正
		if(Stage[(Player.Y)/32][(Player.X+15)/32] != 0
			||Stage[(Player.Y+63)/32][(Player.X+15)/32] != 0)
		{
			Player.X = ((Player.X+65)/32) * 32 - 65 + 16 + 1 ;
		}

		// ジャンプ中にキャラが地面についたら落下をやめる
		if(Jump == 1 && JumpPower < 0 ) {
			if(Stage[(Player.Y+64)/32][(Player.X + 16)/32] != 0
				||Stage[(Player.Y+64)/32][(Player.X + 47)/32] != 0)
			{
				JumpPower = 0 ;
				Jump = 0 ;
			}
		}
		//歩いているときに踏み外したらジャンプ状態にする
		if(Jump == 0) {
			if(Stage[(Player.Y+64)/32][(Player.X + 16)/32] == 0
				&&Stage[(Player.Y+64)/32][(Player.X + 47)/32] == 0)
			{
				Jump = 1 ;
			}
		}



		//HP
		if( HP==10 )
			HPimg = HPgazou[10];

		//画像

		DrawGraph(PlayerViewX, Player.Y, Player.img, TRUE ); // x,y の位置にキャラを描画


		//ステータスバー背景
		for(int y=0 ; y<1 ; y++){
			for(int x=0 ; x<20 ; x++){
				DrawGraph(x*32+0,y*32+418,statesbar,FALSE);
			}
		}

		DrawGraph( 0, 420, HPimg, TRUE ); // HPバー

		//	交互にマップを切り替え
		if( Stage == MapData1 ) {
			Stage = MapData2;
		} else {
			Stage = MapData1;
		}


		ScreenFlip();
	}

	DxLib_End();
	return 0;
}

Re: マップチップで画面をを左右にスクロールさせる

Posted: 2011年6月26日(日) 20:13
by chalaza
ポインタのことをよく勉強せずにいた私が悪いのですが…
コードを参考にさせていただき、マップデータ2にもMAP_WIDTH2とMAP_HEIGHT2をつけてみたんですが…
まずマップデータ2の横の長さを[ 15 ][ 50 ]にしたときのことなのですが、
配列参照のポインタはint (*Stage)[40];として40と決めてしまっていますけども、Stageは最初は横40マスなのでそのままでよいですが、
途中で横50マスのマップデータ2に変える場合は、途中でStageを50に変えなければいけないということでしょうか?

下エラーになったやつです。

コード:

#include "DxLib.h"
 
 
//構造体
 
//プレイヤー構造体  
struct Playerdata{
    int X, Y, img;
}Player;
 
////
 
int Key[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;
}
 
 
 
#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480
#define CHIP_SIZE 32
#define MAP_PIXEL_WIDTH 1280
#define MAP_PIXEL_HEIGHT 480
#define MAP_WIDTH (MAP_PIXEL_WIDTH/CHIP_SIZE)
#define MAP_HEIGHT (MAP_PIXEL_HEIGHT/CHIP_SIZE)
 
// マップのデータ
int MapData1[ 15 ][ 40 ] =
{
    { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
    { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
    { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
    { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
    { 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
    { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
    { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
    { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
    { 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
    { 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
    { 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
    { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
    { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
    { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
    { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
} ;
 
#define MAP_PIXEL_WIDTH2 1600
#define MAP_PIXEL_HEIGHT2 480
#define MAP_WIDTH2 (MAP_PIXEL_WIDTH/CHIP_SIZE)
#define MAP_HEIGHT2 (MAP_PIXEL_HEIGHT/CHIP_SIZE)

int MapData2[ 15 ][ 50 ] =
{
    { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
    { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
    { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
    { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
    { 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
    { 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
    { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
    { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
    { 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
    { 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } ,
    { 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
    { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
    { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
    { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
    { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
} ;
 
 
/////
int ScrollX,OnGround;
 
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
 
    Player.X = 640/2;
    Player.Y = 480/2;
 
 
    // 画像をロード
    //マップ
    int lenga1 = LoadGraph( "image/map/lenga1.png" );
    int statesbar = LoadGraph( "image/statesbar.png" );
    int haikei1 = LoadGraph( "image/haikei1.png" );
    //キャラ関係
    int chara[24];      //キャラ画像
    LoadDivGraph( "image/chara.png" , 24 , 6 , 4 , 64 , 64 , chara );//プレイヤー
    int HPgazou[11];    //HPの画像
    LoadDivGraph( "image/HP.png" , 11 , 1 , 11 , 224 , 32 , HPgazou );//体力
 
 
    //関数
 
    Player.X = 32 , Player.Y = 288 ;    //プレイヤー座標
    int PlayerViewX ;
    int CameraX;
 
    int JumpPower = 0 ;         //ジャンプパワー
    int Jump = 0 ;              //ジャンプ状態か
    int walkdirection = 1 ;     //歩く向き
    int walkanime = 0 ;         //歩くアニメーション用
 
    int HP = 10 ;               //HP
    int HPimg ;                 //HP画像
    int i , j ;                 //座標用
 
    //  マップ配列参照用のポインタ
    int (*Stage)[40];
 
    //  マップのポインタを初期化
    Stage = MapData1;
 
    while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
        //↑メッセージ処理          ↑画面をクリア           ↑入力状態を保存       ↑ESCが押されていない
 
        //ココから
        //背景を描画
        DrawGraph( 0, 0, haikei1, FALSE ); // 背景
 
        // マップを描画
        for( i = 0 ; i < MAP_HEIGHT ; i ++ )
        {
            for( j = 0 ; j < MAP_WIDTH ; j ++ )
            {
                if( Stage[ i ][ j ] == 1 ) //1のとき壁を描画
                {
                    DrawGraph( j*CHIP_SIZE-CameraX, i*CHIP_SIZE , lenga1 , FALSE ) ;
                }
            }
        }
 
        // ジャンプ状態じゃなく、ジャンプボタンを押して地面についていたらジャンプ
        if ( Jump==0 && (Key[KEY_INPUT_SPACE] >=1 ) && JumpPower <= 0) {
            if(Stage[(Player.Y+64)/32][(Player.X + 16)/32] != 0
                ||Stage[(Player.Y+64)/32][(Player.X + 47)/32] != 0)
            {
                JumpPower = 16 ;
                Jump = 1 ;
            }
        }
 
        //ジャンプ状態で右向きなら右ジャンプの画像
        if ( walkdirection == 1 && Jump == 1 ){
            Player.img=chara[5];
        }
 
        //ジャンプ状態で左向きなら左ジャンプの画像
        if ( walkdirection == 0 && Jump == 1 ){
            Player.img=chara[11];
        }
 
 
        if( Key[ KEY_INPUT_RIGHT ] >= 1 ) {     //右キーが押されて
            if(Stage[(Player.Y)/32][(Player.X + 48)/32] == 0      //右が壁じゃなかったら
                &&Stage[(Player.Y+31)/32][(Player.X + 48)/32] == 0
                &&Stage[(Player.Y+32)/32][(Player.X + 48)/32] == 0
                &&Stage[(Player.Y+63)/32][(Player.X + 48)/32] == 0)
                Player.X+=3 ;   //右に動く
            walkdirection = 1 ;
        }
 
        if( Key[ KEY_INPUT_RIGHT ] >= 1 && Jump== 0 ){  // 右キーが押されていてジャンプ状態じゃなかったら
            walkanime++;
            Player.img=chara[(walkanime/10)%4 +1];//右に歩くアニメ
        }
 
        if( walkdirection == 1 && ( Key[ KEY_INPUT_RIGHT ] == 0 )&& Jump== 0 )// 右キーが離されてジャンプ状態じゃなかったら
            Player.img=chara[0];        //右を向く
 
 
        if( Key[ KEY_INPUT_LEFT ] >= 1 ){// 左キーが押されて
            if(Stage[(Player.Y)/32][(Player.X+15)/32] == 0
                &&Stage[(Player.Y+31)/32][(Player.X+15)/32] == 0
                &&Stage[(Player.Y+32)/32][(Player.X+15)/32] == 0
                &&Stage[(Player.Y+63)/32][(Player.X+15)/32] == 0)     //左が壁じゃなかったら
                Player.X-=3 ;   //左に動く
            walkdirection = 0 ;
        }
 
        if( Key[ KEY_INPUT_LEFT  ] >= 1 && Jump== 0 ){  // 左キーが押されていてジャンプ状態じゃなかったら
            walkanime++;
            Player.img=chara[(walkanime/10)%4 +7];//右に歩くアニメ
        }
 
        if( walkdirection == 0 && ( Key[ KEY_INPUT_LEFT ] == 0 ) && Jump== 0 )  // 左キーが離されてジャンプ状態じゃなかったら
            Player.img=chara[6];        //左を向く
 
        if( Key[ KEY_INPUT_RIGHT ] >= 1 && Key[ KEY_INPUT_LEFT  ] >= 1)//左右両方押されてたら右向く
            Player.img=chara[0];
 
        CameraX = Player.X - SCREEN_WIDTH/2;
 
        if(CameraX < 0) CameraX = 0;
        if(CameraX > (MAP_PIXEL_WIDTH-SCREEN_WIDTH)) CameraX = (MAP_PIXEL_WIDTH-SCREEN_WIDTH);
 
        PlayerViewX = Player.X - CameraX;
 
 
        // ジャンプ中ならキャラの落下処理
        if(Jump == 1){
            Player.Y -= JumpPower ;
            JumpPower -= 1 ;
        }
 
        //補正//
        //床にめりこんだら上に補正
        if(JumpPower < 0) {
            if(Stage[(Player.Y+64)/32][(Player.X + 16)/32] != 0
                ||Stage[(Player.Y+64)/32][(Player.X + 47)/32] != 0)
            {
                Player.Y = ((Player.Y+65)/32) * 32 - 65 + 1 ;
            }
        }
        //天井にめりこんだら下に補正
        if(JumpPower > 0) {
            if(Stage[(Player.Y-1)/32][(Player.X + 16)/32] != 0
                ||Stage[(Player.Y-1)/32][(Player.X + 47)/32] != 0)
            {
                Player.Y = ((Player.Y+65)/32) * 32 - 65 + 32 + 1 ;
                JumpPower = 0 ;
            }
        }
 
        //右の壁にめりこんだら左に補正
        if(Stage[(Player.Y)/32][(Player.X + 48)/32] != 0
            ||Stage[(Player.Y+63)/32][(Player.X + 48)/32] != 0)   
        {
            Player.X = ((Player.X+65)/32) * 32 - 65 + 16 + 1 ;
        }
        //左の壁にめりこんだら右に補正
        if(Stage[(Player.Y)/32][(Player.X+15)/32] != 0
            ||Stage[(Player.Y+63)/32][(Player.X+15)/32] != 0)
        {
            Player.X = ((Player.X+65)/32) * 32 - 65 + 16 + 1 ;
        }
 
        // ジャンプ中にキャラが地面についたら落下をやめる
        if(Jump == 1 && JumpPower < 0 ) {
            if(Stage[(Player.Y+64)/32][(Player.X + 16)/32] != 0
                ||Stage[(Player.Y+64)/32][(Player.X + 47)/32] != 0)
            {
                JumpPower = 0 ;
                Jump = 0 ;
            }
        }
        //歩いているときに踏み外したらジャンプ状態にする
        if(Jump == 0) {
            if(Stage[(Player.Y+64)/32][(Player.X + 16)/32] == 0
                &&Stage[(Player.Y+64)/32][(Player.X + 47)/32] == 0)
            {
                Jump = 1 ;
            }
        }
 
 
 
        //HP
        if( HP==10 )
            HPimg = HPgazou[10];
 
        //画像
 
        DrawGraph(PlayerViewX, Player.Y, Player.img, TRUE ); // x,y の位置にキャラを描画
 
 
        //ステータスバー背景
        for(int y=0 ; y<1 ; y++){
            for(int x=0 ; x<20 ; x++){
                DrawGraph(x*32+0,y*32+418,statesbar,FALSE);
            }
        }
 
        DrawGraph( 0, 420, HPimg, TRUE ); // HPバー
 
        //  交互にマップを切り替え
        if( Key[ KEY_INPUT_M ] >= 1 ) {
            Stage = MapData2;
        } else {
            Stage = MapData1;
        }
 
 
        ScreenFlip();
    }
 
    DxLib_End();
    return 0;
}

Re: マップチップで画面をを左右にスクロールさせる

Posted: 2011年6月26日(日) 23:51
by softya(ソフト屋)
やはりステージごとにサイズを変えるんですよね・・・。
この場合は
int (*Stage)[40];
では困りますよね。

なので、この場合は2次元配列は使わずに1次元配列を使います。

コード:

int MapData1[ MAP_HEIGHT*MAP_WIDTH ] =
{
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
} ;
こうすれば、
int *Stage;
で配列のポインタを持てますし可変サイズに対応できます。

[訂正]あっ大間違いだ修正。+さらにxとyが逆
ただし、マップ配列の参照が少しややこしくなるのでマクロを作って
#define STAGE_CHIP(y,x,width) (stage[(y)*(width)+(x)])
としておいて
Stage[(Player.Y+64)/32][(Player.X + 16)/32]
なら
STAGE_CHIP((Player.Y+64)/32,(Player.X + 16)/32,MAP_WIDTH)
と書き換えます。

あるいは、
#define STAGE_CHIP(y,x,width) (stage[(y)/CHIP_SIZE*(width)+(x)/CHIP_SIZE])
としておけば、
STAGE_CHIP(Player.Y+64,Player.X+16,MAP_WIDTH)
と言うふうにも書けます。

[追記]可変で使う場合はMAP_WIDTHの部分は変数を使ってマクロの中に取り込んでください。

それとプログラム全体が長くなっているので、関数化も積極的に行ったほうが良いですね。

Re: マップチップで画面をを左右にスクロールさせる

Posted: 2011年6月27日(月) 00:39
by softya(ソフト屋)
直してみました。
いろいろテクニックを使っていますので分からないところは聞いてください。

コード:

#include "DxLib.h"
 
 
//構造体
 
//	プレイヤー構造体  
struct Playerdata{
    int X, Y, img;
}Player;


////
 
int Key[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;
}
 
 
 
#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480
#define CHIP_SIZE 32
#define MAP_PIXEL_WIDTH 1280
#define MAP_PIXEL_HEIGHT 480
#define MAP_WIDTH (MAP_PIXEL_WIDTH/CHIP_SIZE)
#define MAP_HEIGHT (MAP_PIXEL_HEIGHT/CHIP_SIZE)
 
// マップのデータ
int MapData1[ MAP_HEIGHT*MAP_WIDTH ] =
{
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
} ;
 
#define MAP_PIXEL_WIDTH2 1600
#define MAP_PIXEL_HEIGHT2 480
#define MAP_WIDTH2 (MAP_PIXEL_WIDTH2/CHIP_SIZE)
#define MAP_HEIGHT2 (MAP_PIXEL_HEIGHT2/CHIP_SIZE)
 
int MapData2[ MAP_HEIGHT2*MAP_WIDTH2 ] =
{
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
} ;



//	ステージ構造体
typedef struct {
	int *stage;	//マップのポインタ
	int width;	//横サイズ
	int height;	//縦サイズ
} StageData_t;

//	ステージテーブル
StageData_t StageDataSelect[2] = {
	{ MapData1, MAP_WIDTH, MAP_HEIGHT },	//マップ1
	{ MapData2, MAP_WIDTH2, MAP_HEIGHT2 },	//マップ2
};

 
/////
int ScrollX,OnGround;
 

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
 
    Player.X = 640/2;
    Player.Y = 480/2;
 
 
    // 画像をロード
    //マップ
    int lenga1 = LoadGraph( "image/map/lenga1.png" );
    int statesbar = LoadGraph( "image/statesbar.png" );
    int haikei1 = LoadGraph( "image/haikei1.png" );
    //キャラ関係
    int chara[24];      //キャラ画像
    LoadDivGraph( "image/chara.png" , 24 , 6 , 4 , 64 , 64 , chara );//プレイヤー
    int HPgazou[11];    //HPの画像
    LoadDivGraph( "image/HP.png" , 11 , 1 , 11 , 224 , 32 , HPgazou );//体力
 
 
    //関数
 
    Player.X = 32 , Player.Y = 288 ;    //プレイヤー座標
    int PlayerViewX ;
    int CameraX;
 
    int JumpPower = 0 ;         //ジャンプパワー
    int Jump = 0 ;              //ジャンプ状態か
    int walkdirection = 1 ;     //歩く向き
    int walkanime = 0 ;         //歩くアニメーション用
 
    int HP = 10 ;               //HP
    int HPimg ;                 //HP画像
    int i , j ;                 //座標用
 
    //  マップ配列参照用のデータと初期化。
    StageData_t StageData = StageDataSelect[0];
	//	ステージ参照マクロ
	#define STAGE_CHIP(y,x) (StageData.stage[(y)*(StageData.width)+(x)])
	#define STAGE_CHIPC(y,x) (StageData.stage[(y)/CHIP_SIZE*(StageData.width)+(x)/CHIP_SIZE])
 
    while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
        //↑メッセージ処理          ↑画面をクリア           ↑入力状態を保存       ↑ESCが押されていない
 
        //ココから
        //背景を描画
        DrawGraph( 0, 0, haikei1, FALSE ); // 背景
 
        // マップを描画
        for( i = 0 ; i < MAP_HEIGHT ; i ++ )
        {
            for( j = 0 ; j < MAP_WIDTH ; j ++ )
            {
                if( STAGE_CHIP(i,j) == 1 ) //1のとき壁を描画
                {
                    DrawGraph( j*CHIP_SIZE-CameraX, i*CHIP_SIZE , lenga1 , FALSE ) ;
                }
            }
        }
 
        // ジャンプ状態じゃなく、ジャンプボタンを押して地面についていたらジャンプ
        if ( Jump==0 && (Key[KEY_INPUT_SPACE] >=1 ) && JumpPower <= 0) {
            if(STAGE_CHIPC(Player.Y+64,Player.X + 16) != 0
                ||STAGE_CHIPC(Player.Y+64,Player.X + 47) != 0)
            {
                JumpPower = 16 ;
                Jump = 1 ;
            }
        }
 
        //ジャンプ状態で右向きなら右ジャンプの画像
        if ( walkdirection == 1 && Jump == 1 ){
            Player.img=chara[5];
        }
 
        //ジャンプ状態で左向きなら左ジャンプの画像
        if ( walkdirection == 0 && Jump == 1 ){
            Player.img=chara[11];
        }
 
 
        if( Key[ KEY_INPUT_RIGHT ] >= 1 ) {     //右キーが押されて
            if(STAGE_CHIPC(Player.Y,Player.X + 48) == 0      //右が壁じゃなかったら
                &&STAGE_CHIPC(Player.Y+31,Player.X + 48) == 0
                &&STAGE_CHIPC(Player.Y+32,Player.X + 48) == 0
                &&STAGE_CHIPC(Player.Y+63,Player.X + 48) == 0)
                Player.X+=3 ;   //右に動く
            walkdirection = 1 ;
        }
 
        if( Key[ KEY_INPUT_RIGHT ] >= 1 && Jump== 0 ){  // 右キーが押されていてジャンプ状態じゃなかったら
            walkanime++;
            Player.img=chara[(walkanime/10)%4 +1];//右に歩くアニメ
        }
 
        if( walkdirection == 1 && ( Key[ KEY_INPUT_RIGHT ] == 0 )&& Jump== 0 )// 右キーが離されてジャンプ状態じゃなかったら
            Player.img=chara[0];        //右を向く
 
 
        if( Key[ KEY_INPUT_LEFT ] >= 1 ){// 左キーが押されて
            if(STAGE_CHIPC(Player.Y,Player.X+15) == 0
                &&STAGE_CHIPC(Player.Y+31,Player.X+15) == 0
                &&STAGE_CHIPC(Player.Y+32,Player.X+15) == 0
                &&STAGE_CHIPC(Player.Y+63,Player.X+15) == 0)     //左が壁じゃなかったら
                Player.X-=3 ;   //左に動く
            walkdirection = 0 ;
        }
 
        if( Key[ KEY_INPUT_LEFT  ] >= 1 && Jump== 0 ){  // 左キーが押されていてジャンプ状態じゃなかったら
            walkanime++;
            Player.img=chara[(walkanime/10)%4 +7];//右に歩くアニメ
        }
 
        if( walkdirection == 0 && ( Key[ KEY_INPUT_LEFT ] == 0 ) && Jump== 0 )  // 左キーが離されてジャンプ状態じゃなかったら
            Player.img=chara[6];        //左を向く
 
        if( Key[ KEY_INPUT_RIGHT ] >= 1 && Key[ KEY_INPUT_LEFT  ] >= 1)//左右両方押されてたら右向く
            Player.img=chara[0];
 
        CameraX = Player.X - SCREEN_WIDTH/2;
 
        if(CameraX < 0) CameraX = 0;
        if(CameraX > (MAP_PIXEL_WIDTH-SCREEN_WIDTH)) CameraX = (MAP_PIXEL_WIDTH-SCREEN_WIDTH);
 
        PlayerViewX = Player.X - CameraX;
 
 
        // ジャンプ中ならキャラの落下処理
        if(Jump == 1){
            Player.Y -= JumpPower ;
            JumpPower -= 1 ;
        }
 
        //補正//
        //床にめりこんだら上に補正
        if(JumpPower < 0) {
            if(STAGE_CHIPC(Player.Y+64,Player.X + 16) != 0
                ||STAGE_CHIPC(Player.Y+64,Player.X + 47) != 0)
            {
                Player.Y = ((Player.Y+65)/32) * 32 - 65 + 1 ;
            }
        }
        //天井にめりこんだら下に補正
        if(JumpPower > 0) {
            if(STAGE_CHIPC(Player.Y-1,Player.X + 16) != 0
                ||STAGE_CHIPC(Player.Y-1,Player.X + 47) != 0)
            {
                Player.Y = ((Player.Y+65)/32) * 32 - 65 + 32 + 1 ;
                JumpPower = 0 ;
            }
        }
 
        //右の壁にめりこんだら左に補正
        if(STAGE_CHIPC(Player.Y,Player.X + 48) != 0
            ||STAGE_CHIPC(Player.Y+63,Player.X + 48) != 0)   
        {
            Player.X = ((Player.X+65)/32) * 32 - 65 + 16 + 1 ;
        }
        //左の壁にめりこんだら右に補正
        if(STAGE_CHIPC(Player.Y,Player.X+15) != 0
            ||STAGE_CHIPC(Player.Y+63,Player.X+15) != 0)
        {
            Player.X = ((Player.X+65)/32) * 32 - 65 + 16 + 1 ;
        }
 
        // ジャンプ中にキャラが地面についたら落下をやめる
        if(Jump == 1 && JumpPower < 0 ) {
            if(STAGE_CHIPC(Player.Y+64,Player.X + 16) != 0
                ||STAGE_CHIPC(Player.Y+64,Player.X + 47) != 0)
            {
                JumpPower = 0 ;
                Jump = 0 ;
            }
        }
        //歩いているときに踏み外したらジャンプ状態にする
        if(Jump == 0) {
            if(STAGE_CHIPC(Player.Y+64,Player.X + 16) == 0
                &&STAGE_CHIPC(Player.Y+64,Player.X + 47) == 0)
            {
                Jump = 1 ;
            }
        }
 
 
 
        //HP
        if( HP==10 )
            HPimg = HPgazou[10];
 
        //画像
 
        DrawGraph(PlayerViewX, Player.Y, Player.img, TRUE ); // x,y の位置にキャラを描画
 
 
        //ステータスバー背景
        for(int y=0 ; y<1 ; y++){
            for(int x=0 ; x<20 ; x++){
                DrawGraph(x*32+0,y*32+418,statesbar,FALSE);
            }
        }
 
        DrawGraph( 0, 420, HPimg, TRUE ); // HPバー
 
        //  交互にマップを切り替え
        if( Key[ KEY_INPUT_M ] >= 1 ) {
			StageData = StageDataSelect[1];
        } else {
			StageData = StageDataSelect[0];
        }
 
 
        ScreenFlip();
    }
 
    DxLib_End();
    return 0;
}

Re: マップチップで画面をを左右にスクロールさせる

Posted: 2011年6月27日(月) 15:52
by chalaza
作っていただいたコードを使わせてもらったのですが、
今のところ、ステージ1でもステージ2でもマップをスクロールする幅がステージ1の分だけだったので、
表示しているのがステージ1の場合{
if(CameraX < 0) CameraX = 0;
if(CameraX > (MAP_PIXEL_WIDTH-SCREEN_WIDTH)) CameraX = (MAP_PIXEL_WIDTH-SCREEN_WIDTH);
}としてステージ1の横幅分カメラをスクロールさせて、
表示しているのがステージ2の場合{
if(CameraX < 0) CameraX = 0;
if(CameraX > (MAP_PIXEL_WIDTH2-SCREEN_WIDTH)) CameraX = (MAP_PIXEL_WIDTH2-SCREEN_WIDTH);
}としてステージ2の横幅分スクロールしたいのですが…

『ステージ1の場合』というのをif文で書きたかったのですが、
if(StageData_t StageData == StageDataSelect[0])…としても
if(StageData_t.*stage == MapData1)…としても、
式にはブール型を使用しろとのことです。
ブール型をすこし調べてたんですが、あらかじめboolで宣言しろという事なのでしょうか。
それともこれ以外の現在のステージを調べる書き方があるのでしょうか。
…たぶん後者だと思いますが。

Re: マップチップで画面をを左右にスクロールさせる

Posted: 2011年6月27日(月) 16:00
by softya(ソフト屋)
ステージ1かどうかを確認しなくても
StageData_t StageData
のStageDataにあるwidthとheightを基準に動くようにすれば問題は解決すると思います。
そこの所は大急ぎで直したのですっ飛ばしてあります。あくまで考え方の例として見てくださいね。

プログラム中に
#define MAP_PIXEL_WIDTH 1280
#define MAP_PIXEL_HEIGHT 480
#define MAP_WIDTH (MAP_PIXEL_WIDTH/CHIP_SIZE)
#define MAP_HEIGHT (MAP_PIXEL_HEIGHT/CHIP_SIZE)
が出てこない様にしてください。
StageDataにあるwidthとheightを使えば出来るはずです。

ちなみに
>『ステージ1の場合』というのをif文で書きたかったのですが、
>if(StageData_t StageData == StageDataSelect[0])…としても
>if(StageData_t.*stage == MapData1)…としても、
どちらもポインタと実体の誤解みられますし、あんまり良くない方法なので正解も書きません。

Re: マップチップで画面をを左右にスクロールさせる

Posted: 2011年6月27日(月) 21:42
by chalaza
StageDataにのwidthがMAP_WIDTHかMAP_WIDTH2かでステージの区別はできたのですが、
とりあえずキーボードのSを押すとステージ1、Aを押すとステージ2に切り替わるように組んで試してみたのですが、
切り替わり処理とスクロール範囲は上手くいったものの、ステージ2に切り替えたときに滅茶苦茶なマップになってしまいます。
まさにバグだと思うのですが、どこか間違えたのでしょうか…

コード:

#include "DxLib.h"
 
 
//構造体
 
//  プレイヤー構造体  
struct Playerdata{
    int X, Y, img;
}Player;
 
 
////
 
int Key[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;
}
 
 
 
#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480
#define CHIP_SIZE 32
#define MAP_PIXEL_WIDTH 1280
#define MAP_PIXEL_HEIGHT 480
#define MAP_WIDTH (MAP_PIXEL_WIDTH/CHIP_SIZE)
#define MAP_HEIGHT (MAP_PIXEL_HEIGHT/CHIP_SIZE)
 
// マップのデータ
int MapData1[ MAP_HEIGHT*MAP_WIDTH ] =
{
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0,  0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1,
    1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
} ;
 
#define MAP_PIXEL_WIDTH2 2560
#define MAP_PIXEL_HEIGHT2 480
#define MAP_WIDTH2 (MAP_PIXEL_WIDTH2/CHIP_SIZE)
#define MAP_HEIGHT2 (MAP_PIXEL_HEIGHT2/CHIP_SIZE)
 
int MapData2[ MAP_HEIGHT2*MAP_WIDTH2 ] =
{
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1,
    1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
} ;
 
 
 
//  ステージ構造体
typedef struct {
    int *stage; //マップのポインタ
    int width;  //横サイズ
    int height; //縦サイズ
} StageData_t;
 
//  ステージテーブル
StageData_t StageDataSelect[2] = {
    { MapData1, MAP_WIDTH, MAP_HEIGHT },    //マップ1
    { MapData2, MAP_WIDTH2, MAP_HEIGHT2 },  //マップ2
};
 

/////
int ScrollX,OnGround;
 
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
 
 
    // 画像をロード
    //マップ
    int lenga1 = LoadGraph( "image/map/lenga1.png" );
    int statesbar = LoadGraph( "image/statesbar.png" );
    int haikei1 = LoadGraph( "image/haikei1.png" );
    //キャラ関係
    int chara[24];      //キャラ画像
    LoadDivGraph( "image/chara.png" , 24 , 6 , 4 , 64 , 64 , chara );//プレイヤー
    int HPgazou[11];    //HPの画像
    LoadDivGraph( "image/HP.png" , 11 , 1 , 11 , 224 , 32 , HPgazou );//体力
 
 
    //関数
 
    Player.X = 32 , Player.Y = 288 ;    //プレイヤー座標
    int PlayerViewX ;
    int CameraX;
 
    int JumpPower = 0 ;         //ジャンプパワー
    int Jump = 0 ;              //ジャンプ状態か
    int walkdirection = 1 ;     //歩く向き
    int walkanime = 0 ;         //歩くアニメーション用
 
    int HP = 10 ;               //HP
    int HPimg ;                 //HP画像
    int i , j ;                 //座標用
 
    //  マップ配列参照用のデータと初期化。
    StageData_t StageData = StageDataSelect[0];
    //  ステージ参照マクロ
    #define STAGE_CHIP(y,x) (StageData.stage[(y)*(StageData.width)+(x)])
    #define STAGE_CHIPC(y,x) (StageData.stage[(y)/CHIP_SIZE*(StageData.width)+(x)/CHIP_SIZE])
 
    while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
        //↑メッセージ処理          ↑画面をクリア           ↑入力状態を保存       ↑ESCが押されていない
 
        //ココから
        //背景を描画
        DrawGraph( 0, 0, haikei1, FALSE ); // 背景
 
        //ステージ1のときのマップを描画
		if(StageData.width == MAP_WIDTH){
			for( i = 0 ; i < MAP_HEIGHT ; i ++ )
			{
				for( j = 0 ; j < MAP_WIDTH ; j ++ )
				{
					if( STAGE_CHIP(i,j) == 1 ) //1のとき壁を描画
					{
						DrawGraph( j*CHIP_SIZE-CameraX, i*CHIP_SIZE , lenga1 , FALSE ) ;
					}
				}
			}
		}
        //ステージ2のときのマップを描画
		if(StageData.width == MAP_WIDTH2){
			for( i = 0 ; i < MAP_HEIGHT2 ; i ++ )
			{
				for( j = 0 ; j < MAP_WIDTH2 ; j ++ )
				{
					if( STAGE_CHIP(i,j) == 1 ) //1のとき壁を描画
					{
						DrawGraph( j*CHIP_SIZE-CameraX, i*CHIP_SIZE , lenga1 , FALSE ) ;
					}
				}
			}
		}
        // ジャンプ状態じゃなく、ジャンプボタンを押して地面についていたらジャンプ
        if ( Jump==0 && (Key[KEY_INPUT_SPACE] >=1 ) && JumpPower <= 0) {
            if(STAGE_CHIPC(Player.Y+64,Player.X + 16) != 0
                ||STAGE_CHIPC(Player.Y+64,Player.X + 47) != 0)
            {
                JumpPower = 16 ;
                Jump = 1 ;
            }
        }
 
        //ジャンプ状態で右向きなら右ジャンプの画像
        if ( walkdirection == 1 && Jump == 1 ){
            Player.img=chara[5];
        }
 
        //ジャンプ状態で左向きなら左ジャンプの画像
        if ( walkdirection == 0 && Jump == 1 ){
            Player.img=chara[11];
        }
 
 
        if( Key[ KEY_INPUT_RIGHT ] >= 1 ) {     //右キーが押されて
            if(STAGE_CHIPC(Player.Y,Player.X + 48) == 0      //右が壁じゃなかったら
                &&STAGE_CHIPC(Player.Y+31,Player.X + 48) == 0
                &&STAGE_CHIPC(Player.Y+32,Player.X + 48) == 0
                &&STAGE_CHIPC(Player.Y+63,Player.X + 48) == 0)
                Player.X+=3 ;   //右に動く
            walkdirection = 1 ;
        }
 
        if( Key[ KEY_INPUT_RIGHT ] >= 1 && Jump== 0 ){  // 右キーが押されていてジャンプ状態じゃなかったら
            walkanime++;
            Player.img=chara[(walkanime/10)%4 +1];//右に歩くアニメ
        }
 
        if( walkdirection == 1 && ( Key[ KEY_INPUT_RIGHT ] == 0 )&& Jump== 0 )// 右キーが離されてジャンプ状態じゃなかったら
            Player.img=chara[0];        //右を向く
 
 
        if( Key[ KEY_INPUT_LEFT ] >= 1 ){// 左キーが押されて
            if(STAGE_CHIPC(Player.Y,Player.X+15) == 0
                &&STAGE_CHIPC(Player.Y+31,Player.X+15) == 0
                &&STAGE_CHIPC(Player.Y+32,Player.X+15) == 0
                &&STAGE_CHIPC(Player.Y+63,Player.X+15) == 0)     //左が壁じゃなかったら
                Player.X-=3 ;   //左に動く
            walkdirection = 0 ;
        }
 
        if( Key[ KEY_INPUT_LEFT  ] >= 1 && Jump== 0 ){  // 左キーが押されていてジャンプ状態じゃなかったら
            walkanime++;
            Player.img=chara[(walkanime/10)%4 +7];//右に歩くアニメ
        }
 
        if( walkdirection == 0 && ( Key[ KEY_INPUT_LEFT ] == 0 ) && Jump== 0 )  // 左キーが離されてジャンプ状態じゃなかったら
            Player.img=chara[6];        //左を向く
 
        if( Key[ KEY_INPUT_RIGHT ] >= 1 && Key[ KEY_INPUT_LEFT  ] >= 1)//左右両方押されてたら右向く
            Player.img=chara[0];
 
        CameraX = Player.X - SCREEN_WIDTH/2;
 
		//ステージ1のときのスクロール
		if(StageData.width == MAP_WIDTH){
			if(CameraX < 0) CameraX = 0;
			if(CameraX > (MAP_PIXEL_WIDTH-SCREEN_WIDTH)) CameraX = (MAP_PIXEL_WIDTH-SCREEN_WIDTH);
		}
		//ステージ2のときのスクロール
		if(StageData.width == MAP_WIDTH2){
			if(CameraX < 0) CameraX = 0;
			if(CameraX > (MAP_PIXEL_WIDTH2-SCREEN_WIDTH)) CameraX = (MAP_PIXEL_WIDTH2-SCREEN_WIDTH);
		}

		PlayerViewX = Player.X - CameraX;
 
 
        // ジャンプ中ならキャラの落下処理
        if(Jump == 1){
            Player.Y -= JumpPower ;
            JumpPower -= 1 ;
        }
 
        //補正//
        //床にめりこんだら上に補正
        if(JumpPower < 0) {
            if(STAGE_CHIPC(Player.Y+64,Player.X + 16) != 0
                ||STAGE_CHIPC(Player.Y+64,Player.X + 47) != 0)
            {
                Player.Y = ((Player.Y+65)/32) * 32 - 65 + 1 ;
            }
        }
        //天井にめりこんだら下に補正
        if(JumpPower > 0) {
            if(STAGE_CHIPC(Player.Y-1,Player.X + 16) != 0
                ||STAGE_CHIPC(Player.Y-1,Player.X + 47) != 0)
            {
                Player.Y = ((Player.Y+65)/32) * 32 - 65 + 32 + 1 ;
                JumpPower = 0 ;
            }
        }
 
        //右の壁にめりこんだら左に補正
        if(STAGE_CHIPC(Player.Y,Player.X + 48) != 0
            ||STAGE_CHIPC(Player.Y+63,Player.X + 48) != 0)   
        {
            Player.X = ((Player.X+65)/32) * 32 - 65 + 16 + 1 ;
        }
        //左の壁にめりこんだら右に補正
        if(STAGE_CHIPC(Player.Y,Player.X+15) != 0
            ||STAGE_CHIPC(Player.Y+63,Player.X+15) != 0)
        {
            Player.X = ((Player.X+65)/32) * 32 - 65 + 16 + 1 ;
        }
 
        // ジャンプ中にキャラが地面についたら落下をやめる
        if(Jump == 1 && JumpPower < 0 ) {
            if(STAGE_CHIPC(Player.Y+64,Player.X + 16) != 0
                ||STAGE_CHIPC(Player.Y+64,Player.X + 47) != 0)
            {
                JumpPower = 0 ;
                Jump = 0 ;
            }
        }
        //歩いているときに踏み外したらジャンプ状態にする
        if(Jump == 0) {
            if(STAGE_CHIPC(Player.Y+64,Player.X + 16) == 0
                &&STAGE_CHIPC(Player.Y+64,Player.X + 47) == 0)
            {
                Jump = 1 ;
            }
        }
 
 
 
        //HP
        if( HP==10 )
            HPimg = HPgazou[10];
 
        //画像
 
        DrawGraph(PlayerViewX, Player.Y, Player.img, TRUE ); // x,y の位置にキャラを描画
 
 
        //ステータスバー背景
        for(int y=0 ; y<1 ; y++){
            for(int x=0 ; x<20 ; x++){
                DrawGraph(x*32+0,y*32+418,statesbar,FALSE);
            }
        }
 
        DrawGraph( 0, 420, HPimg, TRUE ); // HPバー
 
        //  AとSでマップを切り替え
        if( Key[ KEY_INPUT_S ] >= 1 ) {
            StageData = StageDataSelect[0];
        }
		if( Key[ KEY_INPUT_A ] >= 1 ){
            StageData = StageDataSelect[1];
        }
 
 
        ScreenFlip();
    }
 
    DxLib_End();
    return 0;
}

Re: マップチップで画面をを左右にスクロールさせる

Posted: 2011年6月28日(火) 01:29
by softya(ソフト屋)
#define MAP_PIXEL_WIDTH2 2560
で32で割ると80なので横に80必要なのにどう見ても横に60しか並んでいないの原因です。
なので、
#define MAP_PIXEL_WIDTH2 (CHIP_SIZE*60)
が正解でしょう。
あと縦も17個ですから
#define MAP_PIXEL_HEIGHT2 (CHIP_SIZE*17)
が正解です。

それとMAP_WIDTHで判断するのはステージが増えて同じサイズになったときに区別できないのでお勧めできません。
私の言うとおりにすれば問題なく処理できますよ。そのほうが、ソースコードもシンプルになります。

Re: マップチップで画面をを左右にスクロールさせる

Posted: 2011年6月28日(火) 22:28
by chalaza
widthとheightを基準にというのでどちらかの数値を使うのかと思ったら違いましたか…
ということはMapDataもwidthとheightをかけ合わせてものなので使えませんよね…
MAP_WIDTHを数値と認識しないでMAP_WIDTHかMAP_WIDTH2かを比べて使う方法とかはないんですかね…?

…ちなみに背景画像を2枚用意して画面スクロールするときに背景がプレイヤーの移動速度の1/3でスクロールするようにしました。
ステージの横幅を2560にしたのでちょうどステージの端までいくと画像2枚分スクロールします。
本当はステージがすごく長い場合背景を交互に反対側に戻そうと思ったのでhaikeiX1とhaikeiX2と座標を2枚分分けていますがこの場合1つでいいのかもしれません・・・これもなにか無駄があるかも…

コード:

#include "DxLib.h"
 
 
//構造体
 
//  プレイヤー構造体  
struct Playerdata{
    int X, Y, img;
}Player;
 
 
////
 
int Key[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;
}
 
 
 
#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480
#define CHIP_SIZE 32
#define MAP_PIXEL_WIDTH 2560
#define MAP_PIXEL_HEIGHT 480
#define MAP_WIDTH (MAP_PIXEL_WIDTH/CHIP_SIZE)
#define MAP_HEIGHT (MAP_PIXEL_HEIGHT/CHIP_SIZE)
 
// マップのデータ
int MapData1[ MAP_HEIGHT*MAP_WIDTH ] =
{
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
} ;
 
#define MAP_PIXEL_WIDTH2 1920
#define MAP_PIXEL_HEIGHT2 480
#define MAP_WIDTH2 (MAP_PIXEL_WIDTH2/CHIP_SIZE)
#define MAP_HEIGHT2 (MAP_PIXEL_HEIGHT2/CHIP_SIZE)
 
int MapData2[ MAP_HEIGHT2*MAP_WIDTH2 ] =
{
    2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
    2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
	2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
	2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
	2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
	2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
	2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
	2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
	2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
	2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
	2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
    2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
} ;
 
 
 
//  ステージ構造体
typedef struct {
    int *stage; //マップのポインタ
    int width;  //横サイズ
    int height; //縦サイズ
} StageData_t;
 
//  ステージテーブル
StageData_t StageDataSelect[2] = {
    { MapData1, MAP_WIDTH, MAP_HEIGHT },    //マップ1
    { MapData2, MAP_WIDTH2, MAP_HEIGHT2 },  //マップ2
};
 

/////
int ScrollX,OnGround;
 
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
 
 
    // 画像をロード
    //マップ
    int lenga1 = LoadGraph( "image/map/lenga1.png" );
    int conc1 = LoadGraph( "image/map/conc1.png" );
    int conc2 = LoadGraph( "image/map/conc2.png" );
    int statesbar = LoadGraph( "image/statesbar.png" );
    int haikei1 = LoadGraph( "image/haikei1.png" );
    int yakei = LoadGraph( "image/yakei.png" );
    int yakei2 = LoadGraph( "image/yakei2.png" );
    int testimg = LoadGraph( "image/testimg.png" );
    //キャラ関係
    int chara[24];      //キャラ画像
    LoadDivGraph( "image/chara.png" , 24 , 6 , 4 , 64 , 64 , chara );//プレイヤー
    int HPgazou[11];    //HPの画像
    LoadDivGraph( "image/HP.png" , 11 , 1 , 11 , 224 , 32 , HPgazou );//体力
 
    //関数
 
    Player.X = 32 , Player.Y = 288 ;    //プレイヤー座標
    int PlayerViewX ;
    int CameraX;
 
    int JumpPower = 0 ;         //ジャンプパワー
    int Jump = 0 ;              //ジャンプ状態か
	int walk = 0 ;
	int hosei = 0 ;
    int walkdirection = 1 ;     //歩く向き
    int walkanime = 0 ;         //歩くアニメーション用
	int haikeiX1 = 0 ;
	int haikeiX2 = 640 ;

    int HP = 10 ;               //HP
    int HPimg ;                 //HP画像
    int i , j ;                 //座標用
 
    //  マップ配列参照用のデータと初期化。
    StageData_t StageData = StageDataSelect[0];
    //  ステージ参照マクロ
    #define STAGE_CHIP(y,x) (StageData.stage[(y)*(StageData.width)+(x)])
    #define STAGE_CHIPC(y,x) (StageData.stage[(y)/CHIP_SIZE*(StageData.width)+(x)/CHIP_SIZE])
 
    while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
        //↑メッセージ処理          ↑画面をクリア           ↑入力状態を保存       ↑ESCが押されていない
 
        //ココから

 
        //ステージ1のときのマップを描画
		if(StageData.width == MAP_WIDTH){
	        //背景を描画
			DrawGraph( haikeiX1, 0, yakei, FALSE ); // 背景
			DrawGraph( haikeiX2, 0, yakei2, FALSE ); // 背景
			for( i = 0 ; i < MAP_HEIGHT ; i ++ )
			{
				for( j = 0 ; j < MAP_WIDTH ; j ++ )
				{
					if( STAGE_CHIP(i,j) == 1 ) //1のとき壁を描画
					{
						DrawGraph( j*CHIP_SIZE-CameraX, i*CHIP_SIZE , conc1 , FALSE ) ;
					}
					if( STAGE_CHIP(i,j) == 2 ) //1のとき壁を描画
					{
						DrawGraph( j*CHIP_SIZE-CameraX, i*CHIP_SIZE , conc2 , FALSE ) ;
					}
				}
			}
		}
        //ステージ2のときのマップを描画
		if(StageData.width == MAP_WIDTH2){
			//背景を描画
			DrawGraph( 0, 0, haikei1, FALSE );
			for( i = 0 ; i < MAP_HEIGHT2 ; i ++ )
			{
				for( j = 0 ; j < MAP_WIDTH2 ; j ++ )
				{
					if( STAGE_CHIP(i,j) == 1 ) //1のとき壁を描画
					{
						DrawGraph( j*CHIP_SIZE-CameraX, i*CHIP_SIZE , lenga1 , FALSE ) ;
					}
					if( STAGE_CHIP(i,j) == 2 ) //1のとき壁を描画
					{
						DrawGraph( j*CHIP_SIZE-CameraX, i*CHIP_SIZE , lenga1 , FALSE ) ;
					}
				}
			}
		}
        // ジャンプ状態じゃなく、ジャンプボタンを押して地面についていたらジャンプ
        if ( Jump==0 && (Key[KEY_INPUT_SPACE] >=1 ) && JumpPower <= 0) {
            if(STAGE_CHIPC(Player.Y+64,Player.X + 16) != 0
                ||STAGE_CHIPC(Player.Y+64,Player.X + 47) != 0)
            {
                JumpPower = 16 ;
                Jump = 1 ;
            }
        }
 
        //ジャンプ状態で右向きなら右ジャンプの画像
        if ( walkdirection == 1 && Jump == 1 ){
            Player.img=chara[5];
        }
 
        //ジャンプ状態で左向きなら左ジャンプの画像
        if ( walkdirection == 0 && Jump == 1 ){
            Player.img=chara[11];
        }


 
        if( Key[ KEY_INPUT_RIGHT ] >= 1 ) {     //右キーが押されて
            if(STAGE_CHIPC(Player.Y,Player.X + 48) == 0      //右が壁じゃなかったら
                &&STAGE_CHIPC(Player.Y+31,Player.X + 48) == 0
                &&STAGE_CHIPC(Player.Y+32,Player.X + 48) == 0
                &&STAGE_CHIPC(Player.Y+63,Player.X + 48) == 0)
                Player.X+=3 ;   //右に動く
            walkdirection = 1 ;
        }
 


        if( Key[ KEY_INPUT_RIGHT ] >= 1 && Jump== 0 ){  // 右キーが押されていてジャンプ状態じゃなかったら
            walkanime++;
            Player.img=chara[(walkanime/10)%4 +1];//右に歩くアニメ
        }
 
        if( walkdirection == 1 && ( Key[ KEY_INPUT_RIGHT ] == 0 )&& Jump== 0 )// 右キーが離されてジャンプ状態じゃなかったら
            Player.img=chara[0];        //右を向く

 
        if( Key[ KEY_INPUT_LEFT ] >= 1 ){// 左キーが押されて
            if(STAGE_CHIPC(Player.Y,Player.X+15) == 0
                &&STAGE_CHIPC(Player.Y+31,Player.X+15) == 0
                &&STAGE_CHIPC(Player.Y+32,Player.X+15) == 0
                &&STAGE_CHIPC(Player.Y+63,Player.X+15) == 0)     //左が壁じゃなかったら
                Player.X-=3 ;   //左に動く
            walkdirection = 0 ;
        }
 
        if( Key[ KEY_INPUT_LEFT  ] >= 1 && Jump== 0 ){  // 左キーが押されていてジャンプ状態じゃなかったら
            walkanime++;
            Player.img=chara[(walkanime/10)%4 +7];//右に歩くアニメ
        }
 
        if( walkdirection == 0 && ( Key[ KEY_INPUT_LEFT ] == 0 ) && Jump== 0 )  // 左キーが離されてジャンプ状態じゃなかったら
            Player.img=chara[6];        //左を向く
		


        if( Key[ KEY_INPUT_RIGHT ] >= 1 && Key[ KEY_INPUT_LEFT  ] >= 1){//左右両方押されてたら右向く
            Player.img=chara[0];
			walk = 0 ;
		}

 
		//マップのスクロール///////////////////////////////////////////////////////

		CameraX = Player.X - SCREEN_WIDTH/2;


		//ステージ1のときのスクロール
		if(StageData.width == MAP_WIDTH){
			if(CameraX < 0)CameraX = 0;
			if(CameraX > (MAP_PIXEL_WIDTH-SCREEN_WIDTH)) CameraX = (MAP_PIXEL_WIDTH-SCREEN_WIDTH);
			//背景表示座標をスクロール
			if( Player.X >= 320 && Player.X <= 2240 && Key[ KEY_INPUT_RIGHT ] >= 1)
				if(STAGE_CHIPC(Player.Y,Player.X + 48) == 0      //右が壁だったら
					&&STAGE_CHIPC(Player.Y+31,Player.X + 48) == 0
					&&STAGE_CHIPC(Player.Y+32,Player.X + 48) == 0
					&&STAGE_CHIPC(Player.Y+63,Player.X + 48) == 0){
						haikeiX1--;
						haikeiX2--;
				}
				if( Player.X >= 320 && Player.X <= 2240 && Key[ KEY_INPUT_LEFT ] >= 1)
					if(STAGE_CHIPC(Player.Y,Player.X+15) == 0
						&&STAGE_CHIPC(Player.Y+31,Player.X+15) == 0
						&&STAGE_CHIPC(Player.Y+32,Player.X+15) == 0
						&&STAGE_CHIPC(Player.Y+63,Player.X+15) == 0){
							haikeiX1++;
							haikeiX2++;
					}
		}

		//ステージ2のときのスクロール
		if(StageData.width == MAP_WIDTH2){
			if(CameraX < 0) CameraX = 0;
			if(CameraX > (MAP_PIXEL_WIDTH2-SCREEN_WIDTH)) CameraX = (MAP_PIXEL_WIDTH2-SCREEN_WIDTH);
		}


		PlayerViewX = Player.X - CameraX;

		///////////////////////////////////////////////////////////////


 
        // ジャンプ中ならキャラの落下処理
        if(Jump == 1){
            Player.Y -= JumpPower ;
            JumpPower -= 1 ;
        }
 
        //補正//
        //床にめりこんだら上に補正
        if(JumpPower < 0) {
            if(STAGE_CHIPC(Player.Y+64,Player.X + 16) != 0
                ||STAGE_CHIPC(Player.Y+64,Player.X + 47) != 0)
            {
                Player.Y = ((Player.Y+65)/32) * 32 - 65 + 1 ;
            }
        }
        //天井にめりこんだら下に補正
        if(JumpPower > 0) {
            if(STAGE_CHIPC(Player.Y-1,Player.X + 16) != 0
                ||STAGE_CHIPC(Player.Y-1,Player.X + 47) != 0)
            {
                Player.Y = ((Player.Y+65)/32) * 32 - 65 + 32 + 1 ;
                JumpPower = 0 ;
            }
        }
 
        //右の壁にめりこんだら左に補正
        if(STAGE_CHIPC(Player.Y,Player.X + 48) != 0
            ||STAGE_CHIPC(Player.Y+63,Player.X + 48) != 0)   
        {
            Player.X = ((Player.X+65)/32) * 32 - 65 + 16 + 1 ;
        }
        //左の壁にめりこんだら右に補正
        if(STAGE_CHIPC(Player.Y,Player.X+15) != 0
            ||STAGE_CHIPC(Player.Y+63,Player.X+15) != 0)
        {
            Player.X = ((Player.X+65)/32) * 32 - 65 + 16 + 1 ;
        }
 
        // ジャンプ中にキャラが地面についたら落下をやめる
        if(Jump == 1 && JumpPower < 0 ) {
            if(STAGE_CHIPC(Player.Y+64,Player.X + 16) != 0
                ||STAGE_CHIPC(Player.Y+64,Player.X + 47) != 0)
            {
                JumpPower = 0 ;
                Jump = 0 ;
            }
        }
        //歩いているときに踏み外したらジャンプ状態にする
        if(Jump == 0) {
            if(STAGE_CHIPC(Player.Y+64,Player.X + 16) == 0
                &&STAGE_CHIPC(Player.Y+64,Player.X + 47) == 0)
            {
                Jump = 1 ;
            }
        }

		//HP
		HPimg = HPgazou[HP];	//HP数値にあわせてHP画像
		if( Key[ KEY_INPUT_D ] == 1 )	//Dを押したらHPを1へらす
			HP -= 1;
		if(HP<0)						//HPは0以下にならない
			HP=0;
		if(Player.Y >= 416)				//プレイヤーが落ちたらHPが0
			HP=0;
 
        //画像
 
        DrawGraph(PlayerViewX, Player.Y, Player.img, TRUE ); // x,y の位置にキャラを描画
 
 
        //ステータスバー背景
        for(int y=0 ; y<1 ; y++){
            for(int x=0 ; x<20 ; x++){
                DrawGraph(x*32+0,y*32+418,statesbar,FALSE);
            }
        }
 
        DrawGraph( 0, 420, HPimg, TRUE ); // HPバー
 
        //  AとSでマップを切り替え
        if( Key[ KEY_INPUT_S ] >= 1 ) {
            StageData = StageDataSelect[0];
        }
		if( Key[ KEY_INPUT_A ] >= 1 ){
            StageData = StageDataSelect[1];
        }
 
 
        ScreenFlip();
    }
 
    DxLib_End();
    return 0;
}

Re: マップチップで画面をを左右にスクロールさせる

Posted: 2011年6月28日(火) 23:15
by softya(ソフト屋)
今のコードの問題はステージが増えていくと、どんどんややこしくなることです。
そんな問題も
if(StageData.width == MAP_WIDTH){
で処理するのではなく
MAP_WIDTHの代わりにStageData.widthを
MAP_HEIGHTの代わりにStageData.heightを
(MAP_PIXEL_WIDTHの代わりに(StageData.width*CHIP_SIZE)を
書けばよいだけです。

あと画像がないので、こちらで動作が確認できません。
どこかのアップローダ経由か、ここのmixc++に登録するとファイル添付可能になるので頂けませんか?

Re: マップチップで画面をを左右にスクロールさせる

Posted: 2011年6月29日(水) 23:21
by chalaza
確認ですが…
MAP_WIDTHの代わりにStageData.width、ということは
最初の#defineの部分ごと修正してしまって良いのですね?

そうなら、ステージ構造体とステージテーブルをマップデータの#defineより上にもっていき、
『MAP_WIDTH』という設定は使わない。ということでよろしいでしょうか…

Re: マップチップで画面をを左右にスクロールさせる

Posted: 2011年6月29日(水) 23:34
by softya(ソフト屋)
chalaza さんが書きました:確認ですが…
MAP_WIDTHの代わりにStageData.width、ということは
最初の#defineの部分ごと修正してしまって良いのですね?

そうなら、ステージ構造体とステージテーブルをマップデータの#defineより上にもっていき、
『MAP_WIDTH』という設定は使わない。ということでよろしいでしょうか…
WinMain以後のコードでは使わないという意味です。
変数の定義部分では使ってください。
これとか他に定義しようがないですし。

コード:

//  ステージテーブル
StageData_t StageDataSelect[2] = {
    { MapData1, MAP_WIDTH, MAP_HEIGHT },    //マップ1
    { MapData2, MAP_WIDTH2, MAP_HEIGHT2 },  //マップ2
};
動的な部分と静的な部分は分けて考えてくださいね。

Re: マップチップで画面をを左右にスクロールさせる

Posted: 2011年7月01日(金) 17:37
by chalaza
私の解釈が間違っているのかもしれませんが、とりあえず流れを確認してみると
まずdifineのMAP_PIXEL_WIDTHとHEIGHTでステージの縦と横の最大値を作り、
MAP_WIDTHとHEIGHTを定義してそこに最大値を32で割ったマス目の大きさを代入…
MapData1を宣言してマップの横幅と高さを掛けた数値を指定。
ステージ構造体StageDataを_t作って、*stageとwidthとheightを入れる。

と、まずここで質問なんですが…StageData_tと構造体を指定していますが、
そのあとにStageData.width等と使っているのは、
StageData_tの中にStageDataがあり、そこにwidthがあるという事でしょうか?
//マップ配列参照用のデータと初期化 というところで
StageData_t StageDataにStagedataSelect[0]を代入していたので、
その時点からStageDataにテーブルStagedataSelectの
{ MapData1, MAP_WIDTH, MAP_HEIGHT }が入れられているのかとは思いましたが、
最初の構造体で宣言したint width;という値にどの時点で数値が代入されているのかわからなく、躓いてるところです…
つまり
ステージテーブルがStageDataSelect[0]になった場合は
stageにMapData1、widthにMAP_WIDTH、heightにMAP_HEIGHTが代入されて、
ステージテーブルがStageDataSelect[1]になった場合は
stageにMapData2、widthにMAP_WIDTH2、heightにMAP_HEIGHT2が代入されるということなのでしょうか?

Re: マップチップで画面をを左右にスクロールさせる

Posted: 2011年7月02日(土) 02:03
by softya(ソフト屋)
それは、構造体宣言とtypedefと構造体代入と言うことですね。
StageData_tは構造体をtypedef(型宣言)した型名です。
「C言語でのtypedefについて」
http://www.c-lang.org/typedef.html

なので、StageDataは型名StageData_tで宣言された構造体変数と言う事になります。

StagedataSelectは、型名StageData_tで宣言された構造体配列です。
なので、StageDataにStagedataSelect[0]を代入するということは全メンバ変数の内容をStagedataSelect[0]からStageDataにコピーするということです。
「構造体の代入」
http://www.cc.kyoto-su.ac.jp/~yamada/pB/struct.html#set

と言うことなのですが、まだ分からないことは有りますでしょうか?
この2つは、C言語だと当たり前に出てくるのでぜひ覚えてください。

Re: マップチップで画面をを左右にスクロールさせる

Posted: 2011年7月02日(土) 18:38
by chalaza
ありがとうございます。サイトを読んでみました。
この場合stageとwidthとheightが入った構造体を型宣言したStageData_tがStageDataを宣言している。ということですかね。
代入によってStageDataSelectの中の{ MapData1, MAP_WIDTH, MAP_HEIGHT }をStageDataにコピーしている。ということですね。たぶん。

そう考えているうちに思ったのですが、今のマップデータの高さや横幅で現在のステージを調べるのは無理なのはわかったのですが、
今のステージを確認するのに純粋に
if( StageData.stage == MapData1 )
としたらステージの大きさを同じにしても問題なく機能したのですが、これでは何か問題があるのでしょうか…
これ以上の効率の良さが思いつかなくてすみません…

Re: マップチップで画面をを左右にスクロールさせる

Posted: 2011年7月02日(土) 19:28
by softya(ソフト屋)
chalaza さんが書きました:ありがとうございます。サイトを読んでみました。
この場合stageとwidthとheightが入った構造体を型宣言したStageData_tがStageDataを宣言している。ということですかね。
代入によってStageDataSelectの中の{ MapData1, MAP_WIDTH, MAP_HEIGHT }をStageDataにコピーしている。ということですね。たぶん。
そういう事です。
chalaza さんが書きました:そう考えているうちに思ったのですが、今のマップデータの高さや横幅で現在のステージを調べるのは無理なのはわかったのですが、
今のステージを確認するのに純粋に
if( StageData.stage == MapData1 )
としたらステージの大きさを同じにしても問題なく機能したのですが、これでは何か問題があるのでしょうか…
これ以上の効率の良さが思いつかなくてすみません…
5ステージ以上とか増えた場合にはムダに長いコード(バグの原因)になります。
同じようなコードをなんども書くのは非効率的な作業で、見直したときにミスに気づき辛いコードに必ずなります。
今後コードを拡張していてってMAP_WIDTHやMAP_HEIGHT が出るたびに、いちいちif( StageData.stage == MapData1 )を書くのは馬鹿らしくないですか?
stage.widthとstage.heightを書くだけでif( StageData.stage == MapData1 )と同じようなコードが不要になるんですよ。

Re: マップチップで画面をを左右にスクロールさせる

Posted: 2011年7月03日(日) 14:47
by chalaza
できました。ありがとうございます。
ステージのスクロールはどのステージでも同じ処理でスクロールさせるということですね。
StageData.widthに変更したついでに、背景のスクロールもできました。
たぶんこれで解決になります。
ついでに余計な雑なワイプの処理も入ってますが貼っておきます。

コード:

#include "DxLib.h"
 
 
//構造体
 
//  プレイヤー構造体  
struct Playerdata{
    int X, Y, img;
}Player;
 
 
////
 
int Key[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;
}
 
 
 
#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480
#define CHIP_SIZE 32
#define MAP_PIXEL_WIDTH 2560
#define MAP_PIXEL_HEIGHT 480
#define MAP_WIDTH (MAP_PIXEL_WIDTH/CHIP_SIZE)
#define MAP_HEIGHT (MAP_PIXEL_HEIGHT/CHIP_SIZE)
 
// マップのデータ
int MapData1[ MAP_HEIGHT*MAP_WIDTH ] =
{
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0,  0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 0, 0, 1,  1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
} ;
 
#define MAP_PIXEL_WIDTH2 1280
#define MAP_PIXEL_HEIGHT2 480
#define MAP_WIDTH2 (MAP_PIXEL_WIDTH2/CHIP_SIZE)
#define MAP_HEIGHT2 (MAP_PIXEL_HEIGHT2/CHIP_SIZE)
 
int MapData2[ MAP_HEIGHT2*MAP_WIDTH2 ] =
{
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
} ;
 
 
 
//  ステージ構造体
typedef struct {
    int *stage; //マップのポインタ
    int width;  //横サイズ
    int height; //縦サイズ
} StageData_t;
 
//  ステージテーブル
StageData_t StageDataSelect[2] = {
    { MapData1, MAP_WIDTH, MAP_HEIGHT },    //マップ1
    { MapData2, MAP_WIDTH2, MAP_HEIGHT2 },  //マップ2
};
 

/////
int ScrollX,OnGround;
 
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
 
    //  マップ配列参照用のデータと初期化。
    StageData_t StageData = StageDataSelect[0];
    //  ステージ参照マクロ
    #define STAGE_CHIP(y,x) (StageData.stage[(y)*(StageData.width)+(x)])
    #define STAGE_CHIPC(y,x) (StageData.stage[(y)/CHIP_SIZE*(StageData.width)+(x)/CHIP_SIZE])

 
    // 画像をロード
    //マップ
    int lenga1 = LoadGraph( "image/map/lenga1.png" );
    int conc1 = LoadGraph( "image/map/conc1.png" );
    int conc2 = LoadGraph( "image/map/conc2.png" );
    int statesbar = LoadGraph( "image/statesbar.png" );
    int haikei1 = LoadGraph( "image/haikei1.png" );
    int yakei = LoadGraph( "image/yakei.png" );
    int yakei2 = LoadGraph( "image/yakei2.png" );
    int testimg = LoadGraph( "image/testimg.png" );
    //キャラ関係
    int chara[24];      //キャラ画像
    LoadDivGraph( "image/chara.png" , 24 , 6 , 4 , 64 , 64 , chara );//プレイヤー
    int HPgazou[11];    //HPの画像
    LoadDivGraph( "image/HP.png" , 11 , 1 , 11 , 224 , 32 , HPgazou );//体力

	//ワイプ用
	int wipestart = 0 ;		//1=フェードアウト開始 2=フェードイン開始
	int wipecount = 0 ;		//ワイプ画像アニメーション用
	int wipeimg ;			//ワイプ画像
	int wipe1[20];			//ワイプ1(ブラインド)
	LoadDivGraph( "image/wipe/wipe1.png" , 20 , 20 , 1 , 32 , 32 , wipe1 );
 

    //関数
 
    Player.X = 32 , Player.Y = 288 ;    //プレイヤー座標
    int PlayerViewX ;
    int CameraX;
 
    int JumpPower = 0 ;         //ジャンプパワー
    int Jump = 0 ;              //ジャンプ状態か
	int walk = 0 ;				//歩いているか
	int hosei = 0 ;				//補正しているか
    int walkdirection = 1 ;     //歩く向き
    int walkanime = 0 ;         //歩くアニメーション用

	int haikeiX1 = 0 ;			//背景1のX座標
	int haikeiX2 = 640 ;		//背景2のX座標

    int HP = 10 ;               //HP
    int HPimg ;                 //HP画像
    int i , j ;                 //座標用

	int MapChange = 0 ;
 

 
    while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
        //↑メッセージ処理          ↑画面をクリア           ↑入力状態を保存       ↑ESCが押されていない
 
        //ココから

 

        // ジャンプ状態じゃなく、ジャンプボタンを押して地面についていたらジャンプ
        if ( Jump==0 && (Key[KEY_INPUT_SPACE] >=1 ) && JumpPower <= 0) {
            if(STAGE_CHIPC(Player.Y+64,Player.X + 16) != 0
                ||STAGE_CHIPC(Player.Y+64,Player.X + 47) != 0)
            {
                JumpPower = 16 ;
                Jump = 1 ;
            }
        }
 
        //ジャンプ状態で右向きなら右ジャンプの画像
        if ( walkdirection == 1 && Jump == 1 ){
            Player.img=chara[5];
        }
 
        //ジャンプ状態で左向きなら左ジャンプの画像
        if ( walkdirection == 0 && Jump == 1 ){
            Player.img=chara[11];
        }


 
        if( Key[ KEY_INPUT_RIGHT ] >= 1 ) {     //右キーが押されて
            if(STAGE_CHIPC(Player.Y,Player.X + 48) == 0      //右が壁じゃなかったら
                &&STAGE_CHIPC(Player.Y+31,Player.X + 48) == 0
                &&STAGE_CHIPC(Player.Y+32,Player.X + 48) == 0
                &&STAGE_CHIPC(Player.Y+63,Player.X + 48) == 0)
                Player.X+=3 ;   //右に動く
            walkdirection = 1 ;
        }
 


        if( Key[ KEY_INPUT_RIGHT ] >= 1 && Jump== 0 ){  // 右キーが押されていてジャンプ状態じゃなかったら
            walkanime++;
            Player.img=chara[(walkanime/10)%4 +1];//右に歩くアニメ
        }
 
        if( walkdirection == 1 && ( Key[ KEY_INPUT_RIGHT ] == 0 )&& Jump== 0 )// 右キーが離されてジャンプ状態じゃなかったら
            Player.img=chara[0];        //右を向く

 
        if( Key[ KEY_INPUT_LEFT ] >= 1 ){// 左キーが押されて
            if(STAGE_CHIPC(Player.Y,Player.X+15) == 0
                &&STAGE_CHIPC(Player.Y+31,Player.X+15) == 0
                &&STAGE_CHIPC(Player.Y+32,Player.X+15) == 0
                &&STAGE_CHIPC(Player.Y+63,Player.X+15) == 0)     //左が壁じゃなかったら
                Player.X-=3 ;   //左に動く
            walkdirection = 0 ;
        }
 
        if( Key[ KEY_INPUT_LEFT  ] >= 1 && Jump== 0 ){  // 左キーが押されていてジャンプ状態じゃなかったら
            walkanime++;
            Player.img=chara[(walkanime/10)%4 +7];//右に歩くアニメ
        }
 
        if( walkdirection == 0 && ( Key[ KEY_INPUT_LEFT ] == 0 ) && Jump== 0 )  // 左キーが離されてジャンプ状態じゃなかったら
            Player.img=chara[6];        //左を向く
		


        if( Key[ KEY_INPUT_RIGHT ] >= 1 && Key[ KEY_INPUT_LEFT  ] >= 1){//左右両方押されてたら右向く
            Player.img=chara[0];
			walk = 0 ;
		}

 
		//マップのスクロール///////////////////////////////////////////////////////

		CameraX = Player.X - SCREEN_WIDTH/2 + 32;


		//ステージのスクロール

			if(CameraX < 0)CameraX = 0;
			if(CameraX > (StageData.width*CHIP_SIZE)-SCREEN_WIDTH) CameraX = (StageData.width*CHIP_SIZE)-SCREEN_WIDTH;
			//背景表示座標をスクロール
			if( Player.X - CameraX == SCREEN_WIDTH/2 - 32 && Key[ KEY_INPUT_RIGHT ] >= 1)	//キャラが画面の中心にいて右に動いていて
				if(STAGE_CHIPC(Player.Y,Player.X + 48) == 0						//右側が壁でないとき
					&&STAGE_CHIPC(Player.Y+31,Player.X + 48) == 0
					&&STAGE_CHIPC(Player.Y+32,Player.X + 48) == 0
					&&STAGE_CHIPC(Player.Y+63,Player.X + 48) == 0){
						haikeiX1--;											//背景1と2を左にスクロール
						haikeiX2--;
				}
			if( Player.X - CameraX == SCREEN_WIDTH/2 - 32 && Key[ KEY_INPUT_LEFT ] >= 1)	//キャラが画面の中心にいて左に動いていて
				if(STAGE_CHIPC(Player.Y,Player.X+15) == 0						//左側が壁でない時
					&&STAGE_CHIPC(Player.Y+31,Player.X+15) == 0
					&&STAGE_CHIPC(Player.Y+32,Player.X+15) == 0
					&&STAGE_CHIPC(Player.Y+63,Player.X+15) == 0){
						haikeiX1++;											//背景1と2を左にスクロール
						haikeiX2++;
				}
		
		PlayerViewX = Player.X - CameraX;

		///////////////////////////////////////////////////////////////


 
        // ジャンプ中ならキャラの落下処理
        if(Jump == 1){
            Player.Y -= JumpPower ;
            JumpPower -= 1 ;
        }
 
        //補正//
        //床にめりこんだら上に補正
        if(JumpPower < 0) {
            if(STAGE_CHIPC(Player.Y+64,Player.X + 16) != 0
                ||STAGE_CHIPC(Player.Y+64,Player.X + 47) != 0)
            {
                Player.Y = ((Player.Y+65)/32) * 32 - 65 + 1 ;
            }
        }
        //天井にめりこんだら下に補正
        if(JumpPower > 0) {
            if(STAGE_CHIPC(Player.Y-1,Player.X + 16) != 0
                ||STAGE_CHIPC(Player.Y-1,Player.X + 47) != 0)
            {
                Player.Y = ((Player.Y+65)/32) * 32 - 65 + 32 + 1 ;
                JumpPower = 0 ;
            }
        }
 
        //右の壁にめりこんだら左に補正
        if(STAGE_CHIPC(Player.Y,Player.X + 48) != 0
            ||STAGE_CHIPC(Player.Y+63,Player.X + 48) != 0)   
        {
            Player.X = ((Player.X+65)/32) * 32 - 65 + 16 + 1 ;
        }
        //左の壁にめりこんだら右に補正
        if(STAGE_CHIPC(Player.Y,Player.X+15) != 0
            ||STAGE_CHIPC(Player.Y+63,Player.X+15) != 0)
        {
            Player.X = ((Player.X+65)/32) * 32 - 65 + 16 + 1 ;
        }
 
        // ジャンプ中にキャラが地面についたら落下をやめる
        if(Jump == 1 && JumpPower < 0 ) {
            if(STAGE_CHIPC(Player.Y+64,Player.X + 16) != 0
                ||STAGE_CHIPC(Player.Y+64,Player.X + 47) != 0)
            {
                JumpPower = 0 ;
                Jump = 0 ;
            }
        }
        //歩いているときに踏み外したらジャンプ状態にする
        if(Jump == 0) {
            if(STAGE_CHIPC(Player.Y+64,Player.X + 16) == 0
                &&STAGE_CHIPC(Player.Y+64,Player.X + 47) == 0)
            {
                Jump = 1 ;
            }
        }

///////////////ワイプ//////////
		if(Key[ KEY_INPUT_W ] == 1)		//ワイプの始まり
			wipestart=1;

		if(wipestart==1 ){		//ワイプが始まったらカウント++
			wipecount++;
			wipeimg=wipe1[wipecount];
		}
		if(wipestart==1 && wipecount == 20 ){	//カウントが16超えたらカウント--
			wipestart=2;
			MapChange=1;
		}
		//////////↓マップチェンジ
		//ステージ1から2
		if( StageData.stage == MapData1 && MapChange==1){
            StageData = StageDataSelect[1];
			Player.X = 32 , Player.Y = 288 ;
			MapChange=0;
			walkdirection=1;
        }
		//ステージ2から1
		if( StageData.stage == MapData2 && MapChange==1){
            StageData = StageDataSelect[0];
			Player.X = 32 , Player.Y = 288 ;
			MapChange=0;
			walkdirection=1;
			haikeiX1 = 0 ;
			haikeiX2 = 640 ;
        }

		/////////↑マップチェンジ
		if(wipestart==2){
			wipecount--;
			wipeimg=wipe1[wipecount];
		}
		if(wipestart==2 && wipecount == 0){
			wipecount=0;
			wipestart=0;
		}
//↓描画↓//////////////////////////////

        //ステージ1のときのマップを描画
		if( StageData.stage == MapData1 ){
	        //背景を描画
			DrawGraph( haikeiX1, 0, yakei, FALSE ); // 背景
			DrawGraph( haikeiX2, 0, yakei2, FALSE ); // 背景
			for( i = 0 ; i < MAP_HEIGHT ; i ++ )
			{
				for( j = 0 ; j < MAP_WIDTH ; j ++ )
				{
					if( STAGE_CHIP(i,j) == 1 ) //1のとき壁を描画
					{
						DrawGraph( j*CHIP_SIZE-CameraX, i*CHIP_SIZE , conc1 , FALSE ) ;
					}
					if( STAGE_CHIP(i,j) == 2 ) //1のとき壁を描画
					{
						DrawGraph( j*CHIP_SIZE-CameraX, i*CHIP_SIZE , conc2 , FALSE ) ;
					}
				}
			}
		}
        //ステージ2のときのマップを描画
		if(StageData.stage == MapData2){
			//背景を描画
			DrawGraph( 0, 0, haikei1, FALSE );
			for( i = 0 ; i < MAP_HEIGHT2 ; i ++ )
			{
				for( j = 0 ; j < MAP_WIDTH2 ; j ++ )
				{
					if( STAGE_CHIP(i,j) == 1 ) //1のとき壁を描画
					{
						DrawGraph( j*CHIP_SIZE-CameraX, i*CHIP_SIZE , lenga1 , FALSE ) ;
					}
					if( STAGE_CHIP(i,j) == 2 ) //1のとき壁を描画
					{
						DrawGraph( j*CHIP_SIZE-CameraX, i*CHIP_SIZE , lenga1 , FALSE ) ;
					}
				}
			}
		}


		//HP
		HPimg = HPgazou[HP];	//HP数値にあわせてHP画像
		if( Key[ KEY_INPUT_D ] == 1 )	//Dを押したらHPを1へらす
			HP -= 1;
		if(HP<0)						//HPは0以下にならない
			HP=0;
		if(Player.Y >= 416)				//プレイヤーが落ちたらHPが0
			HP=0;
 
        //画像
 
        DrawGraph(PlayerViewX, Player.Y, Player.img, TRUE ); // x,y の位置にキャラを描画
 
 
        //ステータスバー背景
        for(int y=0 ; y<1 ; y++){
            for(int x=0 ; x<20 ; x++){
                DrawGraph(x*32+0,y*32+418,statesbar,FALSE);
            }
        }
 
        DrawGraph( 0, 420, HPimg, TRUE ); // HPバー

		//ワイプ表示
			for(int y=0 ; y<15 ; y++){
				for(int x=0 ; x<20 ; x++){
					DrawGraph(x*32+0,y*32+0,wipeimg,TRUE);
				}
			}

        //  AとSでマップを切り替え(ワイプ)
        if( Key[ KEY_INPUT_S ] >= 1 ) {
            StageData = StageDataSelect[0];
			Player.X = 32 , Player.Y = 288 ;
        }

 
 
        ScreenFlip();
    }
 
    DxLib_End();
    return 0;
}

Re: マップチップで画面をを左右にスクロールさせる

Posted: 2011年7月03日(日) 16:41
by softya(ソフト屋)
うまく整理すれば

コード:

        //ステージ1のときのマップを描画
        if( StageData.stage == MapData1 ){
            //背景を描画
            DrawGraph( haikeiX1, 0, yakei, FALSE ); // 背景
            DrawGraph( haikeiX2, 0, yakei2, FALSE ); // 背景
            for( i = 0 ; i < MAP_HEIGHT ; i ++ )
            {
                for( j = 0 ; j < MAP_WIDTH ; j ++ )
                {
                    if( STAGE_CHIP(i,j) == 1 ) //1のとき壁を描画
                    {
                        DrawGraph( j*CHIP_SIZE-CameraX, i*CHIP_SIZE , conc1 , FALSE ) ;
                    }
                    if( STAGE_CHIP(i,j) == 2 ) //1のとき壁を描画
                    {
                        DrawGraph( j*CHIP_SIZE-CameraX, i*CHIP_SIZE , conc2 , FALSE ) ;
                    }
                }
            }
        }
        //ステージ2のときのマップを描画
        if(StageData.stage == MapData2){
            //背景を描画
            DrawGraph( 0, 0, haikei1, FALSE );
            for( i = 0 ; i < MAP_HEIGHT2 ; i ++ )
            {
                for( j = 0 ; j < MAP_WIDTH2 ; j ++ )
                {
                    if( STAGE_CHIP(i,j) == 1 ) //1のとき壁を描画
                    {
                        DrawGraph( j*CHIP_SIZE-CameraX, i*CHIP_SIZE , lenga1 , FALSE ) ;
                    }
                    if( STAGE_CHIP(i,j) == 2 ) //1のとき壁を描画
                    {
                        DrawGraph( j*CHIP_SIZE-CameraX, i*CHIP_SIZE , lenga1 , FALSE ) ;
                    }
                }
            }
        }
これも共通のコードに出来ますよ。

どちらにしても関数化を理解されたほうが良いと思いますね。
これ以上長いコードになるとメンテナンスが困難となるでしょうから。

コード:

        //ステージ1から2
        if( StageData.stage == MapData1 && MapChange==1){
            StageData = StageDataSelect[1];
            Player.X = 32 , Player.Y = 288 ;
            MapChange=0;
            walkdirection=1;
        }
        //ステージ2から1
        if( StageData.stage == MapData2 && MapChange==1){
            StageData = StageDataSelect[0];
            Player.X = 32 , Player.Y = 288 ;
            MapChange=0;
            walkdirection=1;
            haikeiX1 = 0 ;
            haikeiX2 = 640 ;
        }
これも関数化すればかなり整理できると思います。

もっと多くのステージのゲームを作成される予定なら、ここで整理しておくべきだと思います。

Re: マップチップで画面をを左右にスクロールさせる

Posted: 2011年7月03日(日) 20:01
by chalaza
すこし検索してみて、
マップチップの1と0に地形画像を描写する部分を関数化してみました。
マップチェンジの部分もできれば簡略化したかったのですが、次と前以外のステージに行くかもしれなかったり
マップが変わった時に決まったプレイヤー座標にキャラを移動させなかったりする場合でも
関数化というのはできるものなのでしょうか。

ちなみにステージと同じようにchipimgData_t、chipimgData、chipimgDataSelectを作って地形画像を分けました。

コード:

#include "DxLib.h"
 
 
//構造体
 
//  プレイヤー構造体  
struct Playerdata{
    int X, Y, img;
}Player;
 
 
////
 
int Key[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;
}
 
 
 
#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480
#define CHIP_SIZE 32
#define MAP_PIXEL_WIDTH 2560
#define MAP_PIXEL_HEIGHT 480
#define MAP_WIDTH (MAP_PIXEL_WIDTH/CHIP_SIZE)
#define MAP_HEIGHT (MAP_PIXEL_HEIGHT/CHIP_SIZE)
 
// マップのデータ
int MapData1[ MAP_HEIGHT*MAP_WIDTH ] =
{
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0,  0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 0, 0, 1,  1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
} ;
 
#define MAP_PIXEL_WIDTH2 1280
#define MAP_PIXEL_HEIGHT2 480
#define MAP_WIDTH2 (MAP_PIXEL_WIDTH2/CHIP_SIZE)
#define MAP_HEIGHT2 (MAP_PIXEL_HEIGHT2/CHIP_SIZE)
 
int MapData2[ MAP_HEIGHT2*MAP_WIDTH2 ] =
{
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
} ;
 
 
 
//  ステージ構造体
typedef struct {
    int *stage; //マップのポインタ
    int width;  //横サイズ
    int height; //縦サイズ
} StageData_t;
 
//  ステージテーブル
StageData_t StageDataSelect[2] = {
    { MapData1, MAP_WIDTH, MAP_HEIGHT },    //マップ1
    { MapData2, MAP_WIDTH2, MAP_HEIGHT2 },  //マップ2
};
 


/////
int ScrollX,OnGround;
 
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
 
    //  マップ配列参照用のデータと初期化。
    StageData_t StageData = StageDataSelect[0];
    //  ステージ参照マクロ
    #define STAGE_CHIP(y,x) (StageData.stage[(y)*(StageData.width)+(x)])
    #define STAGE_CHIPC(y,x) (StageData.stage[(y)/CHIP_SIZE*(StageData.width)+(x)/CHIP_SIZE])

 
    // 画像をロード
    //マップ画像
    int lenga1 = LoadGraph( "image/map/lenga1.png" );
    int conc1 = LoadGraph( "image/map/conc1.png" );
    int conc2 = LoadGraph( "image/map/conc2.png" );
    int haikei1 = LoadGraph( "image/haikei1.png" );
    int yakei1 = LoadGraph( "image/yakei.png" );
    int yakei2 = LoadGraph( "image/yakei2.png" );
    int testimg = LoadGraph( "image/testimg.png" );
	//  チップ画像構造体
	typedef struct {
		int haikei1 ;
		int haikei2 ;
		int chip1 ;	//チップ1
		int chip2 ;	//チップ2
	} chipimgData_t;
	//  チップ画像テーブル
	chipimgData_t chipimgDataSelect[2] = {
		{ yakei1, yakei2, conc1, conc2, },		//マップ1
		{ haikei1, haikei1, lenga1, lenga1 },		//マップ2
	};
    //  マップ配列参照用のデータと初期化。
		chipimgData_t chipimgData = chipimgDataSelect[0];
 
    //キャラ関係
    int chara[24];      //キャラ画像
    LoadDivGraph( "image/chara.png" , 24 , 6 , 4 , 64 , 64 , chara );//プレイヤー
    int HPgazou[11];    //HPの画像
    LoadDivGraph( "image/HP.png" , 11 , 1 , 11 , 224 , 32 , HPgazou );//体力
		//ステータスバー
	int statesbar = LoadGraph( "image/statesbar.png" );

	//ワイプ用
	int MapChange = 0 ;
	int wipestart = 0 ;		//1=フェードアウト開始 2=フェードイン開始
	int wipecount = 0 ;		//ワイプ画像アニメーション用
	int wipeimg ;			//ワイプ画像
	int wipe1[20];			//ワイプ1(ブラインド)
	LoadDivGraph( "image/wipe/wipe1.png" , 20 , 20 , 1 , 32 , 32 , wipe1 );
 

    //関数
 
    Player.X = 32 , Player.Y = 288 ;    //プレイヤー座標
    int PlayerViewX ;
    int CameraX;
 
    int JumpPower = 0 ;         //ジャンプパワー
    int Jump = 0 ;              //ジャンプ状態か
	int walk = 0 ;				//歩いているか
	int hosei = 0 ;				//補正しているか
    int walkdirection = 1 ;     //歩く向き
    int walkanime = 0 ;         //歩くアニメーション用

	int haikeiX1 = 0 ;			//背景1のX座標
	int haikeiX2 = 640 ;		//背景2のX座標

    int HP = 10 ;               //HP
    int HPimg ;                 //HP画像
    int i , j ;                 //座標用
 

 
    while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
        //↑メッセージ処理          ↑画面をクリア           ↑入力状態を保存       ↑ESCが押されていない
 
        //ココから

 

        // ジャンプ状態じゃなく、ジャンプボタンを押して地面についていたらジャンプ
        if ( Jump==0 && (Key[KEY_INPUT_SPACE] >=1 ) && JumpPower <= 0) {
            if(STAGE_CHIPC(Player.Y+64,Player.X + 16) != 0
                ||STAGE_CHIPC(Player.Y+64,Player.X + 47) != 0)
            {
                JumpPower = 16 ;
                Jump = 1 ;
            }
        }
 
        //ジャンプ状態で右向きなら右ジャンプの画像
        if ( walkdirection == 1 && Jump == 1 ){
            Player.img=chara[5];
        }
 
        //ジャンプ状態で左向きなら左ジャンプの画像
        if ( walkdirection == 0 && Jump == 1 ){
            Player.img=chara[11];
        }


 
        if( Key[ KEY_INPUT_RIGHT ] >= 1 ) {     //右キーが押されて
            if(STAGE_CHIPC(Player.Y,Player.X + 48) == 0      //右が壁じゃなかったら
                &&STAGE_CHIPC(Player.Y+31,Player.X + 48) == 0
                &&STAGE_CHIPC(Player.Y+32,Player.X + 48) == 0
                &&STAGE_CHIPC(Player.Y+63,Player.X + 48) == 0)
                Player.X+=3 ;   //右に動く
            walkdirection = 1 ;
        }
 


        if( Key[ KEY_INPUT_RIGHT ] >= 1 && Jump== 0 ){  // 右キーが押されていてジャンプ状態じゃなかったら
            walkanime++;
            Player.img=chara[(walkanime/10)%4 +1];//右に歩くアニメ
        }
 
        if( walkdirection == 1 && ( Key[ KEY_INPUT_RIGHT ] == 0 )&& Jump== 0 )// 右キーが離されてジャンプ状態じゃなかったら
            Player.img=chara[0];        //右を向く

 
        if( Key[ KEY_INPUT_LEFT ] >= 1 ){// 左キーが押されて
            if(STAGE_CHIPC(Player.Y,Player.X+15) == 0
                &&STAGE_CHIPC(Player.Y+31,Player.X+15) == 0
                &&STAGE_CHIPC(Player.Y+32,Player.X+15) == 0
                &&STAGE_CHIPC(Player.Y+63,Player.X+15) == 0)     //左が壁じゃなかったら
                Player.X-=3 ;   //左に動く
            walkdirection = 0 ;
        }
 
        if( Key[ KEY_INPUT_LEFT  ] >= 1 && Jump== 0 ){  // 左キーが押されていてジャンプ状態じゃなかったら
            walkanime++;
            Player.img=chara[(walkanime/10)%4 +7];//右に歩くアニメ
        }
 
        if( walkdirection == 0 && ( Key[ KEY_INPUT_LEFT ] == 0 ) && Jump== 0 )  // 左キーが離されてジャンプ状態じゃなかったら
            Player.img=chara[6];        //左を向く
		


        if( Key[ KEY_INPUT_RIGHT ] >= 1 && Key[ KEY_INPUT_LEFT  ] >= 1){//左右両方押されてたら右向く
            Player.img=chara[0];
			walk = 0 ;
		}

 
		//マップのスクロール///////////////////////////////////////////////////////

		CameraX = Player.X - SCREEN_WIDTH/2 + 32;


		//ステージのスクロール

			if(CameraX < 0)CameraX = 0;
			if(CameraX > (StageData.width*CHIP_SIZE)-SCREEN_WIDTH) CameraX = (StageData.width*CHIP_SIZE)-SCREEN_WIDTH;
			//背景表示座標をスクロール
			if( Player.X - CameraX == SCREEN_WIDTH/2 - 32 && Key[ KEY_INPUT_RIGHT ] >= 1)	//キャラが画面の中心にいて右に動いていて
				if(STAGE_CHIPC(Player.Y,Player.X + 48) == 0						//右側が壁でないとき
					&&STAGE_CHIPC(Player.Y+31,Player.X + 48) == 0
					&&STAGE_CHIPC(Player.Y+32,Player.X + 48) == 0
					&&STAGE_CHIPC(Player.Y+63,Player.X + 48) == 0){
						haikeiX1--;											//背景1と2を左にスクロール
						haikeiX2--;
				}
			if( Player.X - CameraX == SCREEN_WIDTH/2 - 32 && Key[ KEY_INPUT_LEFT ] >= 1)	//キャラが画面の中心にいて左に動いていて
				if(STAGE_CHIPC(Player.Y,Player.X+15) == 0						//左側が壁でない時
					&&STAGE_CHIPC(Player.Y+31,Player.X+15) == 0
					&&STAGE_CHIPC(Player.Y+32,Player.X+15) == 0
					&&STAGE_CHIPC(Player.Y+63,Player.X+15) == 0){
						haikeiX1++;											//背景1と2を左にスクロール
						haikeiX2++;
				}
		
		PlayerViewX = Player.X - CameraX;

		///////////////////////////////////////////////////////////////


 
        // ジャンプ中ならキャラの落下処理
        if(Jump == 1){
            Player.Y -= JumpPower ;
            JumpPower -= 1 ;
        }
 
        //補正//
        //床にめりこんだら上に補正
        if(JumpPower < 0) {
            if(STAGE_CHIPC(Player.Y+64,Player.X + 16) != 0
                ||STAGE_CHIPC(Player.Y+64,Player.X + 47) != 0)
            {
                Player.Y = ((Player.Y+65)/32) * 32 - 65 + 1 ;
            }
        }
        //天井にめりこんだら下に補正
        if(JumpPower > 0) {
            if(STAGE_CHIPC(Player.Y-1,Player.X + 16) != 0
                ||STAGE_CHIPC(Player.Y-1,Player.X + 47) != 0)
            {
                Player.Y = ((Player.Y+65)/32) * 32 - 65 + 32 + 1 ;
                JumpPower = 0 ;
            }
        }
 
        //右の壁にめりこんだら左に補正
        if(STAGE_CHIPC(Player.Y,Player.X + 48) != 0
            ||STAGE_CHIPC(Player.Y+63,Player.X + 48) != 0)   
        {
            Player.X = ((Player.X+65)/32) * 32 - 65 + 16 + 1 ;
        }
        //左の壁にめりこんだら右に補正
        if(STAGE_CHIPC(Player.Y,Player.X+15) != 0
            ||STAGE_CHIPC(Player.Y+63,Player.X+15) != 0)
        {
            Player.X = ((Player.X+65)/32) * 32 - 65 + 16 + 1 ;
        }
 
        // ジャンプ中にキャラが地面についたら落下をやめる
        if(Jump == 1 && JumpPower < 0 ) {
            if(STAGE_CHIPC(Player.Y+64,Player.X + 16) != 0
                ||STAGE_CHIPC(Player.Y+64,Player.X + 47) != 0)
            {
                JumpPower = 0 ;
                Jump = 0 ;
            }
        }
        //歩いているときに踏み外したらジャンプ状態にする
        if(Jump == 0) {
            if(STAGE_CHIPC(Player.Y+64,Player.X + 16) == 0
                &&STAGE_CHIPC(Player.Y+64,Player.X + 47) == 0)
            {
                Jump = 1 ;
            }
        }

///////////////ワイプ//////////
		if(Key[ KEY_INPUT_W ] == 1)		//ワイプの始まり
			wipestart=1;

		if(wipestart==1 ){		//ワイプが始まったらカウント++
			wipecount++;
			wipeimg=wipe1[wipecount];
		}
		if(wipestart==1 && wipecount == 20 ){	//カウントが16超えたらカウント--
			wipestart=2;			//ワイプ戻り始め
			MapChange=1;			//ここでマップチェンジ
		}
		//////////↓マップチェンジ
		//ステージ1から2
		if( StageData.stage == MapData1 && MapChange==1){
            StageData = StageDataSelect[1];
			chipimgData = chipimgDataSelect[1];
			Player.X = 32 , Player.Y = 288 ;
			MapChange=0;
			walkdirection=1;
			haikeiX1 = 0 ;
			haikeiX2 = 640 ;
        }
		//ステージ2から1
		if( StageData.stage == MapData2 && MapChange==1){
            StageData = StageDataSelect[0];
			chipimgData = chipimgDataSelect[0];
			Player.X = 32 , Player.Y = 288 ;
			MapChange=0;
			walkdirection=1;
			haikeiX1 = 0 ;
			haikeiX2 = 640 ;
        }

		/////////↑マップチェンジ
		if(wipestart==2){
			wipecount--;
			wipeimg=wipe1[wipecount];
		}
		if(wipestart==2 && wipecount == 0){
			wipecount=0;
			wipestart=0;
		}
//↓描画↓//////////////////////////////

        //マップを描画
	        //背景を描画
		DrawGraph( haikeiX1, 0, chipimgData.haikei1, FALSE ); // 背景1を表示
		DrawGraph( haikeiX2, 0, chipimgData.haikei2, FALSE ); // 背景2を表示
		for( i = 0 ; i < MAP_HEIGHT ; i ++ )
		{
			for( j = 0 ; j < MAP_WIDTH ; j ++ )
			{
				if( STAGE_CHIP(i,j) == 1 ) //1のときchip1を描画
				{
					DrawGraph( j*CHIP_SIZE-CameraX, i*CHIP_SIZE , chipimgData.chip1 , FALSE ) ;
				}
				if( STAGE_CHIP(i,j) == 2 ) //1のときchip2を描画
				{
					DrawGraph( j*CHIP_SIZE-CameraX, i*CHIP_SIZE , chipimgData.chip2 , FALSE ) ;
				}
			}
		}


		//HP
		HPimg = HPgazou[HP];	//HP数値にあわせてHP画像
		if( Key[ KEY_INPUT_D ] == 1 )	//Dを押したらHPを1へらす
			HP -= 1;
		if(HP<0)						//HPは0以下にならない
			HP=0;
		if(Player.Y >= 416)				//プレイヤーが落ちたらHPが0
			HP=0;
 
        //画像
 
        DrawGraph(PlayerViewX, Player.Y, Player.img, TRUE ); // x,y の位置にキャラを描画
 
 
        //ステータスバー背景
        for(int y=0 ; y<1 ; y++){
            for(int x=0 ; x<20 ; x++){
                DrawGraph(x*32+0,y*32+418,statesbar,FALSE);
            }
        }
 
        DrawGraph( 0, 420, HPimg, TRUE ); // HPバー

		//ワイプ表示
			for(int y=0 ; y<15 ; y++){
				for(int x=0 ; x<20 ; x++){
					DrawGraph(x*32+0,y*32+0,wipeimg,TRUE);
				}
			}

        //  AとSでマップを切り替え(ワイプ)
        if( Key[ KEY_INPUT_S ] >= 1 ) {
            StageData = StageDataSelect[0];
			Player.X = 32 , Player.Y = 288 ;
        }

 
 
        ScreenFlip();
    }
 
    DxLib_End();
    return 0;
}

Re: マップチップで画面をを左右にスクロールさせる

Posted: 2011年7月03日(日) 21:35
by softya(ソフト屋)
マップの描画の共通化はうまく出来ていると思います。
ですが、関数化はされていませんよね?
関数化したならば、独自の関数を作られるはずです。
マップチェンジの部分もできれば簡略化したかったのですが、次と前以外のステージに行くかもしれなかったり
マップが変わった時に決まったプレイヤー座標にキャラを移動させなかったりする場合でも
関数化というのはできるものなのでしょうか。
構造体で行き先のマップ番号、出現座標を定義しておけばマップチェンジ出来ると思います。処理ってほとんど同じじゃないですか。
それには、StageData_t;にその要素を追加するだけです。
ステージがどんだけ増えても大丈夫でしょう。

[追記]
後から気づきましが、chipimgData.chip1と2の部分は配列にすればすっきりしますね。

コード:

                if( STAGE_CHIP(i,j) == 1 ) //1のときchip1を描画
                {
                    DrawGraph( j*CHIP_SIZE-CameraX, i*CHIP_SIZE , chipimgData.chip1 , FALSE ) ;
                }
                if( STAGE_CHIP(i,j) == 2 ) //1のときchip2を描画
                {
                    DrawGraph( j*CHIP_SIZE-CameraX, i*CHIP_SIZE , chipimgData.chip2 , FALSE ) ;
                }

今後マップチップが増えることを考えると配列にするのを検討されてはどうでしょうか?

あとマップの配列とかツールで作成する予定とか無いのででしょうか?
あるいは、ゲーム自体にマップエディト機能を追加するとか?
どちらにしろ、本格的に作成する場合には問題があると思います。

Re: マップチップで画面をを左右にスクロールさせる

Posted: 2011年7月05日(火) 17:19
by chalaza
本題は解決してからもだらだらとすみませんが、
とりあえず自分なりにマップチップ表示の配列化ができました。
ChipimgDataにChip[2]で2種類のチップ画像を宣言してから、
マップデータが0以外の場合だけchipimgData.chip[STAGE_CHIP(i,j)-1]でその場所に合った画像を表示させるようにしました。
そこでこれから関数化をやってmain関数を綺麗にしてみようと思ったのですが、
たとえば、void Data_Load(){ }で画像などのデータをロードする部分のみを集めて、そのあとにmain関数が始まってすぐに
void Data_Load();を使って呼び出したりしてみたのですが、呼び出した後にmainで使われている画像を変える処理等が
エラーになってしまうのですが、そこはひとまとめにしないといけないのでしょうか…


配列化しました

コード:

#include "DxLib.h"
 
 
//構造体
 
//  プレイヤー構造体  
struct Playerdata{
    int X, Y, img;
}Player;
 
 
////
 
int Key[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;
}
 
 
 
#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480
#define CHIP_SIZE 32
#define MAP_PIXEL_WIDTH 2560
#define MAP_PIXEL_HEIGHT 480
#define MAP_WIDTH (MAP_PIXEL_WIDTH/CHIP_SIZE)
#define MAP_HEIGHT (MAP_PIXEL_HEIGHT/CHIP_SIZE)
 
// マップのデータ
int MapData1[ MAP_HEIGHT*MAP_WIDTH ] =
{
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0,  0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 0, 0, 1,  1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
} ;
 
#define MAP_PIXEL_WIDTH2 2560
#define MAP_PIXEL_HEIGHT2 480
#define MAP_WIDTH2 (MAP_PIXEL_WIDTH2/CHIP_SIZE)
#define MAP_HEIGHT2 (MAP_PIXEL_HEIGHT2/CHIP_SIZE)
 
int MapData2[ MAP_HEIGHT2*MAP_WIDTH2 ] =
{
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0,  0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
} ;
 
 
 
//  ステージ構造体
typedef struct {
    int *stage; //マップのポインタ
    int width;  //横サイズ
    int height; //縦サイズ
	int arriveX;	//到着するX座標
	int arriveY;	//到着するY座標
	int PrevMap;	//前のマップ
	int NextMap;	//次のマップ
	int AnotherMap; //それ以外のマップ

} StageData_t;
 
//  ステージテーブル
StageData_t StageDataSelect[2] = {
    { MapData1, MAP_WIDTH, MAP_HEIGHT, 32, 288, 0, 1, 0},    //マップ1
    { MapData2, MAP_WIDTH2, MAP_HEIGHT2, 64, 288, 0, 1, 0 },  //マップ2
};
 


/////
int ScrollX,OnGround;
 
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
 
    //  マップ配列参照用のデータと初期化。
    StageData_t StageData = StageDataSelect[0];
    //  ステージ参照マクロ
    #define STAGE_CHIP(y,x) (StageData.stage[(y)*(StageData.width)+(x)])
    #define STAGE_CHIPC(y,x) (StageData.stage[(y)/CHIP_SIZE*(StageData.width)+(x)/CHIP_SIZE])

 
    // 画像をロード
    //マップ画像
    int lenga1 = LoadGraph( "image/map/lenga1.png" );
    int conc1 = LoadGraph( "image/map/conc1.png" );
    int conc2 = LoadGraph( "image/map/conc2.png" );
    int haikei1 = LoadGraph( "image/haikei1.png" );
    int yakei1 = LoadGraph( "image/yakei.png" );
    int yakei2 = LoadGraph( "image/yakei2.png" );
    int hekiga1 = LoadGraph( "image/hekiga1.png" );
    int testimg = LoadGraph( "image/testimg.png" );
	//  チップ画像構造体
	typedef struct {
		int haikei1 ;
		int haikei2 ;
		int chip[2] ;	//チップ1
	} chipimgData_t;
	//  チップ画像テーブル
	chipimgData_t chipimgDataSelect[2] = {
		{ yakei1, yakei2, conc1, conc2, },		//マップ1
		{ hekiga1, hekiga1, lenga1, lenga1 },		//マップ2
	};
    //  マップ配列参照用のデータと初期化。
		chipimgData_t chipimgData = chipimgDataSelect[0];
 
    //キャラ関係
    int chara[24];      //キャラ画像
    LoadDivGraph( "image/chara.png" , 24 , 6 , 4 , 64 , 64 , chara );//プレイヤー
    int HPgazou[11];    //HPの画像
    LoadDivGraph( "image/HP.png" , 11 , 1 , 11 , 224 , 32 , HPgazou );//体力
		//ステータスバー
	int statesbar = LoadGraph( "image/statesbar.png" );

	//ワイプ用
	int MapChange = 0 ;
	int WhereMap  = 0 ;		//1=前のマップへ 2=次のマップへ 3=それ以外のマップへ
	int wipestart = 0 ;		//1=フェードアウト開始 2=フェードイン開始
	int wipecount = 0 ;		//ワイプ画像アニメーション用
	int wipeimg ;			//ワイプ画像
	int wipe1[20];			//ワイプ1(ブラインド)
	LoadDivGraph( "image/wipe/wipe1.png" , 20 , 20 , 1 , 32 , 32 , wipe1 );
 

    //関数
 
    Player.X = 32 , Player.Y = 288 ;    //プレイヤー座標
    int PlayerViewX ;
    int CameraX;
 
    int JumpPower = 0 ;         //ジャンプパワー
    int Jump = 0 ;              //ジャンプ状態か
	int walk = 0 ;				//歩いているか
	int hosei = 0 ;				//補正しているか
    int walkdirection = 1 ;     //歩く向き
    int walkanime = 0 ;         //歩くアニメーション用

	int haikeiX1 = 0 ;			//背景1のX座標
	int haikeiX2 = 640 ;		//背景2のX座標

    int HP = 10 ;               //HP
    int HPimg ;                 //HP画像
    int i , j ;                 //座標用
 

 
    while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
        //↑メッセージ処理          ↑画面をクリア           ↑入力状態を保存       ↑ESCが押されていない
 
        //ココから

        if( Key[ KEY_INPUT_RIGHT ] >= 1 ) {     //右キーが押されて
            if(STAGE_CHIPC(Player.Y,Player.X + 48) == 0      //右が壁じゃなかったら
                &&STAGE_CHIPC(Player.Y+31,Player.X + 48) == 0
                &&STAGE_CHIPC(Player.Y+32,Player.X + 48) == 0
                &&STAGE_CHIPC(Player.Y+63,Player.X + 48) == 0)
                Player.X+=3 ;   //右に動く
            walkdirection = 1 ;
        }
 


        if( Key[ KEY_INPUT_RIGHT ] >= 1 && Jump== 0 ){  // 右キーが押されていてジャンプ状態じゃなかったら
            walkanime++;
            Player.img=chara[(walkanime/10)%4 +1];//右に歩くアニメ
        }
 
        if( walkdirection == 1 && ( Key[ KEY_INPUT_RIGHT ] == 0 )&& Jump== 0 )// 右キーが離されてジャンプ状態じゃなかったら
            Player.img=chara[0];        //右を向く

 
        if( Key[ KEY_INPUT_LEFT ] >= 1 ){// 左キーが押されて
            if(STAGE_CHIPC(Player.Y,Player.X+15) == 0
                &&STAGE_CHIPC(Player.Y+31,Player.X+15) == 0
                &&STAGE_CHIPC(Player.Y+32,Player.X+15) == 0
                &&STAGE_CHIPC(Player.Y+63,Player.X+15) == 0
				||Player.X - CameraX < 0 )     //左が壁じゃなかったら
                Player.X-=3 ;   //左に動く
            walkdirection = 0 ;
        }
 
        if( Key[ KEY_INPUT_LEFT  ] >= 1 && Jump== 0 ){  // 左キーが押されていてジャンプ状態じゃなかったら
            walkanime++;
            Player.img=chara[(walkanime/10)%4 +7];//右に歩くアニメ
        }
 
        if( walkdirection == 0 && ( Key[ KEY_INPUT_LEFT ] == 0 ) && Jump== 0 )  // 左キーが離されてジャンプ状態じゃなかったら
            Player.img=chara[6];        //左を向く
		


        if( Key[ KEY_INPUT_RIGHT ] >= 1 && Key[ KEY_INPUT_LEFT  ] >= 1){//左右両方押されてたら右向く
            Player.img=chara[0];
			walk = 0 ;
		}

 
		//マップのスクロール///////////////////////////////////////////////////////

		CameraX = Player.X - SCREEN_WIDTH/2 + 32;


		//ステージのスクロール

			if(CameraX < 0)CameraX = 0;
			if(CameraX > (StageData.width*CHIP_SIZE)-SCREEN_WIDTH) CameraX = (StageData.width*CHIP_SIZE)-SCREEN_WIDTH;
			//背景表示座標をスクロール
			if( Player.X - CameraX == SCREEN_WIDTH/2 - 32 && Key[ KEY_INPUT_RIGHT ] >= 1)	//キャラが画面の中心にいて右に動いていて
				if(STAGE_CHIPC(Player.Y,Player.X + 48) == 0						//右側が壁でないとき
					&&STAGE_CHIPC(Player.Y+31,Player.X + 48) == 0
					&&STAGE_CHIPC(Player.Y+32,Player.X + 48) == 0
					&&STAGE_CHIPC(Player.Y+63,Player.X + 48) == 0){
						haikeiX1--;											//背景1と2を左にスクロール
						haikeiX2--;
				}
			if( Player.X - CameraX == SCREEN_WIDTH/2 - 32 && Key[ KEY_INPUT_LEFT ] >= 1)	//キャラが画面の中心にいて左に動いていて
				if(STAGE_CHIPC(Player.Y,Player.X+15) == 0						//左側が壁でない時
					&&STAGE_CHIPC(Player.Y+31,Player.X+15) == 0
					&&STAGE_CHIPC(Player.Y+32,Player.X+15) == 0
					&&STAGE_CHIPC(Player.Y+63,Player.X+15) == 0){
						haikeiX1++;											//背景1と2を左にスクロール
						haikeiX2++;
				}
		
		PlayerViewX = Player.X - CameraX;

		///////////////////////////////////////////////////////////////

        // ジャンプ状態じゃなく、ジャンプボタンを押して地面についていて上が天井じゃなかったらジャンプ
        if ( Jump==0 && (Key[KEY_INPUT_SPACE] >=1 ) && JumpPower <= 0) {
            if(STAGE_CHIPC(Player.Y+64,Player.X + 16) != 0
				||STAGE_CHIPC(Player.Y+64,Player.X + 47) != 0)
			{
                JumpPower = 16 ;
                Jump = 1 ;
            }
        }
 
        //ジャンプ状態で天井についてなく右向きなら右ジャンプの画像
        if ( walkdirection == 1 && Jump == 1 )
            if(STAGE_CHIPC(Player.Y-1,Player.X + 16) == 0
                &&STAGE_CHIPC(Player.Y-1,Player.X + 47) == 0){
				Player.img=chara[5];
			}
 
        //ジャンプ状態で天井についてなく左向きなら左ジャンプの画像
        if ( walkdirection == 0 && Jump == 1 )
            if(STAGE_CHIPC(Player.Y-1,Player.X + 16) == 0
                &&STAGE_CHIPC(Player.Y-1,Player.X + 47) == 0){
				Player.img=chara[11];
			}
 
        // ジャンプ中ならキャラの落下処理
        if(Jump == 1){
            Player.Y -= JumpPower ;
            JumpPower -= 1 ;
        }
 
        //補正//
        //床にめりこんだら上に補正
        if(JumpPower < 0) {
            if(STAGE_CHIPC(Player.Y+64,Player.X + 16) != 0
                ||STAGE_CHIPC(Player.Y+64,Player.X + 47) != 0)
            {
                Player.Y = ((Player.Y+65)/32) * 32 - 65 + 1 ;
            }
        }
        //天井にめりこんだら下に補正
        if(JumpPower > 0) {
            if(STAGE_CHIPC(Player.Y-1,Player.X + 16) != 0
                ||STAGE_CHIPC(Player.Y-1,Player.X + 47) != 0)
            {
                Player.Y = ((Player.Y+65)/32) * 32 - 65 + 32 + 1 ;
                JumpPower = 0 ;
            }
        }
 
        //右の壁にめりこんだら左に補正
        if(STAGE_CHIPC(Player.Y,Player.X + 48) != 0
            ||STAGE_CHIPC(Player.Y+63,Player.X + 48) != 0)   
        {
            Player.X = ((Player.X+65)/32) * 32 - 65 + 16 + 1 ;
        }
        //左の壁にめりこんだら右に補正
        if(STAGE_CHIPC(Player.Y,Player.X+15) != 0
            ||STAGE_CHIPC(Player.Y+63,Player.X+15) != 0)
        {
            Player.X = ((Player.X+65)/32) * 32 - 65 + 16 + 1 ;
        }
 
        // ジャンプ中にキャラが地面についたら落下をやめる
        if(Jump == 1 && JumpPower < 0 ) {
            if(STAGE_CHIPC(Player.Y+64,Player.X + 16) != 0
                ||STAGE_CHIPC(Player.Y+64,Player.X + 47) != 0)
            {
                JumpPower = 0 ;
                Jump = 0 ;
            }
        }
        //歩いているときに踏み外したらジャンプ状態にする
        if(Jump == 0) {
            if(STAGE_CHIPC(Player.Y+64,Player.X + 16) == 0
                &&STAGE_CHIPC(Player.Y+64,Player.X + 47) == 0)
            {
                Jump = 1 ;
            }
        }

///////////////ワイプ//////////
		if(Key[ KEY_INPUT_Q ] == 1){	//前へ戻るワイプの始まり
			wipestart=1;
			WhereMap=1;
		}
		if(Key[ KEY_INPUT_W ] == 1){	//次へ行くワイプの始まり
			wipestart=1;
			WhereMap=2;
		}
		if(Key[ KEY_INPUT_E ] == 1){	//それ以外へ行くワイプの始まり
			wipestart=1;
			WhereMap=3;
		}
		if(wipestart==1 ){		//ワイプが始まったらカウント++
			wipecount++;
			wipeimg=wipe1[wipecount];
		}
		if(wipestart==1 && wipecount == 20 ){	//カウントが16超えたらカウント--
			wipestart=2;			//ワイプ戻り始め
			MapChange=1;			//ここでマップチェンジ
		}
		//////////↓マップチェンジ
		//前のマップへ
		if( MapChange==1 && WhereMap==1 ){
			StageData = StageDataSelect[(StageData.PrevMap)];
			chipimgData = chipimgDataSelect[(StageData.PrevMap)];
			Player.X = StageData.arriveX , Player.Y = StageData.arriveY ;
			MapChange = 0 ;
			WhereMap = 0 ;
			walkdirection = 0 ;
			haikeiX1 = 0 ;
			haikeiX2 = 640 ;
        }
		//次のマップへ
		if( MapChange==1 && WhereMap==2 ){
			StageData = StageDataSelect[(StageData.NextMap)];
			chipimgData = chipimgDataSelect[(StageData.NextMap)];
			Player.X = StageData.arriveX , Player.Y = StageData.arriveY ;
			MapChange = 0 ;
			WhereMap = 0 ;
			walkdirection = 1 ;
			haikeiX1 = 0 ;
			haikeiX2 = 640 ;
        }
		//それ以外のマップへ
		if( MapChange==1 && WhereMap==3 ){
			StageData = StageDataSelect[(StageData.AnotherMap)];
			chipimgData = chipimgDataSelect[(StageData.AnotherMap)];
			Player.X = StageData.arriveX , Player.Y = StageData.arriveY ;
			MapChange = 0 ;
			WhereMap = 0 ;
			walkdirection = 1 ;
			haikeiX1 = 0 ;
			haikeiX2 = 640 ;
        }
		/////////↑マップチェンジ
		if(wipestart==2){
			wipecount--;
			wipeimg=wipe1[wipecount];
		}
		if(wipestart==2 && wipecount == 0){
			wipecount=0;
			wipestart=0;
		}
//↓描画↓//////////////////////////////

        //マップを描画
	        //背景を描画
		DrawGraph( haikeiX1, 0, chipimgData.haikei1, FALSE ); // 背景1を表示
		DrawGraph( haikeiX2, 0, chipimgData.haikei2, FALSE ); // 背景2を表示
		for( i = 0 ; i < MAP_HEIGHT ; i ++ )
		{
			for( j = 0 ; j < MAP_WIDTH ; j ++ )
			{
				if( STAGE_CHIP(i,j) != 0 ) //1以上のとき数値に合った画像
				{
					DrawGraph( j*CHIP_SIZE-CameraX, i*CHIP_SIZE , chipimgData.chip[STAGE_CHIP(i,j)-1] , FALSE ) ;
				}
			}
		}


		//HP
		HPimg = HPgazou[HP];	//HP数値にあわせてHP画像
		if( Key[ KEY_INPUT_D ] == 1 )	//Dを押したらHPを1へらす
			HP -= 1;
		if(HP<0)						//HPは0以下にならない
			HP=0;
		if(Player.Y >= 416)				//プレイヤーが落ちたらHPが0
			HP=0;
 
        //画像
 
        DrawGraph(PlayerViewX, Player.Y, Player.img, TRUE ); // x,y の位置にキャラを描画
 
 
        //ステータスバー背景
        for(int y=0 ; y<1 ; y++){
            for(int x=0 ; x<20 ; x++){
                DrawGraph(x*32+0,y*32+418,statesbar,FALSE);
            }
        }
 
        DrawGraph( 0, 420, HPimg, TRUE ); // HPバー

		//ワイプ表示
			for(int y=0 ; y<15 ; y++){
				for(int x=0 ; x<20 ; x++){
					DrawGraph(x*32+0,y*32+0,wipeimg,TRUE);
				}
			}
 
 
        ScreenFlip();
    }
 
    DxLib_End();
    return 0;
}

Re: マップチップで画面をを左右にスクロールさせる

Posted: 2011年7月05日(火) 17:55
by softya(ソフト屋)
>void Data_Load();を使って呼び出したりしてみたのですが、呼び出した後にmainで使われている画像を変える処理等が
>エラーになってしまうのですが、そこはひとまとめにしないといけないのでしょうか…

それは変数のスコープと寿命に関する問題だと思います。
「C言語編 第22章 変数のスコープ」
http://www.geocities.jp/ky_webid/c/022.html
「変数寿命 - karetta.jp」
http://karetta.jp/book-node/c-for-beginners/228988

ただ、無闇にグローバルにするのは避けてなるべく少なくする事が重要です。

コード:

    //  チップ画像テーブル
    chipimgData_t chipimgDataSelect[2] = {
        { yakei1, yakei2, conc1, conc2, },      //マップ1
        { hekiga1, hekiga1, lenga1, lenga1 },       //マップ2
    };
ここが厄介だと思いますので、宣言と初期値代入を分けたほうが良いでしょう。
その場合、StageData_tとchipimgData_tは1つにできるきもします。

あとプログラム中にMAP_HEIGHT等が残っているのと、マップチェンジの共通化(どうみても、ほとんど同じコードなので共通化出来ます)も徹底してもらうと良くなると思います。

Re: マップチップで画面をを左右にスクロールさせる

Posted: 2011年7月05日(火) 22:10
by chalaza
なんとか無理やりマップチェンジを共通化みたいにしてみました。
私が組んでみたコードでは一応機能するのですがちょっと疑問があったので…
まず、次のマップへ行く場合はWhereMapに1、前へ戻る時は-1、それ以外の別のマップへ行く時は0を代入して、
StageDataSelect[(StageData.NowMap)+(WhereMap)]を使って現在のマップ数にWhereMapを足したマップ数に移動するようにしてみて、
そこでWhereMapに0が代入されてた場合はStageDataのAnotherMapへ移動する。と組んでみたのですが、
これがちゃんとしたゲームになってからなら前へ戻る扉や次へ行く扉がしっかりマップに合った数になるのですが、
このコードだとテストプレイ時などに-1ステージやできていないステージ数までマップチェンジすることがたまにあり、
そのときエラーで強制終了されるのですが、これは気をつけてこのままのコードで作っていけば良いのでしょうか。
それともテストプレイ時でもあり得ないステージなどには行かないようにできるのでしょうか…

コード:

#include "DxLib.h"
 
 
//構造体
 
//  プレイヤー構造体  
struct Playerdata{
    int X, Y, img;
}Player;
 
 
////
 
int Key[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;
}
 
 
 
#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480
#define CHIP_SIZE 32
#define MAP_PIXEL_WIDTH 2560
#define MAP_PIXEL_HEIGHT 480
#define MAP_WIDTH (MAP_PIXEL_WIDTH/CHIP_SIZE)
#define MAP_HEIGHT (MAP_PIXEL_HEIGHT/CHIP_SIZE)
 
// マップのデータ
int MapData1[ MAP_HEIGHT*MAP_WIDTH ] =
{
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0,  0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 0, 0, 1,  1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
} ;
 
#define MAP_PIXEL_WIDTH2 2560
#define MAP_PIXEL_HEIGHT2 480
#define MAP_WIDTH2 (MAP_PIXEL_WIDTH2/CHIP_SIZE)
#define MAP_HEIGHT2 (MAP_PIXEL_HEIGHT2/CHIP_SIZE)
 
int MapData2[ MAP_HEIGHT2*MAP_WIDTH2 ] =
{
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0,  0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
} ;
 
 


/////
int ScrollX,OnGround;
 
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
 
    //  ステージ参照マクロ
    #define STAGE_CHIP(y,x) (StageData.stage[(y)*(StageData.width)+(x)])
    #define STAGE_CHIPC(y,x) (StageData.stage[(y)/CHIP_SIZE*(StageData.width)+(x)/CHIP_SIZE])

 
    // 画像をロード
    //マップ画像
    int lenga1 = LoadGraph( "image/map/lenga1.png" );
    int conc1 = LoadGraph( "image/map/conc1.png" );
    int conc2 = LoadGraph( "image/map/conc2.png" );
    int haikei1 = LoadGraph( "image/haikei1.png" );
    int yakei1 = LoadGraph( "image/yakei.png" );
    int yakei2 = LoadGraph( "image/yakei2.png" );
    int hekiga1 = LoadGraph( "image/hekiga1.png" );
    int testimg = LoadGraph( "image/testimg.png" );
	//  チップ画像構造体

 
 
//  ステージ構造体
typedef struct {
    int *stage; //マップのポインタ
    int width;  //横サイズ
    int height; //縦サイズ
	int arriveX;	//到着するX座標
	int arriveY;	//到着するY座標
	int NowMap;
	int AnotherMap; //それ以外のマップ
	int haikei1 ;
	int haikei2 ;
	int chip[2] ;

} StageData_t;
 
//  ステージテーブル
StageData_t StageDataSelect[2] = {
    { MapData1, MAP_WIDTH, MAP_HEIGHT, 32, 288, 0, 0, yakei1, yakei2, conc1, conc2,},    //マップ1
    { MapData2, MAP_WIDTH2, MAP_HEIGHT2, 32, 288, 1, 0, hekiga1, hekiga1, lenga1, lenga1 },  //マップ2
};
 
    //  マップ配列参照用のデータと初期化。
    StageData_t StageData = StageDataSelect[0];

    //キャラ関係
    int chara[24];      //キャラ画像
    LoadDivGraph( "image/chara.png" , 24 , 6 , 4 , 64 , 64 , chara );//プレイヤー
    int HPgazou[11];    //HPの画像
    LoadDivGraph( "image/HP.png" , 11 , 1 , 11 , 224 , 32 , HPgazou );//体力
		//ステータスバー
	int statesbar = LoadGraph( "image/statesbar.png" );

	//ワイプ用
	int MapChange = 0 ;
	int WhereMap  = 0 ;		//1=前のマップへ 2=次のマップへ 3=それ以外のマップへ
	int wipestart = 0 ;		//1=フェードアウト開始 2=フェードイン開始
	int wipecount = 0 ;		//ワイプ画像アニメーション用
	int wipeimg ;			//ワイプ画像
	int wipe1[20];			//ワイプ1(四角)
	LoadDivGraph( "image/wipe/wipe1.png" , 20 , 20 , 1 , 32 , 32 , wipe1 );
 

    //関数
 
    Player.X = 32 , Player.Y = 288 ;    //プレイヤー座標
    int PlayerViewX ;
    int CameraX;
 
    int JumpPower = 0 ;         //ジャンプパワー
    int Jump = 0 ;              //ジャンプ状態か
	int walk = 0 ;				//歩いているか
	int hosei = 0 ;				//補正しているか
    int walkdirection = 1 ;     //歩く向き
    int walkanime = 0 ;         //歩くアニメーション用

	int haikeiX1 = 0 ;			//背景1のX座標
	int haikeiX2 = 640 ;		//背景2のX座標

    int HP = 10 ;               //HP
    int HPimg ;                 //HP画像
    int i , j ;                 //座標用
 

 
    while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
        //↑メッセージ処理          ↑画面をクリア           ↑入力状態を保存       ↑ESCが押されていない
 
        //ココから

        if( Key[ KEY_INPUT_RIGHT ] >= 1 ) {     //右キーが押されて
            if(STAGE_CHIPC(Player.Y,Player.X + 48) == 0      //右が壁じゃなかったら
                &&STAGE_CHIPC(Player.Y+31,Player.X + 48) == 0
                &&STAGE_CHIPC(Player.Y+32,Player.X + 48) == 0
                &&STAGE_CHIPC(Player.Y+63,Player.X + 48) == 0)
                Player.X+=3 ;   //右に動く
            walkdirection = 1 ;
        }
 


        if( Key[ KEY_INPUT_RIGHT ] >= 1 && Jump== 0 ){  // 右キーが押されていてジャンプ状態じゃなかったら
            walkanime++;
            Player.img=chara[(walkanime/10)%4 +1];//右に歩くアニメ
        }
 
        if( walkdirection == 1 && ( Key[ KEY_INPUT_RIGHT ] == 0 )&& Jump== 0 )// 右キーが離されてジャンプ状態じゃなかったら
            Player.img=chara[0];        //右を向く

 
        if( Key[ KEY_INPUT_LEFT ] >= 1 ){// 左キーが押されて
            if(STAGE_CHIPC(Player.Y,Player.X+15) == 0
                &&STAGE_CHIPC(Player.Y+31,Player.X+15) == 0
                &&STAGE_CHIPC(Player.Y+32,Player.X+15) == 0
                &&STAGE_CHIPC(Player.Y+63,Player.X+15) == 0
				||Player.X - CameraX < 0 )     //左が壁じゃなかったら
                Player.X-=3 ;   //左に動く
            walkdirection = 0 ;
        }
 
        if( Key[ KEY_INPUT_LEFT  ] >= 1 && Jump== 0 ){  // 左キーが押されていてジャンプ状態じゃなかったら
            walkanime++;
            Player.img=chara[(walkanime/10)%4 +7];//右に歩くアニメ
        }
 
        if( walkdirection == 0 && ( Key[ KEY_INPUT_LEFT ] == 0 ) && Jump== 0 )  // 左キーが離されてジャンプ状態じゃなかったら
            Player.img=chara[6];        //左を向く
		


        if( Key[ KEY_INPUT_RIGHT ] >= 1 && Key[ KEY_INPUT_LEFT  ] >= 1){//左右両方押されてたら右向く
            Player.img=chara[0];
			walk = 0 ;
		}

 
		//マップのスクロール///////////////////////////////////////////////////////

		CameraX = Player.X - SCREEN_WIDTH/2 + 32;


		//ステージのスクロール

			if(CameraX < 0)CameraX = 0;
			if(CameraX > (StageData.width*CHIP_SIZE)-SCREEN_WIDTH) CameraX = (StageData.width*CHIP_SIZE)-SCREEN_WIDTH;
			//背景表示座標をスクロール
			if( Player.X - CameraX == SCREEN_WIDTH/2 - 32 && Key[ KEY_INPUT_RIGHT ] >= 1)	//キャラが画面の中心にいて右に動いていて
				if(STAGE_CHIPC(Player.Y,Player.X + 48) == 0						//右側が壁でないとき
					&&STAGE_CHIPC(Player.Y+31,Player.X + 48) == 0
					&&STAGE_CHIPC(Player.Y+32,Player.X + 48) == 0
					&&STAGE_CHIPC(Player.Y+63,Player.X + 48) == 0){
						haikeiX1--;											//背景1と2を左にスクロール
						haikeiX2--;
				}
			if( Player.X - CameraX == SCREEN_WIDTH/2 - 32 && Key[ KEY_INPUT_LEFT ] >= 1)	//キャラが画面の中心にいて左に動いていて
				if(STAGE_CHIPC(Player.Y,Player.X+15) == 0						//左側が壁でない時
					&&STAGE_CHIPC(Player.Y+31,Player.X+15) == 0
					&&STAGE_CHIPC(Player.Y+32,Player.X+15) == 0
					&&STAGE_CHIPC(Player.Y+63,Player.X+15) == 0){
						haikeiX1++;											//背景1と2を左にスクロール
						haikeiX2++;
				}
		
		PlayerViewX = Player.X - CameraX;

		///////////////////////////////////////////////////////////////

        // ジャンプ状態じゃなく、ジャンプボタンを押して地面についていて上が天井じゃなかったらジャンプ
        if ( Jump==0 && (Key[KEY_INPUT_SPACE] >=1 ) && JumpPower <= 0) {
            if(STAGE_CHIPC(Player.Y+64,Player.X + 16) != 0
				||STAGE_CHIPC(Player.Y+64,Player.X + 47) != 0)
			{
                JumpPower = 16 ;
                Jump = 1 ;
            }
        }
 
        //ジャンプ状態で天井についてなく右向きなら右ジャンプの画像
        if ( walkdirection == 1 && Jump == 1 )
            if(STAGE_CHIPC(Player.Y-1,Player.X + 16) == 0
                &&STAGE_CHIPC(Player.Y-1,Player.X + 47) == 0){
				Player.img=chara[5];
			}
 
        //ジャンプ状態で天井についてなく左向きなら左ジャンプの画像
        if ( walkdirection == 0 && Jump == 1 )
            if(STAGE_CHIPC(Player.Y-1,Player.X + 16) == 0
                &&STAGE_CHIPC(Player.Y-1,Player.X + 47) == 0){
				Player.img=chara[11];
			}
 
        // ジャンプ中ならキャラの落下処理
        if(Jump == 1){
            Player.Y -= JumpPower ;
            JumpPower -= 1 ;
        }
 
        //補正//
        //床にめりこんだら上に補正
        if(JumpPower < 0) {
            if(STAGE_CHIPC(Player.Y+64,Player.X + 16) != 0
                ||STAGE_CHIPC(Player.Y+64,Player.X + 47) != 0)
            {
                Player.Y = ((Player.Y+65)/32) * 32 - 65 + 1 ;
            }
        }
        //天井にめりこんだら下に補正
        if(JumpPower > 0) {
            if(STAGE_CHIPC(Player.Y-1,Player.X + 16) != 0
                ||STAGE_CHIPC(Player.Y-1,Player.X + 47) != 0)
            {
                Player.Y = ((Player.Y+65)/32) * 32 - 65 + 32 + 1 ;
                JumpPower = 0 ;
            }
        }
 
        //右の壁にめりこんだら左に補正
        if(STAGE_CHIPC(Player.Y,Player.X + 48) != 0
            ||STAGE_CHIPC(Player.Y+63,Player.X + 48) != 0)   
        {
            Player.X = ((Player.X+65)/32) * 32 - 65 + 16 + 1 ;
        }
        //左の壁にめりこんだら右に補正
        if(STAGE_CHIPC(Player.Y,Player.X+15) != 0
            ||STAGE_CHIPC(Player.Y+63,Player.X+15) != 0)
        {
            Player.X = ((Player.X+65)/32) * 32 - 65 + 16 + 1 ;
        }
 
        // ジャンプ中にキャラが地面についたら落下をやめる
        if(Jump == 1 && JumpPower < 0 ) {
            if(STAGE_CHIPC(Player.Y+64,Player.X + 16) != 0
                ||STAGE_CHIPC(Player.Y+64,Player.X + 47) != 0)
            {
                JumpPower = 0 ;
                Jump = 0 ;
            }
        }
        //歩いているときに踏み外したらジャンプ状態にする
        if(Jump == 0) {
            if(STAGE_CHIPC(Player.Y+64,Player.X + 16) == 0
                &&STAGE_CHIPC(Player.Y+64,Player.X + 47) == 0)
            {
                Jump = 1 ;
            }
        }

///////////////ワイプ//////////
		if(Key[ KEY_INPUT_Q ] == 1){	//前へ戻るワイプの始まり
			wipestart=1;
			WhereMap=-1;
		}
		if(Key[ KEY_INPUT_W ] == 1){	//次へ行くワイプの始まり
			wipestart=1;
			WhereMap=1;
		}
		if(Key[ KEY_INPUT_E ] == 1){	//別へ行くワイプの始まり
			wipestart=1;
			WhereMap=0;
		}
		if(wipestart==1 ){		//ワイプが始まったらカウント++
			wipecount++;
			wipeimg=wipe1[wipecount];
		}
		if(wipestart==1 && wipecount == 20 ){	//カウントが16超えたらカウント--
			wipestart=2;			//ワイプ戻り始め
			MapChange=1;			//ここでマップチェンジ
		}
		//////////↓マップチェンジ
		//前か次のマップへ
		if( MapChange==1 ){
			StageData = StageDataSelect[(StageData.NowMap)+(WhereMap)];
			if(WhereMap==0){		//この場合別のマップへ
				StageData = StageDataSelect[(StageData.AnotherMap)];
			}
			Player.X = StageData.arriveX , Player.Y = StageData.arriveY ;
			MapChange = 0 ;
			WhereMap = 0 ;
			walkdirection = 1 ;
			haikeiX1 = 0 ;
			haikeiX2 = 640 ;
			
			}

		/////////↑マップチェンジ
		if(wipestart==2){
			wipecount--;
			wipeimg=wipe1[wipecount];
		}
		if(wipestart==2 && wipecount == 0){
			wipecount=0;
			wipestart=0;
		}
//↓描画↓//////////////////////////////

        //マップを描画
	        //背景を描画
		DrawGraph( haikeiX1, 0, StageData.haikei1, FALSE ); // 背景1を表示
		DrawGraph( haikeiX2, 0, StageData.haikei2, FALSE ); // 背景2を表示
		for( i = 0 ; i < StageData.height ; i ++ )
		{
			for( j = 0 ; j < StageData.width ; j ++ )
			{
				if( STAGE_CHIP(i,j) != 0 ) //1以上のとき数値に合った画像
				{
					DrawGraph( j*CHIP_SIZE-CameraX, i*CHIP_SIZE , StageData.chip[STAGE_CHIP(i,j)-1] , FALSE ) ;
				}
			}
		}


		//HP
		HPimg = HPgazou[HP];	//HP数値にあわせてHP画像
		if( Key[ KEY_INPUT_D ] == 1 )	//Dを押したらHPを1へらす
			HP -= 1;
		if(HP<0)						//HPは0以下にならない
			HP=0;
		if(Player.Y >= 416)				//プレイヤーが落ちたらHPが0
			HP=0;
 
        //画像
 
        DrawGraph(PlayerViewX, Player.Y, Player.img, TRUE ); // x,y の位置にキャラを描画
 
 
        //ステータスバー背景
        for(int y=0 ; y<1 ; y++){
            for(int x=0 ; x<20 ; x++){
                DrawGraph(x*32+0,y*32+418,statesbar,FALSE);
            }
        }
 
        DrawGraph( 0, 420, HPimg, TRUE ); // HPバー

		//ワイプ表示
			for(int y=0 ; y<15 ; y++){
				for(int x=0 ; x<20 ; x++){
					DrawGraph(x*32+0,y*32+0,wipeimg,TRUE);
				}
			}
 
 
        ScreenFlip();
    }
 
    DxLib_End();
    return 0;
}

Re: マップチップで画面をを左右にスクロールさせる

Posted: 2011年7月05日(火) 22:34
by softya(ソフト屋)
なんか掲示板の返信がやたらと重くなってきたので、次から新しいトピックに移ってもらえますか?
たぶん、コードが何回も出てくる文字数の多いトピックだからだと思いますが。

新しいトピックに移るときは題名の引継ぎと今回の質問リンクを書きこんでおいてください。
http://www.dixq.net/forum/viewtopic.php?f=3&t=8754

で、今回の問題ですが、

コード:

//  ステージテーブル
StageData_t StageDataSelect[2] = {
    { MapData1, MAP_WIDTH, MAP_HEIGHT, 32, 288, 0, 0, yakei1, yakei2, conc1, conc2,},    //マップ1
    { MapData2, MAP_WIDTH2, MAP_HEIGHT2, 32, 288, 1, 0, hekiga1, hekiga1, lenga1, lenga1 },  //マップ2
};

// ステージテーブル
StageData_t StageDataSelect[2] = {
{ MapData1, MAP_WIDTH, MAP_HEIGHT, 32, 288, 0, 0, 0,0,0,0}, //マップ1
{ MapData2, MAP_WIDTH2, MAP_HEIGHT2, 32, 288, 1, 0, 0,0,0,0 }, //マップ2
};
と初期化してLoadGraph()の後で画像のイメージ番号を代入する形にしてください。
この宣言自体とステージ構造体をWinMainの前に追い出すのが目的です。そうしないと関数化が出来ませんので。
chalaza さんが書きました:まず、次のマップへ行く場合はWhereMapに1、前へ戻る時は-1、それ以外の別のマップへ行く時は0を代入して、
StageDataSelect[(StageData.NowMap)+(WhereMap)]を使って現在のマップ数にWhereMapを足したマップ数に移動するようにしてみて、
そこでWhereMapに0が代入されてた場合はStageDataのAnotherMapへ移動する。と組んでみたのですが、
これがちゃんとしたゲームになってからなら前へ戻る扉や次へ行く扉がしっかりマップに合った数になるのですが、
このコードだとテストプレイ時などに-1ステージやできていないステージ数までマップチェンジすることがたまにあり、
そのときエラーで強制終了されるのですが、これは気をつけてこのままのコードで作っていけば良いのでしょうか。
それともテストプレイ時でもあり得ないステージなどには行かないようにできるのでしょうか…
前回の前のマップと後のマップの番号が書いてあった構造だとダメなのでしょうか?
AnotherMapってことは3つ目の扉があると言うことでしょうか?
もしそうなら、行き先のマップ番号を配列にして持てば解決する気がします。
int MapChangeNo[4]; ← 最大4つある場合。-1ならチェンジ不能
{ MapData2, MAP_WIDTH2, MAP_HEIGHT2, {0,2,-1,-1},
MapChangeNo[0]なら前のマップにチェンジする。
MapChangeNo[1]なら次のマップにチェンジする。
MapChangeNo[2]なら特別なマップにチェンジする。
などなどを自分で決めてください。

あとありえない無いマップ番号(-1や最大値を越える)を差した場合は、マップチェンジをキャンセルする仕組みを作れば良いです。