画像の表示がおかしくなる

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

画像の表示がおかしくなる

#1

投稿記事 by ラプター » 13年前

お世話になります。スクロールの件ではありがとうございました。

あの後他のメンバーが作製していた他の部分と結合してだいぶ進んだのですが
スクロール後にキャラクターの画像(上向き)が点滅または弾が画像が出てないだけで発射されているという変なことになりました。
特にエラーも出てないのでprintfでのデバックもしてみましたがおかしい点がわかりません。
後デバックモードでEscキーで終了すると
Run-Time Check Failure #2 - Stack around the variable 'tama' was corrupted.
というエラーが出るのですが翻訳もしてみたのですがよくわからない状態です
どうかご教授お願いします

開発環境
○Windows Server 2008 Standard SP2
○Visual Studio2008 & 2010
○DXライブラリ使用

コード:

#include "DxLib.h"

#define SCREEN_WIDTH     (640)                          // 画面の横幅
#define SCREEN_HEIGHT    (480)                          // 画面の縦幅
#define CHIP_SIZE        (32)                           // 一つのチップのサイズ
#define MAP_WIDTH_PIXEL  (4480)							// マップの横幅(ピクセル)
#define MAP_WIDTH        (MAP_WIDTH_PIXEL/ CHIP_SIZE)     // マップの横幅
#define MAP_HEIGHT       (SCREEN_HEIGHT / CHIP_SIZE)    // マップの縦幅
#define SCROLL_POINT	 (640-(32*5))					// スクロール開始する画面内の位置

#define G                (0.3F)                         // キャラに掛かる重力加速度
#define JUMP_POWER       (9.0F)                         // キャラのジャンプ力
#define SPEED            (2.0F)                         // キャラの移動スピード
#define CHAR_SIZE        (60)							// キャラサイズ
#define ECHAR_SIZE		 (32)							// 敵キャラサイズ
#define e 0.800
#define g 9.807
#define y_max 2.000

typedef struct{
        int img,muki;
}ch_t;

typedef struct{
	int x,y,img,muki,walking_flag,kaiten_flag;
}ene_m;

struct shot{
    int x2,y2,x3,y3,x4,y4;  //座標
    int flag,flag2,flag3;
};
//全ての入力監視
int GetHitKeyStateAll_2(int KeyStateBuf[]){
   char GetHitKeyStateAll_Key[256];
        GetHitKeyStateAll( GetHitKeyStateAll_Key );
    for(int i=0;i<256;i++){
        if(GetHitKeyStateAll_Key[i]==1) KeyStateBuf[i]++;
        else                            KeyStateBuf[i]=0;
   }
        return 0;
}
//スタート時の選択肢
void char_disp(int White,int y){
	DrawString( 260 , y   , "→"            , White );
    DrawString( 280 , 320 , "スタート"  , White );
    DrawString( 280 , 340 , "操作方法" , White );
    DrawString( 280 , 360 , "終了" , White );
}


// マップデータ
 char MapData[MAP_HEIGHT][MAP_WIDTH] =
{
    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,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,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,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,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, 1,1,0,0,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,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,     0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,  0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,      0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,  0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 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,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,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,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,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,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,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,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,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, 0,0,0,0,0, 0,0,1,0,0, 0,1,1,0,0,  1,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,1,1,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,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,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,     0,0,0,0,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,1,0, 0,0,0,0,0,      0,0,0,0,0, 1,1,1,1,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,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,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,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,1,0, 1,0,0,0,1,      1,0,0,0,0, 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, 1,1,0,0,0, 1,1,0,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,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,1,1,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,0,0, 0,0,0,0,0, 0,0,0,0,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,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,1,1,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,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,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,     0,0,0,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,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,1,1,  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,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, 
} ;

int key[256];
int White=GetColor(255,255,255),y=320;
int logo=0;
int StartTime;
int EndTime;

float PlX, PlY ;            // プレイヤーの座標(中心座標)
float ElX, ElY ;			// 敵座標
float ENX, ENY ;            // 敵の座標(中心座標)
float AlX, AlY ;
float LlX, LlY ;
float BGX, BGY ;
float PlDownSp ;            // プレイヤーの落下速度
float EDownSp ;            // 敵の落下速度
char PlJumpFlag ;           // プレイヤーがジャンプ中か、のフラグ
char walking_flag ;
int camerax=0;
int Input, EdgeInput ;      // 入力状態
int FrameStartTime ;        // 60FPS固定用、時間保存用変数
int check_flag;

int Sound,Sound2,Sound3,Sound4 ;


//*************キャラ*****************
// マップチップの値を取得する関数
int GetChipParam( float X, float Y ) ;

//***************敵*******************
// マップチップの値を取得する関数
int EGetChipParam( float EX, float EY ) ;


// キャラクタをマップとの当たり判定を考慮しながら移動する関数
int CharMove( float *X, float *Y, float *DownSP,
                    float MoveX, float MoveY, float Size, char *JumpFlag ) ;

int EMove( float *EX, float *EY, 
                    float EveX, float EveY, float ESize);

// アクションサンプルプログラムメイン関数
int ActMain( void ) ;
void start(void);
void sousa(void);
// マップとの当たり判定( 戻り値 0:当たらなかった  1:左辺に当たった  2:右辺に当たった
//                                                3:上辺に当たった  4:下辺に当たった

//**************キャラ***************
int MapHitCheck( float X, float Y, float *MoveX, float *MoveY ) ;

//****************敵*****************
int EMHCheck( float EX, float EY, float *EveX, float *EveY ) ;


 void sousa(void){
	ClearDrawScreen();
	while(ProcessMessage()==0 && GetHitKeyStateAll_2(key)==0 && key[KEY_INPUT_ESCAPE]==0){
		LoadGraphScreen(0,0,"graphics/gameover.png",TRUE);
		ScreenFlip();
		if(key[KEY_INPUT_RETURN]==1){
		DxLib_End();		
		}
	}
 }

