2013-04-29 129 views
0

我按照這個教程hereApplet未顯示圖像

我下載了它的源代碼並運行但圖像沒有顯示。

這裏是結果 enter image description here

我期待的結果會是這樣 enter image description here 相同結果的教程。

下面是代碼: StartingClass.java

package kiloboltgame; 

import java.applet.Applet; 
import java.awt.Color; 
import java.awt.Frame; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.net.URL; 

public class StartingClass extends Applet implements Runnable, KeyListener { 

    private Robot robot; 
    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("Q-Bot Alpha"); 
     try { 
      base = getDocumentBase(); 

     } catch (Exception e) { 
      // TODO: handle exception 
      System.out.println(e.toString()); 
     } 

     // Image Setups 
     character = getImage(base, "data/character.png"); 
     System.out.println(" "+base); 

    } 

    @Override 
    public void start() { 
     robot = new Robot(); 

     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) { 
      robot.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, robot.getCenterX() - 61, robot.getCenterY() - 63, this); 

    } 

    @Override 
    public void keyPressed(KeyEvent e) { 

     switch (e.getKeyCode()) { 
     case KeyEvent.VK_UP: 
      System.out.println("Move up"); 
      break; 

     case KeyEvent.VK_DOWN: 
      System.out.println("Move down"); 
      break; 

     case KeyEvent.VK_LEFT: 
      robot.moveLeft(); 
      break; 

     case KeyEvent.VK_RIGHT: 
      robot.moveRight(); 
      break; 

     case KeyEvent.VK_SPACE: 
      System.out.println("Jump"); 
      robot.jump(); 
      break; 

     } 

    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
     switch (e.getKeyCode()) { 
     case KeyEvent.VK_UP: 
      System.out.println("Stop moving up"); 
      break; 

     case KeyEvent.VK_DOWN: 
      System.out.println("Stop moving down"); 
      break; 

     case KeyEvent.VK_LEFT: 
      robot.stop(); 
      break; 

     case KeyEvent.VK_RIGHT: 
      robot.stop(); 
      break; 

     case KeyEvent.VK_SPACE: 
      System.out.println("Stop jumping"); 
      break; 
     } 

    } 

    @Override 
    public void keyTyped(KeyEvent e) { 
     // TODO Auto-generated method stub 
    } 
} 

Robot.java

package kiloboltgame; 

import java.awt.Graphics; 

public class Robot { 

    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 
     centerY += speedY; 
     if (centerY + speedY >= 382) { 
      centerY = 382; 
     } 

     // 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; 
    } 

} 

,這裏是在intelij我的文件結構

enter image description here

請告訴我錯代碼??我試圖「../data/character.png」和「../src/data/character.png」,但它沒有奏效。

+0

而是學習AWT的,你爲什麼不學搖擺?您可以從[如何製作小程序]的Swing教程開始(http://docs.oracle.com/javase/tutorial/uiswing/components/applet.html)。 – camickr 2013-04-29 03:37:02

+1

我沒有看到使用awt和swing之間的很多區別。因爲我的目標是對遊戲開發的工作有基本的瞭解^^ – Tifa 2013-04-29 03:38:33

+0

有一個很大的區別。繪畫完成不同,你使用不同的組件。 – camickr 2013-04-29 04:08:39

回答

1
  • applet.html加載小程序的頁面。
  • data(目錄)
    • Character.png

如果是這樣的服務器的結構,圖像將可以通過:

getImage(base, "data/character.png"); 

我強調上面的服務器這顯然不是你的IDE設置的方式。


你能否解釋一下嗎?

你打開了src/kilobolt路徑顯示源文件的位置,但您展開bin文件夾和跟蹤下來,你可能會發現在bin/kilobolt目錄.class文件。

IDE通常不會使用HTML文件來加載小程序,但是如果使用IntelliJ,它可能會將其放入bin目錄中,以便它可以直接訪問類文件。 從那裏到圖像的路徑將是../data/character.png,但不是使用該路徑,而是建議您將IDE複製到bin中。

在這個階段,它已經成爲IntelliJ的一部分,所以你有任何進一步的問題,都需要關於IDE和它使用的運行時類路徑。

+0

你能說得更多嗎?我也在eclipse中嘗試過,但同樣的問題。 – Tifa 2013-04-29 03:42:33

+0

哎呀,很抱歉^^ – Tifa 2013-04-29 03:53:20

0

這似乎是一個圖像問題。計算機無法找到圖像的位置,或者圖像正在applet下繪製。

如果您使用的是linux/Mac/unix機器,大部分時間,我不得不從根文件夾(例如/Users/.....)到源文件夾或者使用目錄更接近,只需在它前面使用'/'即可。例如:

您正在使用名爲src的目錄,裏面有一個'img'文件夾。要到 'IMG' 的內容,你有兩個選擇:

//......src/img

/src目錄/ IMG/....

希望對任何事情有所幫助

+0

不使用窗口^^ – Tifa 2013-04-29 03:40:11

0

將您的數據文件夾複製到bin文件夾中。 清理項目並運行。

它會工作。

0

@Luiggi Mendoza我有同樣的問題,並能夠解決它通過右鍵單擊'character.png'並選擇屬性,然後從根本上覆製圖像的位置。在我的情況下,它是「/Users/macbookpro/NetBeansProjects/Kilobolt/src/data/character.png」並且在機器人窗口中出現了機器人的賓果。

而且從同一個網站,是的,我正在學習遊戲中你3年前