在颤抖中实现游戏循环的最佳方法是什么?

时间:2019-10-17 11:01:53

标签: android ios flutter mobile dart

感谢您抽出宝贵的时间来审核我的问题!

TL; DR在颤抖中实现游戏循环的最佳方法是什么(可能会使用调度程序库)?

我正在努力在Flutter中实现功能正常的游戏循环(我想编写一个简单的游戏)。我不确定如何正确使用调度程序库以60 fps的速度每帧调用一次函数。我的代码可以正常工作,但是感觉很hacky,尤其是在绘画功能中我称为scheduleTick的部分。我这样做是因为正如我所说,我不知道如何正确使用调度程序库。我在网上找不到任何能真正解释该怎么做的资源。

如果您知道实现游戏循环的更好方法,也将不胜感激。希望您能提供帮助,因为我对我的丑陋/ hacky代码非常执着。

非常感谢您!

下面的代码是我的game.dart文件。在main.dart中,我仅使用Game类来创建视图。

import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';

class Game extends StatelessWidget {
  final GamePainter gamePainter = GamePainter();
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      body: Container(
        decoration: BoxDecoration(
          gradient: LinearGradient(
            begin: Alignment.topCenter,
            end: Alignment.bottomCenter,
            colors: [Colors.white, Colors.green],
          ),
        ),
        child: CustomPaint(
          painter: gamePainter,
          child: Center(),
        ),
      ),
    );
  }
}

class GamePainter extends CustomPainter {
  bool start = true;
  Duration previous = Duration.zero;
  @override
  void paint(Canvas canvas, Size size) {
    if(start) {
      scheduleTick();
      start = false;
    }
    // draw components
  }
  @override
  bool shouldRepaint(GamePainter oldDelegate) {
    return true;
  }
  int frameCallbackID;
  void scheduleTick() {
    frameCallbackID = SchedulerBinding.instance.scheduleFrameCallback(tick);
  }
  void tick(Duration timestamp) {
    scheduleTick();
    update(timestamp);
  }
  void update(Duration now) {
    // Update Components
  }
}

0 个答案:

没有答案