2013-04-29 109 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年前