调用g.drawImage 时 不能有效的画出图像。
这段代码我做了单独的测试。在test里可以运行。
但是放到这个东西里就不行了部分代码如下:
1:炸弹类class Bomb{
//定义炸弹坐标
private int x;
private int y;
//炸弹的生命
private int Life;
private boolean isLive;
public Bomb(int x, int y) {
super();
this.x = x;
this.y = y;
this.Life=9;
this.isLive=true;
}

//减少生命值
public void lifeDown() {
// TODO Auto-generated method stub
if(this.Life>0){
--Life;
}else {
this.isLive=false;
}
} public int getX() {
return x;
} public void setX(int x) {
this.x = x;
} public int getY() {
return y;
} public void setY(int y) {
this.y = y;
} public int getLife() {
return Life;
} public void setLife(int life) {
Life = life;
} public boolean isLive() {
return isLive;
} public void setLive(boolean isLive) {
this.isLive = isLive;
}


}
2:MyPanel类里的paint方法//画出炸弹
for(int i=0;i<this.bombs.size();i++){
//取出一颗炸弹 开始画
Bomb b=bombs.get(i);
//开始画
if(b.getLife()>6){
g.drawImage(image1, b.getX(), b.getY(), 30, 30,  this);
System.out.println("image1"); 
}else if(b.getLife()>3){
g.drawImage(image2, b.getX(), b.getY(), 30, 30,  this);
}else {
g.drawImage(image3, b.getX(), b.getY(), 30, 30,  this);
}
//让b的生命值减小
b.lifeDown();
//炸弹爆炸完了
if(b.getLife()==0){
bombs.remove(b);
}
}3:创建和初始化image代码class MyPanel extends Panel implements KeyListener, Runnable { // 定义一个我的坦克
Hero hero = null;
// 定义敌人的坦克集合
Vector<EnemyTank> ets;

Vector<Bomb> bombs;
int enSize = 3; // 定义三张图片 Image image1 = null;
Image image2 = null;
Image image3 = null; // 重写paint函数
@Override
public void paint(Graphics g) {
// TODO Auto-generated method stub
super.paint(g);
// 画出坦克
this.paintTank(hero.getX(), hero.getY(), g, hero.getDirect(), 0);
// 画出敌人坦克 for (int i = 0; i < this.ets.size(); i++) {
EnemyTank et = ets.get(i);
et.setDirect(2);
if (et.isLive) {
this.paintTank(et.getX(), et.getY(), g, et.getDirect(), 1);
}
} // 画出子弹
for (int i = 0; i < this.hero.getSs().size(); i++) {
Shot myShot = this.hero.getSs().get(i);
if (myShot != null && myShot.isLive() == true) {
g.draw3DRect(myShot.getX(), myShot.getY(), 1, 1, false);
}
if (myShot.isLive() == false) {
// 从ss中去掉该子弹
this.hero.getSs().remove(myShot);
}
}

//画出炸弹
for(int i=0;i<this.bombs.size();i++){
//取出一颗炸弹 开始画
Bomb b=bombs.get(i);
//开始画
if(b.getLife()>6){
g.drawImage(image1, b.getX(), b.getY(), 30, 30,  this);
System.out.println("image1"); 
}else if(b.getLife()>3){
g.drawImage(image2, b.getX(), b.getY(), 30, 30,  this);
}else {
g.drawImage(image3, b.getX(), b.getY(), 30, 30,  this);
}
//让b的生命值减小
b.lifeDown();
//炸弹爆炸完了
if(b.getLife()==0){
bombs.remove(b);
}
}
} // 构造方法
public MyPanel() {
// TODO Auto-generated constructor stub
// 初始化、创建一个自己的坦克
hero = new Hero(100, 100, 5);
// 创建坦克结合
ets = new Vector<EnemyTank>();
// 将敌人坦克加入到集合中
for (int i = 0; i < this.enSize; i++) {
ets.add(new EnemyTank((i + 1) * 50, 0, 5));
} // 初始化图片,3张图片的切换组成一颗炸弹

/*
 * !!!!!这里找不到图片!!!!!
 */
image1 = Toolkit.getDefaultToolkit().getImage("Image\\bomb_1.gif");
image2 = Toolkit.getDefaultToolkit().getImage("Image\\bomb_2.gif");
image3 = Toolkit.getDefaultToolkit().getImage("Image\\bomb_3.gif"); this.bombs=new Vector<Bomb>();


} // 画坦克的方法
public void paintTank(int x, int y, Graphics g, int direct, int type) {
// TODO Auto-generated method stub // 设置坦克颜色(类型)
switch (type) {
case 0: {
g.setColor(Color.cyan);
break;
}
case 1: {
g.setColor(Color.yellow);
break;
}
default: {
;
}
}
// 判断方向
switch (direct) {
case 0: {// 向上
// 左边
g.fill3DRect(x, y, 5, 30, false);
// 右边
g.fill3DRect(x + 15, y, 5, 30, false);
// 中间
g.fill3DRect(x + 5, y + 5, 10, 20, false);
g.fillOval(x + 5, y + 10, 10, 10);
// 炮
g.drawLine(x + 10, y + 15, x + 10, y + 2);
break;
}
case 1: {// 向右
// 上面
g.fill3DRect(x, y, 30, 5, false);
// 下面
g.fill3DRect(x, y + 15, 30, 5, false);
// 中间
g.fill3DRect(x + 5, y + 5, 20, 10, false);
// 炮塔
g.fillOval(x + 10, y + 5, 10, 10);
// 炮
g.drawLine(x + 13, y + 10, x + 28, y + 10);
break;
}
case 2: {// 向下
// 左边
g.fill3DRect(x, y, 5, 30, false);
// 右边
g.fill3DRect(x + 15, y, 5, 30, false);
// 中间
g.fill3DRect(x + 5, y + 5, 10, 20, false);
g.fillOval(x + 5, y + 10, 10, 10);
// 炮
g.drawLine(x + 10, y + 15, x + 10, y + 30);
break;
}
case 3: {// 向左
// 上面
g.fill3DRect(x, y, 30, 5, false);
// 下面
g.fill3DRect(x, y + 15, 30, 5, false);
// 中间
g.fill3DRect(x + 5, y + 5, 20, 10, false);
// 炮塔
g.fillOval(x + 10, y + 5, 10, 10);
// 炮
g.drawLine(x + 2, y + 10, x + 13, y + 10);
break;
}
default: {
;
}
}
} // 写一个方法判断是否击中对方坦克
public void hitTank(Shot s, EnemyTank et) {
// 判断该坦克的方向
switch (et.getDirect()) {
case 0:
case 2: {
if (s.getX() > et.getX() && s.getX() < et.getX() + 20
&& s.getY() > et.getY() && s.getY() < et.getY() + 30) {
// 击中了
// 1.子弹死亡 2.敌人坦克死亡
s.setLive(false);
et.isLive = false;
//创建一颗炸弹
Bomb b =new Bomb(et.getX(), et.getY());
//加入到向量
this.bombs.add(b);
}
break;
}
case 1:
case 3: {
if (s.getX() > et.getX() && s.getX() < et.getX() + 30
&& s.getY() > et.getY() && s.getY() < et.getY() + 20) {
// 击中了
s.setLive(false);
et.isLive = false;
//创建一颗炸弹 放入向量中
Bomb b =new Bomb(et.getX(), et.getY());
//加入到向量
this.bombs.add(b);
}
break;
}
}
} @Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub } @Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
if (e.getKeyCode() == KeyEvent.VK_W) {
// 向上
hero.setDirect(0);
hero.moveUp();
} else if (e.getKeyCode() == KeyEvent.VK_D) {
// 向右
hero.setDirect(1);
hero.moveRight();
} else if (e.getKeyCode() == KeyEvent.VK_S) {
// 向下
hero.setDirect(2);
hero.moveDown();
} else if (e.getKeyCode() == KeyEvent.VK_A) {
// 向左
hero.setDirect(3);
hero.moveLeft();
} else {
// System.out.println("输入错误");
;
}
if (e.getKeyCode() == KeyEvent.VK_J) {
// 判断玩家是否发射子弹
if (this.hero.getSs().size() < 5) {
this.hero.shotEnemy();
} }
this.repaint();
} @Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub } @Override
public void run() {
// TODO Auto-generated method stub
while (true) {
// 延时方法
try {
Thread.sleep(16);
} catch (Exception e) {
// TODO: handle exception
} // 判断是否击中
for (int i = 0; i < this.hero.getSs().size(); i++) {
Shot myShot = hero.getSs().get(i);
// 判断该子弹是否有效
if (myShot.isLive()) {
// 取出每一个坦克进行比较
// !!!!!!!!!!!!!这里一定要注意i、j!!!!!!!!!!!!!!!!
for (int j = 0; j < this.ets.size(); j++) {
EnemyTank et = ets.get(j);
if (et.isLive) {
this.hitTank(myShot, et);
}
}
}
} // 重绘
this.repaint();
}
}
}还需要代码我也可以提供。这段东西调了2天多了 还是一直没调出来,,,有些郁闷了。故上来请教给位大侠。

