あの後他のメンバーが作製していた他の部分と結合してだいぶ進んだのですが
スクロール後にキャラクターの画像(上向き)が点滅または弾が画像が出てないだけで発射されているという変なことになりました。
特にエラーも出てないので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 ] ;
}