为了实现游戏对象的各种变换逻辑,我们需要一个循环,然后在每一次循环里改变游戏对象的属性,以此来产生变化。
这个功能其实很简单,直接看一下代码:
public class GameLoop
{
private bool _isRunning = false;
public event Action Logic;
public async void Start()
{
if (_isRunning)
{
return;
}
_isRunning = true;
while (_isRunning || _timeCounter > 0)
{
await OnLogic();
}
}
public void Stop()
{
_isRunning = false;
}
private async Task OnLogic()
{
await Logic.Invoke();
}
}
我假设看这个系列文章的读者有一定的游戏开发经验,所以我就不过多解释代码了。
GameLoop其实就是开了一个while循环,然后通过回调事件来执行游戏逻辑。
我们只需要创建一个Blazor的组件,在组件里监听这个回调事件即可:
public partial class LetFight : ComponentBase
{
private GameLoop _gameLoop;
protected override void OnAfterRender(bool firstRender)
{
if (_gameLoop != null)
{
return;
}
_gameLoop = new();
_gameLoop.Logic += Logic;
_gameLoop.Start();
}
private async Task Logic(object sender, GameLoopLogicEventArgs e)
{
// 游戏逻辑
}
}
这样就能实现游戏的循环,当然,以上代码是简化过的,实际上还加入了帧率控制,详情就看源码吧。