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

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

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

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

DXライブラリ

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

Q&A

0回答

712閲覧

C++ for文について

kinakomoti-_-

総合スコア3

C++

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

DXライブラリ

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

0グッド

1クリップ

投稿2023/01/20 03:08

編集2023/01/20 03:17

前提

DXライブラリで射的ゲームを作成しています
C++初心者

実現したいこと

お邪魔ブロックをfor文で表示させたい。

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

for文でお邪魔ブロックを表示させるソースコードを書いて実行したら
一瞬しか表示されませんでした。

自分の推測(間違っているかも)

ClearDrawScreen()で初期化されてしまうから一瞬しか表示されないのかなと考えています。
ですが自分が作成している射的ゲームには制限時間を設けていてClearDrawScreen()をなくしてしまうと、
制限時間が更新されて表示出来なくなってしまったりと他にも様々な問題が発生してしまいます。
なので自分の理想は初期化されずにお邪魔ブロックが制限時間が0秒なるまで表示されるようにしたいです。

該当のソースコード

C++

1//描画 2void Easy_Draw() { 3 4 ChangeWindowMode(TRUE); 5 SetAlwaysRunFlag(TRUE); 6 7 SetDrawScreen(DX_SCREEN_BACK); 8 9 10 score = 0; // 得点の初期化 11 breakNum = 0; 12 rank_flag = 0; 13 14 15 int XPos, YPos; 16 int X = GetRand(640), Y = GetRand(480), X1 = GetRand(640), Y1 = GetRand(480), X2 = GetRand(640), Y2 = GetRand(480); // 的の座標 17 int targetGraph, targetGraph1, targetGraph2; // 的 18 int back; // 背景 19 int W, H, W1, H1, W2, H2; // 的の縦横の長さ 20 bool target_flag = TRUE; // 1個目の的の生存フラグ 21 bool target_flag1 = TRUE; // 2個目の的の生存フラグ 22 bool target_flag2 = TRUE; // 3個目の的の生存フラグ 23 int Appearance_flag = GetRand(1); // 1個目の的のランダム出現フラグ 24 int Appearance_flag1 = GetRand(1); // 2個目の的のランダム出現フラグ 25 int Appearance_flag2 = GetRand(1); // 3個目の的のランダム出現フラグ 26 27 28 int tg1 = LoadGraph("image/tg_anime1.png"); 29 int tg2 = LoadGraph("image/tg_anime2.png"); 30 int tg3 = LoadGraph("image/tg_anime3.png"); 31 int tg4 = LoadGraph("image/tg_anime4.png"); 32 int tg5 = LoadGraph("image/tg_anime5.png"); 33 int tg6 = LoadGraph("image/tg_anime6.png"); 34 int tg7 = LoadGraph("image/tg_anime7.png"); 35 36 int tg_ani[7]; // 的のアニメーション用の配列 37 tg_ani[0] = tg1; 38 tg_ani[1] = tg2; 39 tg_ani[2] = tg3; 40 tg_ani[3] = tg4; 41 tg_ani[4] = tg5; 42 tg_ani[5] = tg6; 43 tg_ani[6] = tg7; 44 45 46 47 48 int timediff; // 制限時間 49 LONGLONG timelimit = GetNowHiPerformanceCount() + 30000000; 50 51 52 53 54 while (ProcessMessage() == 0) { 55 56 // 1個目の的 57 targetGraph = LoadGraph("image\\tar.png"); 58 // 2個目の的 59 targetGraph1 = LoadGraph("image\\tar.png"); 60 // 3個目の的 61 targetGraph2 = LoadGraph("image\\tar.png"); 62 63 // 背景 64 back = LoadGraph("image\\tg_back.png"); 65 66 67 68 69 int tg[3]; 70 tg[0] = targetGraph; 71 tg[1] = targetGraph1; 72 tg[2] = targetGraph2; 73 74 75 76 77 // 1個目の的のグラフィックのサイズを得る 78 GetGraphSize(targetGraph, &W, &H); 79 80 // 2個目の的のグラフィックのサイズを得る 81 GetGraphSize(targetGraph1, &W1, &H1); 82 83 // 3個目の的のグラフィックのサイズを得る 84 GetGraphSize(targetGraph2, &W2, &H2); 85 86 87 88 89 // 時間を減算 90 timediff = int(timelimit - GetNowHiPerformanceCount()); 91 92 ClearDrawScreen(); // 裏画面を初期化 93 94 DrawGraph(0, 0, back, TRUE); // 背景表示 95 96 SetFontSize(10); 97 DrawString(0, 0, "得点:", GetColor(255, 255, 255)); 98 DrawFormatString(50, 0, GetColor(255, 255, 255), "%d", score); // 得点表示 99 DrawString(120, 0, "破壊数:", GetColor(255, 255, 255)); 100 DrawFormatString(200, 0, GetColor(255, 255, 255), "%d", breakNum); // 破壊数表示 101 DrawFormatString(580, 0, GetColor(255, 255, 255), "%01d:%02d", timediff / 60000000, (timediff % 60000000) / 1000000); 102 103 GetMousePoint(&XPos, &YPos); // マウス座標の取得 104      105 Easy_Block(); 106 107 // 的の当たり判定 108     ソースコードが長いので削除してます。 109 110 111 112 // 的が生存しているなら実行する 113 ソースコードが長いので削除してます。 114 115 116 117 118      // 的の生存フラグ記載 119 ソースコードが長いので削除してます。 120 121 // 制限時間が0秒になったら 122 if (timediff <= 0) { 123 break; 124 } 125 126 ScreenFlip(); // 裏画面の内容を表画面に反映 127 128 } 129 130 131 132 ScoreSave(); 133 BreakSave(); 134 135 136 ClearDrawScreen(); 137 SetFontSize(50); 138 DrawString(240, 220, "終了", GetColor(255, 255, 255)); 139 ScreenFlip(); // 裏画面の内容を表画面に反映 140 141 142 Sleep(3000); 143 Scene_ChangeScene(eScene_Result); 144} 145 146 147void Easy_Block() { 148 bool block_flag = TRUE; // お邪魔ブロックのフラグ 149 int i, image[16]; 150 if (block_flag) { 151 LoadDivGraph("image\\block.png", 16, 4, 4, 32, 32, image); //画像を分割してimage配列に保存 152 153 for (i = 0; i < 100; i++) { 154 DrawGraph(GetRand(640), GetRand(480), image[4], TRUE);//ランダムな場所に画像を描写 155 block_flag = FALSE; 156 } 157 158 } 159} 160

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

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

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

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

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

