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

使用数组/列表进行冲突检测

齐铭
2023-03-14

我是碰撞检测新手,在游戏原型中遇到了一些问题。我已经做了好几天了。经过一些阅读和辅导,我仍然不明白我做错了什么,所以这里的其他人应该能够解释我做错了什么。

游戏运行时,屏幕上有10个绿色矩形(NPC)和1个红色矩形(吸血鬼)。作为一个起点,我希望吸血鬼“喝血”,当它通过愚蠢的运气随机穿过npc时。如果我不注释掉冲突检测方法,代码中就会出现一个nullpointexception。

公共类屏幕扩展JPanel实现可运行{

public Thread gameLoop = new Thread (this); 

public static int myWidth, myHeight;

public static boolean isFirst = true; 

public static Npc npc;
public static Vamp vamp; 

public static Npc[] npcs = new Npc[10]; //in future will have npcs and vamp count increase/decreasable
public static Vamp[] vamps = new Vamp[1]; 

public Screen(Frame frame){

    gameLoop.start();
}


public void define(){
    npc = new Npc();
    vamp = new Vamp();


    for(int i=0;i<npcs.length;i++){ 
        npcs[i] = new Npc();

    }

    for(int i=0;i<vamps.length;i++){ 
        vamps[i] = new Vamp();

    }
}

public void paintComponent(Graphics g){
    if(isFirst){

        myWidth = getWidth();
        myHeight = getHeight();
        define();
        for(int i=0;i<npcs.length;i++){
        spawnVillagers(); 
            }
        for(int i=0;i<vamps.length;i++){
        spawnVamp();    
            }
        isFirst = false; 

    }

    g.setColor(new Color(192,192,192));
    g.fillRect(0, 0, getWidth(), getHeight()); 

    for(int i=0;i<npcs.length;i++){ 
        if(npcs[i].inGame){
            npcs[i].draw(g);
        }
    }

    for(int i=0;i<vamps.length;i++){ 
        if(vamps[i].inGame){
            vamps[i].draw(g);
        }
    }


}

public void spawnVillagers(){
    for(int i=0;i<npcs.length;i++){
        if(!npcs[i].inGame){
            npcs[i].spawn();

            break;
        }
    }

}

public void spawnVamp(){
    for(int i=0;i<vamps.length;i++){
        if(!vamps[i].inGame){
            vamps[i].spawn();

            break;
        }
    }
}

public void checkCollision(){          
            for(int i=0;i<vamps.length;i++){

                    Vamp v = (Vamp) vamps[i];
                    Rectangle vampSpace = v.bounds(); //nullpoint error
                for(int n=0;n<npcs.length;n++){
                    Npc c = (Npc) npcs[n];
                    Rectangle npcSpace = c.bounds(); //nullpoint error
                    if(vampSpace.intersects(npcSpace)){ //error here as well since it's not getting bounds
                        vamp.gainBlood();
                    }
                }

            }

}

@Override
public void run() {
    while (true){
        if(!isFirst) {
            npc.physic();
            vamp.physic();
            for(int i=0;i<npcs.length;i++){
                if(npcs[i].inGame){
                    npcs[i].physic();
                }
            }
            for(int i=0;i<vamps.length;i++){
                if(vamps[i].inGame){
                    vamps[i].physic();
                }
            }
        }       
        checkCollision();
        repaint();

        try{
            Thread.sleep(1);
        } catch (Exception e){}
    }

}

}

公共类Npc扩展矩形{

public Rectangle bounds(){
    return (new Rectangle (x, y, npcSize, npcSize));
}

    }
}

}

公共类鞋面{

public Rectangle bounds(){
    return (new Rectangle (x, y, npcSize, npcSize));
}

}

共有1个答案

贲绪
2023-03-14

泰马特。我对nullpointerException错误做了一些额外的研究。用新的眼光审视我的代码,解决了我的问题。我在代码的早期将checkcollision()设置为。

 类似资料:
  • 我试图计算在一个Tibble中源向量和比较向量之间的Jaccard相似度。 jaccard_sim中的所有值都为零。但是,如果我们运行类似这样的东西,我们得到第一个条目的正确的Jaccard相似度为0.2:

  • 我目前正在学习C#和XNA,我在让碰撞检测正常工作方面遇到了一些问题。当敌人物体相交时,我希望我的玩家消失。 下面显示了我在Obj类中的代码 我正在循环查看objList中的每个项目,看它们是否相交。在这种情况下,如果敌人与我的玩家相交,我希望玩家消失,但这并没有发生。 此代码来自我的Player类 如果它与敌人相交,它应该消失,但这似乎没有发生。

  • 问题内容: 如何检测两个元素是否发生冲突? 这两个div是简单的彩色框,彼此垂直,因此没有复杂的形状或角度。 问题答案: 一般思路-获得框的偏移量和尺寸,并检查它们是否重叠。 如果要更新,可以使用: 另外,请注意,您可以针对特定示例优化功能。 因为它们是固定的,所以您不必重复读取框的尺寸(就像我在代码中一样)。您可以在页面加载时读取它们(将其读取到变量中),然后仅读取变量 小盒子的水平位置不会改变

  • 我正在尝试为我的大学工作制作一个基于2D平台的游戏(在SFML)。我不是要求任何人为我编写一些代码,但如果有人能提供一些指示,我将非常感激:) 目前我有大约13门课,包括: BaseEntity(大多数游戏对象都是由此派生的) 玩家(继承自BE) 魔法宝石(玩家需要这些来通过关卡晋级) 平台 SolidBlock(从平台继承) 可以说,我已经构建了大部分的游戏“积木”--每个类都有自己的更新函数,

  • 我只使用Box2D进行碰撞检测。我的代码与Ray Wenderlich教程中的代码类似。 我遇到了这个方法的问题。由于代码绕过了Box2D模拟,因此没有碰撞响应。因此,精灵可以重叠。我知道Box2D冲突API提供了一个单位法向量来帮助解决冲突。然而,这个矢量传达的是方向,而不是大小。因此,我无法确定应该将重叠的sprites移动多远。有人知道如何使用Box2D冲突API手动解决重叠问题吗?

  • 我已经更新了dplyr(现在是0.7.1),我的很多旧代码都不能用了,因为mutate_each已经被弃用了。我曾经用mutate_each做类似这样的事情(代码如下),使用列索引。我会在数百个专栏中这样做。而我就是搞不清楚如何用mutate_at正确使用vars参数。我看到的所有例子都使用了列名...我不想这么做。我确信这是一个简单的答案,但是我已经花了太多的时间试图弄明白它,并且将非常感谢一些