//穴埋め追加したやつです #include "DxLib.h" #include #define WINDOW_WIDTH 640 //横ウィンドウの大きさ #define WINDOW_HEIGHT 480 //縦ウィンドウの大きさ #define GRA 1 //重力加速度 #define MAXSPEEDY 20 //自由落下時の最高速度 #define BLOCK 32 //タイルの大きさ[px] #define CENTER 288 //主人公の中央座標 #define HERO_SIZE 32 //主人公の大きさ #define WIDTH_SIZE 50 //横スクロールの大きさ #define HEIGHT_SIZE 15 //縦スクロールの大きさ //イメージのストラクト struct SImg { int migi; int hidari; int migiattack; int hidariattack; int kabe; int yuka; int goal; //int r_enemy; //int l_enemy; int gameover; int title; int clear; int haikei; int null; }; //プレイヤーのストラクト struct SPlayer { int x, y; //主人公のX,Y座標 int vx,vy; //主人公のX,Y軸方向の速度 int jfly; //飛んでいるかどうかの判定 0:着地 それ以外:空中 int dire; //向き 0:右向き 1:左向き int attack; //攻撃中か否か 0:通常 1:攻撃中 int kabejr; //右方向に壁があるかどうか判定 int kabejl; //左方向に壁があるかどうか判定 }; struct SImg img; struct SPlayer player; //struct Enemy enemy; int map[WIDTH_SIZE][HEIGHT_SIZE]; char keyState[256]; //マップチップ読み込み void Map(void){ FILE *file; if(( file = fopen("map/map.txt","r")) == NULL ){ OutputDebugString( "MapData Read Error\n" ); //デバック画面に表示 exit( EXIT_FAILURE ); } for( int j=0 ; j < HEIGHT_SIZE ; j++ ){ for( int i=0 ; i < WIDTH_SIZE ; i++ ){ fscanf(file, "%d,", &map[i][j]); } } fclose(file); } //画像読み込み void image(void){ img.migi = LoadGraph("img/migi.png"); img.hidari = LoadGraph("img/hidari.png"); img.migiattack = LoadGraph("img/migiattack.png"); img.hidariattack = LoadGraph("img/hidariattack.png"); img.kabe = LoadGraph("img/kabe.png"); img.goal = LoadGraph("img/goal.png"); img.yuka = LoadGraph("img/yuka.png"); //img.r_enemy = LoadGraph("img/r_enemy.png"); //img.l_enemy = LoadGraph("img/l_enemy.png"); img.clear = LoadGraph("img/clear.png"); img.title = LoadGraph("img/title.png"); img.gameover = LoadGraph("img/gameover.png"); img.haikei = LoadGraph("img/haikei.png"); img.null = LoadGraph("img/null.png"); } //関数の初期化 void init(void){ player.x = 0; player.y = 416; //プレイヤーの初期座標 player.vx = 0; player.vy = 0; player.jfly = 0; player.dire = 0; player.attack = 0; player.kabejr = 0; player.kabejl = 0; } //タイトル画面の表示 void title(void){ ClearDrawScreen(); DrawGraph( 0 , 0 , img.title , TRUE ) ; //タイトル画面を描画 ScreenFlip(); while( keyState[ KEY_INPUT_ESCAPE ] != 1 && keyState[ KEY_INPUT_X ] != 1){ //エスケープキー、Xが押されると GetHitKeyStateAll(keyState); if( ProcessMessage() == -1 ){ break ; // エラーが発生したらループを抜ける } } } //ゲームオーバー時の画面表示、その他諸々 void gameover(void){ init(); ClearDrawScreen(); DrawGraph( 0 , 0 , img.gameover , TRUE ) ; //タイトル画面を描画 ScreenFlip(); while( keyState[ KEY_INPUT_ESCAPE ] != 1 && keyState[ KEY_INPUT_X ] != 1){ //エスケープキー、Xが押されると GetHitKeyStateAll( keyState ); if( ProcessMessage() == -1 ){ break ; // エラーが発生したらループを抜ける } } Map(); } //クリア時の以下略 void clear(void){ init(); ClearDrawScreen(); DrawGraph( 0 , 0 , img.clear , TRUE ) ; //タイトル画面を描画 ScreenFlip(); while( keyState[ KEY_INPUT_ESCAPE ] != 1 && keyState[ KEY_INPUT_X ] != 1){ //エスケープキー、Xが押されると GetHitKeyStateAll(keyState); if( ProcessMessage() == -1 ){ break ; // エラーが発生したらループを抜ける } } Map(); } //壁判定1(左右判定) void judge1(int blx,int bly){ if( 【穴埋め】 <= (player.x+HERO_SIZE) && 【穴埋め】 < (blx+BLOCK-4) && 【穴埋め】 < (player.y+HERO_SIZE) && 【穴埋め】 < (bly+BLOCK) ){ //右方向 player.kabejr = 1; if( map[blx/BLOCK][bly/BLOCK] == 4 ){ 【穴埋め】; } } if( blx+4 <= 【穴埋め】 && player.x < 【穴埋め】 && bly < 【穴埋め】 && player.y < 【穴埋め】 ){ //左方向 player.kabejl = 1; if( map[blx/BLOCK][bly/BLOCK] == 4 ){ 【穴埋め】; } } } //壁判定2(上下判定) void judge2(int blx,int bly){ if( 【穴埋め】 && 【穴埋め】 && 【穴埋め】 && 【穴埋め】 ){ if(player.vy >= 0){ player.jfly = 0; player.y = 【穴埋め】; player.vy = 0; } else{ player.vy = 1; player.y = 【穴埋め】; } if( map[blx/BLOCK][bly/BLOCK] == 4 ){ 【穴埋め】; } } } void attack(void){ GetHitKeyStateAll(keyState); if(keyState[KEY_INPUT_S]){ if( player.attack == 0 ){ player.attack = 1; } } else{ player.attack = 0; } } void move(void){ player.vx = 0; //横の速度リセット if( player.jfly != 0 && player.vy < MAXSPEEDY ){ //重力 player.vy += GRA; } player.kabejr = 0; //壁判定リセット player.kabejl = 0; for(int j = 0; j < HEIGHT_SIZE; j++){ //横のブロック判定 for(int i = 0; i < WIDTH_SIZE; i++){ if(map[i][j] != 0){ judge1(i*BLOCK, j*BLOCK); } } } GetHitKeyStateAll(keyState); //キーボードの状態を取得 if(keyState[KEY_INPUT_LEFT]){ if(player.attack == 0){ if(player.kabejl == 0 && player.x > 0){ //プレイヤーの左向き操作 player.x -= 4; } player.dire = 1; //左向いてます } } else if(keyState[KEY_INPUT_RIGHT]){ if(player.attack == 0){ if(player.kabejr == 0 && player.x <= WINDOW_WIDTH-HERO_SIZE ){ //プレイヤーの右向き操作 player.x += 4; } player.dire = 0; //右向いてます } } if(player.jfly == 0 && keyState[ KEY_INPUT_X ]){ //ジャンプ player.jfly = 1; //飛んでます player.vy =- 15; } if( keyState[ KEY_INPUT_R ]){ player.vy =- 5; } player.x += player.vx; //移動します player.y += player.vy; if(player.y+HERO_SIZE >= WINDOW_HEIGHT-BLOCK){ //プレイヤーのy座標が画面サイズ-ブロック一マスより大きいとき player.jfly = 0; //着地状態にする player.vy = 0; //落下速度を0にする player.y = WINDOW_HEIGHT - BLOCK - HERO_SIZE; } else{ player.jfly = 1; //それ以外の時は空にいるよ! } for(int j=0; j= 0){ //横の部分より狭い範囲でマップ判断 switch(map[i][j]){ case 0: case 3: 【穴埋め】; case 1: DrawGraph(i*BLOCK,j*BLOCK,img.yuka,TRUE);break; //床 case 2: DrawGraph(i*BLOCK,j*BLOCK,img.kabe,TRUE);break; //壁(通り抜け孵化) case 4: DrawGraph(i*BLOCK,j*BLOCK,img.goal,TRUE);break; //ゴール旗(触れたらゴール) case 5: default:DrawGraph(i*BLOCK,j*BLOCK,img.null,TRUE);break; //ぬる } } else if(j == 14){ DrawGraph(i*BLOCK,j*BLOCK,img.yuka,TRUE); } } } if(player.dire == 0){ //主人公書くよ DrawGraph(player.x,player.y,img.migi,TRUE); //右左その辺 } else{ DrawGraph(player.x,player.y,img.hidari,TRUE); } if(player.attack){ if(player.dire == 0){ //主人公攻撃書くよ DrawGraph(player.x+HERO_SIZE,player.y,img.migiattack,TRUE); //右左その辺 } else{ DrawGraph(player.x-HERO_SIZE,player.y,img.hidariattack,TRUE); } } //デバッグ用の変数描画ここから int white=GetColor(255,255,255); DrawFormatString(450,20,white,"X:%4d",player.x); DrawFormatString(550,20,white,"Y:%4d",player.y); DrawFormatString(450,40,white,"VX%4d",player.vx); DrawFormatString(550,40,white,"VY%4d",player.vy); DrawFormatString(450,60,white,"右壁:%4d",player.kabejr); DrawFormatString(550,60,white,"左壁:%4d",player.kabejl); if(player.dire){ DrawString(450,80,"左向き",white) ; } else{ DrawString(450,80,"右向き",white) ; } if(player.jfly){ DrawString(550,80,"空中",white) ; } else{ DrawString(550,80,"着地",white) ; } if(player.attack){ DrawString(450,100,"攻撃",white) ; } else{ DrawString(450,100,"通常",white) ; } ScreenFlip(); } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR ipCmdLine, int nShowCmd) { //ウィンドウのタイトルを変更 SetMainWindowText("action"); //ウィンドウモードに変更 ChangeWindowMode(TRUE); //解像度とカラービット数を設定 SetGraphMode(WINDOW_WIDTH, WINDOW_HEIGHT, 32); SetWindowSizeChangeEnableFlag(TRUE) ; //初期化に失敗したらやめる if(DxLib_Init()== -1){return -1;} ////マップチップ読み込み Map(); //画像のロード image(); //変数の初期化 init(); SetDrawScreen(DX_SCREEN_BACK); //タイトル表示 title(); /************************** ゲームループ *****************************/ while(ProcessMessage() == 0&&CheckHitKey(KEY_INPUT_ESCAPE)==0){ //動き move(); //enemymove(); //敵は追加資料で //攻撃 attack(); //描画 draw(); } /************************ ゲームループおわり ************************/ //DXライブラリ使用の終了処理 DxLib_End(); //SOFTの終了 return 0; }