//******************クリア画面関数********************
//*************画面表示後ENTERで終了*************

  void clear(void){
	ClearDrawScreen();
	while(ProcessMessage()==0 && GetHitKeyStateAll_2(key)==0 && key[KEY_INPUT_ESCAPE]==0){
		LoadGraphScreen(0,0,"graphics/clear.png",TRUE);
		ScreenFlip();
		if(key[KEY_INPUT_RETURN]==1){
		DxLib_End();		
		}
	}
 }

// WinMain関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    LPSTR lpCmdLine, int nCmdShow )
{	
	ChangeWindowMode( TRUE ) ;
	if( DxLib_Init() == -1 )	// DXライブラリ初期化処理
	{
		 return -1;				// エラーが起きたら直ちに終了
	}


	StartTime = GetNowCount();
	while(ProcessMessage()==0 && GetHitKeyStateAll_2(key)==0 && key[KEY_INPUT_ESCAPE]==0){
          //↑メッセージ処理         ↑画面をクリア         ↑入力状態を保存       ↑ESCが押されていない
		
 		char_disp(White,y);                              // 文字を描画 
 		if( key[KEY_INPUT_DOWN]==1){ 
			ClearDrawScreen();
		y+=20;
		}
		if( key[KEY_INPUT_UP]==1 ){ 
			ClearDrawScreen();
		y-=20;
		}
		if(y==320)
			logo=0;
		if(y==360)
			logo=0;
			if(CheckHitKey( KEY_INPUT_RETURN)==1 ){
				ClearDrawScreen();
				if(y==320){
						ActMain();//メインプログラム

					}
				else if(y==340){
						logo=1;
						LoadGraphScreen( 0 , 0 , "graphics/sousa.png" , FALSE ) ;
					}
							//操作方法に飛ばす
					else if (y==360){
						DxLib_End() ;
					}
			}
			if(y==300)
				   y=360;
            if(y==380)                            // y座標が260なら(選択が一番下なら)
				   y=320;                        // 選択座標を一番上に
		if(logo==0){
			LoadGraphScreen( 0 , 0 , "graphics/title.png" , TRUE );
		}
	}
    ScreenFlip();//裏画面反映
    
    // DXライブラリの後始末
    DxLib_End() ;

    // 終了
    return 0 ;
}

