当前位置: 首页 > 知识库问答 >
问题:

为玩家设置无敌框架

淳于功
2023-03-14

在我创建的游戏中,我只希望僵尸能够每分钟击中玩家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达到30000时,该循环会使玩家死亡,但僵尸仍然会以如此快的速度伤害玩家,以至于洞健康条被拿走。

共有3个答案

纪翰
2023-03-14

我喜欢创建一个警报类来处理诸如“等待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);
}
花烨
2023-03-14

有一个每帧都调用的方法 - 称之为更新计时器或其他方法。这种方法应该将玩家的无敌计时器减少一定数量。然后,如果玩家拥有非零无敌定时器,则在CheckCollission中容易受到伤害,这也会将无敌定时器设置为设定的数字。

糜凯泽
2023-03-14

对僵尸使用攻击冷却时间。

在我的游戏里,我有这样的东西

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;
}

然后你只需在循环中检查一下,如果僵尸还没有准备好攻击,即使他很近也不会攻击(事实上,最好在碰撞前检查冷却时间,这比较便宜)ø

 类似资料:
  • 我让敌人随机移动并看着玩家,现在我想让敌人射击玩家,我不知道为什么,但射击完全随机,正如你在下面的gif中看到的(你按左ctrl射击)。 无论如何,这是玩家类: 这是我的敌人类: 这是我的子弹课: 如果你想测试代码,我已经删除了不必要的东西:< br > https://pastebin.com/HT93hUzt 您可以在此处下载替换图像来测试代码(记得更改图像加载字符串!): https://w

  • 我正在制作的网站可以在德语和英语之间切换显示语言。Shaka player似乎支持本地化切换,但我无法用英语以外的任何语言显示该播放器。尝试在新沙卡上使用changeLocale。用户界面。本地化实例,但它似乎对玩家没有影响。 如果能在不同地区之间切换,我将不胜感激。

  • 当玩家或敌人被击中时,我希望他们的精灵变成红色。从本质上讲,我想要在精灵上显示透明的红色效果。皮游戏是否提供了一种方法来做到这一点?(我使用多个图像,因为角色是动画的,所以创建一个红色的精灵,只是闪烁而不是正常的子画面是行不通的)

  • 我的程序要求用户输入牌数和玩家数。我只是想打印出每个玩家的卡片。ex.(球员1:黑桃王牌,红桃两枚。球员2:梅花两枚等)我已经把它打印出来了,但它似乎只打印出一套卡片,尽管玩家的数量中输入了2张。这是我的密码。 手类: 我的司机: 我得到的输出: 我想让它打印出两套卡片,而不是一套,但从逻辑上讲,我不知道该怎么做。任何帮助都会很好,谢谢。

  • 快速笔记。这是我的高级NEA编程项目。有两个主要部分——一个是生成迷宫,用户必须在给定的时间段内通过它,该时间段当前没有实现,第二个部分是用户必须回答教育物理问题以获得最佳分数。问题从本地存储在我的系统上的文本文件中导入。然后,用户的分数和完成日期一起导出到本地文本文件中。 到目前为止,我的程序生成迷宫,用户可以自由移动。教育方面按预期工作。 我该从哪里开始,让墙壁充当物理屏障,而不仅仅是视觉屏障

  • 为什么我的保安(S)和唐纳德(D)处于相同的位置。 地图应该是这样打印出来的 [D----] [- - - - -] [- - - - -] [--S-] [--P--] 但它却像这样出现 [S----] [- - - - -] [- - - - -] [- - - - -] [--P--] 所以正如你在这里看到的,我把安全位置设为[3,2],但出于某种原因,它没有将其识别为[3,2],并将安全位