【问题标题】:Scaling in android game development, how to do it properly?android游戏开发中的缩放,如何正确进行?
【发布时间】:2014-05-11 16:41:06
【问题描述】:

所以,最近我和我的两个队友开始了我们的考试项目。这是一个基本的 2D 跳台滑雪游戏。

我们之前在 Android 上进行过编程,但从未与游戏相关,我们掌握了使用线程创建动画的基本技术等等。但我们似乎遇到了扩展问题。

目前我们在可绘制文件夹中有一个分辨率为 1920x1080 的背景图像,我们正在使用 BitmapFactory 将背景图像缩放到用户的屏幕尺寸,这似乎工作正常,它完美地适合我们所有 3 种不同的智能手机。

正在创建玩家精灵从山上滑雪下来并从边缘跳下的动画,看起来非常有趣并且效果很好。为此,我只是将屏幕宽度和高度除以 100,然后使用 1% 屏幕宽度的百分比在 x 轴上以特定速度移动他,同样在 y 轴上以屏幕高度的 1% 移动他。

它适用于大多数手机,但由于某种原因它不适用于所有手机?我不明白为什么不呢?我的意思是数学应该总是有效的,不是吗?在一些手机上,他在山外的空中飞翔,而不是在正确的轨迹上。我不明白我错过了什么,但我怀疑它与屏幕格式或其他什么有关?

谁能告诉我这个?请记住,这是我们的第一个安卓游戏,所以是游戏开发的新游戏。

如果您事先有任何意见,感谢您的所有意见。

【问题讨论】:

  • 我建议使用游戏引擎,这里提到了一些stackoverflow.com/questions/13071138/android-game-engine
  • 无论您使用什么屏幕,都将播放器移动到相同的 deltax/deltay,只有在 Canvas 上绘图时 concat()使用每个屏幕不同的转换矩阵来创建 Canvas
  • 我应该在前面提到,不允许使用任何引擎。关键是我们自己从头开始编码。 @Pskink 你介意放弃一个关于你如何去做的小例子的答案吗?如果这能解决我们的问题,我将不胜感激。
  • 计算转换矩阵,如果一个屏幕比其他屏幕大 1.5,那么它的转换矩阵应该缩放 1.5 倍,通过调用 canvas.concat(matrix) 在 onDraw 中使用该矩阵,绘制原始位图,绘制玩家精灵,瞧
  • 所以我应该在 draw 方法中做的第一件事是创建一个矩阵,设置矩阵的比例并将其添加到画布上(假设视图加载后只有一次?)。然后画出我需要的所有图像?如果理解正确,我应该只加载原始大小的图像并使用它,还是应该花时间调整它们的屏幕大小?

标签: android scale scaling image-scaling


【解决方案1】:

试试这个:

class V extends View implements Callback {

    private Bitmap mBitmap;
    private Matrix mMatrix;
    private Handler mHandler;
    private float mX;
    private Paint mPaint;

    public V(Context context) {
        super(context);
        Resources res = getResources();
        mBitmap = BitmapFactory.decodeResource(res, R.drawable.layer0);
        mMatrix = new Matrix();
        mHandler = new Handler(this);
        mHandler.obtainMessage(0).sendToTarget();
        mPaint = new Paint();
        mPaint.setColor(0xff00ff00);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        RectF src = new RectF(0, 0, mBitmap.getWidth(), mBitmap.getHeight());
        RectF dst = new RectF(0, 0, w, h);
        mMatrix.setRectToRect(src, dst, ScaleToFit.CENTER);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.concat(mMatrix);
        canvas.drawBitmap(mBitmap,  0,  0, null);
        canvas.drawRect(mX, 20, mX + 20, 40, mPaint);
    }

    @Override
    public boolean handleMessage(Message msg) {
        msg = mHandler.obtainMessage(0);
        if (mX < mBitmap.getWidth()) {
            mX += 1.5f;
            mHandler.sendMessageDelayed(msg, 50);
        } else {
            Log.d(TAG, "handleMessage stop");
        }
        invalidate();
        return true;
    }
}

【讨论】:

  • 我希望添加:确保将图像放在 res/drawable-nodpi 文件夹中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-03
  • 1970-01-01
  • 2019-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多