如何限制玩家activity?
How to limit player activity?
我有一个简单的游戏,玩家可以射击一些子弹。但是,我想让玩家每 x 秒只能发射一颗子弹。我该怎么做?
我试图通过计算子弹之间的平均时间来做到这一点,并说如果平均时间少于一秒,请不要让 space 条(射击控制)起作用。但是,我不知道如何让 space 条不起作用,这意味着玩家可能暂时不开枪,然后一次射出很多子弹。
拍摄方法大概是这样的:
public void keyPressed(KeyEvent e) {
if (!keysDown.contains(e.getKeyCode()))
keysDown.add(new Integer(e.getKeyCode()));
这会将键值的整数添加到数组中,然后在此处读取:
if (keysDown.contains(KeyEvent.VK_SPACE)) {
b = new Bullets(x);
bullCount.add(b);
System.out.println(bullCount.get(0).getY());
System.out.println ("There are " + bullCount.size() + "bullets alive.");
//elapsed = System.nanoTime() - start;
//if ((elapsed / bulletCount) < 1000000000) {
//this is where I would say 'no more bullets shot until
//average time in nanoseconds is more than 1 second!' but I don't know how
//}
创建一个全局变量即:long lastShot
。
当用户射击时,在允许他射击之前检查是否 (System.currentTimeMilis()-lastShot>5000)
。
如果可以拍摄,就把lastShot = System.currentTimeMilis();
存起来,然后进行实拍。
不行就别让他开枪。
这是一个伪代码示例:
class SomeClass {
private long lastShot;
public void userPressedShot() {
if (System.currentTimeMillis()-lastShot>5000) {
lastShot = System.currentTimeMillis();
doTheRealShot();
}
// Ignored till 5000 miliseconds from last shot
}
}
对于此解决方案,我假设您使用 Player
对象。
很简单:
1.: 将类型为 long
且值为 0 的字段 lastShot
添加到您的 class.
2.: 每当玩家射击时,将 lastShot 设置为 System.currentTimeMillis()
3.: 现在,在你让他射击之前,检查 System.currentTimeMillis()-lastShot
是否小于你的子弹延迟秒数。
这将是一个必须插入播放器的 MWE class:
只需调用方法 player.shoot()
让他开枪 - 或者不开枪,如果不可能的话。
private long lastShot = 0;
//return value is for you to check if the shot happened
public boolean shoot(){
//Did the last shot happen less than 1 second (1000 milliseconds) ago
if(System.currentTimeMillis()-lastShot <= 1000){
//If yes: return false, the shot can not happen
return false;
}else{
lastShot = System.currentTimeMillis();
//If no: insert your shooting code here to be executed
//return true, the shot happened
return true;
}
}
一个矫枉过正的选择是使用 Guava 的 RateLimiter
final RateLimiter rateLimiter = RateLimiter.create(2.0); // rate is "2 permits per second"
while(true) {
rateLimiter.acquire();
shootSomething();
}
尝试使用每秒重置子弹计数的计时器:
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
bullCount.clear();
}
}, 0, 1000); // 0 is the delay in milliseconds before it starts and 1000 is the time in milliseconds between successive task executions
然后当玩家想要射击时,您只需要查看 bullCount 的大小
我有一个简单的游戏,玩家可以射击一些子弹。但是,我想让玩家每 x 秒只能发射一颗子弹。我该怎么做?
我试图通过计算子弹之间的平均时间来做到这一点,并说如果平均时间少于一秒,请不要让 space 条(射击控制)起作用。但是,我不知道如何让 space 条不起作用,这意味着玩家可能暂时不开枪,然后一次射出很多子弹。
拍摄方法大概是这样的:
public void keyPressed(KeyEvent e) {
if (!keysDown.contains(e.getKeyCode()))
keysDown.add(new Integer(e.getKeyCode()));
这会将键值的整数添加到数组中,然后在此处读取:
if (keysDown.contains(KeyEvent.VK_SPACE)) {
b = new Bullets(x);
bullCount.add(b);
System.out.println(bullCount.get(0).getY());
System.out.println ("There are " + bullCount.size() + "bullets alive.");
//elapsed = System.nanoTime() - start;
//if ((elapsed / bulletCount) < 1000000000) {
//this is where I would say 'no more bullets shot until
//average time in nanoseconds is more than 1 second!' but I don't know how
//}
创建一个全局变量即:long lastShot
。
当用户射击时,在允许他射击之前检查是否 (System.currentTimeMilis()-lastShot>5000)
。
如果可以拍摄,就把lastShot = System.currentTimeMilis();
存起来,然后进行实拍。
不行就别让他开枪。
这是一个伪代码示例:
class SomeClass {
private long lastShot;
public void userPressedShot() {
if (System.currentTimeMillis()-lastShot>5000) {
lastShot = System.currentTimeMillis();
doTheRealShot();
}
// Ignored till 5000 miliseconds from last shot
}
}
对于此解决方案,我假设您使用 Player
对象。
很简单:
1.: 将类型为 long
且值为 0 的字段 lastShot
添加到您的 class.
2.: 每当玩家射击时,将 lastShot 设置为 System.currentTimeMillis()
3.: 现在,在你让他射击之前,检查 System.currentTimeMillis()-lastShot
是否小于你的子弹延迟秒数。
这将是一个必须插入播放器的 MWE class:
只需调用方法 player.shoot()
让他开枪 - 或者不开枪,如果不可能的话。
private long lastShot = 0;
//return value is for you to check if the shot happened
public boolean shoot(){
//Did the last shot happen less than 1 second (1000 milliseconds) ago
if(System.currentTimeMillis()-lastShot <= 1000){
//If yes: return false, the shot can not happen
return false;
}else{
lastShot = System.currentTimeMillis();
//If no: insert your shooting code here to be executed
//return true, the shot happened
return true;
}
}
一个矫枉过正的选择是使用 Guava 的 RateLimiter
final RateLimiter rateLimiter = RateLimiter.create(2.0); // rate is "2 permits per second"
while(true) {
rateLimiter.acquire();
shootSomething();
}
尝试使用每秒重置子弹计数的计时器:
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
bullCount.clear();
}
}, 0, 1000); // 0 is the delay in milliseconds before it starts and 1000 is the time in milliseconds between successive task executions
然后当玩家想要射击时,您只需要查看 bullCount 的大小