Помогите с ошибками выбора и ошибки, появляется сообщение об обработки
I’m using Processing 3 to code and I'm pretty new but know some basics, so I wanted to make the game Snake. I’ve been able to make the square move in a grid and eat food then spawn new food, but adding a new square is giving me trouble. In the Snake class and void update() I’m trying to create a vector for the new part of the snake by increasing total by 1 in boolean eat() then having inside the update an array that adds 1 to the length. Right now I have the total set as 0 so I get the ArrayIndex… error but if I change total to 1 to fix that I get NullPointerException when trying to draw the new rectangle in the void show() function.
PVector food; float scl=20; Snake s; void setup() { size(800,800); background(255); s= new Snake(); frameRate(10); pickLocation(); } void draw() { background(200); s.update(); s.show(); if(s.eat(food)) { pickLocation(); } fill(255,0,0); rect(food.x,food.y,scl,scl); } void pickLocation() { float cols=floor(width/scl); float rows=floor(height/scl); food= new PVector(floor(random(cols)),floor(random(rows))); food.mult(scl); } class Snake { float x=0; float y=0; float xspeed=1; float yspeed=0; float total=1; PVector[] tail= new PVector[6400]; void dir(float x, float y) { xspeed=x; yspeed=y; } boolean eat(PVector pos) { float d=dist(x,y,pos.x,pos.y); if(d<1) { total++; return true; } else return false; } void update() { if(total==tail.length) { for(int i=(int)total; i<tail.length-1; i++) { tail[i]=tail[i+1]; } } tail[(int)total-1]= new PVector(x,y); x=x + xspeed*scl; y=y + yspeed*scl; x=constrain(x,0,width-scl); y=constrain(y,0,height-scl); } void show() { fill(0); for(int i=0; i<tail.length; i++) { rect(tail[i].x,tail[i].y,scl,scl); } stroke(255); fill(0); rect(x,y,20,20); } } void keyPressed() { if(keyCode==UP) { s.dir(0,-1); } else if(keyCode==DOWN) { s.dir(0,1); } else if(keyCode==RIGHT) { s.dir(1,0); } else if(keyCode==LEFT) { s.dir(-1,0); } }
Что я уже пробовал:
Я попробовал использовать 2 поплавка вместо Pvector и не получил никаких ошибок, но тогда новый хвостовой блок не остается связанным со змеей. Я знаю, что мой код, вероятно, грязный и плохой, но я пытался найти исправление, и я не могу, поэтому я надеюсь, что кто-то может помочь. Если вам нужно, чтобы я объяснил что-то еще в коде, что еще не было упомянуто, просто спросите. Я также попытался изменить < в цикле for В void show() на >, который избавляется от ошибок, но не добавляет новый блок змеиного хвоста на змею.
Richard MacCutchan
Первое, что вам нужно объяснить: какие именно ошибки вы видите, где они происходят и любая другая связанная с ними информация.
Member 13994924
Итак,первая ошибка была ArrayIndexOutOfBoundsException: -1 в этой строке: tail[(int)total-1]= new PVector(x, y); но я могу исправить эту ошибку, изменив total на 1, что я уже сделал в коде, который я вставил. Но делать, что приводит к другой ошибке назвал исключение NullPointerException на этой линии: прямоугольник(хвост[я].х,хвост[я].г,ОКС,ОКС);
Richard MacCutchan
Таким образом, одна из этих ссылок является нулевой. Используйте свой отладчик, чтобы выяснить, что это такое и почему. Не гадайте, а затем измените какое-то случайное значение, надеясь, что это исправит проблему.