トップページ > 記事閲覧
シューティングゲームで斜め上に進みながら弾が打てない
名前:はちみつ 日時: 2018/05/08 11:26

題名の通り斜め上に進みながらの時だけ弾が発射されません。 プログラミング自体初心者なのでよろしくお願いします。 作ったプログラムは以下の通りです。 #include "DxLib.h" int Key[256]; // キーが押されているフレーム数を格納する // キーの入力状態を更新する int gpUpdateKey() { char tmpKey[256]; // 現在のキーの入力状態を格納する GetHitKeyStateAll(tmpKey); // 全てのキーの入力状態を得る for (int i = 0; i<256; i++) { if (tmpKey[i] != 0) { // i番のキーコードに対応するキーが押されていたら Key[i]++; // 加算 } else { // 押されていなければ Key[i] = 0; // 0にする } } return 0; } int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK); //ウィンドウモード変更と初期化と裏画面設定 /*            自機設定                   */ ///////////////////////////////////////////////////////// int jiki= LoadGraph("画像/シューティング2.png"); //自機の画像ロード int jikix = 200; //自機のx座標 int jikiy = 350; //自機のy座標 int jikidan[32]; //自機の弾の画像読み込み LoadDivGraph("画像/シューティング.png", 32, 8, 4, 10, 15.5, jikidan); struct PlayrShot { int flag; int PlayrShotx; int PlayrShoty; }PlayrShot[20]; ////////////////////////////////////////////////////// /*  音楽読み込み  */ ///////////////////////////////////////////////////// struct Music { int flag = 0; int Sound = 0; }; Music stage{ 0,LoadSoundMem("サウンド/stage1.wav") };//ステージの音楽読み込み Music SE{ 0,LoadSoundMem("サウンド/shot.mp3") }; ChangeVolumeSoundMem(150, stage.Sound);//BGMの音量調整 PlaySoundMem(stage.Sound, DX_PLAYTYPE_LOOP);//ステージ音楽再生 ////////////////////////////////////////////////////     int colo = GetColor(225, 225, 225); /* ループ開始 */ while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && gpUpdateKey() == 0) { if (Key[KEY_INPUT_RIGHT] >= 1) { // 右キーが押されていたら jikix=jikix+4; // 右へ移動 } if (Key[KEY_INPUT_LEFT] >= 1) { // 左キーが押されていたら jikix=jikix-4; // 左へ移動 } if (Key[KEY_INPUT_UP] >= 1) { // 上キーが押されていたら jikiy = jikiy - 4; // 上へ移動 } if (Key[KEY_INPUT_DOWN] >= 1) { // 下キーが押されていたら jikiy = jikiy + 4; // 下へ移動 } if (jikiy < 2) { //自機画面上 jikiy = 2; } if (jikiy > 400) { //自機画面下 jikiy = 400; } if (jikix < 2) { //自機画面左端 jikix = 2; } if (jikix > 572) { //自機画面右端 jikix = 572; } if (Key[KEY_INPUT_A] == 1) { //自機の弾の処理 for (int i = 0; i < 20; i++) { if (PlayrShot[i].flag == 0) { //自機の弾のフラグ;効果音のフラグ;弾の座標の取得 PlayrShot[i].flag = 1; SE.flag = 1; PlayrShot[i].PlayrShotx = jikix; PlayrShot[i].PlayrShoty = jikiy; break; } } } for (int i=0; i < 20; i++) { if (PlayrShot[i].flag) { PlayrShot[i].PlayrShoty -= 5; //弾の進み方 if (PlayrShot[i].PlayrShoty < -50) { //フラグの消去 PlayrShot[i].flag = 0; } } } /* 描画開始 */ DrawGraph(jikix, jikiy, jiki, true);//自機描画 for (int i = 0; i < 20; i++) { if (PlayrShot[i].flag == 1){ DrawGraph(PlayrShot[i].PlayrShotx+30, PlayrShot[i].PlayrShoty+10, jikidan[5], true); //自機の弾の描画 if (SE.flag == 1) { PlaySoundMem(SE.Sound,DX_PLAYTYPE_BACK); //弾の効果音 SE.flag = 0; } } } DrawFormatString(10, 10, colo, "座標「%d.%d」", jikix, jikiy); if (Key[KEY_INPUT_ESCAPE] == 1) { break; } } DxLib_End(); // DXライブラリ終了処理 return 0; }
メンテ

