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