Я новичок в обнаружении столкновений и испытываю определенные проблемы с получением моей работы в прототипе моей игры. Был в течение нескольких дней. После некоторых чтений и учебников я все еще не понимаю, что я делаю неправильно, поэтому фигура других здесь должна быть способна объяснить, что я делаю неправильно.Обнаружение столкновений с массивами/списками
Банкомат Игра проходит и имеет 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));
}
}
'NullPointerException' не имеет ничего общего с обнаружением столкновений и возникает, когда вы пытаетесь осмыслить объект, который не инициализирован, или инициализирован« null ». Я рекомендую вам пройти через свой код с помощью отладчика, чтобы узнать, что происходит. –
Вы можете выделить только код, необходимый для демонстрации проблемы? – Patashu
Я отрезал класс npc и vamp, чтобы помочь глазам. Не хотел, чтобы вырезать экран много, как Мэтт сказал, что я не инициализирую/не что-то, и я беспокоюсь, что могу взять что-то, что может быть ключом к моей проблеме. (Все еще не очень хорошо с nullpointerexceptions или отладчиками, поскольку это моя вторая программа для записи) – maebe