我有一个显示彩色块阵列的游戏。用户可以在屏幕上移动这些块。触摸事件发生时,我会记下被触摸的单元格(cell[i][j].isMoving = true
)。如果用户移动块我将相对于偏移值绘制矩形。当检测到触摸事件时,我会检查用户是否已将块拖动到足以表示移动块的位置。
我的基本绘制循环如下:
for(int i = 0; i < xCells, i++){
for(int j = 0; j < yCells; j++){
if(cell[i][j].isMoving)
canvas.drawRect(...) // draw with offsets
else
canvas.drawRect(..)
}
}
我遇到的问题是,当用户释放该块时,它偶尔会轻微闪烁。
当发生补足事件时,必须将偏移设置为0,更改块的坐标(如果满足要求)并且isMoving
必须设置为false
。
由于我有一个不断运行的线程调用上面的绘图代码,看起来UI线程正在改变块数组,这意味着当draw方法发生时它处于不一致状态。
有没有人就如何解决此问题提出建议?我可以使用处理程序吗?我已尝试同步onTouchEvent
方法和onDraw
方法,但这似乎偶尔会阻止用户输入
感谢
答案 0 :(得分:0)
安全的解决方案是只允许一个线程创建对象,在游戏开始后从List或数组中添加和删除它们。
我遇到了随机AIOOBE(Array Index Out Of Bounds Exception)错误的问题,没有同步可以正确解决它,加上它减慢了用户的响应。
我的解决方案,现在稳定而快速(从未有过AIOOBE)是让UI线程通过将布尔标志和触摸坐标设置为简单变量来通知游戏线程创建或操作对象。
由于游戏线程每秒循环约60次,因此证明足以从UI线程中获取消息并对其执行某些操作。
在你的情况下,onTouch事件不应该直接改变cell [i] [j],而只是将某个整数设置为particluar值。然后你的线程会在某个时候评估这些变量并设置单元格[i] [j]然后绘制,所以onTouch永远不会无法预测地与你的线程相互干扰。
这是一个非常简单的解决方案,效果很好......