РЕДАКТИРОВАТЬ: (ВОПРОС ОТВЕТ)
Итак, у меня есть поток, управляющий x и y и меняющий его.Моя проблема в том, что когда тело змеи помещается в графический интерфейс, оно помещает его прямо на голову вместо 12 мест за ним.Я знаю, почему он это делает, но я не уверен, как решить эту проблему.
Из того, что я понимаю, он рисует тело, а затем голову, но использует те же x и y пробелы ... что на самом деледолжно произойти то, что ему нужно нарисовать голову, пройти через Нить, затем нарисовать части тела так, чтобы она делала это пространство позади головы (потому что голова будет двигаться вперед) ... и так далее, и тому подобное... Я просто не могу понять, как это сделать.
Вот бегун Потоков, который, я сильно сомневаюсь, вам действительно понадобится, но просто чтобы быть уверенным
class ThreadRunnable extends Thread implements Runnable {
private boolean allDone = false;
private boolean RIGHT;
private boolean LEFT;
private boolean UP;
private boolean DOWN;
public ThreadRunnable (boolean up, boolean right, boolean down, boolean left){
UP = up;
RIGHT = right;
DOWN = down;
LEFT = left;
}
public void run() {
if(UP == true) {
try {
while(UP) {
if (y <= yBase && y >= 0) {
y = y - 12;
}
else {
y = yBase;
}
Thread.sleep(40);
repaint();
if (allDone) {
return;
}
}
}
catch (InterruptedException exception) {
}
finally {
}
}
if(RIGHT == true) {
try {
while(RIGHT) {
if (x <= xBase && x >= 0) {
x = x+12;
}
else {
x = 0;
}
Thread.sleep(40);
repaint();
if(allDone) {
return;
}
}
}
catch (InterruptedException exception) {
}
finally {
}
}
if(DOWN == true) {
try {
while(DOWN) {
if (y <= yBase && y >= 0) {
y = y+12;
}
else {
y = 0;
}
Thread.sleep(40);
repaint();
if (allDone) {
return;
}
}
}
catch (InterruptedException exception) {
}
finally {
}
}
if(LEFT == true) {
try {
while(LEFT) {
if (x <= xBase && x >= 0) {
x = x-12;
}
else {
x = xBase;
}
Thread.sleep(40);
repaint();
if (allDone) {
return;
}
}
}
catch (InterruptedException exception) {
}
finally {
}
}
}
}
Вот«Чертежная» часть кода
public void paintComponent(Graphics g) {
super.paintComponent(g);
setBorder(BorderFactory.createLineBorder(Color.WHITE));
this.setBackground(Color.black);
if (numOfFood == 1) {
g.setColor(Color.BLUE);
g.fillRect(foodX,foodY,12,12); //Paints the food
}
else {
foodX = random.nextInt(105)*12; //Random x for food position after snake eats
foodY = random.nextInt(59)*12; //Random y for food position after snake eats
numOfFood = 1;
}
Rectangle headRect = new Rectangle( x, y, 12, 12 ); //The head (not painted)
Rectangle foodRect = new Rectangle(foodX, foodY, 12, 12); //The food (not painted)
if ( body.size() >= 0) {
body.add(new BodyPart( x, y, 12, 12));
body = new ArrayList<BodyPart>( body.subList( body.size() - n, body.size() ) );
g.setColor(Color.RED);
for ( int i = body.size() - 1; i >= body.size() - (n-1); i-- ) {
g.fillRect( body.get( i ).getX(), body.get( i ).getY(), body.get( i ).getWidth(), body.get( i ).getHeight() ); //This is calling a class that will get these parts of the array list (x,y,width,height)
}
}
g.setColor(Color.RED);
g.fillRect(x,y,12,12); //Draws head
g.setColor(Color.WHITE);
g.fillRect(x+2,y+2,8,8); //This is a white square in the middle of the head to show that it is the head
if (headRect.intersects(foodRect)) {
numOfFood = 0;
n++;
}
}
РЕДАКТИРОВАТЬ: ВОПРОС ОТВЕТИТЬ НИЖЕ
Все, что требовалось, это переместить
setBorder(BorderFactory.createLineBorder(Color.WHITE));
и
this.setBackground(Color.black);
для более ранней части кода, а не в методе рисования там ...
Я также изменил свойArrayList в обычном массиве ArrayList и просто заставил его вставить местоположение головы в начало массива, а затемсделал это в следующий раз (после того, как голова переместилась)
g.setColor(Color.RED);
//Prints the body parts
if (n > 0) {
for (int i = 0;i < n; ++i) {
g.fillRect(body[i][0],body[i][1],12,12);
}
}
//Inserts the head location
for (int i = n-1;i >= 0; --i) {
body[i+1][0] = body[i][0];
body[i+1][1] = body[i][1];
if (i == 0) {
body[i][0] = x;
body[i][1] = y;
}
}
Большое спасибо за помощь