解决方案 »

  1.   

    好长的代码,就不细看了
    调用g.drawImage 时 不能有效的画出图像。
    你的注释里不是写着找不到图片吗?检查一下你的图片保存的路径,估计是你的相对路径没设好,实在不行你用绝对路径试试看
      

  2.   

            /*
             * !!!!!这里找不到图片!!!!!
             */
            image1 = Toolkit.getDefaultToolkit().getImage("Image\\bomb_1.gif");
            image2 = Toolkit.getDefaultToolkit().getImage("Image\\bomb_2.gif");
            image3 = Toolkit.getDefaultToolkit().getImage("Image\\bomb_3.gif");
    查看这个地方的图片保存的路径
      

  3.   

    您的程序较长,没有细看,有一篇文章不知你看过没有,我向你推荐一下,如果你英语好,建议看原文:
    译文地址是:
    http://happy.host898.net/java/swing/swing0001.html
    外国人免费的服务器,不知你能浏览否.
    image1 = Toolkit.getDefaultToolkit().getImage("Image\\bomb_1.gif");
    读不出来,可换一种方法,如:
    img = javax.imageio.ImageIO.read(getClass().getResource(imageNum+".gif"));我也想做applet版的战机或坦克格斗游戏,因激情不够,迟迟没开始.
      

  4.   

    路径有相对路径和绝对路径
    你这里用的是相对路径,也就是相对于你程序当前执行的路径,所以你要保证在当前程序的执行路径中能找到这个文件,对于你来说,目前最简单的方法就是使用绝对路径,比如 D:\\xxx\\Image\\bomb_1.gif
    否则你就要查看你当前程序执行的路径,然后再修改相对路径
    查看路径可以通过
    System.out.println(System.getProperty("user.dir"));
      

  5.   

    我使用myeclipse 创建的项目,同样的做法已经能载入图片了。现在问题出现在显示。