質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

Q&A

解決済

1回答

582閲覧

C++ 的をそれぞれ左クリックで破壊したい

kinakomoti-_-

総合スコア3

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

1グッド

0クリップ

投稿2022/12/22 01:55

編集2022/12/22 02:58

前提

DXライブラリを使って、射的ゲームを作成しています

実現したいこと

的をそれぞれ左クリックで押されたら破壊したい

発生している問題・エラーメッセージ

1つ目の的は左クリックで破壊できるが、2つ目の的は左クリックを押しても破壊されない

試したこと

2つ目の的を右クリックで破壊するというコードを書いたら破壊されました。

該当のソースコード

C++

1#include "Easy.h" 2#include "Scene.h" 3#include "DxLib.h" 4 5 6//更新 7void Easy_Update() { 8 if (CheckHitKey(KEY_INPUT_B) != 0) { //Bキーが押されていたら 9 Scene_ChangeScene(eScene_Menu);//シーンをメニューに変更 10 } 11 12} 13 14 15//描画 16void Easy_Draw() { 17 18 ChangeWindowMode(TRUE); 19 SetAlwaysRunFlag(TRUE); 20 21 SetDrawScreen(DX_SCREEN_BACK); 22 int XPos, YPos; 23 int X = 10, Y = GetRand(420), X1 = 10, Y1 = GetRand(420); //的の座標 24 int targetGraph; // 1個目の的 25 int targetGraph1; // 2個目の的 26 int back; // 背景 27 int score = 0; // 得点 28 int breakNum = 0; // 破壊数 29 int W, H, W1, H1; // 的の縦横の長さ 30 int ObstructionBlock; // お邪魔ブロック 31 bool target_flag = TRUE; // 1個目の的の生存フラグ 32 bool target_flag1 = TRUE; // 2個目の的の生存フラグ 33 int Appearance_flag = 0; // 1個目の的のランダム出現フラグ 34 int Appearance_flag1 = 0; // 2個目の的のランダム出現フラグ 35 36 37 38 int tg1 = LoadGraph("image/tg_anime1.png"); 39 int tg2 = LoadGraph("image/tg_anime2.png"); 40 int tg3 = LoadGraph("image/tg_anime3.png"); 41 int tg4 = LoadGraph("image/tg_anime4.png"); 42 int tg5 = LoadGraph("image/tg_anime5.png"); 43 int tg6 = LoadGraph("image/tg_anime6.png"); 44 int tg7 = LoadGraph("image/tg_anime7.png"); 45 46 int tg_ani[7]; // 的のアニメーション用の配列 47 tg_ani[0] = tg1; 48 tg_ani[1] = tg2; 49 tg_ani[2] = tg3; 50 tg_ani[3] = tg4; 51 tg_ani[4] = tg5; 52 tg_ani[5] = tg6; 53 tg_ani[6] = tg7; 54 55 int timediff; // 制限時間 56 LONGLONG timelimit = GetNowHiPerformanceCount() + 60000000; 57 58 59 while (ProcessMessage() == 0) { 60 61 62 // 1個目の的 63 targetGraph = LoadGraph("image\\tar.png"); 64 // 2個目の的 65 targetGraph1 = LoadGraph("image\\tar.png"); 66 67 // 背景 68 back = LoadGraph("image\\tg_back.png"); 69 70 // お邪魔ブロック 71 ObstructionBlock = LoadGraph("image\\ObstructionBlock.png"); 72 73 // 1個目の的のグラフィックのサイズを得る 74 GetGraphSize(targetGraph, &W, &H); 75 76 // 2個目の的のグラフィックのサイズを得る 77 GetGraphSize(targetGraph1, &W1, &H1); 78 79 80 81 82 // 時間を減算 83 timediff = int(timelimit - GetNowHiPerformanceCount()); 84 85 ClearDrawScreen(); // 裏画面を初期化 86 87 DrawGraph(0, 0, back, TRUE); // 背景表示 88 89 SetFontSize(10); 90 DrawString(0, 0, "得点:", GetColor(255, 255, 255)); 91 DrawFormatString(50, 0, GetColor(255, 255, 255), "%d", score); // 得点表示 92 DrawString(120, 0, "破壊数:", GetColor(255, 255, 255)); 93 DrawFormatString(200, 0, GetColor(255, 255, 255), "%d", breakNum); // 破壊数表示 94 DrawFormatString(580, 0, GetColor(255, 255, 255), "%01d:%02d", timediff / 60000000, (timediff % 60000000) / 1000000); 95 96 GetMousePoint(&XPos, &YPos); // マウス座標の取得 97 98 99 // 的の当たり判定(ど真ん中) 100 // 右       左         下        上 101 int MiddleHit = (int)((XPos<X + W - 23 && XPos>X - W + 73) && (YPos<Y + H - 23 && YPos>Y - H + 73)); 102 int MiddleHit1 = (int)((XPos<X1 + W1 - 23 && XPos>X1 - W1 + 73) && (YPos<Y1 + H1 - 23 && YPos>Y1 - H1 + 73)); 103 104 // 的の当たり判定(真ん中以外) 105 int HIT = (int)((XPos<X + W && XPos>X - W + 45) && (YPos<Y + H && YPos>Y - H + 45)); 106 int HIT1 = (int)((XPos<X1 + W1 && XPos>X1 - W1 + 45) && (YPos<Y1 + H1 && YPos>Y1 - H1 + 45)); 107 108 109 110 // 的が生存しているなら実行 111 if (target_flag) { 112 113 // 的表示 114 DrawGraph(X, Y, targetGraph, TRUE); 115 116 117 // お邪魔ブロック表示 118 DrawGraph(100, 100, ObstructionBlock, FALSE); 119 120 121 //1個目の的の移動 122 if (Appearance_flag == 0) { 123 X += 2; if (X > 560)X = 0; // 横移動 124 } 125 else if (Appearance_flag == 1) { 126 Y += 2; if (Y > 480)Y = 0; // 縦移動 127 } 128 129 130 131 // 1個目の的の真ん中が押されたら 132 if (MiddleHit && GetAsyncKeyState(MOUSE_INPUT_LEFT) & 1) { 133 DeleteGraph(targetGraph); 134 target_flag = FALSE; 135 score += 100; 136 breakNum++; 137 } 138 139 // 1個目の的の真ん中以外押されたら 140 if (!MiddleHit && HIT & GetAsyncKeyState(MOUSE_INPUT_LEFT) & 1) { 141 DeleteGraph(targetGraph); 142 target_flag = FALSE; 143 score += 50; 144 breakNum++; 145 } 146 147 } 148 149 if (target_flag1) { 150 151 // 2個目の的表示 152 DrawGraph(X1, Y1, targetGraph1, TRUE); 153 154 // 2個目の的の移動 155 if (Appearance_flag1 == 0) { 156 X1 += 2; if (X1 > 560)X1 = 0; // 横移動 157 } 158 else if (Appearance_flag1 == 1) { 159 Y1 += 2; if (Y1 > 480)Y1 = 0; // 縦移動 160 } 161 162 // 2個目の的の真ん中が押されたら 163 if (MiddleHit1 && GetAsyncKeyState(MOUSE_INPUT_LEFT) & 1) { 164 DeleteGraph(targetGraph1); 165 target_flag1 = FALSE; 166 score += 100; 167 breakNum++; 168 } 169 170 // 2個目の的の真ん中以外押されたら 171 if (!MiddleHit1 && HIT1 & GetAsyncKeyState(MOUSE_INPUT_LEFT) & 1) { 172 DeleteGraph(targetGraph1); 173 target_flag1 = FALSE; 174 score += 50; 175 breakNum++; 176 } 177 178 } 179 180 181 182 183 184 // 1個目の的が生存していなければ 185 if (target_flag == FALSE) { 186 // 的のアニメーション 187 for (int i = 0; i < 7; i++) { 188 DrawGraph(X, Y, tg_ani[i], TRUE); 189 } 190 191 // ランダム(縦移動か横移動か) 192 Appearance_flag = GetRand(1); 193 194 //フラグが0だったら横移動、1だったら縦移動 195 if (Appearance_flag == 0) { 196 Y = GetRand(420); 197 X = 20; 198 } 199 else if (Appearance_flag == 1) { 200 X = GetRand(600); 201 Y = 20; 202 } 203 target_flag = TRUE; 204 } 205 206 // 2個目の的が生存していなければ 207 if (target_flag1 == FALSE) { 208 // 的のアニメーション 209 for (int i = 0; i < 7; i++) { 210 DrawGraph(X1, Y1, tg_ani[i], TRUE); 211 } 212 213 // ランダム(縦移動か横移動か) 214 Appearance_flag1 = GetRand(1); 215 216 //フラグが0だったら横移動、1だったら縦移動 217 if (Appearance_flag1 == 0) { 218 Y1 = GetRand(420); 219 X1 = 20; 220 } 221 else if (Appearance_flag1 == 1) { 222 X1 = GetRand(600); 223 Y1 = 20; 224 } 225 target_flag1 = TRUE; 226 } 227 228 229 230 231 // 制限時間が0秒になったら 232 if (timediff <= 0) { 233 break; 234 } 235 236 ScreenFlip(); // 裏画面の内容を表画面に反映 237 } 238 239 240 241 ClearDrawScreen(); 242 SetFontSize(50); 243 DrawString(240, 220, "終了", GetColor(255, 255, 255)); 244 ScreenFlip(); // 裏画面の内容を表画面に反映 245 Sleep(3000); 246 Scene_ChangeScene(eScene_Ranking); 247} 248 249 250
ankomoti-_-👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pig_vba

2022/12/22 02:34

的を配列にしてあげればコード半分になるのに…
pig_vba

2022/12/22 02:38

>if (!MiddleHit1 && HIT1 & GetAsyncKeyState(MOUSE_INPUT_LEFT) & 1) { →else if (HIT1 && GetAsyncKeyState(MOUSE_INPUT_LEFT) & 1) { こう。&1のところ自分の時は0x80って教わったけどどっちでもいいのかな
kinakomoti-_-

2022/12/22 02:50

アドバイスありがとうございます。試させていただきます。
guest

回答1

0

自己解決

GetAsyncKeyState(MOUSE_INPUT_LEFT) & 1を変数に代入して if文に組み込むことで、実装することができました。

投稿2022/12/22 04:52

kinakomoti-_-

総合スコア3

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問