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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
てんさん

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

#1

投稿記事 by てんさん » 6年前

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);
という形でお願いします。初めての投稿なので上手く説明できてないと思いますが
その都度説明しますのでどうか教えてください。お願いいたします。

25130
記事: 4
登録日時: 6年前

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

#2

投稿記事 by 25130 » 6年前

どこかで時間計測をする必要があります。

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);
}
となります。
-- Let's enjoy programming !!

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

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

#3

投稿記事 by Dixq (管理人) » 6年前

基本的には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

inemaru
記事: 108
登録日時: 7年前

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

#4

投稿記事 by inemaru » 6年前

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

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

コード:

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

コード:

list.emplace_back(index++);

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

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

#5

投稿記事 by Dixq (管理人) » 6年前

オフトピック
おっと、せっかくemplaceになっているのに。
ご指摘ありがとうございます。
一時変数名listってよくないですね・・。すみません、普段Java書いているのでついつい・・。(クラス名が小文字から始まるってことが無い)

返信

“C言語何でも質問掲示板” へ戻る