【发布时间】:2016-09-04 13:27:15
【问题描述】:
我没有 2D 图形和游戏体验。我通过数百个错误和数十个小时的损失自学。我从简单的装扮游戏开始。我使用 Nexus 5x 进行屏幕看起来不错的开发。当我完成一个里程碑时,我尝试在大型联想平板电脑和小型三星迷你手机上玩游戏。看起来很可怕。
原始矢量 PSD 文件看起来很完美,PNG 导出也没有任何问题。但是当我缩放图片时,它是颠簸的。我知道它是位图。但是我在其他地方缩放了另一张图片,看起来不错(两张图片都是 32 位的):
当我从 Google Play 玩一些游戏时,他们从来没有遇到过缩放问题。它们是如何实施的?他们使用向量吗?有什么诀窍吗?
我将所有内容都放入assets 文件夹中,尽管它占用了 1 MB。我反编译了一些 apk,它们没有针对每个分辨率的一组变体。虽然它们可以很好地缩放图片。
一些源代码sn-ps:
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
this.w = w;
this.h = h;
canvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
drawCanvas = new Canvas(canvasBitmap);
}
protected void onDraw(Canvas canvas) {
if (baseBitmap != null) {
double scale = Math.min((double) w / (double) figure.getW(), (double) h / (double) figure.getH());
figure.setScaleRatio(scale);
int sw = (int) (scale * figure.getW());
int x = ((w - sw) >> 1);
figure.setX(x);
paintDressPart(canvas, figure, figure.getMain());
if (displayedParts != null) {
for (DressPart dressPart : figure.getParts()) {
if (displayedParts.contains(dressPart.getId())) {
paintDressPart(canvas, figure, dressPart);
}
}
}
}
}
private void paintDressPart(Canvas canvas, Figure figure, DressPart part) {
double scale = figure.getScaleRatio();
int sh = (int) (scale * part.getH());
int sw = (int) (scale * part.getW());
int sdx = (int) (scale * part.getDestX());
int sdy = (int) (scale * part.getDestY());
scaledRect.set(figure.getX() + sdx, sdy, figure.getX() + sw + sdx, sh + sdy);
Rect partRect = part.getRect();
canvas.drawBitmap(baseBitmap, partRect, scaledRect, canvasPaint);
}
如果你想自己看,我在 GitHub 上准备了完整的项目,所以你可以下载并自己运行它:
https://github.com/literakl/DressUp
更新
缩小比例也很糟糕。但感谢 Paavnet 的评论,我意识到 Paint 很重要。在图片上查看差异:
我在 3,2" AVD 图像上运行演示应用程序。图片 278x786 缩放为 107x303。
10 月更新
我重写了应用程序以使用资源文件夹而不是资产。 Android 缩放图片,然后我再次重新缩放它。虽然它看起来比我不使用 Android 资源缩放时要好。资源缩放图片看起来通常比未缩放的 nodpi / assets 图片更好。
我发现 mdpi 效果最好。我什至有 xxhdpi 图片,它看起来比 mdpi 差。我认为即使在 xxhdpi 设备上!但是画得不好可能是这幅画的一个问题。 Android 资源缩放可能会平滑线条的边缘。
【问题讨论】:
-
我尝试在纵向模式下将图片缩放到全屏,看起来不错。缩小尺寸会丢失细节吗?
-
如果您将尺寸缩小一半以上,许多图像缩小算法都会出现问题。我会尝试通过多个步骤调整您的大小,看看是否有帮助。
-
到目前为止,我已经做了很多升级测试。基本上 150x150 和 250x250 对小屏幕和大屏幕都是无用的,而在任何屏幕上 320x586、640x960 或 1242x2208 之间的视觉差异很小。
-
您是否使用了正确的位图配置?
-
这里是获取设备指标(例如密度)的方法 WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);最终的 DisplayMetrics displayMetrics = new DisplayMetrics(); wm.getDefaultDisplay().getMetrics(displayMetrics);
标签: android 2d game-development