当前位置: 首页 > 知识库问答 >
问题:

Android开发 - 精灵在移动时不会重新绘制,会克隆到下一个位置 - 留下痕迹

乔凯康
2023-03-14

我在学习Android编程时遇到了一些问题。我得到了以下内容:一个RelativeLayout,我在其中添加了一个名为“GameView”的新类,扩展了一个表面视图。这个“GameView”类包含了一个“GameThread”类的对象,一个我创建的线程类。所以现在我的问题是,这个线程类一直调用我的表面视图的onDraw()方法。现在我让表面视图在屏幕上绘制一个位图,每次调用onDraw()时,它应该向右移动10个像素。但是现在我的问题是,第一个图像保持在它的位置,右边出现了另一个10个像素的图像。它看起来像这样:

https://docs.google.com/file/d/0B7rVL5jhBMejN2VwTWlmaG1XemM/edit?usp=sharing

现在,我如何能够创建一个平滑的移动雪碧没有这样的克隆图像的痕迹?

我的代码:主类:

    import android.os.Bundle;
    import android.app.Activity;
    import android.view.Menu;
    import android.widget.RelativeLayout;

    public class MainActivity extends Activity {    

  RelativeLayout rLayout;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    rLayout = (RelativeLayout)findViewById(R.id.all);
    rLayout.addView(new GameView(this));

  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
  }

    }

和游戏视图类

    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;

    public class GameView extends SurfaceView {

    private Bitmap bmp;
    private SurfaceHolder holder;
    private GameThread gameThread;
    private int x = 11;

    public GameView(Context context) {
    super(context);
    gameThread = new GameThread(this);
    holder = getHolder();
    holder.addCallback(new SurfaceHolder.Callback() {

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {

        }

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            gameThread.start();
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

        }
    });
    bmp = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
    }

    @Override
    protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.drawBitmap(bmp, x, 10, null);
    x += 1;
    }



    } 

和游戏循环类:

    import android.graphics.Canvas;

    public class GameThread implements Runnable{
    private GameView gameView;
    private boolean isRunning = false;

    public GameThread(GameView gameView) {
    this.gameView = gameView;
    }

    public void start() {
    isRunning = true;
    new Thread(this, "Game Thread").start();
    }

    @Override
    public void run() {
    while(isRunning) {
        Canvas c = null;
        try {
            c = gameView.getHolder().lockCanvas();
            synchronized (gameView.getHolder()) {
                gameView.onDraw(c);
            }
        } finally {
            if(c != null) {
                gameView.getHolder().unlockCanvasAndPost(c);
            }
        }
    }
    }   
    }

我希望有人可以帮助我,谢谢!

共有1个答案

杨成礼
2023-03-14

在绘制精灵之前添加以下内容:

canvas.drawRGB(0, 0, 0)

在绘制下一帧之前,您需要重置画布的背景。

也可以试试< code>canvas.drawARGB(100,0,0,0)。这将绘制一个半透明的背景,这将允许一些以前绘制的位图显示出来。看起来精灵在它身后留下了微弱的痕迹。

 类似资料:
  • 我正在用PyGame制作一个小游戏,相机聚焦在一个代表角色的精灵上,当按下箭头键时,地图会围绕它移动。问题是地图不动。我以前多次遇到过这个问题,我想我已经把它缩小到可能的范围,但是我不知道如何真正解决这个问题。 这是代码: 基于我过去的PyGame程序,我总是在移动被绘制到屏幕上的精灵集时遇到问题,比如我在这里所做的。即使是平庸简单的例子也会失败。我想知道的是这是为什么,我怎样才能简明扼要地画出大

  • 我创建了一个程序,创建一个正方形并将其绘制在JPanel上。还有控制正方形运动的键绑定(w为上)(s为下)(a为左)(d为右)。我的问题是,当我按下键时,它会移动一个实例,犹豫,然后继续移动。有没有办法防止运动的犹豫。 这是我的面板类。 任何帮助都将不胜感激。非常感谢。

  • 我想重新绘制我的屏幕。到目前为止,它所做的只是在第一个屏幕上的头部应该在的地方显示一个点。这很好,但是我在代码中写了我想每秒将头部向下移动10个像素。我正在打印头部应该在的位置,在命令提示符中它显示y值确实在增加。但是在我的屏幕上,头部没有移动。 我尝试过使用revalidate方法,尝试扩展canvas类而不是jframe,我尝试过只为paint方法使用不同的类,我尝试过用paintCompon

  • 移动精灵 现在你知道了如何展示精灵,但是让它们移动呢?很简单:使用Pixi的ticker。这被称为 游戏循环 。任何在游戏循环里的代码都会1秒更新60次。你可以用下面的代码让 cat 精灵以每帧1像素的速率移动。 function setup() { //Start the game loop by adding the `gameLoop` function to //Pixi's `t

  • 精灵位置 现在你知道了怎么创建和显示一个精灵,让我们学习如何定位他们的位置和改变他们的大小 在最早的示例里那个猫的精灵被放在了舞台的左上角。它的x和y坐标都是0。你可以通过改变它的x和y坐标的值来改变他们的位置。下面的例子就是你通过设置x和y为96坐标让它在舞台上居中。 cat.x = 96; cat.y = 96; 在你创建这个精灵之后,把这两行代码放进setup方法。 function set

  • 刚开始使用pygame,当你按住箭头键时,试图让一个简单的点在屏幕上移动。目前,它只在你按键时移动,但你必须重复按键。 此外,我很感激你对我目前的代码有任何建议,可以改进或改变,使之更有效。