Andengine中的精灵闪烁
Sprites flicker in Andengine
我想以恒定的慢速从左向右移动一些精灵。我第一次尝试 RatioResolutionPolicy
但我看到精灵闪烁很多。然后我将分辨率策略更改为 FixedResolutionPolicy
,将精灵纹理定义为位图,缩放它们并通过这些纹理制作精灵(更多细节:click here)。这比第一种方法好,但并不完全好。我使用 setx()
来移动精灵。例如,当我将 x
位置更改为每个帧的 2 pixels
时,没有问题。但是对于具有不同分辨率的不同设备,我必须将 2
乘以一个比率。在这种情况下,精灵再次闪烁,虽然不多,但对我来说很烦人。
相机代码在下面
@Override
public EngineOptions onCreateEngineOptions() {
WindowManager w = getWindowManager();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
Point size = new Point();
w.getDefaultDisplay().getSize(size);
V.CAMERA_WIDTH = size.x;
V.CAMERA_HEIGHT = size.y;
} else {
Display d = w.getDefaultDisplay();
V.CAMERA_WIDTH = d.getWidth();
V.CAMERA_HEIGHT = d.getHeight();
}
if (V.CAMERA_HEIGHT/V.CAMERA_WIDTH>480f/860f){
V.CAMERA_HEIGHT=V.CAMERA_WIDTH*480f/860f;
}
else {
V.CAMERA_WIDTH=V.CAMERA_HEIGHT*860f/480f;
}
V.ratio=V.CAMERA_HEIGHT/480f;
this.mCamera = new Camera(0, 0, V.CAMERA_WIDTH, V.CAMERA_HEIGHT);
final EngineOptions engineOptions = new EngineOptions(true,
ScreenOrientation.LANDSCAPE_FIXED, new FixedResolutionPolicy((int)V.CAMERA_WIDTH, (int)V.CAMERA_HEIGHT),
this.mCamera);
return engineOptions;
}
移动精灵:
this.wallPosX -= this.speed;
this.setX(Math.round(this.wallPosX));
speed 是一个浮点变量,对于 1280x720 的屏幕分辨率,它的值为 4.4651165。如果我将它设置为整数则不会出现闪烁,但这次精灵速度因设备而异。
android 手机的屏幕尺寸和屏幕比例太多。
使用 jgibbs 创建的裁剪分辨率策略。按照 Martin Varga 的教程了解它的工作原理和实现方式。
它创造奇迹。
您不必担心微管理实体位置坐标以适应各种可能的屏幕尺寸。
我不确定这是否会解决闪烁问题,这可能是与您的相机无关的其他问题
我注意到这不是关于 Andengine,而是关于 opengl。这个问题的解决方案是这个很棒的工具:
https://github.com/gemserk/imageprocessing
我想以恒定的慢速从左向右移动一些精灵。我第一次尝试 RatioResolutionPolicy
但我看到精灵闪烁很多。然后我将分辨率策略更改为 FixedResolutionPolicy
,将精灵纹理定义为位图,缩放它们并通过这些纹理制作精灵(更多细节:click here)。这比第一种方法好,但并不完全好。我使用 setx()
来移动精灵。例如,当我将 x
位置更改为每个帧的 2 pixels
时,没有问题。但是对于具有不同分辨率的不同设备,我必须将 2
乘以一个比率。在这种情况下,精灵再次闪烁,虽然不多,但对我来说很烦人。
相机代码在下面
@Override
public EngineOptions onCreateEngineOptions() {
WindowManager w = getWindowManager();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
Point size = new Point();
w.getDefaultDisplay().getSize(size);
V.CAMERA_WIDTH = size.x;
V.CAMERA_HEIGHT = size.y;
} else {
Display d = w.getDefaultDisplay();
V.CAMERA_WIDTH = d.getWidth();
V.CAMERA_HEIGHT = d.getHeight();
}
if (V.CAMERA_HEIGHT/V.CAMERA_WIDTH>480f/860f){
V.CAMERA_HEIGHT=V.CAMERA_WIDTH*480f/860f;
}
else {
V.CAMERA_WIDTH=V.CAMERA_HEIGHT*860f/480f;
}
V.ratio=V.CAMERA_HEIGHT/480f;
this.mCamera = new Camera(0, 0, V.CAMERA_WIDTH, V.CAMERA_HEIGHT);
final EngineOptions engineOptions = new EngineOptions(true,
ScreenOrientation.LANDSCAPE_FIXED, new FixedResolutionPolicy((int)V.CAMERA_WIDTH, (int)V.CAMERA_HEIGHT),
this.mCamera);
return engineOptions;
}
移动精灵:
this.wallPosX -= this.speed;
this.setX(Math.round(this.wallPosX));
speed 是一个浮点变量,对于 1280x720 的屏幕分辨率,它的值为 4.4651165。如果我将它设置为整数则不会出现闪烁,但这次精灵速度因设备而异。
android 手机的屏幕尺寸和屏幕比例太多。
使用 jgibbs 创建的裁剪分辨率策略。按照 Martin Varga 的教程了解它的工作原理和实现方式。 它创造奇迹。
您不必担心微管理实体位置坐标以适应各种可能的屏幕尺寸。 我不确定这是否会解决闪烁问题,这可能是与您的相机无关的其他问题
我注意到这不是关于 Andengine,而是关于 opengl。这个问题的解决方案是这个很棒的工具: https://github.com/gemserk/imageprocessing