2013-06-05 2 views
1

поэтому я использую netbeans, и я начинаю входить в игры для кодирования ... и я сделал это до сих пор без ошибок, однако, когда я запускаю его только в серой коробке с моим названием " игра zachs появляется и то это .... пожалуйста, помогите, если вы знаете, проблема 1 -СпасибоСерый экран в Netbeans

package swing9; 

import java.awt.Color; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import javax.swing.JFrame; 

public class JavaApplication2 extends JFrame implements Runnable { 

    int x, y, xDirection, yDirection; 
    Font font = new Font("Arial", Font.BOLD | Font.ITALIC, 30); 

    public void run() { 
     try { 
      while (true) { 

       move(); 

       Thread.sleep(5); 
      } 
     } catch (Exception e) { 

      System.out.println("Error"); 
     } 
    } 

    public void move() { 

     x += xDirection; 
     y += yDirection; 

     if (x <= 0) 
      x = 0; 

     if (x >= 300) 
      x = 300; 

     if (y <= 50) 
      y = 50; 

     if (y <= 300) 
      y = 300; 

    } 

    public void seyXDir(int xdir) { 

     xDirection = xdir; 
    } 

    public void setYDirection(int ydir) { 

     yDirection = ydir; 
    } 

    public class AL extends KeyAdapter { 

     public void keyPressed(KeyEvent e) { 

      int keyCode = e.getKeyCode(); 

      if (keyCode == e.VK_LEFT) { 

       int setXDirection = -1; 

      } 

      if (keyCode == e.VK_RIGHT) { 
       int setXDirection = +1; 

      } 

      if (keyCode == e.VK_UP) { 
       int setYDirection = -1; 
      } 

      if (keyCode == e.VK_DOWN) { 
       int setYDirection = +1; 

      } 

     } 

    } 

    public void keyReleased(KeyEvent e) { 

     int keyCode = e.getKeyCode(); 

     if (keyCode == e.VK_LEFT) { 
      int setXDirection = 0; 
     } 

     if (keyCode == e.VK_RIGHT) { 
      int setXDirecetion = 0; 
     } 

     if (keyCode == e.VK_UP) { 
      int setYDirectiom = 0; 
     } 

     if (keyCode == e.VK_DOWN) { 
      int setYDirecction = 0; 
     } 

    } 

    public JavaApplication2() { 

     addKeyListener((KeyListener) new JavaApplication2.AL()); 

     setTitle("Zachs Game"); 
     setSize(300, 300); 

     setResizable(false); 

     setVisible(true); 
     setBackground(Color.blue); 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     x = 150; 
     y = 150; 

    } 

    public void paintComponent(Graphics g) { 

     g.setColor(Color.red); 
     g.drawString("Play", 40, 40); 
     g.setFont(font); 
     g.setColor(Color.red); 
     g.fillOval(x, y, 15, 15); 

     repaint(); 
    } 

    public static void main(String[] args) { 

     new JavaApplication2(); 

     // threads 

     Thread t1 = new Thread(); 
     t1.start(); 
    } 
} 
+0

Был ли 'keyReleased()' должен быть частью класса 'AL'? Я часто обнаруживаю, что маркер '@ Override' очень удобен для поиска небольших ошибок. –

+0

'Thread.sleep (5)' достаточно близко к 'Thread.sleep (0)', так как не имеет значения. 60fps - это примерно 'Thread.sleep (15)', 25fps - примерно 'Thread.sleep (40)'. Большинство людей не будут видеть большую разницу более 30 кадров в секунду на большинстве мониторов ... – MadProgrammer

+0

Ваш «KeyListener» вряд ли когда-либо срабатывает, поскольку сам JFrame не может получить фокус, так как на нем есть другие компоненты, подумайте об использовании [привязки клавиш] (http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html) вместо – MadProgrammer

ответ

2

JFrame или любой из его супер классов не реализуют paintComponent метод так никогда не вызывается. Проверьте это сами, добавление аннотации @Override.

Переместите этот метод в новый класс, который расширяет JComponent и вызывает super.paintComponent(g) как первое утверждение.

Не вызывайте repaint с точностью до paintComponent, это создает бесконечный цикл и ухудшает производительность. Swing Timers были разработаны для более легкого взаимодействия с компонентами качания. Используйте эти более, чем необработанные потоки для периодических обновлений.

Помимо этого: JFrame не настраивается по умолчанию, поэтому KeyEvents, для которого требуется фокус, не будет запускаться, не делая окна ориентируемыми. Вместо этого используйте Key Bindings.

+0

(и не вызывайте перерисовку внутри какого-либо метода 'paint', и ничто на самом деле не запрашивает перерисовку, когда модель изменилась ...) – MadProgrammer

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