Java Android游戏:移动位图会在末端留下模糊的轨迹

Java Android游戏:移动位图会在末端留下模糊的轨迹,java,android,bitmap,android-animation,game-development,Java,Android,Bitmap,Android Animation,Game Development,我正在尝试创建一个Android游戏的背景滚动。假设它是一组以一定速度移动的图像。 为了测试一些基本元素,我拍摄了一个小的矩形图像,并将其从上到下线性移动。它在移动,但我看到一条很小的轨迹,就像火箭在云中飞行一样!。我在绘画课上尝试了各种方法来纠正这个问题,但我做不到 我将首先发布一个屏幕截图,然后添加相关代码 因此,这里的垂直线是单个png图像: 现在我所做的就是将这个位图从某个x,y移动,每次增加y 5。它会移动,但请注意移动时图像的端点。有点像线索,但不是永久的。我已尝试但无法消除此效果。

我正在尝试创建一个Android游戏的背景滚动。假设它是一组以一定速度移动的图像。 为了测试一些基本元素,我拍摄了一个小的矩形图像,并将其从上到下线性移动。它在移动,但我看到一条很小的轨迹,就像火箭在云中飞行一样!。我在绘画课上尝试了各种方法来纠正这个问题,但我做不到

我将首先发布一个屏幕截图,然后添加相关代码

因此,这里的垂直线是单个png图像:

现在我所做的就是将这个位图从某个x,y移动,每次增加y 5。它会移动,但请注意移动时图像的端点。有点像线索,但不是永久的。我已尝试但无法消除此效果。我试过三星Galaxy S5。我没有在任何其他模型上进行测试

守则:

移动的垂直图像是一个精灵对象:

package com.src.*.*;


import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Rect;
import android.util.Log;

public class Sprite {

    private Rect sourceRect;    // the rectangle to be drawn from the animation bitmap
    private int frameNr;        // number of frames in animation
    private int currentFrame;   // the current frame
    private long frameTicker;   // the time of the last frame update
    private int framePeriod;    // milliseconds between each frame (1000/fps)

    private int spriteWidth;    // the width of the sprite to calculate the cut out rectangle
    private int spriteHeight;   // the height of the sprite

    private int x;              // the X coordinate of the object (top left of the image)
    private int y;              // the Y coordinate of the object (top left of the image)
    private Bitmap bitmap;
    private float degrees;
    private boolean rotate=false;
    private Matrix matrix;
    private Bitmap reversedBitmap;
    private Paint paint;

    public Sprite(Bitmap bitmap, int x, int y, int fps, int frameCount) {
        this.bitmap = bitmap;
        this.x = x;
        this.y = y;
        currentFrame = 0;
        frameNr = frameCount;
        spriteWidth = bitmap.getWidth() / frameCount;
        spriteHeight = bitmap.getHeight();
        sourceRect = new Rect(0, 0, spriteWidth, spriteHeight);
        framePeriod = 1000 / fps;
        frameTicker = 0l;
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG
                | Paint.FILTER_BITMAP_FLAG);
        paint.setDither(true);
    }

    public void animate(){

    }
    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }

    public void setReverse(Bitmap reverse){
        this.reversedBitmap = reverse;
    }

    public void rorateSprite(float degrees){
        if(degrees == 0){
            rotate = false;
        }else{
            rotate = true;
        }
        this.degrees = degrees;
    }


        public void draw(Canvas canvas) {
            // where to draw the sprite
            Rect destRect = new Rect(getX(), getY(), getX() + spriteWidth, getY() + spriteHeight);

            if(rotate){
                canvas.drawBitmap(reversedBitmap, sourceRect, destRect, paint);
            }else{
                canvas.drawBitmap(bitmap, sourceRect, destRect, paint);
            }
            }

        public void update(long gameTime){
            if (gameTime > frameTicker + framePeriod) {
                frameTicker = gameTime;
                //Log.i("INFO", "In if loop" + currentFrame + " framenr:" + frameNr);
                // increment the frame
                currentFrame++;
                if (currentFrame >= frameNr) {
                    currentFrame = 0;
                }
            }else{
                //Log.i("INFO", "in else" + currentFrame + "");
            }
            // define the rectangle to cut out sprite
            //Log.i("INFO", "sprite width: " + spriteWidth);
            this.sourceRect.left = currentFrame * spriteWidth;
            this.sourceRect.right = this.sourceRect.left + spriteWidth;

        }
}
位图的设置如下所示: wallAnimation=新的SpriteSizedBitMapWall,0,0,30,1; wallAnimation.setXmargin

精灵的onDraw和更新如下所示。它工作正常,没有任何异常或错误。所有这些中唯一的问题是图像的末端有模糊/尾部效果。我甚至不知道该用什么词来形容它

onDraw和Update的代码:

@Override
protected void onDraw(Canvas canvas) {
    // fills the canvas with black
    canvas.drawColor(Color.WHITE);
    wallAnimation.draw(canvas);

    paint.setColor(Color.BLACK);

    for (int i = 0; i < 6; i++) {
        canvas.drawLine(margin+laneWidth*i, 0, margin+laneWidth*i, laneHeight, paint);

    }
    canvas.drawText("High Score: "+ highScore, 10, 10, paint);


}

public void Update(long gameTime) {
    // TODO Auto-generated method stub
    if(wallState < laneHeight+laneHeight/6){
        wallAnimation.setY(wallState);
        //wallState+=laneHeight/80;
        wallState+=20;
    }else{
        wallState = 0;
    }
}

你试过paint.setAntiAlias、setFilterBitmap和SetDitter吗?是的,我试过三个。它不起作用在不移动雪碧的情况下也会发生吗?不,不会。它以一定的速度发生。如果您看到我提到的最后一个函数,特别是这个增量wallState+=20;。如果我增加2,就可以了。当我增加3,4,5…20时,模糊量会增加。我想你需要在绘图时调用invalidate,以便它重新绘制。我只是在猜测。。。