在游戏中我创造我只希望僵尸每分钟能够击中玩家2次,而不是拿走洞穴健康栏,因为它会快速损坏玩家。
public void checkCollision(){
Rectangle r3 = player.getBounds();
for(int i = 0; i < zombie.size(); i++){
Zombie z = (Zombie) zombie.get(i);
Rectangle r2 = z.getBounds();
if(r3.intersects(r2)){
if(!player.getInvincibility()){
player.setHealth(player.getHealth() - 10);
player.setInvincibility(true);
}
}
}
}
这是检查玩家和僵尸碰撞的代码。我已经做到这一点,玩家只需要10点伤害,但玩家将再也无法受到伤害。我曾尝试使用if语句来检查玩家是否是无敌的,并且在if语句中有一个for循环,当int击中30 000时会使玩家死亡,但是僵尸仍然会如此快地破坏玩家健康酒吧gats带走。
答案 0 :(得分:1)
对你的僵尸使用攻击冷却时间。
在我的游戏中,我有类似
的东西public boolean isReadyToAttack() {
boolean ret;
long delta = System.currentTimeMillis() - t0;
timer += delta;
if (timer > attackCooldown) {
timer = 0;
ret = true;
} else {
ret = false;
}
t0 = System.currentTimeMillis();
return ret;
}
然后你只需在你的循环中检查这个,如果僵尸还没有准备好攻击他即使他已经接近也不会(事实上最好在碰撞之前检查冷却时间,它更便宜)ø< / p>
答案 1 :(得分:0)
有一个每帧调用的方法 - 称之为updateTimers或其他。此方法应将玩家的invincibilityTimer减少一定量。然后,如果玩家具有非零的invincibilityTimer,它们很容易受到checkCollission的破坏,这也会将invincibilityTimer设置为一个设定的数字。
答案 2 :(得分:0)
我喜欢制作一个警报类来处理诸如“等待10帧,然后打印'Hello world!'之类的事情。”到控制台“:
public class Alarm {
//'timer' holds the frames left until the alarm goes off.
int timer;
//'is_started' is true if the alarm has ben set, false if not.
boolean is_started;
public Alarm() {
timer = 0;
is_started = false;
}
public void set(int frames) {
//sets the alarm to go off after the number of frames specified.
timer = frames;
is_started = true;
}
public void tick() {
//CALL THIS EVERY FRAME OR ELSE THE ALARM WILL NOT WORK! Decrements the timer by one if the alarm has started.
if (is_started) {
timer -= 1;
}
}
public void cancel() {
//Resets the frames until the alarm goes off to zero and turns is_started off
timer = 0;
is_started = false;
}
public boolean isGoingOff() {
//Call this to check if the alarm is going off.
if (timer == 0 && is_started == true) {
return true;
}
else {
return false;
}
}
}
你可以制作一个无敌框架(假设玩家有一个名为invincibility_alarm的警报,当僵尸击中玩家时它设置为30帧。):
//Pretend this is your gameloop:
while (true) {
if (player.invincibility_alarm.isGoingOff()) {
player.setInvincibility(false);
player.invincibility_alarm.cancel();
}
player.invincibility_alarm.tick();
Thread.sleep(10);
}