Сделать объект (растровое изображение) на холсте в Android 2D игре - PullRequest
1 голос
/ 15 марта 2012

Перемещение объектов в 2D-игре очень просто в Android-2D-игре, мы знаем.Просто используйте SurfaceView и нарисуйте отдельные растровые изображения с помощью Canvas.drawBitmap ().

Но как мне этого добиться, когда дело доходит до вращающегося объекта, например шара?Использование матриц преобразования приводит к очень низкому качеству отрисованного растрового изображения, не так ли?

1 Ответ

1 голос
/ 15 марта 2012

Если вы хотите повернуть растровое изображение с помощью рисования на основе Canvas, у вас нет особого выбора, кроме как использовать матрицы преобразования, либо через Matrix , который вы передаете Canvas.drawBitmap (), либо через операции преобразованиявызывается прямо на холсте.И если вы включите фильтрацию растрового изображения с помощью Paint.setFilterBitmap (логическое значение) , качество будет хорошим, по крайней мере, по моим стандартам.

Вот полный пример (на основе матрицы), в который вы можете игратьвокруг, в частности, глядя на то, какую разницу имеет включение и выключение растровой фильтрации (или просто посмотрите на мои скриншоты ниже).Хотя он не использует SurfaceView, просто обычный пользовательский вид, но его легко перенести на SurfaceView:

CustomView.java :

package com.example.android;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.util.TypedValue;
import android.view.View;

public class CustomView extends View {
    private static final float DP_PER_SECONDS = 10;

    private final float mBallCirfumference;
    private final float mBallRadius;
    private final Bitmap mBallBitmap;
    private final Paint mBallBitmapPaint;
    private final Matrix mBallTransformMatrix = new Matrix();
    private final float mPxPerSecond;

    private long mStartTime = -1;

    public CustomView(Context context) {
        super(context);
        final Resources res = getResources();

        // Load the ball bitmap. You probably want to use a better bitmap ;)
        mBallBitmap = BitmapFactory.decodeResource(res, R.drawable.icon);

        // We need the radius and circumference of the ball for our calculations
        // later
        mBallRadius = mBallBitmap.getHeight() / 2;
        mBallCirfumference = mBallRadius * 2 * (float)Math.PI;

        // Create ourself a paint object so we can adjust the quality of the
        // bitmap drawing
        mBallBitmapPaint = new Paint();

        // Significantly improves quality when drawing transformed bitmaps. Compare
        // with when you disable this, which is the default
        mBallBitmapPaint.setFilterBitmap(true);

        // Calculate speed of ball in pixels
        mPxPerSecond = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, DP_PER_SECONDS,
                res.getDisplayMetrics());
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        // Calculate how far into the animation we are
        if (mStartTime == -1) {
            mStartTime = getDrawingTime();
        }
        long currentTime = getDrawingTime();
        float secondsPassed = (currentTime - mStartTime) / 1000.0f;

        // Calculate how far the ball has moved and how many degrees it has been
        // rotated as a consequence of the movement
        float movedDistance = secondsPassed * mPxPerSecond;
        float fullRotationsMade = movedDistance / mBallCirfumference;
        float rotationInDegrees = fullRotationsMade * 360;

        // Setup the transformation matrix to simulate a rolling ball
        mBallTransformMatrix.reset();
        mBallTransformMatrix.postRotate(rotationInDegrees, mBallRadius, mBallRadius);
        mBallTransformMatrix.postTranslate(movedDistance, 0);
        canvas.drawBitmap(mBallBitmap, mBallTransformMatrix, mBallBitmapPaint);

        // Force redraw so we get an animation
        invalidate();
    }
}

ExampleActivity.java :

package com.example.android;

import android.app.Activity;
import android.os.Bundle;

public class ExampleActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new CustomView(this));
    }
}

Пример снимка экрана с фильтрацией растровых изображений включена .Если вы запустите пример, растровое изображение будет катиться, как шарик (извините, что я плохо выбрал графику шариков):

enter image description here

Пример снимка экрана с фильтрацией растровых изображений отключен .

enter image description here

...