为玩家设置无敌框架

时间:2013-04-24 15:01:52

标签: java if-statement for-loop

在游戏中我创造我只希望僵尸每分钟能够击中玩家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带走。

3 个答案:

答案 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);
}