0

サーバーが個別のメッセージを送信するマルチプレイヤーゲームに取り組んでいます。敵の種類と数。その特定のスプライトが画面に読み込まれます。画面を切り替えるための CardLayout と上部のボタンで区切られた 4 つのビューがあります。

これが私が設定したチェーンです。敵を描こうとすると・・・エラーが出ます。

Main クラスには、次のメソッドがあります。

public void handleAttack(String message){
  ViewA.spawnEnemy(type,amt);
}

メソッドViewAを持つクラスです。spawnEnemy()

public class BattleView extends JPanel implements ActionListener {  
  private Player player;
  private Timer timer;
  private int B_WIDTH;
  private int B_HEIGHT;
  private boolean ingame;
  private ArrayList aliens;

  public BattleView(Player player) {
    this.player = player;
    addKeyListener(new TAdapter());
    setFocusable(true);
    setBackground(Color.RED);
    setDoubleBuffered(true);
    setSize(652, 480);
    ingame = true;
    timer = new Timer(5, this);
    timer.start();
  }

  public void addNotify() {
    super.addNotify();
    B_WIDTH = getWidth();
    B_HEIGHT = getHeight();   

    super.setPreferredSize(new Dimension(B_WIDTH,B_HEIGHT));
  }

  public void spawnEnemy(int type, int amount) {
    aliens = new ArrayList();
    for (int i=1; i<amount+1; i++ ) {
      aliens.add(new Enemy(0-i*40,400));
      System.out.println("Attack Message Recieved "+i);
    }
  }

  public void paint(Graphics g) {
    super.paint(g);

    Graphics2D g2d = (Graphics2D)g;
    g2d.drawImage(background, 0, 0, null);

    if (player.isVisible()){
      g2d.drawImage(player.getImage(), player.getX(), player.getY(), this);
    }
    ArrayList ms = player.getMissiles();

    /* for (int i = 0; i < ms.size(); i++) {
      Missile m = (Missile)ms.get(i);
      g2d.drawImage(m.getImage(), m.getX(), m.getY(), this);
    }*/

    /*    for (int i = 0; i < aliens.size(); i++) {
      Enemy a = (Enemy)aliens.get(i);
      if (a.isVisible()){
        g2d.drawImage(a.getImage(), a.getX(), a.getY(), this);
      }
    }*/

    g2d.setColor(Color.BLACK);
    g2d.drawString("BattleView: ", 5, 15);

    Toolkit.getDefaultToolkit().sync();
    g.dispose();
  }

  @Override public void actionPerformed(ActionEvent e) {
    /* if (aliens.size()==0) {
      //send message to server that enemies have been killed
    }*/

    ArrayList ms = player.getMissiles();
    /*  for (int i = 0; i < ms.size(); i++) {
      Missile m = (Missile) ms.get(i);
      if (m.isVisible()){
        m.move();
      }else{
        ms.remove(i);
      }
    }*/

    /*  for (int i = 0; i < aliens.size(); i++) {
      Enemy a = (Enemy) aliens.get(i);
      if (a.isVisible()){
        a.move();
      }else{
        aliens.remove(i);
      }
    }*/

    player.move();
    checkCollisions();
    repaint();  
  }

  public void checkCollisions() {
    /* Rectangle r3 = player.getBounds();

    for (int j = 0; j<aliens.size(); j++) {
      Enemy a = (Enemy) aliens.get(j);
      Rectangle r2 = a.getBounds();

        if (r3.intersects(r2)) {
          player.setVisible(false);
          a.setVisible(false);
          ingame = false;
        }
    }*/

    ArrayList ms = player.getMissiles();
    /*  for (int i = 0; i < ms.size(); i++) {
      Missile m = (Missile) ms.get(i);

      Rectangle r1 = m.getBounds();
      for (int j = 0; j<aliens.size(); j++) {
        Enemy a = (Enemy) aliens.get(j);
        Rectangle r2 = a.getBounds();

        if (r1.intersects(r2)) {
          m.setVisible(false);
          a.setVisible(false);
        } // r1.intersects
      } // for aliens.size()
    }*/ // for ms.size()
  }

  private class TAdapter extends KeyAdapter {

    public void keyReleased(KeyEvent e) {
      player.keyReleased(e);
    }

    public void keyPressed(KeyEvent e) {
      player.keyPressed(e);
    }
  }
}

System.out.println("Attack Message Recieved "+i);サーバーがメッセージを送信すると、この部分が 5 つ起動します。したがって、サーバーが 1,5.. を送信すると、タイプ 1 の 5 つのユニットが「受信」され、System.out.println5 回印刷されます。

forループを使用して敵ユニットを描画しようとするとpaint(g)..エラーが発生します forループをコメントアウトすると、すべてが正常にコンパイルされてロードされます(ただし、敵のスクリーンスプライトは作成されずSystem.out.println、サーバー経由で送信された N 回。

System.out.println火事の直後に敵を引き寄せるにはどうすればよいですか?

これはエラーです:

at ViewA.paint(ViewA.java:85)
at javax.swing.JComponent.paintToOffscreen(Unknown Source)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Unknown Source)
at javax.swing.RepaintManager$PaintManager.paint(Unknown Source)
at javax.swing.RepaintManager.paint(Unknown Source)
at javax.swing.JComponent._paintImmediately(Unknown Source)
at javax.swing.JComponent.paintImmediately(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.prePaintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.access$700(Unknown Source)
at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

ViewA.paint (ViewA.java:85) で

次の行に対応します。

        for (int i = 0; i < aliens.size(); i++) {
            Enemy a = (Enemy)aliens.get(i);
            if (a.isVisible())
                g2d.drawImage(a.getImage(), a.getX(), a.getY(), this);
        }

        g2d.setColor(Color.BLACK);
        g2d.drawString("BattleView: ", 5, 15);
4

2 に答える 2

1

上から

編集

  1. timer = new Timer(5, this);5 ミリ秒は 未満の更新頻度でlatency for all Native OSあり、25 以上の量で再生できます


  2. コードブロック全体を削除し、 getPreferredSizepublic void addNotify() {に置き換えてから、

    widtha) すべての座標は get /に基づいていますheight

    b)ObjectsでペイントされてJPanelいる/サイズ変更可能JFrame

  3. paintComponentの代わりに Java の Swing JComponent およびカスタム ペインティングに 使用します。public void paint(Graphics g) {

  4. public void actionPerformed(ActionEvent e) {repaint()プログラムで再描画するためのコード行がありません

  5. KeyListenerforをSwing JComponents使用しないでください 。の代わりにKeyBindingsadded toを使用してください。JPanelKeyListener

于 2013-07-19T07:26:47.610 に答える