#include "DxLib.h" // WinMain関数 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int BallX , BallY , BallGraph ; int SikakuX , SikakuY , SikakuMuki , SikakuGraph ; int Shot1X , Shot1Y , Shot1Flag , ShotGraph ; int Shot2X , Shot2Y , Shot2Flag ; // 画面モードの設定 SetGraphMode( 640 , 480 , 16 ) ; // DXライブラリ初期化処理 if( DxLib_Init() == -1 ) return -1; // グラフィックの描画先を裏画面にセット SetDrawScreen( DX_SCREEN_BACK ) ; // ボール君のグラフィックをメモリにロード&表示座標をセット BallGraph = LoadGraph( "Ball.png" ) ; BallX = 288 ; BallY = 400 ; // 四角君のグラフィックをメモリにロード&表示座標をセット SikakuGraph = LoadGraph( "Sikaku.png" ) ; SikakuX = 0 ; SikakuY = 50 ; // 弾のグラフィックをメモリにロード ShotGraph = LoadGraph( "Shot.png" ) ; // 弾1・2が画面上に存在しているか保持する変数に『存在していない』を意味する0を代入しておく Shot1Flag = 0 ; Shot2Flag = 0 ; // 四角君の移動方向をセット SikakuMuki = 1 ; // 移動ルーチン while( 1 ) { // 画面を初期化(真っ黒にする) ClearDrawScreen() ; // ボール君の操作ルーチン { // ↑キーを押していたらボール君を上に移動させる if( CheckHitKey( KEY_INPUT_UP ) == 1 ) BallY -= 3 ; // ↓キーを押していたらボール君を下に移動させる if( CheckHitKey( KEY_INPUT_DOWN ) == 1 ) BallY += 3 ; // ←キーを押していたらボール君を左に移動させる if( CheckHitKey( KEY_INPUT_LEFT ) == 1 ) BallX -= 3 ; // →キーを押していたらボール君を右に移動させる if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 ) BallX += 3 ; // スペースキーを押した場合は処理を分岐 if( CheckHitKey( KEY_INPUT_SPACE ) ) { if( Shot1Flag == 0 ) { // 弾1が画面に存在していない場合は弾1を出す int Bw, Bh, Sw, Sh ; // ボール君と弾の画像のサイズを得る GetGraphSize( BallGraph , &Bw , &Bh ) ; GetGraphSize( ShotGraph , &Sw , &Sh ) ; // 弾1の位置をセット、位置はボール君の中心にする Shot1X = ( Bw - Sw ) / 2 + BallX ; Shot1Y = ( Bh - Sh ) / 2 + BallY ; // 弾1は現時点を持って存在するので、存在状態を保持する変数に1を代入する Shot1Flag = 1 ; } else if( Shot2Flag == 0 ) { // 弾2が画面に存在していない場合は弾2を出す int Bw, Bh, Sw, Sh ; // ボール君と弾の画像のサイズを得る GetGraphSize( BallGraph , &Bw , &Bh ) ; GetGraphSize( ShotGraph , &Sw , &Sh ) ; // 弾2の位置をセット、位置はボール君の中心にする Shot2X = ( Bw - Sw ) / 2 + BallX ; Shot2Y = ( Bh - Sh ) / 2 + BallY ; // 弾2は現時点を持って存在するので、存在状態を保持する変数に1を代入する Shot2Flag = 1 ; } } // ボール君が画面左端からはみ出そうになっていたら画面内の座標に戻してあげる if( BallX < 0 ) BallX = 0 ; // ボール君が画面右端からはみ出そうになっていたら画面内の座標に戻してあげる if( BallX > 640 - 64 ) BallX = 640 - 64 ; // ボール君が画面上端からはみ出そうになっていたら画面内の座標に戻してあげる if( BallY < 0 ) BallY = 0 ; // ボール君が画面下端からはみ出そうになっていたら画面内の座標に戻してあげる if( BallY > 480 - 64 ) BallY = 480 - 64 ; // ボール君を描画 DrawGraph( BallX , BallY , BallGraph , FALSE ) ; } // 自機の弾1の移動ルーチン( 存在状態を保持している変数の内容が1(存在する)の場合のみ行う ) if( Shot1Flag == 1 ) { // 弾1を16ドット上に移動させる Shot1Y -= 16 ; // 画面外に出てしまった場合は存在状態を保持している変数に0(存在しない)を代入する if( Shot1Y < -80 ) { Shot1Flag = 0 ; } // 画面に弾1を描画する DrawGraph( Shot1X , Shot1Y , ShotGraph , FALSE ) ; } // 自機の弾2の移動ルーチン( 存在状態を保持している変数の内容が1(存在する)の場合のみ行う ) if( Shot2Flag == 1 ) { // 弾2を16ドット上に移動させる Shot2Y -= 16 ; // 画面外に出てしまった場合は存在状態を保持している変数に0(存在しない)を代入する if( Shot2Y < -80 ) { Shot2Flag = 0 ; } // 画面に弾2を描画する DrawGraph( Shot2X , Shot2Y , ShotGraph , FALSE ) ; } // 四角君の移動ルーチン { // 四角君の座標を移動している方向に移動する if( SikakuMuki == 1 ) SikakuX += 3 ; if( SikakuMuki == 0 ) SikakuX -= 3 ; // 四角君が画面右端からでそうになっていたら画面内の座標に戻してあげ、移動する方向も反転する if( SikakuX > 576 ) { SikakuX = 576 ; SikakuMuki = 0 ; } // 四角君が画面左端からでそうになっていたら画面内の座標に戻してあげ、移動する方向も反転する if( SikakuX < 0 ) { SikakuX = 0 ; SikakuMuki = 1 ; } // 四角君を描画 DrawGraph( SikakuX , SikakuY , SikakuGraph , FALSE ) ; } // 裏画面の内容を表画面にコピーする ScreenFlip() ; // Windows 特有の面倒な処理をDXライブラリにやらせる // -1 が返ってきたらループを抜ける if( ProcessMessage() < 0 ) break ; // もしESCキーが押されていたらループから抜ける if( CheckHitKey( KEY_INPUT_ESCAPE ) ) break ; } DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 }

