gpt4 book ai didi

java - 安卓Java。 invalidate(Rect) 的奇怪行为

转载 作者:行者123 更新时间:2023-12-01 05:18:14 25 4
gpt4 key购买 nike

我用 invalidate(Rect) 得到了奇怪的效果。

我在 Canvas 上使用 onDraw 方法。在最简单的情况下,我有一个背景和一个 Sprite 。

在第一次通过 onDraw 时,我绘制背景并使用 invalidate(Rect) (一个覆盖整个游戏场的矩形),并在同一次传递中,我绘制一个 Sprite 并且(因为所有传递的代码都是相同的) )我对 Sprite 所在的矩形执行 invalidate(Rect) 操作。

第一次通过后,比赛 field 是正确的。整个背景就位,并叠加了 Sprite 。

在onDraw的下一次和后续遍历中,我绘制 Sprite 所在背景的“脏”位,并对其以及 Sprite 及其新的“脏”矩形执行无效(矩形),并且 Sprite 的另一个无效(矩形)。

在这个 channel 和所有后续 channel 之后,我只能看到 Sprite 。就好像 Canvas 已被清除。

是否不允许在一次传递中执行多个invalidate(Rect)?这是问题所在吗?我遇到过一些异步问题吗?

这是 onDraw() 代码。如果我在 onDraw() 末尾执行全屏 invalidate() ,它工作正常,但速度很慢。它还缩放所有图像。所有图像和屏幕位置均基于 640x480 的比赛 field ,并缩放到当前 Android 设备的大小。一切正常,直到我尝试优化屏幕使用 invalidate(Rect) 进行绘制。

    @Override
protected void onDraw(Canvas canvas)
{
int ii;

// Draw the background scene
// Restore all the bits of the backcloth that got
// trampled on by any sprites or the cursor
// On the first pass the whole playfield dirty rectangle is in place in mask
paint.reset();
mask.collapse();
ArrayList <Rect> usedSet = mask.getUsedRectSet();
for (ii = 0; ii < usedSet.size(); ii++)
{
Rect src = rescaleRect(usedSet.get(ii));
Rect dst = displaceRect(src);
canvas.drawBitmap(backcloth, src, dst, paint);
invalidate(dst);
}
// Leave used Rect set clear for next set of sprites
mask.ClearUsedRectSet();

//
// draw Sprites
// screen scaling and
// displacement is done here.
//
ArrayList <Sprite> slist = jadedata.getCurrentSprites();
//Sort sprites into ascending order of priority
// This is a sinking sort. On first pass, the highest
// priority sprite arrives at the bottom. On second,
// the next highest arrives at second bottom, etc.
// Sprites of the same priority remain in their
// original sequence with respect to each other.
for (ii = 0; ii< slist.size()-1; ii++)
{
int sw=0;
for (int jj = 0; jj < (slist.size()-ii-1); jj++)
{
Sprite spare1 = slist.get(jj);
Sprite spare2 = slist.get(jj+1);
if (spare1.getPriority() > spare2.getPriority())
{
slist.set(jj+1, spare1);
slist.set(jj, spare2);
sw=1;
}
}
if (sw==0) break; // exit if slist is already in sequence
}

for (ii = 0; ii< slist.size(); ii++)
{
Point p = new Point();
Point e = new Point();
Rect o = new Rect();
Sprite sprite = (Sprite)slist.get(ii);
// Zero-priority sprites do not get drawn
if (sprite.getPriority() == 0) continue;
p = sprite.getPosition();
e = sprite.getExtent();
// make a rect for usedRects
Rect r = new Rect(0, 0, e.x-1, e.y-1);
Rect src = new Rect(r);
// move it to the model playfield position
r.offset(p.x-e.x/2, p.y-e.y/2);
// make an overlap rect so we can apply it to the source image
o = overlapRect(r, 0, 0, iWidth, iHeight);
// trim r for the used rectangles
r = trimRect(r, 0, 0, iWidth, iHeight);
// add it to used Rectangles
mask.addNewRect(r);
// draw the sprite image
Rect d = rescaleRect(usedSet.get(ii));
Rect dst = displaceRect(d);
Bitmap spriteim = sprite.getCurrentImage();
src.top += o.top;
src.left += o.left;
src.bottom -= o.bottom;
src.right -= o.right;
canvas.drawBitmap(spriteim, src, dst, paint);
invalidate(dst);
}

最佳答案

由于您没有提供代码,所以不确定您在做什么,所以我只会给出一般提示:

对于第一遍之后的遍,仅在脏矩形上使用 invalidate,并在 onDraw 方法中绘制需要绘制的所有内容,但仅在脏矩形内。

关于java - 安卓Java。 invalidate(Rect) 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10864073/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com