0

タワーディフェンスゲームを作ってみました。これまでのところ、すべてが表示されるJFrame(と呼ばれるGameFrame) を作成し、背景画像 ( .PNG) を追加して、モンスターを作成し、作成したパス上を「移動」させようとしています。そこで、 のようGlassPaneに設定したクラスを作成しglassPaneましたGameFrame

のコードは次のGlassPaneとおりです。

public class GlassPane extends JComponent implements ActionListener{

    private ArrayList<MyPoint> path; //list of Points-pixel positions- (x,y pair) that monsters will follow
    private ArrayList<Monster> wave; //list of monsters that will try to reach the rift
    private Timer timer; //javax.swing.Timer
    private boolean waveEnd;//signing that the wave has ended(ignore it)

    public GlassPane(){

        super();
        createPath();//method is below
        wave = new ArrayList<Monster>();//monsters added in nextWave()
        timer = new Timer(4,this);//timer in order to slow down and smooth the movement of monsters
        waveEnd = false;
    }

    @Override
    protected void paintComponent(Graphics g){
            super.paintComponent(g);
            for(Monster m:wave){
               if(m.isVisible())//visible is a private variable in Monster class(defines whether i want to paint that monster or not)
                {
               g.drawImage(m.getImage(), m.getX(), m.getY(), this);
                }
             }
    }

    public void nextWave(){

        waveEnd = false;
                for(int i =0;i<20;i++)
                    wave.add(new Monster());
                wave.get(0).setVisible(true);//sets the first monster to be visible(paintable)
                int visibles = 1;//index 0 is visible,so index 1 is next to become visible
        while(!waveEnd){
                        if(visibles<19 && wave.get(0).getPathIndex()%50 == 0){
                        //meaning until all 20 monsters are visible(indexes 0-19),"every 50 steps(pixels) the first monster moves"
                           wave.get(visibles).setVisible(true);
                           //make another monster visible and start moving it
                           visibles++;//visible(moving) monsters increased by 1
            timer.start();//"move all visible monsters one step forward with a small delay until the next movement to make it soft"
        }
        JOptionPane.showMessageDialog(new JFrame(), "Finished!","All monsters reached the rift!",JOptionPane.INFORMATION_MESSAGE);//let me know then wave is finished
    }

    private void createPath(){
                //just making a lsit of pixels that I want monsters to follow
        path = new ArrayList<MyPoint>();
        for(int x=0;x<175;x++){
            path.add(new MyPoint(x,0));
        }

        for(int y=0;y<175;y++){
            path.add(new MyPoint(174,y));
        }

        for(int x=175;x<325;x++){
            path.add(new MyPoint(x,174));
        }

        for(int y=175;y<425;y++){
            path.add(new MyPoint(299,y));
        }

        for(int x=325;x<575;x++){
            path.add(new MyPoint(x,424));
        }

        for(int y=424;y>175;y--){
            path.add(new MyPoint(574,y));
        }

        for(int x=575;x<1001;x++){
            path.add(new MyPoint(x,174));
        }   
    }

    @Override

    public void actionPerformed(ActionEvent arg0) {
             for(Monster m:wave)
                if(m.isVisible())
            m.move(path);
                //"move every visible monster by one step"
        if(m.get(19).getPathIndex() == 1674)//1674 is the path's last index
            waveEnd = true;//if the last monster reaches the end,then all have
                //meaning the wave is finished
        this.repaint();//refresh any changes to the monsters' positions
        }
}

問題は、最初のモンスターだけがパスを移動していることrepaint()です。p で何が間違っていaintComponent(Graphics g)ますか? それが私の間違いだと信じているからです...どうすれば「利用可能な」すべての画像を毎回次々と描くことができますか?

注:.PNGそれが問題になる場合、それらは形式でバッファリングされた画像です。

クラスコードを追加することについてMonster考えましたが、メソッドの機能を説明するだけで、何が起こっているのかを理解するのに十分だと思います。誰かが詳細を必要とする場合は、私に知らせてください。前もって感謝します。

4

1 に答える 1

0

ループの周りに括弧を付ける必要があると思います。短縮形は、ループ後の最初の行のみをループします

//Output: 
//AAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAA
//BBBBBBBBBBBBBBBBBB
for(Monster m:wave)
System.out.println("AAAAAAAAAAAAAA");
System.out.println("BBBBBBBBBBBBBBB");


//Output: 
//AAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAA
//BBBBBBBBBBBBBBBBBB
//BBBBBBBBBBBBBBBBBB
//BBBBBBBBBBBBBBBBBB
//BBBBBBBBBBBBBBBBBB  
for(Monster m:wave)
{
System.out.println("AAAAAAAAAAAAAA");
System.out.println("BBBBBBBBBBBBBBB");
}
于 2013-02-04T17:48:42.673 に答える