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

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

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

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

DXライブラリ

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

Q&A

解決済

2回答

1601閲覧

Dxライブラリ キー入力と警告

kurira

総合スコア28

C++

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

DXライブラリ

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

0グッド

0クリップ

投稿2020/11/18 01:21

Dxライブラリを用いて、カウンターを作りたいです。
最初に100を表示して、上下キーの上を押すと+1、下を押すと-1。範囲は0~200です。
もし、0の状態で上を、200の状態で下を押すとなんらかの形で警告が出るというものにしたいです。

#include"DxLib.h" int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC) { char keyBuf[200]; int color; int countUP=100,countDOWN=100, xd = 1, yd = 1; if (DxLib_Init() == -1) { return -1; } SetDrawScreen(DX_SCREEN_BACK); SetFontSize(100); color = GetColor(0, 255, 0); while (1) { GetHitKeyStateAll(keyBuf); if (keyBuf[KEY_INPUT_UP]) countUP += xd; if (keyBuf[KEY_INPUT_DOWN]) countDOWN += yd; DrawFormatString(0, 0, color, "100"); ScreenFlip(); if (ProcessMessage() == -1) break; if (CheckHitKey(KEY_INPUT_ESCAPE) != 0) break; } DxLib_End; return 0; }

上記のソースを書いてみました。まだ、Dxライブラリを勉強し始めたばかりで、どう書けば良いか曖昧で、上のようなソースになりました。

わからないところは、上下キーを押して数字を変化させるのはどうやれば良いのか。
また、警告(音を鳴らすなどの警告にしたいです)の出し方がわかりません。

上記2点を教えていただけるとありがたいです。また、他に間違っているところ等ありましたら、ご指摘いただけるとありがたいです。

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

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

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

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

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

stdio

2020/11/18 01:35

警告音はビープ音でいいのでしょうか? それならC言語のprintf("\a");を呼べば、音出ますよ。
dodox86

2020/11/18 01:46

>@stdioさん WinMainはコンソールアプリケーションではないので、"\a"によるビープ音を含むprintfの出力は使えません。
guest

回答2

0

ベストアンサー

参考になりますか?

C++

1#include "DxLib.h" 2 3int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC) 4{ 5 ChangeWindowMode(TRUE); 6 if (DxLib_Init() == -1) return -1; 7 SetDrawScreen(DX_SCREEN_BACK); 8 SetFontSize(100); 9 10 int color = GetColor(0, 255, 0); 11 int count = 100; 12 int beep = 0; 13 14 while (ProcessMessage() == 0) { 15 char keyBuf[256]; 16 GetHitKeyStateAll(keyBuf); 17 if (keyBuf[KEY_INPUT_ESCAPE]) break; 18 if (keyBuf[KEY_INPUT_UP] && ++count > 200) { 19 PlayBeep(); beep = 5; count = 200; 20 } 21 if (keyBuf[KEY_INPUT_DOWN] && --count < 0) { 22 PlayBeep(); beep = 5; count = 0; 23 } 24 if (beep > 0 && --beep == 0) StopBeep(); 25 26 ClearDrawScreen(); 27 DrawFormatString(50, 50, color, "%d", count); 28 ScreenFlip(); 29 } 30 DxLib_End(); 31 return 0; 32}

追記
一瞬キーを押したつもりでも複数回入力されます。
1つずつカウントアップ・ダウンさせたかったら次のようにすればできます。

C++

1#include "DxLib.h" 2 3int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC) 4{ 5 ChangeWindowMode(TRUE); 6 if (DxLib_Init() == -1) return -1; 7 SetDrawScreen(DX_SCREEN_BACK); 8 SetFontSize(100); 9 10 int color = GetColor(0, 255, 0); 11 int count = 100; 12 int beep = 0; 13 int keyCount[256] = { 0 }; 14 15 while (ProcessMessage() == 0) { 16 char keyBuf[256]; 17 GetHitKeyStateAll(keyBuf); 18 for (int i = 0; i < 256; i++) !keyBuf[i] ? keyCount[i] = 0 : keyCount[i]++; 19 20 if (keyCount[KEY_INPUT_ESCAPE]) break; 21 if (keyCount[KEY_INPUT_UP] == 1 && ++count > 200) { 22 PlayBeep(); beep = 5; count = 200; 23 } 24 if (keyCount[KEY_INPUT_DOWN] == 1 && --count < 0) { 25 PlayBeep(); beep = 5; count = 0; 26 } 27 if (beep > 0 && --beep == 0) StopBeep(); 28 29 ClearDrawScreen(); 30 DrawFormatString(50, 50, color, "%d", count); 31 ScreenFlip(); 32 } 33 DxLib_End(); 34 return 0; 35}

追記2
1つずつカウントアップ・ダウンさせたいし、リピート機能も付けたい場合は、

C++

1 if (keyCount[KEY_INPUT_ESCAPE]) break; 2 int k = keyCount[KEY_INPUT_UP]; 3 if ((k == 1 || k > 30) && ++count > 200) { 4 PlayBeep(); beep = 5; count = 200; 5 } 6 k = keyCount[KEY_INPUT_DOWN]; 7 if ((k == 1 || k > 30) && --count < 0) { 8 PlayBeep(); beep = 5; count = 0; 9 } 10 if (beep > 0 && --beep == 0) StopBeep();

投稿2020/11/18 03:56

編集2020/11/18 15:52
kazuma-s

総合スコア8224

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

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

kurira

2020/11/18 23:20

ご丁寧に補足までありがとうございます。ソースが書けたことはもちろん、勉強にもなりました!
guest

0

警告音はbeep音を鳴らすのが楽だと思います。その場合

c

1extern int SetBeepFrequency( int Freq ) ; // ビープ音周波数設定関数 2extern int PlayBeep( void ) ; // ビープ音を再生する 3extern int StopBeep( void ) ;

この関数が使えます。いやべつに自分で警告音の音声ファイルを用意して流してもいいですが。


GetHitKeyStateAllの使い方はあっていますが、キーの受け付け間隔を考えてみてください。現状、1 loop文の処理が終わるごとにキーを受け付けています。PCと実行時の状況によって一秒間に何回キーを受け付けるか変わってしまいます。
こういう時の解決策は、描画ループを回す間隔を固定してしまう(Constant Frame Rate)か、キー受け付けだけ間隔を固定する方法です。後者は難しいので前者を解説すると、

c

1#include <chrono> 2#include <thread> 3using namespace std::chrono_literals; 4// 30fps 5constexpr auto loop_duration = 1000ms / 30; 6using clock = std::chrono::high_resolution_clock; 7 8while(0 == ProcessMessage() && 0 == ScreenFlip() && 0 == ClearDrawScreen()) { 9 const auto current = clock::now(); 10 //ループ内の処理 11 std::this_thread::sleep_until(current + loop_duration); 12}

のようにすることで実現できます。

ref:


あとは数字の描画周りですが、countUPcountDownで分けているカウンターを一つにまとめてしまって、その値をDrawFormatStringで描画すればいいと思います。

投稿2020/11/18 02:52

yumetodo

総合スコア5852

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問