android-studio - 在 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;
}
}
解决方案
您不必自己处理渲染方法,只需将 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)
您的更新覆盖。
推荐阅读
- actionscript-3 - 如何创建随机名称选择器?动作脚本
- java - 创建一个Java循环,其中一个变量上升到99,而另一个变量下降到0
- python - 2020 年 Python 的 GUI 框架建议
- azure - Azure Function Consumption 静默流式传输大文件错误 500
- scala - 无法在 spark 中读取镶木地板文件:java.lang.NoSuchMethodError: org.json4s.jackson.JsonMethods
- python - 什么可能导致此错误:FileNotFoundError:[Errno 2] 没有这样的文件或目录
- c++ - C++ 数组编译
- python-3.x - 如何在指定时间内没有传入连接的情况下关闭 CherryPy?
- javascript - 如何在 jQuery 中编写 document.getElementsByClassName(names)[n]
- javascript - 围绕对象方法调用的 IF 安全检查