Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-随时间改变图像的透明度_Java_Swing_Sprite_Alpha Transparency - Fatal编程技术网

Java-随时间改变图像的透明度

Java-随时间改变图像的透明度,java,swing,sprite,alpha-transparency,Java,Swing,Sprite,Alpha Transparency,我正在尝试制作一个在游戏运行时可以变成半透明的游戏对象 当我在进入游戏的计时器循环(loadImages()方法内部)之前将其应用于对象的图像时,我的半透明度过滤器工作正常。但是,在游戏的计时器循环(timerLoop()方法)中,它不起作用,使我的对象的图像完全透明。我做错了什么 我使用java.awt库进行绘图,并使用RGBImageFilter应用半透明度 public class MyMainJPanel extends JPanel { // essential members

我正在尝试制作一个在游戏运行时可以变成半透明的游戏对象

当我在进入游戏的计时器循环(loadImages()方法内部)之前将其应用于对象的图像时,我的半透明度过滤器工作正常。但是,在游戏的计时器循环(timerLoop()方法)中,它不起作用,使我的对象的图像完全透明。我做错了什么

我使用java.awt库进行绘图,并使用RGBImageFilter应用半透明度

public class MyMainJPanel extends JPanel
{
    // essential members
    private Timer timer;
    private Camera camera;

    // image data

    Image bulletImg;
    Image bulletSemiTransImg;

    MenuBackgroundsSprite menuBg, menuBg2;



    public MyMainJPanel()
    {
        this.setBackground(Color.black);

        this.setFocusable(true);

        // load images

        this.loadImages();

        // set up the timer

        TimerListener timerListener = new TimerListener();

        timer = new Timer(0,timerListener);
        this.setFPS(60);
        timer.start();
    }


    private boolean loadImages()
    {
        ... 

        loads some other graphics

        ...

        // LOAD BULLET GRAPHICS

        // get our default toolkit

        Toolkit tk = Toolkit.getDefaultToolkit();

        // load our bullet images

        Image preImg = tk.getImage("graphics/basicBullet.png");

        bulletImg = ColorFilters.setTransparentColor(preImg, new Color(0xFF00FF)); // pink
    //  bulletSemiTransImg = ColorFilters.setSemiTransparency(bulletImg, 0.5); // My semitransparency works here outside the timer loop


        ...

        loads Camera object

        ...

        return true;
    }


    /** 
    *   setFPS()
    *   Preconditions: fps is a quantity of frames per second
    *   Postconditions: Sets the timer's refresh rate so that it fires fps times per second.
    **/

    public void setFPS(int fps)
    {
        int mspf = (int) (1000.0 /fps + 0.5);
        timer.setDelay(mspf);
    }



    // Event listener for the timer objects

    private class TimerListener implements ActionListener
    {

        public void actionPerformed(ActionEvent e)
        {
            Object source = e.getSource();

            if(source == timer)
            {
                // perform a loop through the game's logic
                timerLoop();        // Enters timer loop step here

            }
        }
    }


    public void timerLoop()
    {

        // bullet dynamic semitransparency test

        bulletSemiTransImg = ColorFilters.setSemiTransparency(bulletImg, 0.5); // This is where I'm having my problem. It makes all the bullets completely transparent 
                                                                                                        // if I try to apply semitransparency to them inside my timer loop.

        // repaint after game logic has completed.
        this.repaint();
    }

    public void paintComponent(Graphics g)
    {
            super.paintComponent(g);

            Graphics2D g2D = (Graphics2D) g;
            // test data

            // Camera transform

            g2D.setTransform(camera.getTransform()); 

            // Draw graphics

            ...

            Draw some stuff before the bullets

            ...

            // Here's where I draw my bullets

            for(int i = 0; i < 10; i++)
            {
                for(int j = 0; j < 10; j++)
                {
                    g2D.translate((i+1)*32,(j+1)*32);

                    g2D.drawImage(bulletSemiTransImg, null, null); 

                    g2D.setTransform(camera.getTransform()); // reset the Graphics context's transform
                }
            }


    }

}



/**
*   ColorFilters.java
*   A class of static methods used to apply color filters to images.
**/

public class ColorFilters
{

    public static Image setTransparentColor(Image srcImg, final Color tColor) // method accepts a transparent color.
                                                                     // It'll transform all pixels of the transparent color to transparent.
    {   
        ImageFilter filter = new RGBImageFilter() // overriding part of the RGBImageFilterClass to produce a specialized filter.
        {
            public int testColor = tColor.getRGB() | 0xFF000000; // establish the transparent color as a hexidecimal value for bit-wise filtering.

            public int  filterRGB(int x, int y, int rgb) // overriden method
            {
                if((rgb | 0xFF000000 ) == testColor) // if transparent color matches the color being tested, make it transparent.
                {
                    return rgb & 0x00FFFFFF; // alpha bits set to 0 yields transparency.
                }
                else // otherwise leave it alone.
                    return rgb;
            }
        };

        ImageProducer ip = new FilteredImageSource(srcImg.getSource(),filter);
        Image result = Toolkit.getDefaultToolkit().createImage(ip);

        return result;
    }


    // Here is the static method used to apply the semitransparency

    public static Image setSemiTransparency(Image srcImg, double semiTrans) // method accepts a transparent color.
                                                                     // It'll transform all pixels of the transparent color to transparent.
    {   
        if(semiTrans > 1.0) 
            semiTrans = 1.0;
        if(semiTrans < 0.0)
            semiTrans = 0.0;
        final int alpha = (int) (255 * (1.0 - semiTrans));

        ImageFilter filter = new RGBImageFilter() // overriding part of the RGBImageFilterClass to produce a specialized filter.
        {
            public int  filterRGB(int x, int y, int rgb) // overriden method
            {
                System.out.println(alpha);
                if((rgb & 0xFF000000) != 0)
                    return (rgb & 0x00FFFFFF) + (alpha << 24); // alpha bits set to 0 yields transparency.  
                else
                    return rgb;
            }
        };

        ImageProducer ip = new FilteredImageSource(srcImg.getSource(),filter);
        Image result = Toolkit.getDefaultToolkit().createImage(ip);

        return result;
    }

}
公共类MyMainJPanel扩展了JPanel
{
//重要成员
私人定时器;
私人摄像机;
//图像数据
图像公告;
图像处理;
MenuBackgroundsPrite menuBg,menuBg2;
公共MyMainJPanel()
{
这个.背景(颜色.黑色);
此参数为.setFocusable(true);
//加载图像
这是loadImages();
//设置计时器
TimerListener TimerListener=新TimerListener();
计时器=新计时器(0,timerListener);
这是setFPS(60);
timer.start();
}
私有布尔loadImages()
{
... 
加载其他一些图形
...
//加载项目符号图形
//获取我们的默认工具包
Toolkit tk=Toolkit.getDefaultToolkit();
//加载我们的子弹图像
Image preImg=tk.getImage(“graphics/basicBullet.png”);
bulletImg=ColorFilters.setTransparentColor(预调,新颜色(0xFF00FF));//粉红色
//BulletSemitTransimg=ColorFilters.setSemitTransparency(bulletImg,0.5);//我的半透明度在计时器循环之外工作
...
加载摄影机对象
...
返回true;
}
/** 
*setFPS()
*前提条件:fps是每秒的帧数
*后置条件:设置计时器的刷新率,使其每秒触发fps次。
**/
公共无效设置fps(整数fps)
{
int-mspf=(int)(1000.0/fps+0.5);
定时器设置延迟(mspf);
}
//计时器对象的事件侦听器
私有类TimerListener实现ActionListener
{
已执行的公共无效操作(操作事件e)
{
对象源=e.getSource();
如果(源==计时器)
{
//通过游戏逻辑执行循环
timerLoop();//在此处进入计时器循环步骤
}
}
}
public void timerLoop()
{
//子弹动态半透明度试验
BulletSemitTransimg=ColorFilters.setSemitTransparency(bulletImg,0.5);//这就是我的问题所在。它使所有的项目符号都完全透明
//如果我试图在计时器循环中对它们应用半透明度。
//游戏逻辑完成后重新绘制。
这个。重新绘制();
}
公共组件(图形g)
{
超级组件(g);
Graphics2D g2D=(Graphics2D)g;
//测试数据
//摄像机变换
g2D.setTransform(camera.getTransform());
//画图
...
在子弹之前画些东西
...
//这是我抽子弹的地方
对于(int i=0;i<10;i++)
{
对于(int j=0;j<10;j++)
{
翻译((i+1)*32,(j+1)*32);
g2D.drawImage(bulletSemiTransImg,null,null);
g2D.setTransform(camera.getTransform());//重置图形上下文的转换
}
}
}
}
/**
*ColorFilters.java
*一类静态方法,用于对图像应用颜色过滤器。
**/
公共类颜色过滤器
{
public static Image setTransparentColor(Image srcImg,final Color tColor)//方法接受透明颜色。
//它会将透明颜色的所有像素转换为透明。
{   
ImageFilter filter=new RGBImageFilter()//重写RGBImageFilterClass的一部分以生成专用筛选器。
{
public int testColor=tColor.getRGB()| 0xFF000000;//将透明颜色建立为十六进制值,用于逐位过滤。
public int filterRGB(int x,int y,int rgb)//重写的方法
{
如果((rgb | 0xFF000000)=testColor)//如果透明颜色与被测颜色匹配,则使其透明。
{
返回rgb&0x00FFFFFF;//将alpha位设置为0会产生透明度。
}
否则,就别管它了。
返回rgb;
}
};
ImageProducer ip=new FilteredImageSource(srcImg.getSource(),filter);
Image result=Toolkit.getDefaultToolkit().createImage(ip);
返回结果;
}
//下面是用于应用半透明度的静态方法
public static Image setsemittransparency(Image srcImg,double semtrans)//方法接受透明颜色。
//它会将透明颜色的所有像素转换为透明。
{   
如果(半反式>1.0)
半反式=1.0;
if(半反式<0.0)
半反式=0.0;
最终整数α=(整数)(255*(1.0-半反式));
ImageFilter filter=new RGBImageFilter()//重写RGBImageFilterClass的一部分以生成专用筛选器。
{
public int filterRGB(int x,int y,int rgb)//重写的方法
{
系统输出打印项次(α);
如果((rgb&0xFF000000)!=0)
返回(rgb&0x00FFFFFF)+(alpha(接近底部:)

返回(