2011-10-11 51 views
0

我想在遊戲運行期間製作一個可以變成半透明的遊戲對象。Java - 隨着時間的推移改變圖像的透明度

當我在進入遊戲的定時器循環(在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; 
    } 

} 
+0

歡迎來到StackOverflow。爲了更快地獲得更好的幫助,請發佈[SSCCE](http://pscode.org/sscce.html)。有關獲取圖像的想法,請參閱我對[此線程]的回答(http://stackoverflow.com/questions/7732959/change-imageicon-being-displayed-in-jframe-java/7733084#7733084)。 –

回答

0

(靠近底部:)

return (rgb & 0x00FFFFFF) + (alpha << 24); // alpha bits set to 0 yields transparency.

不應該這是(rgb & 0x00FFFFFF) | (alpha << 24)

+0

我剛試過,但沒有改變任何東西。 – Cazra

相關問題