使用 C++ 协程进行“脚本编写”

问题描述 投票:0回答:1

我正在尝试使用协程作为行为脚本为游戏敌人实现一个简单的脚本系统。和许多普通的 C++ 程序员一样,我很难处理复杂的

std::coroutine
内容,但我设法修补了一些有用的东西。我的脚本现在看起来像这样,其中
R
A
是从协程教程之一粘贴的返回和等待类型:

R script(){
    command_moveTo(10, 10);
    co_await A;
    command_idle(3);
    co_await A;
    command_moveTo(20, 20)
    co_await A;
    // etc..    
}

这完成了工作,但我想消除在每次

co_await
调用后不断编写
command_*()
的需要,因此脚本看起来像这样整洁:

R script(){
    command_moveTo(10, 10);
    command_idle(3);
    command_moveTo(20, 20)
    // etc..    
}

有没有办法以某种方式从

command_*()
函数中暂停协程。
sdt::coroutine
的复杂性通常被认为有助于创建任何类型的协程系统。这种相当典型的用法可以实现吗?

我唯一能想到的就是使用

command_*()
函数的宏,简单地将
co_await
潜入协程的源代码中。有更好的办法吗?

c++ c++20 coroutine c++-coroutine
1个回答
0
投票

协程只能使用

co_await
或类似语法来挂起自身。协程之外的任何东西,甚至是它调用的函数,都不能强制它挂起。

如果所有这些

command_
函数后面都应该有
co_await
调用,那么你应该让它们 return 可等待。这意味着您调用
co_await command_*
。并将函数设置为
[[nodiscard]]
,这样用户就无法在不对返回值进行处理的情况下调用它们。

这也允许命令在完成和执行下一个命令时有发言权。您甚至可以将等待的东西制作为可以链接的东西,这样您就可以拥有多个命令,当所有命令完成时,这些命令将被视为完成。

co_await command_moveTo(10, 10) & command_idle(3);
© www.soinside.com 2019 - 2024. All rights reserved.