当物体数量增加时如何保持相同的物体速度?

时间:2013-04-30 14:44:48

标签: android

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

1 个答案:

答案 0 :(得分:1)

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

  1. 您需要以某种方式插入您的积分 - 取平均值,忽略相同点和关闭点或其他内容。
  2. 当您为“点”设置动画时,您的动画必须基于时间,而不是基于硬件绘图的实际速度。
  3. 要准时制作动画,您应该计算自上一帧以来经过的时间,并在计算点的新位置的函数中使用此时间。 这是一篇关于这个主题的好文章: 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

    一旦你习惯了这种方法,你就会发现绝大多数动画的实现都非常微不足道。