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

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

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

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

DXライブラリ

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

Q&A

0回答

174閲覧

dxライブラリの効果音について

nao12

総合スコア0

C++

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

DXライブラリ

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

0グッド

0クリップ

投稿2024/12/21 08:58

実現したいこと

スペースキーで弾を発射し、発射したタイミングで効果音を流したい

前提

dxライブラリで横スクロールシューティングを制作しています。
弾を発射した際に効果音も一緒に流したいのですが、流れる事には流れるのですが、処理が重いのか自機の動きがかなり遅くなっています
どの部分が不適切なのでしょうか
エラーメッセージは特には出ていません

該当のソースコード

c++

1 2void Player::MovePlayer() 3{ 4 int SeHandle = LoadSoundMem("Sound/Shot.mp3"); 5 static char oldSpcKey; //1つ前のスペースキーの状態を保持する変数 6 static int countSpcKey; //スペースキーを押し続けている間、カウントアップする変数 7 if (CheckHitKey(KEY_INPUT_A) == 1) 8 { 9 player.x -= speed; 10 if (player.x < 0) 11 { 12 player.x = 0; 13 } 14 } 15 16 if (CheckHitKey(KEY_INPUT_S) == 1) 17 { 18 player.y += speed; 19 if (player.y > 670) 20 { 21 player.y = 670; 22 } 23 } 24 25 if (CheckHitKey(KEY_INPUT_W) == 1) 26 { 27 player.y -= speed; 28 if (player.y < 0) 29 { 30 player.y = 0; 31 } 32 } 33 34 if (CheckHitKey(KEY_INPUT_D) == 1) 35 { 36 player.x += speed; 37 if (player.x > 600) 38 { 39 player.x = 600; 40 } 41 } 42 43 if (CheckHitKey(KEY_INPUT_SPACE) == 1) 44 { 45 int ad = 0; 46 int CheckSound = 0; 47 if (oldSpcKey == 0) 48 { 49 PlaySoundMem(SeHandle, DX_PLAYTYPE_BACK); 50 SetBullet(); 51 ad = CheckSoundMem(SeHandle); 52 } 53 else if (countSpcKey % 20 == 0)//一定間隔で発射 54 { 55 PlaySoundMem(SeHandle, DX_PLAYTYPE_BACK); 56 SetBullet(); 57 ad = CheckSoundMem(SeHandle); 58 } 59 DrawFormatString(100, 100, GetColor(255, 255, 255), "%d", ad); 60 countSpcKey++; 61 } 62 else 63 { 64 countSpcKey = 0; 65 } 66 oldSpcKey = CheckHitKey(KEY_INPUT_SPACE); //スペースキーの状態を保持 67 DrawBox(player.x, player.y, player.x + 30, player.y + 50, GetColor(255,255,255), TRUE); 68}

使用している環境はvisual studio 2022です
dxライブラリ初心者ですので何卒お手柔らかにお願いいたします。

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

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

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

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

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

lehshell

2024/12/21 10:24

気になった点をお伝えします。 void Player::MovePlayer() { int SeHandle = LoadSoundMem("Sound/Shot.mp3"); これでは MovePlayer() が呼び出される度に Shot.mp3 がメモリに読み込まれヒープメモリ使用量が増大していきます。 所謂メモリリークしている状況です。 Player であれば コンストラクタで LoadSoundMem してデストラクタで DeleteSoundMem することをお勧めします。
dodox86

2024/12/21 10:37

処理が重いのも、恐らくlehshellさんが指摘されたことが影響している気がします。MovePlayerメンバー関数は(恐らく)1フレームずつ(1秒に約60回)描画するタイミングで呼んでいると思うのですが、そのタイミングで毎回LoadSoundMem("Sound/Shot.mp3");も呼ぶと、そのたびにファイルのロードとメモリ消費量の増大でどんどん遅くなっているかと思います。Windowsのタスクマネージャーで確認してみても分るんじゃないでしょうかね。
nao12

2024/12/21 10:57

lehshellさまとdodox86さまの修正案で正しく動かせました! 本当にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.34%

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

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

質問する

関連した質問