1

それで、友人と私は楽しみのために非常に基本的なゲームを作成しています。これは、木こりが木を切り倒すトップダウン (約 45 度の角度) です。非常に基本的でちょっと不自由なことは承知していますが、準高度な Java を始めたばかりです。

まず、木のスプライトが必要であると判断しましたが、それが何であろうと、木の周りに白いピクセルがある四角形になることに気付きましたが、それでは背景画像の一部が切り取られてしまいます。そのため、白 (空白/負のスペース) であるすべてのピクセルを取得し、それらのピクセルを透明にしたいと考えました。これを行うために、大量のコードを調べましたが、最も多く見られたのは以下のコードでした。これは機能しましたが、よくわかりません。

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

public class simpleFrame extends JFrame {
   JPanel mainPanel = new JPanel() {
      ImageIcon originalIcon = new ImageIcon("image.png");
      ImageFilter filter = new RGBImageFilter() {
         int transparentColor = Color.white.getRGB() | 0xFF000000;
         public final int filterRGB(int x, int y, int rgb) {
            if ((rgb | 0xFF000000) == transparentColor) {
               return 0x00FFFFFF & rgb;
            } else {
               return rgb;
            }
         }
      };
      ImageProducer filteredImgProd = new FilteredImageSource(originalIcon.getImage().getSource(), filter);
      Image transparentImg = Toolkit.getDefaultToolkit().createImage(filteredImgProd);
      public void paintComponent(Graphics g) {
         g.setColor(getBackground());
         g.fillRect(0, 0, getSize().width, getSize().height);
         g.drawImage(transparentImg, 140, 10, this);
      }
   };
   public simpleFrame() {
      super("Transparency Example");

      JPanel content = (JPanel)getContentPane();
      mainPanel.setBackground(Color.black);
      content.add("Center", mainPanel);
   }
   public static void main(String[] argv) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            simpleFrame c = new simpleFrame();
            c.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            c.setSize(700,700);
            c.setVisible(true);
         }
      });
   }
}

正確に理解できないのは、6行目のJPanelの宣言の後に括弧がある理由であり、6行目から16行目がどのようになっているのかわかりません。大括弧の間と同様に、右大括弧の後にセミコロンがあります。それがどのように機能するのか理解できません。すべてのコマンドラインは脇に置いてありますが、JPanel を宣言する構造は JPanel mainPanel = new JPanel() { }; です。

JPanel クラスに画像をインポートし、すべてのネガティブ スペースを透明にしてからペイントできるように、これを実装しようとしています。プログラムの構造と、それをクラスに実装する方法を理解できないようです。

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

public class Frame extends JPanel   {
    /*
     * This is the JPanel in which I want to add the transparent image to a JPanel
     * then add the JPanel object,"Frame", above in a JFrame declared in my
     * class above
     */
    public Frame()  {
        JPanel jp = new JPanel();
        jp.setSize(300,300);
        jp.setVisible(true);
        circle = new BufferedImage();           
        try {circle = ImageIO.read(new File("circle.PNG"));}
        catch (IOException ex) {}
    }
    public void paintComponents(Graphics g) {
        super.paintComponents(g);
        g.drawImage(circle,0,0,300,300, null);
        g.drawRect(50, 50, 50, 50);
    }

}

画像を読み込んで透明化し、JPanel に描画するだけのテストコードです。これを行うための最善の方法を理解しようとしているところです。私が見つけたコード (最初のコード ブロック) は非常にうまく機能しているように見えますが、それをコードに実装するための最善の方法がわかりません。

前もって感謝します、

ロビーとニック

4

1 に答える 1