java图像不动

时间:2011-09-13 04:04:43

标签: java image animation

嗨,大家好我正在做一个游戏。但由于某种原因,图像不会出现也不会移动。

这是一些代码。

TheScreen.java

package TheCarePackage;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class TheScreen extends JFrame implements KeyListener{

short FWIDTH = 500;
short FHEIGHT = 500;

private Image dbImage;
private Graphics dbGraphics;

private Image Bg;

static Player_1 P1 = new Player_1(250,450);
static AlienSpawner AS = new AlienSpawner();

public TheScreen(){

    addKeyListener(this);
    setTitle("1st Game");
    setSize(FWIDTH,FHEIGHT);
    setResizable(false);
    setLocationRelativeTo(null);
    setBackground(Color.white);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);

    ImageIcon back = new      ImageIcon("C:/Users/yellowsoldier25/Desktop/Games/PlanB_1stGame/src/TheCarePackage/Images/Background.png");
    Bg = back.getImage();

}

public void paint(Graphics g){

    dbImage = createImage(getWidth(),getHeight());
    dbGraphics = dbImage.getGraphics();
    paintComponent(dbGraphics);
    g.drawImage(dbImage,0,0,this);

}

public void paintComponent(Graphics g){

    g.drawImage(Bg,0,0,this);
    P1.draw(g);
    AS.paint(g);

    repaint();

}

public static void main(String[] args) {

    new TheScreen();

    Thread As = new Thread(AS);
    Thread Player1 = new Thread(P1);
    As.start();
    Player1.start();

}

public void keyPressed(KeyEvent e) {

    P1.keyPressed(e);

}

public void keyReleased(KeyEvent e) {}
public void keyTyped(KeyEvent e) {}



}

ThePlayer.java

package TheCarePackage;

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;

public class Player_1 implements Runnable{

public int a = 8;

int x,y;
Image Player_1;

private Shot[] shots;
static AlienSpawner AS = new AlienSpawner();

public Player_1(int x, int y){

    this.x = x;
    this.y = y;

    ImageIcon i = new ImageIcon("C:/Users/yellowsoldier25/Desktop/Games/PlanB_1stGame/src/TheCarePackage/Images/Player_1.png");
    Player_1 = i.getImage();

    shots = new Shot[8];

}

public void draw(Graphics g){

    g.drawImage(Player_1,x,y,50,50,null);

    g.setColor(Color.white);
    g.drawString("Ammo : " + a,10,40);

    for(int i = 0; i < shots.length; i++){

        if(shots[i] != null){

            shots[i].drawShot(g);

        }

    }

}

public void keyPressed(KeyEvent e) {

    if(e.getKeyCode() == e.VK_LEFT){

        x += -8;

    }
    if(e.getKeyCode() == e.VK_RIGHT){

        x += 8;

    }
    if(e.getKeyCode() == e.VK_SPACE){

    for(int i = 0; i < shots.length; i++){

        if(shots[i] == null){

            a--;
            shots[i] = generateShot();
            break;

        }

    }

    }

}

public void keyReleased(KeyEvent e) {}

public void keyTyped(KeyEvent e) {}

public Shot generateShot(){

    Shot shot = new Shot(x+23,y-7);

    return shot;

}

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

            Thread.sleep(5);

            for(int i = 0; i < shots.length; i++){

                if(shots[i] != null){

                    shots[i].moveShot(-1);

                    if(shots[i].getY() < 0){

                        shots[i] = null;
                        a++;

                    }


                }

            }

        }
    }catch(Exception e){System.err.println(e.getMessage());}
}

}

... theProblem

TheAlienSpawner.java

package TheCarePackage;

import java.awt.*;
import javax.swing.*;

public class AlienSpawner implements Runnable{

private int Health = 3;

private Shot s;

private boolean Spawn = true;

public AlienSpawner(){}

Alien1stVariant A1 = new Alien1stVariant(250,0);

public void paint(Graphics g){

    A1.drawAlien(g);

}

public void run() {

    try{

        Thread.sleep(20);

    while(true){

    A1.movement(1);

    }

    }catch(Exception e){System.err.println(e.getMessage());}
}

}

外星人阶级另一个问题......

package TheCarePackage;

import java.awt.*;
import javax.swing.*;

public class Alien1stVariant {

private int x;
private int y;

private Image Alien;

public Alien1stVariant(int x, int y){

    this.x = x;
    this.y = y;

    ImageIcon AlienIcon = new ImageIcon("C:/Users/yellowsoldier25/Desktop/Games/PlanB_1stGame/src/TheCarePackage/Images/Alien.png");
    Alien = AlienIcon.getImage();

}

public int getX(){

    return x;

}

public int getY(){

    return y;

}

public void movement(int speed){

    y += speed;

}

public void drawAlien(Graphics g){

    g.drawImage(Alien,x,y,40,40,null);

}

}

请尽快帮助。

问题:异形图像不会移动并显示。

2 个答案:

答案 0 :(得分:1)

JFrame没有paintComponent()方法,所以不要试图覆盖它。

你应该很少覆盖paint()方法。而是通过扩展JPanel(或JComponent)来完成自定义绘制,然后将面板添加到框架的内容窗格中。

如果你想做动画,现在使用一个带有sleep()的while循环的Swing Timer。

答案 1 :(得分:0)

看起来你在runAl方法中的TheAlienSpawner.java文件中有一个无限循环:

public void run() {
    try{
        Thread.sleep(20);
    while(true){ //This will never end
    A1.movement(1);
    }
    }catch(Exception e){System.err.println(e.getMessage());}
}

你只需要在导入无限循环的While(true)之前的20毫秒睡眠,你正在寻找的是类似的东西:

public void run() {
   try{
       while(true){
           Thread.sleep(20);
           A1.movement(1);
       }
    }catch(Exception e){System.err.println(e.getMessage());}
}