Дублирование спрайта пламени Flutter на Android, но не на Iphone?

Создание игры с использованием движка Flutter Flame и AndroidStudio для разработки. Функция рендеринга использует функции canvas.save () и canvas.render (), которые обеспечивают четкость экрана между кадрами (для предотвращения дублирования отрисовки спрайтов). В симуляторе iPhone приложение работает должным образом, однако на нескольких симуляторах Android отрисовываются повторяющиеся спрайты. Не могу понять, почему это происходит ... Любая помощь приветствуется!

введите описание изображения здесь

import 'dart:ui';
import 'package:flame/components/component.dart';
import 'package:flame/flame.dart';
import 'package:flame/game.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';


class ThisGame extends Game {
  final SharedPreferences storage;
  Size screenSize;
  double tileSize;

  Player player;
  double spriteSize = 128;
  double timeElapsed = 0;

  ThisGame(this.storage) {
    initialize();
  }

  initialize() async {
    resize(await Flame.util.initialDimensions());
    player = Player();
    player.x = 0;
    player.y = 0;
  }

  @override
  void render(Canvas canvas) {
    canvas.save();
    player.render(canvas);
    canvas.restore();
  }

  @override
  void update(double t) {
    timeElapsed += t;
    if (timeElapsed > 1) {
      timeElapsed = 0;
      player.y += t * 300;
      player.x += t * 300;
    }
  }

  @override
  void resize(Size size) {
    screenSize = size;
    tileSize = screenSize.width / 9;
  }
}

class Player extends SpriteComponent {
  Player() : super.square(128.0, 'player.png') {
    this.angle = 0.0;
   }

}

person mark mark    schedule 05.04.2020    source источник
comment
Интересно, что вы можете попробовать в BlueStack, Nov или другом известном симуляторе, чтобы узнать, работает ли он. Я тоже не знаю этого вопроса, но мне просто любопытно, каков результат на этих знаменитых симуляторах.   -  person Tokenyet    schedule 06.04.2020


Ответы (1)


Вам не нужно самостоятельно обрабатывать метод рендеринга, просто добавьте свой SpriteComponent в игру, и он выполнит рендеринг за вас.

class ThisGame extends Game {
  final SharedPreferences storage;
  Size screenSize;
  double tileSize;

  Player player;
  double spriteSize = 128;
  double timeElapsed = 0;

  ThisGame(this.storage) {
    initialize();
  }

  initialize() async {
    resize(await Flame.util.initialDimensions());
    player = Player();
    player.x = 0;
    player.y = 0;
    add(player); // <-- Like this
  }

  @override
  void update(double t) {
    super.update(t) // Also don't forget to call super
    timeElapsed += t;
    if (timeElapsed > 1) {
      timeElapsed = 0;
      player.y += t * 300;
      player.x += t * 300;
    }
  }

  @override
  void resize(Size size) {
    screenSize = size;
    tileSize = screenSize.width / 9;
  }
}

class Player extends SpriteComponent {
  Player() : super.square(128.0, 'player.png') {
    this.angle = 0.0;
  }
}

Кроме того, не забудьте вызвать super.update(t) в своем переопределении обновления.

person spydon    schedule 08.06.2020