y_waiwai

2023/01/20 04:57

コマンドプロンプトを立ち上げ、そこで実行したらどうなるでしょうか
fana

2023/01/20 05:15

teratail でこういうことを言うと激しく反感を買うのかもしれませんが… 何度かお見掛けした感じ,どうにも「必要なことを 必要なときにのみ 実施するように処理フローを作る」という根本のところができていないように見受けるので, そこらへんのこと(:なんて言えばよいのだろう?「概念」とでもいうのか)を学ぶ(?)というか会得する(?)というか,そういうことがまずは必要なんじゃないかな,と思います.
fana

2023/01/20 05:20

そういう意味では,一個前の質問 https://teratail.com/questions/8cul0paoqwtzai と,根っこの部分では「同じ」なんじゃないかな,と. (個々の現象の詳細やその直接的な原因に着目するならば「違う」のでしょうけど)
fana

2023/01/20 05:39 編集

> teratail でこういうことを言うと激しく反感を買うのかも …に関して,あらかじめ防御(?)しておくとすれば, これは{攻撃している,馬鹿にしている,追い出そうとしている,etc...}とかいうことではなく,単なる経験に基づいたアドバイス(をしているつもり)です. 何か邪悪な意思があるわけではありません. #余計なお世話だ,みたいな場合には「いや,そういうのはいいから」とか言ってもらえればそれでOKです.
ardin

2023/01/20 07:57

お邪魔ブロック以外はそのまま見えていますか? 一応気になったのは、 Easy_Block()内でランダムな場所に表示させようとしているようですが、 画面の書き換えごとにランダムな場所に表示するので、画面書き換えが速いと一瞬見えては消えてになると思います。
ardin

2023/01/20 08:00

↑ ClearDrawScreen()が走るのとブロック表示が同じ時間間隔。 ClearDrawScreen()が例えば1/60秒なら1/60の時間ごとにランダムな場所にブロックが消えては出る ということ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問