#include "DxLib.h" // WinMain関数 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int BallX , BallY , BallGraph ; int SikakuX , SikakuY , SikakuMuki , SikakuGraph ; int ShotX[2] , ShotY[2] , ShotFlag[2] , ShotGraph ; int i ; // 画面モードの設定 SetGraphMode( 640 , 480 , 16 ) ; // DXライブラリ初期化処理 if( DxLib_Init() == -1 ) return -1; // グラフィックの描画先を裏画面にセット SetDrawScreen( DX_SCREEN_BACK ) ; // ボール君のグラフィックをメモリにロード&表示座標をセット BallGraph = LoadGraph( "Ball.png" ) ; BallX = 288 ; BallY = 400 ; // 四角君のグラフィックをメモリにロード&表示座標をセット SikakuGraph = LoadGraph( "Sikaku.png" ) ; SikakuX = 0 ; SikakuY = 50 ; // 弾のグラフィックをメモリにロード ShotGraph = LoadGraph( "Shot.png" ) ; // 弾1・2が画面上に存在しているか保持する変数に『存在していない』を意味する0を代入しておく for( i = 0 ; i < 2 ; i ++ ) { ShotFlag[i] = 0 ; } // 四角君の移動方向をセット SikakuMuki = 1 ; // 移動ルーチン while( 1 ) { // 画面を初期化(真っ黒にする) ClearDrawScreen() ; // ボール君の操作ルーチン { // ↑キーを押していたらボール君を上に移動させる if( CheckHitKey( KEY_INPUT_UP ) == 1 ) BallY -= 3 ; // ↓キーを押していたらボール君を下に移動させる if( CheckHitKey( KEY_INPUT_DOWN ) == 1 ) BallY += 3 ; // ←キーを押していたらボール君を左に移動させる if( CheckHitKey( KEY_INPUT_LEFT ) == 1 ) BallX -= 3 ; // →キーを押していたらボール君を右に移動させる if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 ) BallX += 3 ; // スペースキーを押した場合は処理を分岐 if( CheckHitKey( KEY_INPUT_SPACE ) ) { // 画面上にでていない弾があるか、弾の数だけ繰り返して調べる for( i = 0 ; i < 2 ; i ++ ) { // 弾iが画面上にでていない場合はその弾を画面に出す if( ShotFlag[i] == 0 ) { int Bw, Bh, Sw, Sh ; // ボール君と弾の画像のサイズを得る GetGraphSize( BallGraph , &Bw , &Bh ) ; GetGraphSize( ShotGraph , &Sw , &Sh ) ; // 弾iの位置をセット、位置はボール君の中心にする ShotX[i] = ( Bw - Sw ) / 2 + BallX ; ShotY[i] = ( Bh - Sh ) / 2 + BallY ; // 弾iは現時点を持って存在するので、存在状態を保持する変数に1を代入する ShotFlag[i] = 1 ; // 一つ弾を出したので弾を出すループから抜けます break ; } } } // ボール君が画面左端からはみ出そうになっていたら画面内の座標に戻してあげる if( BallX < 0 ) BallX = 0 ; // ボール君が画面右端からはみ出そうになっていたら画面内の座標に戻してあげる if( BallX > 640 - 64 ) BallX = 640 - 64 ; // ボール君が画面上端からはみ出そうになっていたら画面内の座標に戻してあげる if( BallY < 0 ) BallY = 0 ; // ボール君が画面下端からはみ出そうになっていたら画面内の座標に戻してあげる if( BallY > 480 - 64 ) BallY = 480 - 64 ; // ボール君を描画 DrawGraph( BallX , BallY , BallGraph , FALSE ) ; } // 弾の数だけ弾を動かす処理を繰り返す for( i = 0 ; i < 2 ; i ++ ) { // 自機の弾iの移動ルーチン( 存在状態を保持している変数の内容が1(存在する)の場合のみ行う ) if( ShotFlag[ i ] == 1 ) { // 弾iを16ドット上に移動させる ShotY[ i ] -= 16 ; // 画面外に出てしまった場合は存在状態を保持している変数に0(存在しない)を代入する if( ShotY[ i ] < -80 ) { ShotFlag[ i ] = 0 ; } // 画面に弾iを描画する DrawGraph( ShotX[ i ] , ShotY[ i ] , ShotGraph , FALSE ) ; } } // 四角君の移動ルーチン { // 四角君の座標を移動している方向に移動する if( SikakuMuki == 1 ) SikakuX += 3 ; if( SikakuMuki == 0 ) SikakuX -= 3 ; // 四角君が画面右端からでそうになっていたら画面内の座標に戻してあげ、移動する方向も反転する if( SikakuX > 576 ) { SikakuX = 576 ; SikakuMuki = 0 ; } // 四角君が画面左端からでそうになっていたら画面内の座標に戻してあげ、移動する方向も反転する if( SikakuX < 0 ) { SikakuX = 0 ; SikakuMuki = 1 ; } // 四角君を描画 DrawGraph( SikakuX , SikakuY , SikakuGraph , FALSE ) ; } // 裏画面の内容を表画面にコピーする ScreenFlip() ; // Windows 特有の面倒な処理をDXライブラリにやらせる // -1 が返ってきたらループを抜ける if( ProcessMessage() < 0 ) break ; // もしESCキーが押されていたらループから抜ける if( CheckHitKey( KEY_INPUT_ESCAPE ) ) break ; } DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 }

