9

さて、私はゲームを作成しています。元のヒット マーカーの画像にテキストを追加して変更しようとしています。次のコードを使用しています。

import javax.swing.ImageIcon;
import javax.swing.Timer;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
public class HitMarker {

    public static final Image rangeHitMarker = new ImageIcon(HitMarker.class.getResource("rangeHitMarker.png")).getImage();
    public static final Image magicHitMarker = new ImageIcon(HitMarker.class.getResource("magicHitMarker.png")).getImage();
    public static final Image monsterHitMarker = new ImageIcon(HitMarker.class.getResource("monsterHitMarker.png")).getImage();

    public static final Font font = new Font("Tahoma", Font.PLAIN, 10);

    public static final Color t = new Color(0,0,0,0);

    public Image hitMarker;
    public BufferedImage image;
    public String hit;

    public int attackStyle;

    public boolean rangeAttack;
    public int x;
    public int y;

    public Timer timer;
    public boolean remove;

    public HitMarker(int x, int y, int hit, int attackStyle){
        this.hit = String.format("%d", hit);
        this.remove = false;
        this.x = x;
        this.y = y;
        this.attackStyle = attackStyle;
        this.hitMarker = getImage();
        BufferedImage bi = new BufferedImage(35, 20, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = bi.createGraphics();
        g.drawImage(hitMarker, 0, 0, null);
        g.setFont(font);
        g.setColor(Color.WHITE);
        g.drawString(this.hit, 18, 13);
        g.dispose();
        image = bi;
        timer = new Timer(800,
                new ActionListener(){
            public void actionPerformed(ActionEvent e){
                remove = true;
                timer.stop();
            }
        }
        );
        timer.setInitialDelay(800);
        timer.start();
    }

    public HitMarker(int x, int y, int hit){
        this.hit = String.format("%d", hit);
        this.remove = false;
        this.x = x;
        this.y = y;
        this.hitMarker = monsterHitMarker;
        BufferedImage bi = new BufferedImage(35, 20, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = bi.createGraphics();
        g.drawImage(hitMarker, 0, 0, null);
        g.setFont(font);
        g.setColor(Color.WHITE);
        g.drawString(this.hit, 18, 13);
        g.dispose();
        image = bi;
        timer = new Timer(800,
                new ActionListener(){
            public void actionPerformed(ActionEvent e){
                remove = true;
                timer.stop();
            }
        }
        );
        timer.setInitialDelay(800);
        timer.start();
    }

    public boolean isRangeAttack(){
        return attackStyle == AttackStyleConstants.RANGE || attackStyle == AttackStyleConstants.RANGE_DEFENCE ? true : false;
    }

    public Image getImage(){
        return isRangeAttack() ? rangeHitMarker : magicHitMarker;
    }

}

特にどちらかのコンストラクターに焦点を当てています: そして、私が抱えているエラーは、BufferedImage を作成し、バッファーされた画像に画像を描画すると、黒い背景が自動的に作成され、理由がわからないということです。私はこのトピックについて調査してみましたが、AlphaComposite と g.clearRect() メソッドについて何かを変更すると言う人もいますが、どちらも機能していないようです。ちなみに、バッファリングされた画像にペイントしている画像は 35x20 (バッファリングされた画像の寸法) で、背景は透明です。この黒い背景を削除する方法を教えていただける方がいらっしゃいましたら、よろしくお願いいたします。

4

4 に答える 4

19

試してみてくださいBufferedImage.TYPE_INT_ARGB。これにより、領域が黒ではなく透明になります。

于 2012-06-29T16:12:35.893 に答える
4

アルファチャンネルも試して保存したいかもしれません。

 BufferedImage bi = new BufferedImage(35, 20, BufferedImage.TYPE_INT_ARGB);
于 2012-06-29T16:13:44.267 に答える
1

白いJPG背景が必要な場合は、次のように画像を描画する必要があります。

g.drawImage(hitMarker, 0, 0, Color.WHITE, null);

PNGこのようにして、 からに移動するときに黒い背景を回避できますJPG

于 2016-02-18T01:45:05.460 に答える