// アクションサンプルプログラムメイン
int ActMain() {
	ch_t ch;		////キャラ
	ene_m en;		////敵
	int Color;
	Color=GetColor(255,255,255);
	int image[36],image2[16],image4[1],image5[18],image6[1],image10[1];
	int image_stage;
	char Key[256];
	int i=0,counter=0,tmuki=2;
	struct shot tama[10];
	int roll=0,roll2=0;
	int BO;

	int HP=5,HP1=5,emo=1,emo1=1;
	int BHP=1;
	int myHP=5;
	int eneHP=5;

	int boss_flag=0;	//ボスの登場フラグ

	if( DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;

		for(i=0;i<10;i++){                  //初期化処理
            tama[i].x2=(int)PlX; tama[i].y2=(int)PlY; //座標代入
            tama[i].flag=0;                 //飛んでいない事を示すフラグ=0
			tama[i].x3=(int)PlX; tama[i].y3=(int)PlY;
			tama[i].flag2=0;
			tama[i].x4=(int)PlX; tama[i].y4=(int)PlY;
			tama[i].flag3=0;
		}

    // 描画先を裏画面にセット
    SetDrawScreen( DX_SCREEN_BACK ) ;

	walking_flag=FALSE;
	ch.muki=2;
	LoadDivGraph( "graphics/hokou.png" , 36 , 18 , 2 , 60 , 60 , image );
	LoadDivGraph( "graphics/hg.png" , 16 , 4 , 4 , 32, 32 , image2);
	LoadDivGraph( "graphics/teki.png" , 1 , 1 , 1 , 32, 32 , image4);
	LoadDivGraph( "graphics/uehokou.png", 18 , 18 , 1 , 60 , 85 , image5);
	LoadDivGraph( "graphics/boss.png" , 1 , 1 , 1 , 128, 128 , image6);
	LoadDivGraph( "graphics/bossshi.png" , 1 , 1 , 1 , 178, 60 , image10);
	
	image_stage=LoadGraph("graphics/haikei.png");
	Sound = LoadMusicMem("backmusic.mid");
	Sound2 = LoadSoundMem("gun.wav");

	PlayMusicMem( Sound ,  DX_PLAYTYPE_LOOP ) ;

    // 垂直同期信号を待たない
    SetWaitVSyncFlag( FALSE ) ;

    // プレイヤーの座標を初期化
    PlX = 100.0F ;        PlY = 240.0F ;

	//背景座標
	BGX = 0.0F;			  BGY = 0.0F;
	
	// 敵(反発する)の座標を初期化
	ENX = 570.0F ;        ENY = 380.0F ; 
	// 敵(チビエイリアン)の初期化
	ElX = 300.0F ;        ElY = 410.0F ;
	AlX = 200.0F ;        AlY = 410.0F ;

    // プレイヤーの落下速度を初期化
    PlDownSp = 0.0F ;
	// 敵の落下速度
	EDownSp = 0.0F ;

    // ジャンプ中フラグを倒す
    PlJumpFlag = FALSE ;

    // 入力状態の初期化
    Input = 0 ;
    EdgeInput = 0 ;

    // 60FPS固定用、時間保存用変数を現在のカウント値にセット
    FrameStartTime = GetNowCount() ;

	//敵の初期値
	en.x   =570;		
	en.y   =380;
	en.walking_flag=1;
	en.muki=1;
	en.kaiten_flag=1;

	//AllocConsole();
    //freopen("CONOUT$", "w", stdout); //標準出力をコンソールにする

    // メインループ開始、ESCキーで外に出る
    while( ProcessMessage() == 0 && !ClearDrawScreen() && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 && !GetHitKeyStateAll( Key ))
    {
        // 1/60秒立つまで待つ
        while( GetNowCount() - FrameStartTime < 1000 / 60 ){}

        // 現在のカウント値を保存
        FrameStartTime = GetNowCount() ;

		if( (int)PlX%1==0 &&  (int)PlY%1==0){         //座標が32で割り切れたら入力可能
			walking_flag=FALSE;
            if     ( CheckHitKey( KEY_INPUT_UP   )  == 1 )  //上ボタンが押されたら
                    ch.muki=0;         //上向きフラグを立てる
            else if( CheckHitKey( KEY_INPUT_LEFT  )  == 1 )  //左ボタンが押されたら
                    ch.muki=1;         //左向きフラグを立てる
            else if( CheckHitKey( KEY_INPUT_RIGHT  )  == 1 )  //右ボタンが押されたら
                    ch.muki=2;         //右向きフラグを立てる
			else walking_flag=TRUE;
        }
						
		///////////////////敵/////////////
	
		///////////////////回転///////////////////////////


		if(en.kaiten_flag==1){			
			if(en.muki==1){				//////左に進む
				if(CHIP_SIZE > ENX){

					en.muki=0;
				}
				if(check_flag ==1 || check_flag%2==1){
					en.kaiten_flag=0;
					en.muki=3;
				}
			}
				
			else if(en.muki==0){		 /////左端まで進んだら上方向に切り替える
				if( CHIP_SIZE > ENY && CHIP_SIZE > ENX) {

					en.muki=3;					//左上の角に来たら進行方向を「右」に
				}
				if(check_flag ==1 || check_flag%2==1){
					en.kaiten_flag=0;
					en.muki=5;
				}
			}

			else if(en.muki==3){				//左上角まで進んだら右方向に切り替える

				if(check_flag ==1 || check_flag%2==1){
				en.kaiten_flag=0;
				en.muki=1;
				}
					if(ENX > SCREEN_WIDTH)
					en.muki=5;        //進行方向を「下」に
			}
				
			else if(en.muki==5){			//下に進む

				if(ENY > SCREEN_HEIGHT)  
					en.muki=1;
				if(check_flag ==1 || check_flag%2==1){
					en.kaiten_flag=0;
					en.muki=0;
				}
			}
		}
		////////////////////////////////////////////////////////

		///////////////////逆回転///////////////////////////////
		else{
			if(en.muki==1){	
				if(check_flag ==0 || check_flag%2==0){
					en.kaiten_flag=1;
					en.muki=3;
				}
				if(CHIP_SIZE > ENX )
					en.muki=5;
			}

			else if(en.muki==5){
				if(check_flag ==0 || check_flag%2==0){
					en.kaiten_flag=1;
					en.muki=0;
				}
				if( ENY > SCREEN_HEIGHT)
					en.muki=3;
			}

			else if(en.muki==3){
				if(check_flag ==0 || check_flag%2==0){
					en.kaiten_flag=1;
					en.muki=1;
				}
				if( ENX > SCREEN_WIDTH)
					en.muki=0;
			}

			else if(en.muki==0){
				if( CHIP_SIZE > ENY)
					en.muki=1;
				if(check_flag ==0 || check_flag%2==0){
					en.kaiten_flag=1;
					en.muki=5;
				}
			}				
		}
		////////////////////////////////////////////////////////
        // プレイヤーの移動処理
        {
            float MoveX, MoveY ;

            // 移動量の初期化
            MoveX = 0.0F ;
            MoveY = 0.0F ;

            // 左右の移動を見る
			if(walking_flag==FALSE){
            if( Key[ KEY_INPUT_LEFT   ] == 1 ) MoveX -= SPEED ;
            if( Key[ KEY_INPUT_RIGHT  ] == 1 ) MoveX += SPEED ;
			}

            // 地に足が着いている場合のみジャンプボタン(ボタン1 or Zキー)を見る
            if( PlJumpFlag == FALSE && Key[ KEY_INPUT_SPACE ] == 1 )
            {
                PlDownSp = -JUMP_POWER ;
                PlJumpFlag = TRUE ;
            }

            // 落下処理
            PlDownSp += G ;

            // 落下速度を移動量に加える
            MoveY = PlDownSp ;

            // 移動量に基づいてキャラクタの座標を移動
            CharMove( &PlX, &PlY, &PlDownSp, MoveX, MoveY, CHAR_SIZE, &PlJumpFlag ) ;
        }

		//////////////////敵の移動処理/////////////////
		{
			float EveX, EveY;

            // 移動量の初期化 
			EveX = 0.0F ;
            EveY = 0.0F ;

            // 左右の移動を見る
			if(en.muki==1)  EveX -= SPEED;
			if(en.muki==3)  EveX += SPEED;			
			if(en.muki==5)  EveY += SPEED;
			if(en.muki==0)  EveY -= SPEED;
			
            // 移動量に基づいて(敵)の座標を移動
            EMove( &ENX, &ENY, EveX, EveY, ECHAR_SIZE);
        }  

		//画面スクロール
        if( PlX > SCROLL_POINT ) {
            //  はみ出したサイズ
            int scroll_offset = (int)PlX - SCROLL_POINT;
 
            //  新しいカメラ位置
            int new_camerax = camerax + scroll_offset;
 
            //  カメラ位置がマップサイズを超えていないか? (カメラの座標は左端なのでSCREEN_WIDTHの補正が必要)
            if( new_camerax > (MAP_WIDTH_PIXEL-SCREEN_WIDTH) ) {
                //  オフセットを残りサイズに補正。
                scroll_offset = (MAP_WIDTH_PIXEL-SCREEN_WIDTH) - camerax;
            }
 
            //  補正が必要?
            if( scroll_offset > 0 ) {
                //  カメラの位置を変更する。
                camerax += scroll_offset;
 
                //  キャラクタ、弾、敵の座標を-scroll_offsetで補正する。
                PlX -= scroll_offset;
				AlX -= scroll_offset;
                ElX -= scroll_offset;
                tama[i].x2 -= scroll_offset;
				tama[i].x3 -= scroll_offset;
				tama[i].x4 -= scroll_offset;
				BGX -= scroll_offset;
            }
        }

		///////////////////////////////////ボス登場位置////////////////////
		if(boss_flag==0){
			LlX=-200;
			LlY=-200;
		}
		if(boss_flag==1){
			LlX=1000.0F;
			LlY=325.F;
		boss_flag+=1;
		}
		else if(camerax>=3400&&boss_flag==0)
			boss_flag=1;

		//背景描画
		DrawGraph((int)BGX,(int)BGY,image_stage,TRUE);
		
		// キャラクタの描画
		if((int)PlX<480){
			if(ch.muki==2)
			ch.img=image[((int)PlX/8)%18];
			if(ch.muki==1)
			ch.img=image[((int)PlX/8)%18+18];
			if(ch.muki==0)
			ch.img=image5[((int)PlX/8)%18];

			if(ch.muki!=0)
				DrawGraph( (int) (PlX - CHAR_SIZE * 0.5F)  , (int) (PlY - CHAR_SIZE * 0.5F) , ch.img  , TRUE ) ;
			else
				DrawGraph( (int) (PlX - CHAR_SIZE * 0.5F)  , (int) (PlY - CHAR_SIZE * 0.5F)-25 , ch.img  , TRUE ) ;
		}
		if((int)PlX>=480){
			if( Key[ KEY_INPUT_RIGHT  ] == 1 ){
				ch.img=image[roll++];
				ch.muki=2;
			}
			if( Key[ KEY_INPUT_LEFT  ] == 1 ){
				ch.img=image[roll++];
				(int)PlX--;
				ch.muki=1;
			}
			if( Key[ KEY_INPUT_UP  ] == 1 ){
				ch.img=image5[roll2++];
				ch.muki=0;
			}
			if(ch.muki!=0)			   
				DrawGraph( (int) (PlX - CHAR_SIZE * 0.5F)  , (int) (PlY - CHAR_SIZE * 0.5F) , ch.img  , TRUE ) ;
			else
				DrawGraph( (int) (PlX - CHAR_SIZE * 0.5F)  , (int) (PlY - CHAR_SIZE * 0.5F)-25 , ch.img  , TRUE ) ;
			if(roll>17 && ch.muki==2)
				roll=0;
			if(roll<17 && ch.muki==1)
				roll=18;
			if(roll>33 && ch.muki==1)
				roll=18;
			if(roll2>16 && ch.muki==0)
				roll2=0;
		}

		/////////////////////////(敵)の描画//////////////////////////////////
		if(eneHP>0){
		en.img=image4[0];
		DrawGraph( (int) (ENX - CHAR_SIZE * 0.5F)  , (int) (ENY - CHAR_SIZE * 0.5F) , en.img  , TRUE ) ; 
		}
		int Cr = GetColor( 255 , 255 , 255 );
		
		//弾の処理&描画
		{
		if(counter<5)                        //前にzを押してから5カウント未満なら
			counter++;                       //カウントアップ
        else if( Key[ KEY_INPUT_Z ]  == 1 ){ //5カウント以上たってい
			PlaySoundMem( Sound2 , DX_PLAYTYPE_BACK ) ;
            counter=0;                       //カウンターを戻す
			tmuki=ch.muki;
            for(i=0;i<10;i++){  
				if(tmuki==2){
					if(tama[i].flag==0){     //発射していない玉を探し、
						tama[i].flag=1;  //発射フラグを立てる
						tama[i].x2=(int)PlX;
						tama[i].y2=(int)PlY;
                        break;
                    }
				}
				if(tmuki==1){
					if(tama[i].flag2==0){     //発射していない玉を探し、
                        tama[i].flag2=1;  //発射フラグを立てる
						tama[i].x3=(int)PlX;
						tama[i].y3=(int)PlY;
                        break;
                    }
				}
				if(tmuki==0){
					if(tama[i].flag3==0){     //発射していない玉を探し、
                        tama[i].flag3=1;  //発射フラグを立てる
						tama[i].x4=(int)PlX;
						tama[i].y4=(int)PlY;
                        break;
                    }
				}
            }
         }
				
         if(tmuki==2){
			for(i=0;i<10;i++){
				if(tama[i].flag==1){              //発射している玉なら
					tama[i].x2+=8;
					DrawGraph( tama[i].x2+13 , tama[i].y2-5 , image2[15] , TRUE );//玉を描画
						if(tama[i].x2 > 640){      //もし画面外まで来9たら
							tama[i].x2=(int)PlX;    //初期値に戻し、
							tama[i].y2=(int)PlY;
                            tama[i].flag=0;   //発射フラグを戻す
                        }
						if(tama[i].x2 < ElX+12 && tama[i].x2 > ElX-12 && 
							tama[i].y2 < ElY+12 && tama[i].y2 > ElY-12 && HP>0){
							tama[i].x2=(int)PlX;
							tama[i].y2=(int)PlY;
							tama[i].flag=0;
							HP--;
						}
						if(tama[i].x2 < AlX+12 && tama[i].x2 > AlX-12 && 
							tama[i].y2 < AlY+30 && tama[i].y2 > AlY-12 && HP1>0){
							tama[i].x2=(int)PlX;
							tama[i].y2=(int)PlY;
							tama[i].flag=0;
							HP1--;
						}
						if(tama[i].x2 < ENX+12 && tama[i].x2 > ENX-12 && 
							tama[i].y2 < ENY+30 && tama[i].y2 > ENY-12 && eneHP>0){
							tama[i].x2=(int)ENX;
							tama[i].y2=(int)ENY;
							tama[i].flag=0;
							eneHP--;
						}
						if(tama[i].x2 < LlX+12 && tama[i].x2 > LlX-12 && 
							tama[i].y2 < LlY+12 && tama[i].y2 > LlY-12 && BHP>0){
							tama[i].x2=(int)PlX;
							tama[i].y2=(int)PlY;
							tama[i].flag=0;
							BHP--;
						}
					}
				if(tmuki==1||tmuki==0){
					int j=0;
					for(j=0;j<10;j++){
						tama[i].flag=0;
						tama[i].x2=(int)PlX;
						tama[i].y2=(int)PlY;
					}
				}
			}
		}
		if(tmuki==1){
            for(i=0;i<10;i++){
                if(tama[i].flag2==1){              //発射している玉なら
                    tama[i].x3-=8;
					DrawGraph( tama[i].x3-45 , tama[i].y3-5 , image2[6] , TRUE );//玉を描画
                    if(tama[i].x3 < 0){      //もし画面外まで来たら
                        tama[i].x3=(int)PlX;    //初期値に戻し、
						tama[i].y3=(int)PlY;
                        tama[i].flag2=0;   //発射フラグを戻す
                    }
					if(tama[i].x3-30 < ElX+12 && tama[i].x3-30 > ElX-12 && 
						tama[i].y3 < ElY+12 && tama[i].y3 > ElY-12 && HP>0){
						tama[i].x3=(int)PlX;
						tama[i].y3=(int)PlY;
						tama[i].flag2=0;
						HP--;
					}
					if(tama[i].x3-30 < AlX+12 && tama[i].x3-30 > AlX-12 && 
						tama[i].y3 < AlY+12 && tama[i].y3 > AlY-12 && HP1>0){
						tama[i].x3=(int)PlX;
						tama[i].y3=(int)PlY;
						tama[i].flag2=0;
						HP1--;
					}
					if(tama[i].x3-30 < ENX+12 && tama[i].x3-30 > ENX-12 && 
						tama[i].y3 < ENY+12 && tama[i].y3 > ENY-12 && eneHP>0){
						tama[i].x3=(int)PlX;
						tama[i].y3=(int)PlY;
						tama[i].flag2=0;
						eneHP--;
					}
					if(tama[i].x3-30 < LlX+12 && tama[i].x3-30 > LlX-12 && 
						tama[i].y3 < LlY+12 && tama[i].y3 > LlY-12 && BHP>0){
						tama[i].x3=(int)PlX;
						tama[i].y3=(int)PlY;
						tama[i].flag2=0;
						BHP--;
					}
				}
				if(tmuki==2||tmuki==0){
					int j=0;
					for(j=0;j<10;j++){
						tama[i].flag2=0;
						tama[i].x3=(int)PlX;
						tama[i].y3=(int)PlY;
					}
				}
            }
		}
		if(tmuki==0){
            for(i=0;i<10;i++){
                if(tama[i].flag3==1){              //発射している玉なら
                    tama[i].y4-=8;
					DrawGraph( tama[i].x4-20 , tama[i].y4-80 , image2[2] , TRUE );//玉を描画
                    if(tama[i].y4 < 0){      //もし画面外まで来たら
                        tama[i].x4=(int)PlX;    //初期値に戻し、
						tama[i].y4=(int)PlY;
                        tama[i].flag3=0;   //発射フラグを戻す
                    }
					if(tama[i].x4 < ElX+12 && tama[i].x4 > ElX-12 && 
						tama[i].y4 < ElY+12 && tama[i].y4 > ElY-12 && HP>0){
						tama[i].x4=(int)PlX;
						tama[i].y4=(int)PlY;
						tama[i].flag3=0;
						HP--;
					}
					if(tama[i].x4 < AlX+40 && tama[i].x4 > AlX && 
						tama[i].y4 < AlY+50 && tama[i].y4 > AlY && HP1>0){
						tama[i].x4=(int)PlX;
						tama[i].y4=(int)PlY;
						tama[i].flag3=0;
						HP1--;
					}
					if(tama[i].x4 < ENX+12 && tama[i].x4 > ENX-12 && 
						tama[i].y4 < ENY+12 && tama[i].y4 > ENY && eneHP>0){
						tama[i].x4=(int)PlX;
						tama[i].y4=(int)PlY;
						tama[i].flag3=0;
						eneHP--;
					}
					if(tama[i].x4 < LlX+40 && tama[i].x4 > LlX && 
						tama[i].y4 < LlY+50 && tama[i].y4 > LlY && BHP>0){
						tama[i].x4=(int)PlX;
						tama[i].y4=(int)PlY;
						tama[i].flag3=0;
						BHP--;
					}
				}
				if(tmuki==1||tmuki==2){
					int j=0;
					for(j=0;j<10;j++){
						tama[i].flag3=0;
						tama[i].x4=(int)PlX;
						tama[i].y4=(int)PlY;
					}
				}
			}
		}
		}

		printf("%d\n",GetNowCount());
		printf("%d\n",StartTime);

		// 敵機の描画
		{
			if(emo==1)
				ElX--;
			if(emo==0)
				ElX++;
			if(ElX==400)
				emo=1;
			if(ElX==50)
				emo=0;
		}
		{
		    if(emo1==1)
				AlY--;
			if(emo1==0)
				AlY++;
			if(AlY==200)
				emo1=1;
			if(AlY==80)
				emo1=0;
		}
		if(BHP>0){
			if(LlX>=PlX)
				LlX-=1.5;
			if(LlX<=PlX)
				LlX+=1.5;
		}

        if(HP>0)
		  DrawGraph( (int) ElX , (int) ElY , image4[0]  , TRUE ) ;
		if(HP1>0)
		  DrawGraph( (int) AlX , (int) AlY , image4[0]  , TRUE ) ;
		if(BHP>0)
		  DrawGraph( (int) LlX , (int) LlY , image6[0]  , TRUE ) ;
		
		if(PlX>ElX-10 && PlX<ElX+10 && PlY>ElY-10 && PlY<ElY+10 && HP>0
			||PlX>AlX-10 && PlX<AlX+10 && PlY>AlY-10 && PlY<AlY+10 && HP1>0
			||PlX>LlX-20 && PlX<LlX+20 && PlY>LlY-100 && PlY<LlY+100 && BHP>0
			||PlX>ENX-10 && PlX<ENX+10 && PlY>ENY-10 && PlY<ENY+10 && eneHP>0){
			myHP--;
		}
		if(myHP<1)
			sousa();
		if(BHP==0 && BO==1){
			EndTime = GetNowCount();
			BO=0;
		}
		if(BO=0){
			DrawGraph( (int) LlX , (int) LlY+65 , image10[0] , TRUE ) ;
			if((GetNowCount() - EndTime) < 6000){
			StopMusic();
			clear();
			}
		}
		if(PlY>=520){
			StopMusic();
			sousa();
		}

        // 画面の更新
        ScreenFlip() ;
    }

    // 終了
    return 0 ;
}

// キャラクタをマップとの当たり判定を考慮しながら移動する
int CharMove( float *X, float *Y, float *DownSP,
                    float MoveX, float MoveY, float Size, char *JumpFlag )
{
    float Dummy = 0.0F ;
    float hsize ;

    // キャラクタの左上、右上、左下、右下部分が当たり判定のある
    // マップに衝突しているか調べ、衝突していたら補正する

    // 半分のサイズを算出
    hsize = Size * 0.5F ;

    // 先ず上下移動成分だけでチェック
    {
        // 左下のチェック、もしブロックの上辺に着いていたら落下を止める
        if( MapHitCheck( *X - hsize, *Y + hsize, &Dummy, &MoveY ) == 3 ) *DownSP = 0.0F ;

        // 右下のチェック、もしブロックの上辺に着いていたら落下を止める
        if( MapHitCheck( *X + hsize, *Y + hsize, &Dummy, &MoveY ) == 3 ) *DownSP = 0.0F ;
 
        // 左上のチェック、もしブロックの下辺に当たっていたら落下させる
        if( MapHitCheck( *X - hsize, *Y - hsize, &Dummy, &MoveY ) == 4 ) *DownSP *= -1.0F ;

        // 右上のチェック、もしブロックの下辺に当たっていたら落下させる
        if( MapHitCheck( *X + hsize, *Y - hsize, &Dummy, &MoveY ) == 4 ) *DownSP *= -1.0F ;

		//真下のチェック,もしブロックの上に乗っかっていたら落下を止める。
        if( MapHitCheck( *X , *Y + hsize, &Dummy, &MoveY ) == 3 ) *DownSP = 0.0F ;

		//真上のチェック,もしブロックの真下に当たっていたら落下させる.
	    if( MapHitCheck( *X , *Y - hsize, &Dummy, &MoveY ) == 4 ) *DownSP *= -1.0F ;


        // 上下移動成分を加算
        *Y += MoveY ;
    }

    // 後に左右移動成分だけでチェック
    {
        // 左下のチェック
        MapHitCheck( *X - hsize, *Y + hsize, &MoveX, &Dummy ) ;

        // 右下のチェック
        MapHitCheck( *X + hsize, *Y + hsize, &MoveX, &Dummy ) ;

        // 左上のチェック
        MapHitCheck( *X - hsize, *Y - hsize, &MoveX, &Dummy ) ;

        // 右上のチェック
        MapHitCheck( *X + hsize, *Y - hsize, &MoveX, &Dummy ) ;

		// 右真ん中のチェック
		MapHitCheck( *X + hsize, *Y , &MoveX, &Dummy ) ;

		// 左真ん中のチェック
		MapHitCheck( *X - hsize, *Y , &MoveX, &Dummy ) ;

        // 左右移動成分を加算
        *X += MoveX ;
    }

    // 接地判定
    {
        // キャラクタの左下と右下の下に地面があるか調べる
        if( GetChipParam( *X - Size * 0.5F, *Y + Size * 0.5F + 1.0F ) == 0 && 
            GetChipParam( *X + Size * 0.5F, *Y + Size * 0.5F + 1.0F ) == 0 )
        {
            // 足場が無かったらジャンプ中にする
            *JumpFlag = TRUE ;
        }
        else
        {
            // 足場が在ったら接地中にする
            *JumpFlag = FALSE ;
        }
    }

    // 終了
    return 0 ;
}

// マップとの当たり判定( 戻り値 0:当たらなかった  1:左辺に当たった  2:右辺に当たった
//                                                3:上辺に当たった  4:下辺に当たった
// 注意:MoveX と MoveY 、どっちか片方が0じゃないとまともに動作しません(爆)
int MapHitCheck( float X, float Y,
                    float *MoveX, float *MoveY )
{
    float afX, afY ;

    // 移動量を足す
    afX = X + *MoveX ;
    afY = Y + *MoveY ;

    // 当たり判定のあるブロックに当たっているかチェック
    if( GetChipParam( afX, afY ) != 0 )
    {
        float blx, bty, brx, bby ;

        // 当たっていたら壁から離す処理を行う

        // ブロックの上下左右の座標を算出
        blx = (float)( ((int)afX+camerax) / CHIP_SIZE ) * CHIP_SIZE ;        // 左辺の X 座標
        brx = (float)( ((int)afX+camerax) / CHIP_SIZE + 1 ) * CHIP_SIZE ;    // 右辺の X 座標

        bty = (float)( (int)afY / CHIP_SIZE ) * CHIP_SIZE ;        // 上辺の Y 座標
        bby = (float)( (int)afY / CHIP_SIZE + 1 ) * CHIP_SIZE ;    // 下辺の Y 座標

        // 上辺に当たっていた場合
        if( *MoveY > 0.0F )
        {
            // 移動量を補正する
            *MoveY = bty - Y - 1.0F  ;

            // 上辺に当たったと返す
            return 3 ;
        }

        // 下辺に当たっていた場合
        if( *MoveY < 0.0F )
        {
            // 移動量を補正する
            *MoveY = bby - Y + 1.0F ;

            // 下辺に当たったと返す
            return 4 ;
        }

        // 左辺に当たっていた場合
        if( *MoveX > 0.0F )
        {
            // 移動量を補正する
            *MoveX = (blx -(blx-X))- X - 1.0F ;

            // 左辺に当たったと返す
            return 1 ;
        }

        // 右辺に当たっていた場合
        if( *MoveX < 0.0F )
        {
            // 移動量を補正する
            *MoveX = (brx -(brx-X))- X + 1.0F ;

            // 右辺に当たったと返す
            return 2 ;
        }

        // ここに来たら適当な値を返す
        return 4 ;
    }

    // どこにも当たらなかったと返す
    return 0 ;
}

// マップチップの値を取得する関数
int GetChipParam( float X, float Y )
{
    int x, y ;

    // 整数値へ変換
    x = ((int)X + camerax) / CHIP_SIZE ;
    y = (int)Y / CHIP_SIZE ;

    // マップからはみ出ていたら 0 を返す
    if( x >= MAP_WIDTH || y >= MAP_HEIGHT || x < 0 || y < 0 ) return 0 ;

    // 指定の座標に該当するマップの情報を返す
    return MapData[ y ][ x ] ;
}

////////////////////敵/////////////////////////////////////////////////////////////////
//キャラクタをマップとの当たり判定を考慮しながら移動する
int EMove( float *EX, float *EY, 
                    float EveX, float EveY, float ESize)
{
    float Dummy = 0.0F;
    float ehsize;
	int Cr;
	Cr = GetColor( 255 , 255 , 255 );

    // キャラクタの左上、右上、左下、右下部分が当たり判定のある
    // マップに衝突しているか調べ、衝突していたら補正する

    // 半分のサイズを算出
    ehsize = ESize * 0.5F ;
	
    // 先ず上下移動成分だけでチェック
	{
        // 左下のチェック、もしブロックの上辺に着いていたら落下を止める
        if( EMHCheck( *EX - ehsize, *EY + ehsize, &Dummy, &EveY ) == 3 ){
		}
        // 右下のチェック、もしブロックの上辺に着いていたら落下を止める
        if( EMHCheck( *EX + ehsize, *EY + ehsize, &Dummy, &EveY ) == 3 ){
		}
        // 左上のチェック、もしブロックの下辺に当たっていたら落下させる
        if( EMHCheck( *EX - ehsize , *EY - ehsize , &Dummy, &EveY ) == 4 ){
		}
        // 右上のチェック、もしブロックの下辺に当たっていたら落下させる
        if( EMHCheck( *EX + ehsize , *EY - ehsize , &Dummy, &EveY ) == 4 )  {
		}
		//真下のチェック,もしブロックの上に乗っかっていたら落下を止める。
        if( EMHCheck( *EX , *EY + ehsize, &Dummy, &EveY ) == 3 ){
		}
		//真上からのチェック,もしブロックの真下に当たっていたら落下させる.
	    if( EMHCheck( *EX , *EY - ehsize, &Dummy, &EveY ) == 4 ){
		}

        // 上下移動成分を加算
        *EY += EveY ;
    }
    // 後に左右移動成分だけでチェック
    {
        // 左下のチェック
        EMHCheck( *EX - ehsize, *EY + ehsize , &EveX, &Dummy );
        // 右下のチェック
        EMHCheck( *EX + ehsize, *EY + ehsize , &EveX, &Dummy );
        // 左上のチェック
		EMHCheck( *EX - ehsize, *EY - ehsize , &EveX, &Dummy );
        // 右上のチェック
        EMHCheck( *EX + ehsize, *EY - ehsize , &EveX, &Dummy );

		EMHCheck( *EX - ehsize, *EY , &EveX, &Dummy );

		EMHCheck( *EX + ehsize, *EY , &EveX, &Dummy );

        // 左右移動成分を加算
        *EX += EveX ;
    }
    // 終了
    return 0 ;
}


// マップとの当たり判定( 戻り値 0:当たらなかった  1:左辺に当たった  2:右辺に当たった
//                                                3:上辺に当たった  4:下辺に当たった
// 注意:EveX と EveY 、どっちか片方が0じゃないとまともに動作しません(爆)
int EMHCheck( float EX, float EY,float *EveX, float *EveY )
{
    float efX, efY;
	int Cr;

	Cr = GetColor( 255 , 255 , 255 );

    // 移動量を足す
    efX = EX + *EveX ;
    efY = EY + *EveY ;
	
    // 当たり判定のあるブロックに当たっているかチェック
	
    if( EGetChipParam( efX, efY ) == 2 )
    {
        float elx, ety, erx, eby;

        // 当たっていたら壁から離す処理を行う

        // ブロックの上下左右の座標を算出
        elx = (float)( ((int)efX+camerax) / CHIP_SIZE ) * CHIP_SIZE ;        // 左辺の X 座標
        erx = (float)( ((int)efX+camerax) / CHIP_SIZE + 1) * CHIP_SIZE ;    // 右辺の X 座標

        ety = (float)( (int)efY / CHIP_SIZE) * CHIP_SIZE ;        // 上辺の Y 座標
        eby = (float)( (int)efY / CHIP_SIZE +1 ) * CHIP_SIZE ;    // 下辺の Y 座標

        // 上辺に当たっていた場合
        if( *EveY > 0.0F )
        {
			check_flag++;
						
            // 移動量を補正する
            *EveY = ety- EY - 1.0F; 
			
		    // 上辺に当たったと返す
            return 3 ;
        }

        // 下辺に当たっていた場合
        else if( *EveY < 0.0F )
        {
			check_flag++;
			
            // 移動量を補正する			
            *EveY = eby- EY + 1.0F; 
			
            // 下辺に当たったと返す
            return 4 ;
        }

        // 左辺に当たっていた場合
		else if( *EveX > 0.0F )
        {
			check_flag++;
			
            // 移動量を補正する
            *EveX = (elx -(elx-EX))- EX - 1.0F;
			
            // 左辺に当たったと返す
            return 1 ;
        }

        // 右辺に当たっていた場合
		else  if( *EveX < 0.0F )
        {
			check_flag++;

            // 移動量を補正する           
			*EveX = (erx -(erx-EX))- EX + 1.0F;
			
            // 右辺に当たったと返す
            return 2 ;

        }

        // ここに来たら適当な値を返す
        return 4 ;
    }

    // どこにも当たらなかったと返す
    return 0 ;
}

// マップチップの値を取得する関数
int EGetChipParam( float EX, float EY )
{
    int x=0, y=0;
	int Cr;
	Cr = GetColor( 255 , 255 , 255 );
    // 整数値へ変換
    if(EX>60.5F)
		x = ((int)EX+camerax) / CHIP_SIZE ;
	if(EY>60.5F)
		y = (int)EY / CHIP_SIZE ;
    // マップからはみ出ていたら 0 を返す
    if( x >= MAP_WIDTH || y >= MAP_HEIGHT || x < 0 || y < 0 ) return 0;	

    return MapData[ y ][ x ] ;
}



non
記事: 1097
登録日時: 13年前

Re: 画像の表示がおかしくなる

#2

投稿記事 by non » 13年前

プログラムの中身は全く見ていませんので、問題ないかチェックしてみてください。
483行目 tama.x2 -= scroll_offset;
ここで、iはいくらになってますか?

631~636行
int j=0;
for(j=0;j<10;j++){
tama.flag=0;
tama.x2=(int)PlX;
tama.y2=(int)PlY;
}
合ってますか?
non

ラプター

Re: 画像の表示がおかしくなる

#3

投稿記事 by ラプター » 13年前

non さんが書きました:プログラムの中身は全く見ていませんので、問題ないかチェックしてみてください。
483行目 tama.x2 -= scroll_offset;
ここで、iはいくらになってますか?

631~636行
int j=0;
for(j=0;j<10;j++){
tama.flag=0;
tama.x2=(int)PlX;
tama.y2=(int)PlY;
}
合ってますか?


返信が遅れて申し訳ないです。
483行目のiはprintfで調べたところ10になっていました
631~636行目は合っていると思います。
何かおかしいでしょうか?

non
記事: 1097
登録日時: 13年前

Re: 画像の表示がおかしくなる

#4

投稿記事 by non » 13年前

>483行目のiはprintfで調べたところ10になっていました

222行目に struct shot tama[10]; と宣言されています。

>631~636行目は合っていると思います。
合っているのならいいのです。無駄な処理なので、iとjが間違っているのかと思いましたので。
non

ラプター

Re: 画像の表示がおかしくなる

#5

投稿記事 by ラプター » 13年前

non さんが書きました: 222行目に struct shot tama[10]; と宣言されています。
すいません、何が間違っているのでしょうか?
そこはtamaを10個作るためにtama[10]と宣言しています。
そして下のforのところでtamaの初期化しています。

non
記事: 1097
登録日時: 13年前

Re: 画像の表示がおかしくなる

#6

投稿記事 by non » 13年前

tama[10]と宣言したなら、tama[0]からtama[9]までしかないよね。

初期化したいなら、やっぱり、iとjを間違ってるでしょ。
non

maru
記事: 150
登録日時: 13年前

Re: 画像の表示がおかしくなる

#7

投稿記事 by maru » 13年前

ラプター さんが書きました:後デバックモードでEscキーで終了すると
Run-Time Check Failure #2 - Stack around the variable 'tama' was corrupted.
というエラーが出るのですが翻訳もしてみたのですがよくわからない状態です
このエラーメッセージをそのまま翻訳すれば
「変数'tama'の周りでスタックが壊れています。」
原因としてはポインタの計算間違いや配列の添え字を間違えた結果、配列の範囲外のデータ(そこには別のデータがある)を書き換えてしまうことがあげられます。
そして
non さんが書きました:tama[10]と宣言したなら、tama[0]からtama[9]までしかないよね。

初期化したいなら、やっぱり、iとjを間違ってるでしょ。
と言うように配列の範囲外を書き換えてしまっているので、ちゃんと原因と結果があってますね。

ラプター

Re: 画像の表示がおかしくなる

#8

投稿記事 by ラプター » 13年前

non さんが書きました:tama[10]と宣言したなら、tama[0]からtama[9]までしかないよね。

初期化したいなら、やっぱり、iとjを間違ってるでしょ。
いえ自分が言ったforの初期化は235~242行目のことだったんです。
そこではちゃんと0~9で初期化されているみたいだったのでそれでokだと思ってました。

後作ったメンバーに再確認したら631~636は間違ってたと言われました。申し訳ない。
たぶんその下の同じ処理二つも同様に間違っているようです。
そして指摘通り全く処理してないので削除することにします。
そしてこのこととエラーとはどのような関係があったのでしょうか?

ラプター

Re: 画像の表示がおかしくなる

#9

投稿記事 by ラプター » 13年前

maru さんが書きました:
ラプター さんが書きました:後デバックモードでEscキーで終了すると
Run-Time Check Failure #2 - Stack around the variable 'tama' was corrupted.
というエラーが出るのですが翻訳もしてみたのですがよくわからない状態です
このエラーメッセージをそのまま翻訳すれば
「変数'tama'の周りでスタックが壊れています。」
原因としてはポインタの計算間違いや配列の添え字を間違えた結果、配列の範囲外のデータ(そこには別のデータがある)を書き換えてしまうことがあげられます。
そして
non さんが書きました:tama[10]と宣言したなら、tama[0]からtama[9]までしかないよね。

初期化したいなら、やっぱり、iとjを間違ってるでしょ。
と言うように配列の範囲外を書き換えてしまっているので、ちゃんと原因と結果があってますね。
なるほど、エラーの内容は把握出来ました。
でもということは最初の初期化部分の235行目~のところが間違っているということになるんでしょうか?
さっき間違っていたところは削除したので他に間違っていそうな初期化部分はないのですが・・・・

ラプター

Re: 画像の表示がおかしくなる

#10

投稿記事 by ラプター » 13年前

色々いじっていたら解決しました。
アドバイスありがとうございました。

maru
記事: 150
登録日時: 13年前

Re: 画像の表示がおかしくなる

#11

投稿記事 by maru » 13年前

ラプター さんが書きました:でもということは最初の初期化部分の235行目~のところが間違っているということになるんでしょうか?
さっき間違っていたところは削除したので他に間違っていそうな初期化部分はないのですが・・・・
いや、だから、初期化云々は関係無くて、
ラプター さんが書きました:483行目のiはprintfで調べたところ10になっていました
に対して、
non さんが書きました:tama[10]と宣言したなら、tama[0]からtama[9]までしかないよね。
と回答されているでしょ。
つまり483行目でi=10でアクセスしているのは明らかにおかしいんです。
ラプター さんが書きました:色々いじっていたら解決しました。
これは非常に危険です。この類の問題(無効な領域への書き込み)はいろいろいじっていると現象が変わって出てくることがあります。
たまたまメモリの配置が変わったために、今までの問題が表に表れなくなって、別の問題点を引き起こしてしまうことが往々にして有ります。
ちゃんと、原因を確かめて、その原因となっている部分を修正したことによって問題が現れなくなったことを確認しないと、また別の原因不明の問題点に悩まされることになります。

閉鎖

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