【问题标题】:Regulate speed of game with speed of screen touches通过屏幕触摸速度调节游戏速度
【发布时间】:2012-07-17 13:28:14
【问题描述】:

我正在创建一个游戏,用户必须更快地点击屏幕才能让他们在游戏中走得更快,但是我遇到了一些问题。我已经制作了游戏,因此它会根据用户的最后一次点击和他们当前的点击计算每分钟的点击次数,但是这种方法似乎很生涩并且效果不佳。我也想不出另一种方法来做到这一点,所以当他们根本不点击时,它会变慢。

我将如何为游戏创建这种机制:用户点击得越快,游戏进行得越快,如果他们根本不点击,游戏就会减速停止。

谢谢

这是我目前所拥有的一个 sn-p,计算用户每分钟的点击次数 (TPM)。 (这是在触摸方法中)。我目前正在将 TPM 传递给一个更新方法,该方法在每次更新时将背景移动 TPM/100(它以 30FPS 运行)

 if (thisTouch == 0 || lastTouch == 0) {
            Log.d("info","First Touch");
            thisTouch = lastTouch = System.currentTimeMillis();
        } else {
            Log.d("d","touch");
            thisTouch = System.currentTimeMillis();

            long difference = thisTouch - lastTouch;

            TPM = (int)((1000*60)/difference);

            lastTouch = thisTouch;
        }

我想知道如何更改此设置,以便游戏在点击更快时加速,然后在他们不触摸屏幕时减慢。

【问题讨论】:

  • 只是想知道你有什么,我可以看看你的算法吗?
  • @Addison - 编辑显示我到目前为止所拥有的
  • 为什么不根据差异本身计算“游戏速度”呢?将其用作乘数,直至某一点,以计算速度。

标签: java android performance touch


【解决方案1】:

也许你可以这样做:

  • 创建优先队列
  • 每当用户点击屏幕时,将 (currentTime + someTimeOut) 添加到队列中
  • 当您要检查当前速度(例如队列大小)时,首先删除所有元素 > currentTime。

当然,如果您执行此类操作,请不要忘记添加适当的线程安全措施。

【讨论】:

  • 你好。我已经“有点”使用了这种方法,但是感谢您提出它,因为它使我找到了一种有效的算法。我只是使用了 Queue,每次用户按下它都会将他们按下的时间添加到队列中。然后我使用 Peek() 检查队列的头部是否是 1s 前,如果是,我使用 Poll()。一旦对 > 1 秒前的所有项目完成此操作,(使用 while 循环)我得到了 Queue 的大小并将其传递给我的更新方法。
  • @TomRichardson:不客气。不要忘记为有帮助的答案投票,也许接受最好的答案。
  • 完成了,谢谢 :) (抱歉,我总是忘记点赞,然后直接跳回我的代码!)
【解决方案2】:

不要成为“那个家伙”,但听起来您当前的每分钟点击次数计划非常好,但实施得很糟糕。但是,我强烈建议您使用较小的时间量,例如每三秒点击一次,因为游戏通常节奏很快,并且必须等待整整一分钟才能看到您的角色加速或减速可能会产生延迟感。

或者,您可以使用某种形式的加速度,每次点击屏幕时都会将其增加到最大限制,并在不点击屏幕时随着时间的推移而减小。

现在我看到您用一些代码更新了您的问题,我想指出,点击是一种触摸,从屏幕上释放不一定是触摸。老实说,我从您的代码中不知道您是否对此进行补偿,因此这可能是您的一些问题的根源。

最后,对于游戏开发算法和理论,您可能希望查看此 StackExchange 站点:https://gamedev.stackexchange.com/

听起来您已经非常接近让您的游戏获得您想要的感觉,祝您好运!

【讨论】:

  • 非常感谢,我从来不知道网站的那部分!我现在去看看:)
  • @TomRichardson 我添加了一段,因为我看到你用一点代码更新了你的问题。非常欢迎您!
【解决方案3】:

您的一般方法几乎是唯一的方法,它只需要一些微调。

保留一个通用的 TapsPerTime 变量。对于您注册的每个新点击,不要替换 TapsPerTime,而是计算一个新的加权值:

TapsPerTime = (TapsPerTime * X) + (MeasureTapsPerTime * (1-X))

您需要凭经验找到的因子 X(通过尝试最适合您的方法)。这里的总体思路是,每次测量只会将使用的值稍微推向正确的方向。

此外,如果您在设定的时间内未检测到点击,只需使用相同的公式更新 TapsPerTime,但对 MeasureTapsPerTime 使用 0(零)。因此,如果用户不做任何事情,价值就会下降。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多