C++의 Coroutine을 사용했어요.

C++20 Coroutine 추가.Coroutine에 대해서는 여기.를 참조하십시오.나는 동방동방탄막풍을 좋아한다. 한때 한 적이 있는데 거기도 있다동일 기능.저기, 지금 만든 게임도 편입 안 되나요?

상상과는 다르다.


아까 웹사이트처럼 C++는 탄막풍의 약간 붉은 색처럼 편리한 것을 실시하는 것이 아니라 그것을 실현하기 위한 것이다.미니 레드를 직접 만드는 기분이라는 것이다.그리고 탄막풍이 주요 라인으로 돌아오는 것과 달리 탄막풍은 소환원으로 돌아왔다.

벽에 부딪쳤다


그래도 이 코로틴은새로운 것일지도 몰라요. 일본어 문헌이 하나도 없어요.내가 아는 바에 의하면 일본어에는 단지 두 개의 견본만 있다.1
하지만 쉽게 이해할 수 있어서 정말 큰 도움이 됐어요.

만들어진 물건



이 문자는 한 글자씩 그려집니다.DX 라이브러리.

코드


생성기는 상술한 사이트와 거의 같다.하지만 이번에는 보답이 필요 없어서 일단 버렸어요.어떻게 좀 해볼게요.
먼저 움직였기 때문에 여분의 일도 있으니 적당하다.
task.h
#include <experimental/coroutine>
#define YIELD (co_yield NULL) /*とりあえずNULL返してる。どうにかしたい*/

struct task {
    bool flag = true;
    struct promise_type {
        auto get_return_object() { return task{ handle_type::from_promise(*this) }; }
        std::experimental::suspend_never initial_suspend()noexcept { return {}; }
        std::experimental::suspend_always final_suspend()noexcept { return {}; }
        std::experimental::suspend_always yield_value(void*)noexcept { return {}; }
        void return_void() {}
        void unhandled_exception() { std::terminate(); }
    };
    using handle_type = std::experimental::coroutine_handle<promise_type>;
    explicit task(handle_type h)
        : coro_(h) {}
    task(const task&) = delete;
    task(task&& rhs)
        : coro_(rhs.coro_) { rhs.coro_ = nullptr; }
    ~task() {
        if (coro_)
            coro_.destroy();
    }
    void processing() {
        coro_.promise();
    }

    void update() {
        if (!flag) return;
        coro_.resume();
        flag = !coro_.done();
        processing();
    }

    handle_type coro_;
};
변경점으로 추가bool flag가량.이렇게 하면 종료 후 작업이 호출되지 않습니다.다만, 이번 상황은 필요 없다.나는 그래도 private를 선택하는 것이 비교적 좋다고 생각한다.
print.cpp
/*省略*/
task print(std::string str) {
    std::string b;
    while (1) {
        if (b != str) {
            for (auto c : str) {
                b.push_back(c);
                DrawString(0, 0, b.c_str(), 0x000000);
                YIELD;
            }
        }
        else {
            DrawString(0, 0, b.c_str(), 0x000000);
            YIELD;
        }
    }
    co_return;
}
main.cpp
/*インクルードとか省略*/
int WINAPI WinMain(/*引数いっぱい*/) {

/*省略*/

    auto DrawString = print("TestString", font);
    while(/*メインループの処理とか*/){
        DrawString.update();
    }

/*省略*/

}
사용 방법으로 반환값task의 함수를 사용하여 중단된 곳에 쓴다YIELD.나는 기본적인 무한순환에 깊이 들어가면 된다고 생각한다.나는 마지막에 co_return쓰는 것이 비교적 좋다고 생각한다.이렇게 하면 프레임마다 문자를 하나씩 그린다.

최후


조금만 더 드세요.아직 이루지 못한 것도 있지만.MSVC는 실험용으로도 사용할 수 있습니다!움직였으니까!
그리고 일본어 추가!사실대로 말하면, 온통 알 수 없는 일들뿐이다.

라이선스


라이센스는 CC0입니다.자유롭게 사용하고 변경할 수 있습니다.
참고 자료 C++ 아로마틴 확장 바
C++ 코르크
20분 정도면 C++20 연골소가 느껴져요.
참조의 위 두 개. 

좋은 웹페이지 즐겨찾기