最近Dxlibでゲームを作っているのですが、「最初にある文字を表示させた後、2秒後に新しい文字を表示して最初に表示させた文字は消す」という操作か「ある文字を表示させた後、エンターキーが押されたら新しい文字を表示して最初に表示させた文字は消す」という操作のどちらかを作りたいと思っています。
ですが、まだDxlibを触り始めたばかりなのでどうすれば良いのかよく分かりません。
作り方やサンプルコードなどを教えてくだされば幸いです。
Dxlibの表示された文字の消し方
Re: Dxlibの表示された文字の消し方
どのような処理に組み込むかによってもいい書き方は変わってくると思いますが、例えばこのような感じでできます。
#include <DxLib.h>
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
if (ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK) return 1;
if (DxLib_Init() == -1) return 1;
SetDrawScreen(DX_SCREEN_BACK);
int startTime = GetNowCount(); // 最初の時刻
bool enterPressed = false; // Enterキーが押されたか
int color = GetColor(255, 255, 255);
while (ProcessMessage() == 0 && ScreenFlip() == 0 && ClearDrawScreen() == 0) {
if (GetNowCount() - startTime < 2000) {
// まだ2秒経っていない
DrawString(50, 50, "ある文字", color);
} else {
// 2秒経った
DrawString(50, 80, "新しい文字", color);
}
// Enterキーが押されたかをチェックする
if (CheckHitKey(KEY_INPUT_RETURN)) enterPressed = true;
if (enterPressed) {
// Enterキーが押された
DrawString(50, 280, "新しい文字", color);
} else{
// Enterキーが押されていない
DrawString(50, 250, "ある文字", color);
}
}
DxLib_End();
return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: Dxlibの表示された文字の消し方
すみません。説明が抽象的すぎました!
というより日本語がおかしかったです。
下のコードを参考にすると、
本来はText(1)を先に動かして、その後にText(2)を動かしたかったのですが、最初からText(1),Text(2)の両方が動いてしまって文字が重なってしまいます。
この原因は文字を消す部分のプログラムに問題があるのかと思い、質問しました。
このコードを参考にしていただき、さらに改善案を出していただければ幸いです。
まだ少し日本語が怪しい部分がありますが、すみません。
というより日本語がおかしかったです。
下のコードを参考にすると、
int Key[256];
int UpdateKey() { //押されたキーを判定する
char tmpKey[256]{};
GetHitKeyStateAll(tmpKey);
for (int i = 0; i < 256; i++) {
if (tmpKey[i] != 0) {
Key[i]++;
}
else {
Key[i] = 0;
}
}
return 0;
}
int FileHandle;
char String[50][100]{}; //[最大の行数][1行あたりの最大文字数]
//textファイルを用意する関数
void Text_File() {
//textファイルを開く
FileHandle = FileRead_open("テキスト.txt");
for (int i = 0; i < 49; i++) {
FileRead_gets(String[i], 256, FileHandle);
}
FileRead_close(FileHandle);
}
int DrawWidth;
bool EnterPressed = false;
int Text(int x) {
if (Key[KEY_INPUT_RETURN] == 1) { //キーが押されたらtrueにする
EnterPressed = true;
}
if (EnterPressed) { //EnterPressed == trueなら
DrawWidth = GetDrawStringWidth(String[0], -1);
DrawString((640 - DrawWidth) / 2, 220, String[0], GetColor(255, 255, 255)); //文字を消す(ファイル内の0行目は空白)
}
else {
DrawWidth = GetDrawStringWidth(String[x], -1); //文字を中央揃えにする
DrawString((640 - DrawWidth) / 2, 220, String[x], GetColor(255, 255, 255)); //xの値によって表示させる行数を変える
}
return x;
}
int WINAPI WinMain(_In_ HINSTANCE hinstance, _In_opt_ HINSTANCE hPrevInstance,_In_ LPSTR lpCmdLine,_In_ int nShiwCmd)
{
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK);
while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && UpdateKey() == 0){
Text_File(); //txtファイルを読み込む
Text(1); //txtファイルの1行目を表示する
Text(2); //txtファイルの2行目を表示する
}
DxLib_End();
return 0;
}
この原因は文字を消す部分のプログラムに問題があるのかと思い、質問しました。
このコードを参考にしていただき、さらに改善案を出していただければ幸いです。
まだ少し日本語が怪しい部分がありますが、すみません。
Re: Dxlibの表示された文字の消し方
って2つ書いたら → 両方が表示される
というのは極めて自然で当たり前すぎる話だと思える.
(むしろ,「頑張って2つ書いたのに何故か1個しか表示されない」とかなったら困るじゃん?)
そしたら,1個にしたいなら1個だけ書けばいいんじゃない? っていうのも極めて明瞭な事柄であろう.
とか1個だけ書いとけばよくない?
あとは LineNo の値を適切に変えていくだけだ.例えば既に回答されている仕組みをそのまま用いればよいのではあるまいか.
というのは極めて自然で当たり前すぎる話だと思える.
(むしろ,「頑張って2つ書いたのに何故か1個しか表示されない」とかなったら困るじゃん?)
そしたら,1個にしたいなら1個だけ書けばいいんじゃない? っていうのも極めて明瞭な事柄であろう.
とか1個だけ書いとけばよくない?
あとは LineNo の値を適切に変えていくだけだ.例えば既に回答されている仕組みをそのまま用いればよいのではあるまいか.
Re: Dxlibの表示された文字の消し方
オフトピック
あと,「文字を消す」という文言がちょっと気になるなぁ.
> while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && UpdateKey() == 0){
とかいうループを書いている時点で,「描画したものは毎回消えている」のではあるまいか.
そしたら,やりたいことは「表示した物を消したい」じゃなくて「所望のものだけを描画したい」という形に表現されるべき場面ではないかと思える.
> while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && UpdateKey() == 0){
とかいうループを書いている時点で,「描画したものは毎回消えている」のではあるまいか.
そしたら,やりたいことは「表示した物を消したい」じゃなくて「所望のものだけを描画したい」という形に表現されるべき場面ではないかと思える.