使用 canvas.drawBitmap 时位图重叠
Bitmaps overlap when using canvas.drawBitmap
我最近开始学习 android 和 java 并练习我开始制作 space 入侵者类型的游戏。
为了绘制所有图像(player/enemy/etc),我一直在使用覆盖的onDraw
方法和canvas.DrawBitmap(..)
。这就是我的问题开始的地方。每当我使用新的 X、Y 坐标绘制图像时,之前的位图仍在 canvas 上,这使得所有内容重叠。有什么方法可以刷新 canvas 或只是摆脱 "leftovers"(我什至不知道如何称呼它们)。当我做这个的时候,我的印象是我只是在屏幕上移动了 1 个图像,但看起来我错了。
这是我用来绘制播放器位图的代码:
public void render(Canvas canvas){
//draw the player image
canvas.drawBitmap(_bmPlayerImg, (float) (_dX - (_iHalfWidth)),
(float)(_dY - (_iHalfHeight)), null);
}
onDraw()
方法:
@Override
protected void onDraw(Canvas canvas) {
//draw the player
_player.render(canvas);
}//end method
onDraw()
方法在我用作游戏计时器的线程中每 50 毫秒调用一次:
public Runnable runnable = new Runnable() {
@Override
public void run() {
canvas = null;
try {
canvas = surfaceHolder.lockCanvas();
synchronized(surfaceHolder){
//update the state of all objects in the game
gamePanel.update(canvas);
gamePanel.onDraw(canvas);
}
} finally {
if (canvas != null) {
surfaceHolder.unlockCanvasAndPost(canvas);
}//end if
}//end finally
handler.postDelayed(this, _iRepeatTime);
}
};
感谢任何帮助...我尝试查找但找不到任何内容。
在 canvas 上绘制任何内容之前:
//clear the canvas
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
现在你的canvas已经清楚了,你可以画出你的角色了。
如果您的 onDraw 方法在展开视图中 class 并且由您调用 invalidate() 触发,那么 canvas 会自动清除自身。但是你是手动调用的(貌似你用的是surface/texture视图?),所以你得手动清除。
我最近开始学习 android 和 java 并练习我开始制作 space 入侵者类型的游戏。
为了绘制所有图像(player/enemy/etc),我一直在使用覆盖的onDraw
方法和canvas.DrawBitmap(..)
。这就是我的问题开始的地方。每当我使用新的 X、Y 坐标绘制图像时,之前的位图仍在 canvas 上,这使得所有内容重叠。有什么方法可以刷新 canvas 或只是摆脱 "leftovers"(我什至不知道如何称呼它们)。当我做这个的时候,我的印象是我只是在屏幕上移动了 1 个图像,但看起来我错了。
这是我用来绘制播放器位图的代码:
public void render(Canvas canvas){
//draw the player image
canvas.drawBitmap(_bmPlayerImg, (float) (_dX - (_iHalfWidth)),
(float)(_dY - (_iHalfHeight)), null);
}
onDraw()
方法:
@Override
protected void onDraw(Canvas canvas) {
//draw the player
_player.render(canvas);
}//end method
onDraw()
方法在我用作游戏计时器的线程中每 50 毫秒调用一次:
public Runnable runnable = new Runnable() {
@Override
public void run() {
canvas = null;
try {
canvas = surfaceHolder.lockCanvas();
synchronized(surfaceHolder){
//update the state of all objects in the game
gamePanel.update(canvas);
gamePanel.onDraw(canvas);
}
} finally {
if (canvas != null) {
surfaceHolder.unlockCanvasAndPost(canvas);
}//end if
}//end finally
handler.postDelayed(this, _iRepeatTime);
}
};
感谢任何帮助...我尝试查找但找不到任何内容。
在 canvas 上绘制任何内容之前:
//clear the canvas
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
现在你的canvas已经清楚了,你可以画出你的角色了。
如果您的 onDraw 方法在展开视图中 class 并且由您调用 invalidate() 触发,那么 canvas 会自动清除自身。但是你是手动调用的(貌似你用的是surface/texture视图?),所以你得手动清除。