ページ 11

dxライブラリ 時間差表示について

Posted: 2017年11月27日(月) 14:52
by てんさん
dxライブラリ初心者です。
今簡単なパズルゲームを作っていて
Draw Format Stringで決めたUIを時間差で3つ表示したいのですがどうプログラムでかけばいいのでしょうか?
時間差は2秒ごとくらいでお願いします。ちなみに時間差で表示させたいUIは
最初に
DrawFormatString(204, 95, WHITE, "%d", sen);
二秒後に
DrawFormatString(204, 115, WHITE, "%d", sen2);
そのまた二秒後に
DrawString(197, 135, "10000", WHITE);
という形でお願いします。初めての投稿なので上手く説明できてないと思いますが
その都度説明しますのでどうか教えてください。お願いいたします。

Re: dxライブラリ 時間差表示について

Posted: 2017年11月27日(月) 17:50
by 25130
どこかで時間計測をする必要があります。

DXライブラリを使用して時間計測を行う方法を、Dixqさんが紹介されています。
http://dixq.net/g/08.html

質問の内容をそのままコードにすると、

コード:

// 最初から表示している
DrawFormatString(204, 95, WHITE, "%d", sen);
// 2秒後、という事は2秒以上が経過している
if (計測時間 が 2秒以上であれば) {
    DrawFormatString(204, 115, WHITE, "%d", sen2);
}
// 2秒後の2秒後…つまり4秒以上が経過している
if (計測時間 が 4秒以上であれば) {
    DrawString(197, 135, "10000", WHITE);
}
となります。

Re: dxライブラリ 時間差表示について

Posted: 2017年11月27日(月) 20:58
by Dixq (管理人)
基本的には25130さんの書かれている通りですが、リンク先のコードは全体の処理をとめてしまうことを前提としているので
常にメインループに処理を返す必要があります。
2秒ごとにタイムスタンプを打ち続けるサンプルを作ってみました。(1フレーム=1/60秒未満の誤差はあります)

実行結果
[youtube][/youtube]

実行コード

TimeStump.h

コード:

#pragma once
class TimeStump
{
public:
    explicit TimeStump(int index);
    virtual ~TimeStump() = default;
    bool update();
    void draw() const;

private:
    const int _index;
    const int _firstTime;
    int _time;
};
TimeStump.cpp

コード:

#include "TimeStump.h"
#include <DxLib.h>

constexpr static int INTERVAL = 2000;

TimeStump::TimeStump(int index) : 
    _index(index),
    _firstTime(GetNowCount()),
    _time(0)
{
}

bool TimeStump::update()
{
    _time = GetNowCount() - _firstTime;
    if (_time >= INTERVAL) {
        return false;
    }
    return true;
}

void TimeStump::draw() const
{
    DrawFormatString(0, 15*_index, GetColor(255,255,255), "%d", _time);
}
main.cpp

コード:

#include "DxLib.h"
#include <list>
#include "TimeStump.h"

using namespace std;

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
    ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK);

    int index = 0;
    list<TimeStump> list;
    list.emplace_back(TimeStump(index++));

    while (!ScreenFlip()&&!ProcessMessage()&&!ClearDrawScreen()) {
        if (!list.back().update()) {
            list.emplace_back(TimeStump(index++));
        }
        for (const auto& t : list) {
            t.draw();
        }
    }

    DxLib_End();
}
使用プロジェクト
http://dixq.net/g/01_01.html

Re: dxライブラリ 時間差表示について

Posted: 2017年11月27日(月) 23:56
by inemaru
オフトピック
質問内容と関係ないのでオフトピックですが、
管理人さんのサンプルコードでemplace_backメソッドの使い方が良くないように思いました。
動作に関係ないですが、気になったので・・・
攻撃の意図等は、ないです。お気を悪くさせてしまったら、本当にすみません。

折角、コンストラクタ引数でintが渡るようになっているので、
一時変数は、不要だと思います。

コード:

list.emplace_back(TimeStump(index++));

コード:

list.emplace_back(index++);

Re: dxライブラリ 時間差表示について

Posted: 2017年11月28日(火) 08:35
by Dixq (管理人)
オフトピック
おっと、せっかくemplaceになっているのに。
ご指摘ありがとうございます。
一時変数名listってよくないですね・・。すみません、普段Java書いているのでついつい・・。(クラス名が小文字から始まるってことが無い)