3

Ovalsオブジェクトを使用してJavaで簡単なゲームを書いていGraphicsます。これはウイルスと呼ばれ、次のように機能します。中央に楕円があり、外側に 6 つの楕円があります。これらの外側の楕円は、クリックするまでサイズが大きくなり、クリックすると消えてプレイヤーが 10 ポイントを獲得します。楕円が中央の楕円に接触すると、中央の楕円のヘルスが低下します。ゼロになるとゲーム終了です。私が抱えている問題は、外側の楕円のサイズが大きくならないことです。なぜこうなった?

これが私のコードです:

package virus;


import java.awt.*;
import java.util.Random;
import javax.swing.JPanel;

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class VirusGamePanel extends JPanel implements MouseListener{
    private static final long serialVersionUID = 1L;//serialVersionUID field
    Random colour = new Random();//the outside ovals will always be a random colour
    private int sizeX = 1;//the x size of the outside ovals 
    private int sizeY = 1;//the y size of the outside ovals
    int score = 0;
    static String scorestring = "Score: ";
    Color rand = new Color(colour.nextInt(255),colour.nextInt(255),colour.nextInt(255));//generate the random colour

    public void paint(Graphics g)
    {
        super.paint(g);
        g.setColor(Color.magenta);
        g.drawString(scorestring+score,275,250);
        g.setColor(Color.orange);
        g.drawOval(200,150,200,200);
        g.setColor(rand);
        g.drawOval(270,50,50,50);
        g.drawOval(100,100,50,50);
        g.drawOval(450,100,50,50);
        g.drawOval(100,400,50,50);
        g.drawOval(450,400,50,50);
        g.drawOval(275,450,50,50);
        g.fillOval(270,50,sizeX,sizeY);//these six ovals are supposed to increase in size
        g.fillOval(100,100,sizeX,sizeY);
        g.fillOval(450,100,sizeX,sizeY);
        g.fillOval(100,400,sizeX,sizeY);
        g.fillOval(450,400,sizeX,sizeY);
        g.fillOval(275,450,sizeX,sizeY);
        inc();
    }

    public static void main(String[] args) {
      JPanel panel = new VirusGamePanel();

      JFrame frame = new JFrame("Virus");
      frame.setSize(700, 700);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(panel);
      frame.setVisible(true);
    }

    private void inc()//increase the size of the ovals
    {
        for(int i = 0; i<25000; i++)
        {
            sizeX++;
            sizeY++;
            repaint();
        }
    }

スレッド付きの新しいコード:

package virus;


import java.awt.*;
import java.util.Random;
import javax.swing.JPanel;

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class VirusGamePanel extends JPanel implements MouseListener,Runnable{
    private static final long serialVersionUID = 1L;
    Random colour = new Random();
    private int sizeX = 1;
    private int sizeY = 1;
    int score = 0;
    Thread thr = new Thread();
    static String scorestring = "Score: ";
    Color rand = new Color(colour.nextInt(255),colour.nextInt(255),colour.nextInt(255));

    public void paint(Graphics g)
    {
        super.paint(g);
        thr.start();
        g.setColor(Color.magenta);
        g.drawString(scorestring+score,275,250);
        g.setColor(Color.orange);
        g.drawOval(200,150,200,200);
        g.setColor(rand);

        g.fillOval(270,50,sizeX,sizeY);
        g.fillOval(100,100,sizeX,sizeY);
        g.fillOval(450,100,sizeX,sizeY);
        g.fillOval(100,400,sizeX,sizeY);
        g.fillOval(450,400,sizeX,sizeY);
        g.fillOval(275,450,sizeX,sizeY);
        inc();
    }

    public static void main(String[] args) {}

    private void inc()
    {
        thr.run();
    }
    public void run(){
        for(int i = 0; i<25000; i++)
        {
            sizeX++;
            sizeY++;
            repaint();
            try
            {
                Thread.sleep(10);
            }
            catch(InterruptedException e)
            {
                e.printStackTrace();
            }
        }
    }
4

3 に答える 3

2

これは私にとってはうまくいきます:

public class VirusGamePanel extends JPanel{
    private static final long serialVersionUID = 1L;//serialVersionUID field
    Random colour = new Random();//the outside ovals will always be a random colour
    private int sizeX = 0;//the x size of the outside ovals 
    private int sizeY = 0;//the y size of the outside ovals
    int score = 0;
    static String scorestring = "Score: ";
    Color rand = new Color(colour.nextInt(255), colour.nextInt(255), colour.nextInt(255)); //generate the random colour

    public void paint(Graphics g)
    {
        super.paint(g);
        g.setColor(Color.magenta);
        g.drawString(scorestring+score,275,250);
        g.setColor(Color.orange);
        g.drawOval(200, 150, 200, 200);
        g.setColor(rand);
        g.fillOval(270 - sizeX / 2, 50 - sizeY / 2, sizeX, sizeY);//these six ovals are supposed to increase in size
        g.fillOval(100 - sizeX / 2,100 - sizeY / 2, sizeX, sizeY);
        g.fillOval(450 - sizeX / 2,100 - sizeY / 2, sizeX, sizeY);
        g.fillOval(100 - sizeX / 2,400 - sizeY / 2, sizeX, sizeY);
        g.fillOval(450 - sizeX / 2,400 - sizeY / 2, sizeX, sizeY);
        g.fillOval(275 - sizeX / 2,450 - sizeY / 2, sizeX, sizeY);
        inc();
    }

    public static void main(String[] args) {
      JPanel panel = new VirusGamePanel();

      JFrame frame = new JFrame("Virus");
      frame.setSize(700, 700);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(panel);
      frame.setVisible(true);
    }

    private void inc()//increase the size of the ovals
    {
            sizeX++;
            sizeY++;
            repaint();
    }
}

楕円の中心点を修正し、incメソッドのループを削除しました。楕円形の境界線を描画する場合は、drawOvalコマンドと同じパラメーターを持つコマンドを追加するだけfillOvalです。

編集

成長プロセスを遅くしたい場合は、メソッドのinc()呼び出しの直前に以下を追加してください:paint

try {
    Thread.sleep(100);
} catch (InterruptedException e) {
    e.printStackTrace();
}
于 2012-08-23T14:29:08.723 に答える
2
 for(int i = 0; i<25000; i++)
    {
        sizeX++;
        sizeY++;
        repaint();
    }

お使いのコンピューターは、CPU が sizeX と sizeY を増やすほど速く再描画できません。ミリ秒単位で待機時間を追加します (特に 800x600 のような大きな領域を描画する場合)

 for(int i = 0; i<25000; i++)
    {
        sizeX++;
        sizeY++;
        repaint();
        try{ sleep(100);} catch(InterruptedException e){}
    }

ただし、これは別のスレッドから実行してください。だから、あなたのアプリ。凍結しません。

これは 10 FPS です。しかし、あなたは2G FPSを試しました。良い一日。

スレッドの例を次に示します。

class TEN_FPS extends Thread
{
    public void run()
    {
        while(working)
        {
             //calculations here
             repaint();
             try{sleep(100);}catch(InterruptedException e){}
        }
     }
 }

次に、メインメソッドで:

working=true;
TEN_FPS.start();

このプログラムを終了したら、次のようにします。

working=false;

デーモンスレッドを解放します。

于 2012-08-23T14:17:11.223 に答える
2

あなたのコードは再帰的です。inc() では、inc() を呼び出す VirusGamePanel.paint() を呼び出す repaint を呼び出します...

repaint() を呼び出すたびに、paint() メソッドが再度呼び出されます。inc() でループする代わりに、次のようにします。

private void inc()// increase the size of the ovals
{
  sizeX++;
  sizeY++;
  repaint();
}     
于 2012-08-23T14:20:39.357 に答える