2016-06-24 4 views
0

私はいつもより簡単に私のコードをすべて1クラスで行うことができたので、Javaで複数のクラスを使うのはあまり良くありません。最近、私が作っているゲームに2番目のクラスを使う必要があることがわかりました。私はエラーに遭遇しています。複数のクラスでのペイント

今は、ユーザーがクリックする場所と時間に敵をスポーンしようとしています。

メインクラス -

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

あなたの質問は何ですか?あなたが話したこのエラーはどこでしたか? – Frecklefoot

+0

しかし、私はOOの問題があります。 '敵がRTSMainを拡張するのはなぜですか?何かあれば、 'RTSMain'は' Enemy'のコレクションを含み、それらを描画するときに反復するだけです。そして 'spawnEnemy()'は 'Enemy'のインスタンスを生成し、それを' Enemy'コレクションに追加するだけで、次回は描画ループで描画されます(私はあなたがゲームループを使用していると仮定しています)。ちょうど私が気づいたものですが、あなたが遭遇しているエラーは何ですか? – Frecklefoot

+0

大きな問題は第1位として 'super.paint(...) 'が欠落しています。 (グラフィックス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 
    } 

は、敵オブジェクトの保存を検討後で再利用する。 また、敵クラスで何かを拡張する必要はありません。

私が更新しましたあなたのメインとあなたの敵のクラス:

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

私はspawnEnemy関数の静的修飾子を削除しました。

私はグラフィックオブジェクトをspawnEnemy関数の属性として送信しました。

私はEnemyクラスのmainメソッドにあったコードをEnemy Constructorに移動しました。

希望すると助かります!

+0

私は' mouseReleased() 'でそれをやっていますが、それは私だけです... – Frecklefoot

+0

それはゲームに必要な行動に依存し、とにかくユーザーがアクションをクリックするように頼んだのです:) –

+0

私はそれをして、新しいJFramesを常に開いていました。そこで、Enemyクラスの拡張RTSMainを削除し、バッファリングされたイメージを敵クラスに移動しました。まだ同じエラーです。 (上のコードを1秒更新する) – Joey402

0

答えを貼り付けるのは、コメントで説明するよりも簡単だったようです。あなたのオブジェクト指向は少しばかりです。あなたの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のはあなたが(paint()が推奨されません)あなたの絵を行うためにオーバーライドする必要がpaintComponent()方法を、持っていません。 JPanelを追加し、paintComponent()などを上書きします。ゲームの場合、非常にターンベースでない限り、あなたのペインティングを行うためのゲームループを作成することをお勧めします。

ハッピーコーディング。

関連する問題