2016-06-24 7 views
0

Я не очень хорошо разбираюсь в нескольких классах в 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 

    } 
} 

Enemy класс -

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

Так в чем ваш вопрос? Где эта ошибка вы говорили? – Frecklefoot

+0

Но я вижу проблему OO. Почему «Enemy» расширяет «RTSMain»? Во всяком случае, я думаю, что 'RTSMain' должен содержать коллекцию« Enemy »и просто перебирать их при их рисовании. И 'spawnEnemy()' должен просто вызвать экземпляр «Enemy», добавить его в коллекцию «Enemy», и он будет нарисован в следующий раз через цикл рисования (я предполагаю, что вы используете игровой цикл). Только то, что я заметил, но какова ошибка, с которой вы сталкиваетесь? – Frecklefoot

+0

вам не хватает 'super.paint (...)' в качестве первой. строка кода внутри 'public void paint (Graphics g) {', тогда текущая картина будет сброшена – mKorbel

ответ

1

в главном обновлении класса ваша функция 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 
    } 

Рассмотрим сохранение объектов противника, если вам нужно для повторного использования позже. Также я не вижу необходимости расширять что-либо в Enemy Class.

Я Обновлено Ваш главный и ваш класс 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 
    } 
} 

И это класс Enemy:

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

Я удалил переменную экземпляра Main, который был на классе Enemy ,

Я удалил статический модификатор для функции spawnEnemy.

Я отправил графический объект в качестве атрибута функции spawnEnemy.

Я переместил код, который был в основном методе в классе Enemy, в Enemy Constructor.

Надеюсь, это поможет!

+0

Я бы сделал это на 'mouseReleased()', но это всего лишь я... – Frecklefoot

+0

Это зависит от поведения, необходимого в игре, он все равно попросил пользователя нажать на ссылку :) –

+0

Я сделал это, и он просто постоянно открывал новые JFrames. Поэтому я удалил расширенный RTSMain в классе Enemy и переместил буферное изображение в класс врага. Такая же ошибка. (Обновление выше кода в секунду) – Joey402

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() и так далее. Для игры вы, вероятно, захотите создать игровой цикл, чтобы сделать свою картину, если она не очень пошаговая.

Счастливое кодирование.

Смежные вопросы