2014-01-05 3 views
0

Я новичок в Java, и я пытаюсь создать простую змеиную игру, но метод рисования получает только один раз и никогда больше, хотя поток продолжает работать. Я попробовал другое исправление на этом сайте, которое использовало другой класс, но это не сработало.repaint не работает в потоке

public class Snake extends JPanel implements Runnable { 

boolean gamerunning = true; 
    int snake_x = 50, snake_y = 50, snake_dir = 2; //for snake_dir 1=up 2=right 3=down 4=left 
    int[] snake_xt, snake_yt; 

    public static void main(String args[]) { 

     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(600,600); 
     frame.setVisible(true); 
     frame.add(new Snake()); 

     (new Thread(new Snake())).start(); 
     System.out.println("Running"); 
    } 

    @Override 
    public void run() { 
     try { 
      while (gamerunning) { 
       Thread.sleep(500); 
       System.out.println(snake_x); 
       tick(); 
       repaint(); 
      } 
     } catch (InterruptedException e) {} 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     System.out.println("painting"); 
     g.setColor(Color.black); 
     g.fillRect(snake_x, snake_y, 10,10); 
    } 

    public void tick() { 
     System.out.println("tick"); 
     switch(snake_dir) { 
      case 1: 
       snake_y -= 10; 
       break; 
      case 2: 
       snake_x += 10; 
       break; 
      case 3: 
       snake_y += 10; 
       break; 
      case 4: 
       snake_x -= 10; 
       break; 
     } 
    } 
} 
+1

Будьте carful с этим типом модели. Возможно, что компонент может быть в процессе окрашивания, когда вы обновляете значения, на которые он опирается ... – MadProgrammer

+0

Ваша установка неверна: свойства компонента swing ** должны быть доступны в EDT - это правило применяется к пользовательские свойства (например, snake_x/y), как и для «обычных» свойств (например, фона). Вызов tick() из другого потока нарушает правило. – kleopatra

ответ

1

Ваша проблема: вы не добавляете ту же самую змею, которую вы рисуете!

frame.add(new Snake()); 

(new Thread(new Snake())).start(); 

Каждая из этих линий создает новую Змею, кулак нарисован, второй перемещается.

Попробуйте

Snake s = new Snake(); 
frame.add(s); 

(new Thread(s)).start(); 

вместо этого.

+3

Даже если он работает после этого исправления, он по-прежнему является ошибочным подходом к решению. Здесь должен использоваться Swing 'Timer'. –

+0

Ну, есть много других проблем, таких как пустой блок catch, магические числа для направлений, использование int [] вместо точки, но ... Но поскольку OP является новым для java, это может быть не плохо идея, чтобы сделать добрую старую попытку и ошибку. –

+1

Я оставил комментарий в надежде пробудить интерес OP :) –

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