2013-06-13 3 views
0

Я новичок в обнаружении столкновений и испытываю определенные проблемы с получением моей работы в прототипе моей игры. Был в течение нескольких дней. После некоторых чтений и учебников я все еще не понимаю, что я делаю неправильно, поэтому фигура других здесь должна быть способна объяснить, что я делаю неправильно.Обнаружение столкновений с массивами/списками

Банкомат Игра проходит и имеет 10 зеленых прямоугольников (npcs) и 1 красный прямоугольник (вампир), удивляющий экран. В качестве прыгающей точки я хочу, чтобы вампир «выпил кровь», когда он случайно пересекал npc через тупую удачу. Если я не закомментирую мой метод обнаружения столкновений, я получаю nullpointexception в коде.

общественного класса Screen расширяет JPanel реализует Runnable {

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 расширяет Rectangle {

надрез

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

надрез

} 
} 

}

общественного класса Vamp расширяет Rectangle {

СНиП

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

}

+2

'NullPointerException' не имеет ничего общего с обнаружением столкновений и возникает, когда вы пытаетесь осмыслить объект, который не инициализирован, или инициализирован« null ». Я рекомендую вам пройти через свой код с помощью отладчика, чтобы узнать, что происходит. –

+0

Вы можете выделить только код, необходимый для демонстрации проблемы? – Patashu

+0

Я отрезал класс npc и vamp, чтобы помочь глазам. Не хотел, чтобы вырезать экран много, как Мэтт сказал, что я не инициализирую/не что-то, и я беспокоюсь, что могу взять что-то, что может быть ключом к моей проблеме. (Все еще не очень хорошо с nullpointerexceptions или отладчиками, поскольку это моя вторая программа для записи) – maebe

ответ

0

TY Мэтт. Я сделал несколько дополнительных исследований по ошибкам nullpointerException. Это, просматривая мой код свежими глазами, исправил мою проблему. Я поставил свой checkcollision() на раннем этапе моего кода.

Смежные вопросы