Каков наилучший способ реализовать игровой цикл во флаттере? - PullRequest
0 голосов
/ 17 октября 2019

Спасибо, что нашли время для рассмотрения моего вопроса!

TL; DR Каков наилучший способ реализации игрового цикла во флаттере (можно использовать библиотеку планировщика)?

Я борюсь с реализацией работающего игрового цикла во Flutter (я хочу написать простую игру). Я не уверен, как правильно использовать библиотеку планировщика, чтобы функция вызывалась один раз за кадр со скоростью 60 кадров в секунду. Мой код работает, но он выглядит очень хакерским, особенно в той части, где я вызываю scheduleTick в функции рисования. Я сделал это, потому что, как я сказал, я не знаю, как правильно использовать библиотеку планировщика. Я не смог найти в Интернете никаких ресурсов, которые бы действительно объясняли, что делать.

Также я был бы признателен, если бы вы знали, как лучше реализовать игровой цикл. Я надеюсь, что вы можете помочь, поскольку я в значительной степени застрял с моим уродливым / хакерским кодом.

Большое вам спасибо!

Ниже приведен код моего файла 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
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...