2014-09-27 4 views
0

Я пытаюсь сделать 2D-игру, которая должна нарисовать персонажа на экране. Но когда я запускаю его, я просто получаю черный экран.Метод рисования не работает

важные биты:

public class StartingClass extends Applet implements Runnable, KeyListener { 

    private static final long serialVersionUID = 1L; 
    private Walrus walrus; 
    private Image image, character; 
    private Graphics second; 
    private URL base; 

    @Override 
    public void init() { 

     setSize(800, 480); 
     setBackground(Color.BLACK); 
     setFocusable(true); 
     addKeyListener(this); 

     Frame frame = (Frame) this.getParent().getParent(); 
     frame.setTitle("Applet"); 
     try { 
      base = getDocumentBase(); 
     } catch (Exception e) { 
      // TODO: handle exception 
     } 

     // Image Setups 
     character = getImage(base, "src/data/walrus_right.png"); 

    } 

    @Override 
    public void start() { 
     walrus = new Walrus(); 

     Thread thread = new Thread(this); 
     thread.start(); 
    } 

    @Override 
    public void stop() { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void destroy() { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void run() { 
     while (true) { 
      walrus.update(); 
      repaint(); 

      try { 
       Thread.sleep(17); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    @Override 
    public void update(Graphics g) { 
     if (image == null) { 
      image = createImage(this.getWidth(), this.getHeight()); 
      second = image.getGraphics(); 
     } 

     second.setColor(getBackground()); 
     second.fillRect(0, 0, getWidth(), getHeight()); 
     second.setColor(getForeground()); 
     paint(second); 

     g.drawImage(image, 0, 0, this);  
    } 

    @Override 
    public void paint(Graphics g) { 
     g.drawImage(character, walrus.getCenterX() - 61, walrus.getCenterY() - 63, this); 

    } 
} 

Кроме того, вот мой другой класс:

public class Walrus { 

private int centerX = 100; 
private int centerY = 382; 
private boolean jumped = false; 

private int speedX = 0; 
private int speedY = 1; 


public void update() { 

    // Moves Character or Scrolls Background accordingly. 
    if (speedX < 0) { 
     centerX += speedX; 
    } else if (speedX == 0) { 
     System.out.println("Do not scroll the background."); 

    } else { 
     if (centerX <= 150) { 
      centerX += speedX; 
     } else { 
      System.out.println("Scroll Background Here"); 
     } 
    } 

    // Updates Y Position 

    if (centerY + speedY >= 382) { 
     centerY = 382; 
    }else{       
        centerY += speedY; 
      } 

    // Handles Jumping 
    if (jumped == true) { 
     speedY += 1; 

     if (centerY + speedY >= 382) { 
      centerY = 382; 
      speedY = 0; 
      jumped = false; 
     } 

    } 

    // Prevents going beyond X coordinate of 0 
    if (centerX + speedX <= 60) { 
     centerX = 61; 
    } 
} 

public void moveRight() { 
    speedX = 6; 
} 

public void moveLeft() { 
    speedX = -6; 
} 

public void stop() { 
    speedX = 0; 
} 

public void jump() { 
    if (jumped == false) { 
     speedY = -15; 
     jumped = true; 
    } 

} 

public int getCenterX() { 
    return centerX; 
} 

public int getCenterY() { 
    return centerY; 
} 

public boolean isJumped() { 
    return jumped; 
} 

public int getSpeedX() { 
    return speedX; 
} 

public int getSpeedY() { 
    return speedY; 
} 

public void setCenterX(int centerX) { 
    this.centerX = centerX; 
} 

public void setCenterY(int centerY) { 
    this.centerY = centerY; 
} 

public void setJumped(boolean jumped) { 
    this.jumped = jumped; 
} 

public void setSpeedX(int speedX) { 
    this.speedX = speedX; 
} 

public void setSpeedY(int speedY) { 
    this.speedY = speedY; 
} 

}

я не получил каких-либо ошибок в данный момент, но это не работает правильно ,

+0

Почему вы используете 'Frame' (AWT) вместо' JFrame' (Swing)? – user1803551

+0

Также: (1) мы не можем запускать ваш код, потому что у нас нет «Walrus». Мы, вероятно, тоже не нуждаемся в этом: разместите минимальный и исполняемый код; (2) Кажется, вы заблокировали EDT с помощью 'sleep', вместо этого создайте новый поток. – user1803551

+0

Я добавил класс моржа к своему сообщению. Причина всех этих вещей, вероятно, связана с тем, что я следовал [этому учебнику] (http://www.kilobolt.com/game-development-tutorial.html). – Charizard

ответ

0

Проблема в том, что ваше изображение не загружено. Линия

getImage(base, "src/data/walrus_right.png"); 

пытается прочитать изображение для развернутого апплета и не сможет спокойно (не бросать ошибки), что и привело к путанице. Попробуйте заменить его

ImageIO.read(new File(getClass().getResource("relative/path.png").getPath())); 

где вы должны заменить путь, указанный при getResource API.

Edit:

Перерыв вызова на несколько вызовов:

Class<? extends StartingClass> clas = getClass(); 
URL url = clas.getResource("relative/path.png"); 
String path = url.getPath(); 
File file = new File(path); 
try { 
    Image image = ImageIO.read(file); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

и двигаться с шагом отладчика за шагом, чтобы увидеть, какую линию бросает ошибку. Я предполагаю, что файл находится не в нужном месте, из-за чего getResource возвращает null, что вызывает new File(path), чтобы выбросить NullPointerException.

+0

Думаю, я не делаю этого правильно. Я заменил эту строку \t \t \t 'ImageIO.read (newFile (getClass(). GetResource (" relative/data/walrus_right.png "). GetPath())) ;; и теперь я получаю исключение из null-указателя:' java.lang.NullPointerException \t в pack.StartingClass.init (StartingClass.java:38) \t в sun.applet.AppletPanel.run (Unknown Source) \t на java.lang.Thread.run (Unknown Source) 'Также , когда я использую JFRames, а не Frames, я получаю другую ошибку, что-то о том, что я не могу использовать Applet для JFrame. – Charizard

+0

@Charizard См. Мое правление об обработке исключения. – user1803551

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