我正在玩游戏而我正在使用SurfaceView
。在游戏中我有25个小点在四处移动。目标是制作一个游戏,其中玩家围绕一些具有相同颜色的点画圆圈。我的问题是,当我画出这个圆圈并且我从屏幕上抬起手指后,所有的点都移动得非常非常慢!我想这就是为什么所有的线段都被不断地与所有点一起绘制。
是否可以始终保持相同的点移动速度?我用SystemClock.Sleep(1)
进行了测试,但没有多大帮助。
// Method to draw objects
private void drawObjects(Canvas canvas) {
SystemClock.sleep(1);
synchronized (this) {
// Clear screen with black color
canvas.drawRGB(0, 0, 0);
// Draw line
if(startDrawLine) {
// Set properties to Paint object
paint.setColor(Color.WHITE);
paint.setStrokeWidth(5);
paint.setStyle(Paint.Style.STROKE);
paint.setAntiAlias(true);
// Draw path
path.moveTo(touchDownX, touchDownY);
for(Point point: points) {
path.lineTo(point.x, point.y);
canvas.drawPath(path, paint);
}
path.reset();
}
}
// Call method draw() in CircleManager to draw all circles in list
circleManager.drawCirclesInList(canvas);
}
答案 0 :(得分:1)
慢速绘制是由路径中的许多点引起的。
如果您正在处理Touch
事件,您可以在短时间内完成数百次触摸(您的积分)。
要准时制作动画,您应该计算自上一帧以来经过的时间,并在计算点的新位置的函数中使用此时间。 这是一篇关于这个主题的好文章: http://www.koonsolo.com/news/dewitters-gameloop/
编辑 - 对评论的回复:
假设你的“点”(我称之为球)需要从左到右水平移动(X
)一个常数速度为每秒100
个单位。
如果您正在计算假设,您的游戏将以 25 FPS 运行,您只需将4
添加到X
即可每一帧。
这种方法的问题是获得不变的FPS很难实现。 在快速硬件上,你将通过限制FPS来牺牲平滑度, 在慢速硬件上,您将被迫跳过绘制(丢弃)一些帧(可以使用常量FPS跳转)。
Android中的计时器不是很精确,线程休眠功能也不准确。 在你的情况下,不要试图强制恒定的FPS或计算当前的FPS,而是试着绕过你的头并重新考虑你的问题 在时间的背景下。
当你考虑时间时,游戏的速度并不重要 跑步(多少次FPS)以及之前发生的事情。
你只需要问一个问题“球应该在哪里 那一刻,现在?“
例如,如果你知道球的移动在原点时间X0
盯着原点位置T0
那么在当前时刻TC
球的位置应为X = (TC - T0) * 100
< / p>
第二种方法是测量自上次球位置更新以来经过TD
的时间。然后球的位置应该像这样更新:X = X + TD * 100
一旦你习惯了这种方法,你就会发现绝大多数动画的实现都非常微不足道。