Page: 1 |

Re: シューティングゲームで斜め上に進みながら弾が打てない ( No.1 )
名前:8127 日時:2018/05/08 13:22

キーボードによっては同時に複数のキー入力を受け付けないものがあります。 斜め入力で既に2つのキーを使っているのでその場合だけ問題が発生するのだと思われます。 ハード依存の問題なのでこればかりはDxlib側ではどうにもならない可能性も・・・ 一応ゲームパッドを使えは改善するはずです。(多分)
メンテ
Re: シューティングゲームで斜め上に進みながら弾が打てない ( No.2 )
名前:はちみつ 日時:2018/05/08 19:05

なるほど、他のキーボードとかを使っていろいろやってみます。 あともう一つ質問なんですが弾の進み方のところにif (PlayrShot[i].flag)とあるじゃないですか。 これをif (PlayrShot[i].flag==1)にすると弾が発射されないんですよ。 もしフラグが立っていたら弾の進み方を計算するってことかなと思っていたのですがちがうのですかね? このif (PlayrShot[i].flag)のかっこの中身ってどういう意味になっているんですか? 他の人のプログラムをまねして書いたのでここだけ理解ができません。 よろしければ教えてください。
メンテ
Re: シューティングゲームで斜め上に進みながら弾が打てない ( No.3 )
名前:PPM 日時:2018/05/08 22:35

問題は↓の部分にあります。 struct PlayrShot { int flag; int PlayrShotx; int PlayrShoty; }PlayrShot[20]; 関数 (ここではWinMain) の中で変数を定義すると、初期値を設定していない場合、Visual C++ のDebugビルドでは struct PlayrShot { int flag; ---> 0xcccccccc (16進数) = -858993460 (10進数) int PlayrShotx; ここも同じ int PlayrShoty; ここも同じ }PlayrShot[20]; のように、intの場合は 0 ではなく 0xcccccccc (-858993460) という「意味のない数値」が強制的に割り当てられます。 プログラムの流れでいうと、そのあとに↓の部分がありますが for (int i = 0; i < 20; i++) { if (PlayrShot[i].flag) { PlayrShot[i].PlayrShoty -= 5; //弾の進み方 if (PlayrShot[i].PlayrShoty < -50) { //フラグの消去 PlayrShot[i].flag = 0; } } } if (PlayrShot[i].flag) は if (PlayrShot[i].flag != 0) のことであり、「0じゃなければなんでもOK」です。 で、PlayrShot[i].flag は 0 ではなく、1 でもなく、-858993460 なので、実は最初のループでこの中に入ってしまいます。 (なので if (PlayrShot[i].flag == 1) にしてしまうとここに永久に入れないため PlayrShot[i].flag = 0 になれず、撃てません) で、PlayrShot[i].PlayrShoty も同じく -858993460 であり -50より小さいので PlayrShot[i].flag = 0 になります。 つまり、最初の描画ループで「(超)画面外なので見えないけど、弾が20発存在していて、すぐに消えた」ことになります。 その後は、PlayrShot[i].flag は 0 か 1 で進むので問題は発生しません。 つまり、↓にすれば、if (PlayrShot[i].flag == 1) にしてもOKになります。 struct PlayrShot { int flag = 0; int PlayrShotx = 0; int PlayrShoty = 0; }PlayrShot[20]; ■追記 LoadDivGraph("画像/シューティング.png", 32, 8, 4, 10, 15.5, jikidan); で 15.5 というのが気になるのですが、間違いですか?(ここは整数を指定する箇所)
メンテ
Re: シューティングゲームで斜め上に進みながら弾が打てない ( No.4 )
名前:はちみつ(解決) 日時:2018/05/08 23:10

おかげさまでここまでの疑問はすべて解決しました。 また製作中に何かあったらよろしくお願いします。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存