gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:38:02 25 4
gpt4 key购买 nike

我正在玩游戏,我正在使用 SurfaceView。在游戏中,我有 25 个四处移动的小点。目标是制作一款游戏,让玩家在一些相同颜色的点周围画一个圆圈。我的问题是,当我画这个圆圈时,当我 Handlebars 指从屏幕上移开后,所有的点都移动得非常非常慢!我想这是因为所有的线段都被不断地连同所有的点一起绘制。

有没有可能一直有相同的点移动速度?我使用 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);
}

最佳答案

缓慢的绘制是由路径中的许多点引起的。如果您正在处理 Touch 事件,您可能会在短时间内收到成百上千次触摸(您的点数)。

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

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

编辑 - 对评论的回应:

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

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

这种方法的问题是很难实现恒定的 FPS。在快速硬件上,您将通过限制 FPS 来牺牲流畅性,在慢速硬件上,您将被迫跳过绘制(丢弃)一些帧(在 FPS 不变的情况下可能会跳动)。

Android 中的计时器不是很精确,线程休眠功能也不准确。在您的情况下,与其尝试强制恒定 FPS 或计算当前 FPS,不如尝试全神贯注并重新考虑您的问题在时间背景下。

When you think about time, it does not matter how fast is the game running (how many FPS) and what happened before.

You just need to ask a question "Where the ball should be in this moment, right now?"

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

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

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

关于android - 当物体数量增加时如何保持物体相同的速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16302715/

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