多个班级的绘画

时间:2016-06-24 20:22:05

标签: java swing class paint mouselistener

我在java中使用多个类并不是很好,因为我总是发现在1个类中执行所有代码更容易。最近我发现需要使用第二堂课进行我正在制作的游戏,并且我遇到了错误。

现在我只是想在用户点击的地方和时间产生敌人。

主类 -

package joey.rts;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
public class RTSMain extends JFrame implements MouseListener{
    /**
     * 
     */
    private static final long serialVersionUID = -7122370886923000314L;
    public static BufferedImage menu,enemy;
    public static boolean onmenu,oneenemy;
    public static void main(String[] args){
        new RTSMain();
    }
    public RTSMain(){
        init();
    }
    public void init(){
        setSize(1700,1100);
        setVisible(true);
        setLocationRelativeTo(null);
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("RTS");
        addMouseListener(this);
    }
    public void paint(Graphics g){
        Graphics2D g2 = (Graphics2D) g;
        if(onmenu == true){
            g2.drawImage(menu,0,0,this);
        }
    }
    @Override
    public void mouseClicked(MouseEvent e) {
        // TODO Auto-generated method stub

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

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

    }
    @Override
    public void mousePressed(MouseEvent e) {
        Enemy enemy = new Enemy();
        int x = e.getX();
        int y = e.getY();
        enemy.spawnEnemy(x, y);

    }
    @Override
    public void mouseReleased(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }
}

敌人类 -

   package joey.rts;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;

public class Enemy{
    /**
     * 
     */
    public static BufferedImage enemy;
    private static final long serialVersionUID = 7898827977636314494L;
    public static RTSMain rts;
    public static void main(String[] args){
        try{
            enemy = ImageIO.read(new File(javax.swing.filechooser.FileSystemView.getFileSystemView().getHomeDirectory() + "\\enemy.png"));
        } catch (Exception e){
            e.printStackTrace();
        }

    }
    public static void spawnEnemy(int x, int y){
        Graphics g = rts.getGraphics();
        Graphics2D g2 = (Graphics2D) g;
        g2.drawImage(enemy,x,y,null);
    }
}

2 个答案:

答案 0 :(得分:1)

在Main类中,将mouseClicked函数更新为:

@Override
    public void mouseClicked(MouseEvent e) {
        Enemy enemy = new Enemy();
        int x=e.getX(); // get mouse positionX
        int y=e.getY();//get mouse positionY
        enemy.spawnEnemy(x,y);//spawn Enemy
    }

如果您需要稍后重复使用,请考虑保存敌人对象。 我也认为没有必要在敌人类中扩展任何东西。

我已经更新了你的主要和你的敌人类:

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
public class Main extends JFrame implements MouseListener{
    /**
     * 
     */
    private static final long serialVersionUID = -7122370886923000314L;
    public static BufferedImage menu,enemy;
    public static boolean onmenu,oneenemy;
    public static void main(String[] args){
        new Main().setVisible(true);
    }
    public Main(){
        init();
    }
    public void init(){
        setSize(1700,1100);
        setVisible(true);
        setLocationRelativeTo(null);
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("RTS");
        addMouseListener(this);
    }

    @Override
    public void paint(Graphics g){
        Graphics2D g2 = (Graphics2D) g;
        if(onmenu == true){
            g2.drawImage(menu,0,0,this);
        }
    }
    @Override
    public void mouseClicked(MouseEvent e) {
        // TODO Auto-generated method stub

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

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

    }
    @Override
    public void mousePressed(MouseEvent e) {
        Enemy enemy = new Enemy();
        int x = e.getX();
        int y = e.getY();
        enemy.spawnEnemy(x, y,this.getGraphics());

    }
    @Override
    public void mouseReleased(MouseEvent arg0) {
        // TODO Auto-generated method stub
    }
}

这就是敌人类:

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;

public class Enemy{

    public static BufferedImage enemy;
    private static final long serialVersionUID = 7898827977636314494L;
    public Enemy(){
        try {
            //MAKE SURE THAT THIS IS THE CORRECT IMAGE PATH
        enemy = ImageIO.read(new File(javax.swing.filechooser.FileSystemView.getFileSystemView().getHomeDirectory() + "\\enemy.png"));
        } catch (IOException ex) {
            Logger.getLogger(Enemy.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    public void spawnEnemy(int x, int y,Graphics g){
        Graphics2D g2 = (Graphics2D) g;
        g2.drawImage(enemy,x,y,null);
    }
}

我删除了Enemy类上的Main实例变量。

我删除了spawnEnemy函数的static修饰符。

我已将图形对象作为属性发送到spawnEnemy函数。

我已将Enemy类中main方法中的代码移动到Enemy Constructor。

希望它有所帮助!

答案 1 :(得分:0)

粘贴答案似乎比试图在评论中解释它更容易。你的OO有点偏。将其添加到您的RTSMain班级:

protected ArrayList<Enemy> enemies = new ArrayList<Enemy>();
protected BufferedImage enemyImage = null;
...
public void init() {
    ...
    // everything you already have...
    enemyImage = //read in your enemy image here
    ...
}
...

@Override
public void mouseClicked(MouseEvent e) {
    // this takes place of Enemy.spawn(), get rid of it
    int x = e.getX(); // get mouse positionX
    int y = e.getY(); //get mouse positionY
    Enemy enemy = new Enemy( enemyImage, x, y );
    Enemies.add( enemy );
    // Iterate over list above to draw each enemy in your paintComponent method
}

此外,JFrame没有paintComponent()方法,您需要覆盖该方法来进行绘制(paint()已弃用)。添加JPanel,覆盖它的paintComponent(),依此类推。对于游戏,你可能想要创建一个游戏循环来进行绘画,除非它是基于回合的。

快乐的编码。