さて、弾を沢山出すことは出来るようになりました。#include "DxLib.h" #define SHOT 2 // WinMain関数 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int BallX , BallY , BallGraph ; int SikakuX , SikakuY , SikakuMuki , SikakuGraph ; int ShotX[SHOT] , ShotY[SHOT] , ShotFlag[SHOT] , ShotGraph ; int i ; // 画面モードの設定 SetGraphMode( 640 , 480 , 16 ) ; // DXライブラリ初期化処理 if( DxLib_Init() == -1 ) return -1; // グラフィックの描画先を裏画面にセット SetDrawScreen( DX_SCREEN_BACK ) ; // ボール君のグラフィックをメモリにロード&表示座標をセット BallGraph = LoadGraph( "Ball.png" ) ; BallX = 288 ; BallY = 400 ; // 四角君のグラフィックをメモリにロード&表示座標をセット SikakuGraph = LoadGraph( "Sikaku.png" ) ; SikakuX = 0 ; SikakuY = 50 ; // 弾のグラフィックをメモリにロード ShotGraph = LoadGraph( "Shot.png" ) ; // 弾が画面上に存在しているか保持する変数に『存在していない』を意味する0を代入しておく for( i = 0 ; i < SHOT ; i ++ ) { ShotFlag[i] = 0 ; } // 四角君の移動方向をセット SikakuMuki = 1 ; // 移動ルーチン while( 1 ) { // 画面を初期化(真っ黒にする) ClearDrawScreen() ; // ボール君の操作ルーチン { // ↑キーを押していたらボール君を上に移動させる if( CheckHitKey( KEY_INPUT_UP ) == 1 ) BallY -= 3 ; // ↓キーを押していたらボール君を下に移動させる if( CheckHitKey( KEY_INPUT_DOWN ) == 1 ) BallY += 3 ; // ←キーを押していたらボール君を左に移動させる if( CheckHitKey( KEY_INPUT_LEFT ) == 1 ) BallX -= 3 ; // →キーを押していたらボール君を右に移動させる if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 ) BallX += 3 ; // スペースキーを押した場合は処理を分岐 if( CheckHitKey( KEY_INPUT_SPACE ) ) { // 画面上にでていない弾があるか、弾の数だけ繰り返して調べる for( i = 0 ; i < SHOT ; i ++ ) { // 弾iが画面上にでていない場合はその弾を画面に出す if( ShotFlag[i] == 0 ) { int Bw, Bh, Sw, Sh ; // ボール君と弾の画像のサイズを得る GetGraphSize( BallGraph , &Bw , &Bh ) ; GetGraphSize( ShotGraph , &Sw , &Sh ) ; // 弾iの位置をセット、位置はボール君の中心にする ShotX[i] = ( Bw - Sw ) / 2 + BallX ; ShotY[i] = ( Bh - Sh ) / 2 + BallY ; // 弾iは現時点を持って存在するので、存在状態を保持する変数に1を代入する ShotFlag[i] = 1 ; // 一つ弾を出したので弾を出すループから抜けます break ; } } } // ボール君が画面左端からはみ出そうになっていたら画面内の座標に戻してあげる if( BallX < 0 ) BallX = 0 ; // ボール君が画面右端からはみ出そうになっていたら画面内の座標に戻してあげる if( BallX > 640 - 64 ) BallX = 640 - 64 ; // ボール君が画面上端からはみ出そうになっていたら画面内の座標に戻してあげる if( BallY < 0 ) BallY = 0 ; // ボール君が画面下端からはみ出そうになっていたら画面内の座標に戻してあげる if( BallY > 480 - 64 ) BallY = 480 - 64 ; // ボール君を描画 DrawGraph( BallX , BallY , BallGraph , FALSE ) ; } // 弾の数だけ弾を動かす処理を繰り返す for( i = 0 ; i < SHOT ; i ++ ) { // 自機の弾iの移動ルーチン( 存在状態を保持している変数の内容が1(存在する)の場合のみ行う ) if( ShotFlag[ i ] == 1 ) { // 弾iを16ドット上に移動させる ShotY[ i ] -= 16 ; // 画面外に出てしまった場合は存在状態を保持している変数に0(存在しない)を代入する if( ShotY[ i ] < -80 ) { ShotFlag[ i ] = 0 ; } // 画面に弾iを描画する DrawGraph( ShotX[ i ] , ShotY[ i ] , ShotGraph , FALSE ) ; } } // 四角君の移動ルーチン { // 四角君の座標を移動している方向に移動する if( SikakuMuki == 1 ) SikakuX += 3 ; if( SikakuMuki == 0 ) SikakuX -= 3 ; // 四角君が画面右端からでそうになっていたら画面内の座標に戻してあげ、移動する方向も反転する if( SikakuX > 576 ) { SikakuX = 576 ; SikakuMuki = 0 ; } // 四角君が画面左端からでそうになっていたら画面内の座標に戻してあげ、移動する方向も反転する if( SikakuX < 0 ) { SikakuX = 0 ; SikakuMuki = 1 ; } // 四角君を描画 DrawGraph( SikakuX , SikakuY , SikakuGraph , FALSE ) ; } // 裏画面の内容を表画面にコピーする ScreenFlip() ; // Windows 特有の面倒な処理をDXライブラリにやらせる // -1 が返ってきたらループを抜ける if( ProcessMessage() < 0 ) break ; // もしESCキーが押されていたらループから抜ける if( CheckHitKey( KEY_INPUT_ESCAPE ) ) break ; } DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 }