1

我在玩游戏,我正在使用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);
}
4

1 回答 1

1

绘制缓慢是由路径中的许多点引起的。如果您正在处理Touch事件,您可以在短时间内期待成百上千的触摸(您的积分)。

  1. 你需要以某种方式插入你的点 - 取平均值,忽略相同和接近的点或其他东西。
  2. 当您为“点”设置动画时,您的动画必须基于时间,而不是基于硬件绘图的实际速度。

为了使您的动画基于时间,您应该计算自上一帧以来经过的时间,并在计算点的新位置的函数中使用这个时间。这是一篇关于这个主题的精彩文章: http ://www.koonsolo.com/news/dewitters-gameloop/

编辑 - 对评论的回应:

假设你的“点”(我称之为)需要以每秒单位X的恒定速度从左到右水平移动(通过 ) 。100

如果您在假设您的游戏将以25 FPS运行的情况下进行计算,您只需添加4X每一帧。

这种方法的问题是很难获得恒定的 FPS。 在快速硬件上,您将通过限制 FPS 来牺牲平滑度,在慢速硬件上,您将被迫跳过绘制(丢弃)一些帧(在恒定 FPS 下可能会出现跳跃)。

Android中的计时器不是很精确,线程睡眠功能也不准确。在您的情况下,与其尝试强制保持恒定 FPS 或计算当前 FPS,不如尝试转过头来重新考虑您的问题。

当您考虑时间时,游戏运行的速度(多少 FPS)以及之前发生的事情并不重要。

你只需要问一个问题“此时此刻,球应该在哪里?”

X0例如,如果您知道球的运动在起点时盯着起点位置,T0那么在当前时刻TC球的位置应该是X = (TC - T0) * 100

第二种方法是测量TD自上次球位置更新以来经过的时间。然后球的位置应该像这样更新:X = X + TD * 100

一旦你习惯了这种方法,你会发现绝大多数动画实现起来非常简单,而且准确度很高。

于 2013-04-30T15:04:00.893 回答