2

私はちょっと立ち往生しています。私は、アニメーション化されたスプライトの 6x6 グリッドで構成される Java メモリ ゲームを作成しています (私の教授の要件)。私の試行では、スプライト アニメーションを持つ 1 つのコンポーネントしか表示できませんでした。私の他の試みは、 p1[i] = new Ash() を変更することでした。これにより、すべてのスプライトをグリッド内のすべてのコンポーネントにペイントできましたが、アニメーションはペイントできませんでした。グリッド内のすべてのコンポーネントが ANIMATED スプライトを持つようにする方法について、いくつかのアイデアをお願いしたいと思います。

私の主なクラス:

public class Main extends Component{
    public static void main(String[] args) {
        Ash ash = new Ash();
        JFrame f = new JFrame("Game sample");

        JPanel panel1 = new JPanel(new GridLayout(6,6,6,6));
        JPanel[] p1 = new JPanel[36];

        for(int i = 0;i < 36;i++){
          p1[i] = new JPanel(new BorderLayout());
          p1[i].add(ash);
          panel1.add(p1[i]);
        }
        f.add(panel1,BorderLayout.CENTER);
        f.setSize(500,500);
        f.setVisible(true);
        long start, trigger = 0, delay = 1000 / 8;
        while(true) {
            start = System.currentTimeMillis();
            if(start > trigger) {
                trigger = start + delay;
                ash.repaint();
            }
        }
    }
}

私のアッシュクラス:

public class Ash extends JPanel{

    BufferedImageLoader loader;
    BufferedImage spriteSheet;
    BufferedImage sprite, sprite2, sprite3, sprite4;
    int step = 0, start = 0;


    public Ash() {
        loader = new BufferedImageLoader();
        spriteSheet = null;
        try{
            spriteSheet = loader.loadImage("spritesheet.png");
        }catch (IOException ex){

        }
    }
}

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D)g;
    SpriteSheet ss = new SpriteSheet(spriteSheet);
    sprite = ss.grabSprite(start + step, 0, 32, 50);
    g2d.drawImage(sprite,0,10,null);
    if(step == 96) {
        step = 0;
    } else {
        step += 32;
    }
}
4

1 に答える 1

3

これが「実用的な例」です(まだ多くの問題があります)。根本的な問題は、コンポーネントが一度に 1 つのコンテナーにしか表示されないことです。36 個のアニメーションを作成するには、36 個のオブジェクトが必要Ashです。

import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;

public class Main extends Component{
    public static void main(String[] args) {
        Ash[] ash = new Ash[36];
        JFrame f = new JFrame("Game sample");

        JPanel panel1 = new JPanel(new GridLayout(6,6,6,6));
        JPanel[] p1 = new JPanel[36];

        for(int i = 0;i < 36;i++){
          p1[i] = new JPanel(new BorderLayout());
          ash[i] = new Ash();
          p1[i].add(ash[i]);
          panel1.add(p1[i]);
        }
        f.add(panel1,BorderLayout.CENTER);
        f.setSize(500,500);
        f.setVisible(true);
        long start, trigger = 0, delay = 1000 / 8;
        while(true) {
            start = System.currentTimeMillis();
            if(start > trigger) {
                trigger = start + delay;
                for (int ii=0; ii<ash.length; ii++) {
                    ash[ii].repaint();
                }
            }
        }
    }
}

class Ash extends JPanel{

    BufferedImage sprite[] = {
        new BufferedImage(25,100,BufferedImage.TYPE_INT_RGB),
        new BufferedImage(55,100,BufferedImage.TYPE_INT_RGB),
        new BufferedImage(75,100,BufferedImage.TYPE_INT_RGB),
        new BufferedImage(100,100,BufferedImage.TYPE_INT_RGB)
    };
    int step = 0, start = 0;

    int count = 0;


    public Ash() {
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D)g;
        g2d.drawImage(sprite[count++%4],0,10,null);
        if(step == 96) {
            step = 0;
        } else {
            step += 32;
        }
    }
}
于 2013-09-18T21:02:56.520 に答える