【发布时间】:2011-04-21 08:29:04
【问题描述】:
我现在正在为 Android 编写游戏,我遇到了一个问题,即当我与敌人发生碰撞时,我的生命值条会快速向下射击。
我想让它每秒只记录两次点击。截至目前,它似乎在 1-2 秒内完成了 50 帧动画。
请告诉我如何解决我的问题。
谢谢!
【问题讨论】:
我现在正在为 Android 编写游戏,我遇到了一个问题,即当我与敌人发生碰撞时,我的生命值条会快速向下射击。
我想让它每秒只记录两次点击。截至目前,它似乎在 1-2 秒内完成了 50 帧动画。
请告诉我如何解决我的问题。
谢谢!
【问题讨论】:
如何存储上次碰撞发生在您的播放器对象中的时间戳,并在检测到碰撞时将当前时间与它进行比较?如果时间过长,则减少健康。这样您就不会受到可能的帧速率波动的限制。
【讨论】:
在一定时间后运行某些东西的最佳解决方案是使用TimerTask。例如,此代码在 2011 年 12 月 31 日运行。
Timer timer = new Timer();
timer.schedule(new TimerTask(
public void run() {
System.out.println("done");
}),
new Date(2011, 12, 31));
【讨论】:
将作业放入AsyncTask,其中doInBackground() 方法正在倒计时,发送进度更新,然后休眠一小段时间。
伪代码:
doInBackground(int howMuch) {
while (howMuch > 0 ) {
publishProgress(howMuch);
Thread.sleep(1000 / howMuch);
}
}
onProgressUpdate(int current) {
updateProgressBar(current);
}
【讨论】:
制作 Runnable 并使其在触发时将无敌标志翻转为 false 甚至可能更简单。
mHandler = new Handler() (during onCreate)
notInvincible = true;
-- get damaged --
if(damaged && notInvincible ){
notInvincible = false;
mHandler.postDelayed(new Runnable(){ void run() { notInvincible = true; }},DELAYTIME);
}
但 AsyncTask 也可以让你这样做。
【讨论】:
执行此类操作的常用方法是计算帧时间(自上一帧以来的时间)。有了这段时间,您可以使所有动作都依赖于时间,还可以处理这些计时器之类的东西。
对于这样的碰撞,您需要为您的玩家类添加一个属性,其中包含自上次命中以来的时间。每一帧,此属性都会与帧时间相加。然后,您可以检查自上次碰撞以来的时间。击中后,您可以将计时器设置回零。不涉及线程。
【讨论】: