Java 用触摸屏的速度调节游戏的速度

Java 用触摸屏的速度调节游戏的速度,java,android,performance,touch,Java,Android,Performance,Touch,我正在创建一个游戏,用户必须更快地点击屏幕,以允许他们在游戏中更快地移动,但是我遇到了一些问题。我制作了这个游戏,所以它可以根据用户上一次点击和当前点击计算出每分钟点击量,但是这个方法似乎有些急促,效果不太好。我也无法想出另一种方法来做这件事,所以当他们根本不点击时,它会变慢 我该如何为游戏创建这种机制,用户点击的速度越快,游戏运行的速度就越快,如果他们根本不点击,游戏就会停止 谢谢 这里是我到目前为止的一个片段,计算用户每分钟的点击率(TPM)。(这是触控式方法)。我目前正在将TPM传递到一个

我正在创建一个游戏,用户必须更快地点击屏幕,以允许他们在游戏中更快地移动,但是我遇到了一些问题。我制作了这个游戏,所以它可以根据用户上一次点击和当前点击计算出每分钟点击量,但是这个方法似乎有些急促,效果不太好。我也无法想出另一种方法来做这件事,所以当他们根本不点击时,它会变慢

我该如何为游戏创建这种机制,用户点击的速度越快,游戏运行的速度就越快,如果他们根本不点击,游戏就会停止

谢谢

这里是我到目前为止的一个片段,计算用户每分钟的点击率(TPM)。(这是触控式方法)。我目前正在将TPM传递到一个更新方法中,该方法在每次更新时(以30FPS的速度运行)都会将后台移动TPM/100

我想知道我如何改变这一点,使游戏在他们点击更快时加速,然后在他们不触摸屏幕时变慢。

不想成为“那个家伙”,但听起来你目前的每分钟点击数计划相当不错,但只是执行得不好。然而,我强烈建议减少游戏的时间量,比如每三秒轻拍一次,因为游戏通常节奏很快,而且要等整整一分钟才能看到你的角色加速或减速,这可能会产生延迟的感觉

或者,您可以使用某种形式的加速度,每次点击屏幕时,加速度会增加到最大极限,而随着时间的推移,加速度会随着屏幕未点击而减小

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

最后,对于游戏开发算法和理论,您可能希望看到此StackExchange站点:

听起来你很快就能让你的游戏达到你想要的效果了,祝你好运

不是“那个家伙”,但听起来你目前的每分钟点击量计划相当不错,只是执行得不好。然而,我强烈建议减少游戏的时间量,比如每三秒轻拍一次,因为游戏通常节奏很快,而且要等整整一分钟才能看到你的角色加速或减速,这可能会产生延迟的感觉

或者,您可以使用某种形式的加速度,每次点击屏幕时,加速度会增加到最大极限,而随着时间的推移,加速度会随着屏幕未点击而减小

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

最后,对于游戏开发算法和理论,您可能希望看到此StackExchange站点:


听起来你很快就能让你的游戏达到你想要的效果了,祝你好运

也许你可以这样做:

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

当然,如果您这样做,请不要忘记添加适当的线程安全措施。

也许您可以这样做:

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

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

您的常规方法几乎是实现这一点的唯一方法,它只需要一些微调

保留一个常规TapsPerTime变量。对于注册的每个新抽头,不要替换抽头时间,而是计算一个新的加权值:

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

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


此外,如果在设定的时间内未检测到抽头,只需使用相同的公式更新抽头时间,但使用0(零)表示MeasureTapPertime。因此,如果用户不执行任何操作,则值会下降。

您的一般方法几乎是执行此操作的唯一方法,只需进行一些微调

保留一个常规TapsPerTime变量。对于注册的每个新抽头,不要替换抽头时间,而是计算一个新的加权值:

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

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


此外,如果在设定的时间内未检测到抽头,只需使用相同的公式更新抽头时间,但使用0(零)表示MeasureTapPertime。因此,如果用户不做任何操作,则该值会下降。

为了知道您有什么,我可以看看您的算法吗?@Addison-编辑以显示我到目前为止的结果,为什么不根据差异本身计算“游戏速度”?使用它作为乘数,直到某一点,计算速度。为了知道你有什么,我可以看看你的算法吗?@Addison-编辑以显示我到目前为止所拥有的,为什么不根据差异本身计算“游戏速度”?用它作为乘数,在一定程度上,计算速度。非常感谢,我从来都不知道这个
 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;
        }