透過は、png 画像は透明成分を含んだ色が使えますので、あらかじめそれで塗っておくことが出来ます。
分割は、画像の描画を Graphics.drawImage で行っているのでしたら、オーバーロードされたメソッドの中に元画像の一部を書き込むものがありますので、それを使えば同じことになります。
コードは、java_beginner1 さんの以前のご質問から個人的に作っていたモノを、爆発対応にしたうえで抜き出したものです。ですので、タイマーによる定周期処理の中でキー入力や描画を行う等結構余計なコードが含まれています。
実行すると小さいウインドウが出て、ESC キーを押すと中央で爆発します。
ご提示頂いている画像を読み込む際に外周を透明色にしていますので、背景の水色に対して黒い枠は出ません。
java
1 package teratail_java . q358026 ;
2
3 import java . awt . * ;
4 import java . awt . event . * ;
5 import java . awt . image . BufferedImage ;
6 import java . io . File ;
7 import java . io . IOException ;
8 import java . util . HashMap ;
9 import java . util . Map ;
10 import java . util . concurrent . * ;
11
12 import javax . imageio . ImageIO ;
13 import javax . swing . JFrame ;
14 import javax . swing . JPanel ;
15
16 public class ExplosionTest extends JFrame {
17 public static void main ( String [ ] args ) throws IOException {
18 new ExplosionTest ( ) . setVisible ( true ) ;
19 }
20
21 ExplosionTest ( ) throws IOException {
22 super ( "ExplosionTest" ) ;
23 setDefaultCloseOperation ( EXIT_ON_CLOSE ) ;
24
25 add ( new MainPanel ( ) ) ;
26
27 pack ( ) ;
28 setResizable ( false ) ;
29 setLocationRelativeTo ( null ) ;
30 }
31
32 private static class MainPanel extends JPanel implements FocusListener , Runnable {
33 private static final String EXPLOSION_FILENANE = "Q358026_explosion.png" ; //爆発画像
34 private ImageManager imageManager ;
35 private KeyManager keyManager ;
36 private Explosion explosion = null ;
37
38 MainPanel ( ) throws IOException {
39 super ( null ) ;
40 setPreferredSize ( new Dimension ( 100 , 100 ) ) ;
41 setBackground ( Color . CYAN ) ;
42
43 setFocusable ( true ) ;
44 addFocusListener ( this ) ;
45
46 imageManager = new ImageManager ( ) ;
47 imageManager . readImage ( EXPLOSION_FILENANE ) ;
48
49 keyManager = new KeyManager ( ) ;
50 addKeyListener ( keyManager ) ;
51 }
52
53 //各キーの押下状態を管理.
54 private class KeyManager implements KeyListener {
55 private int keyBits = 0 ;
56
57 boolean pressedEscape ( ) { return ( keyBits & 32 ) != 0 ; } //ESC が押されていたら true
58
59 @Override
60 public void keyTyped ( KeyEvent e ) { } //ignore
61 @Override
62 public void keyPressed ( KeyEvent e ) {
63 //System.out.println("keyPressed: "+e.getKeyCode());
64 switch ( e . getKeyCode ( ) ) {
65 case KeyEvent . VK_ESCAPE : keyBits |= 32 ; return ;
66 }
67 }
68 @Override
69 public void keyReleased ( KeyEvent e ) {
70 //System.out.println("keyReleased: "+e.getKeyCode());
71 switch ( e . getKeyCode ( ) ) {
72 case KeyEvent . VK_ESCAPE : keyBits &= ~ 32 ; return ;
73 }
74 }
75 }
76
77 //画像ロード担当
78 private class ImageManager {
79 private Map < String , BufferedImage > imageMap = new HashMap < > ( ) ;
80
81 void readImage ( String filename ) throws IOException {
82 BufferedImage image = ImageIO . read ( new File ( filename ) ) ;
83 tranparent ( image ) ;
84 imageMap . put ( filename , image ) ;
85 }
86 BufferedImage getImage ( String filename ) {
87 return imageMap . get ( filename ) ;
88 }
89 //左上角の色と同じ色を透明にする
90 protected void tranparent ( BufferedImage image ) {
91 int w = image . getWidth ( ) ;
92 int h = image . getHeight ( ) ;
93 int target = image . getRGB ( 0 , 0 ) ;
94 for ( int y = 0 ; y < h ; y ++ ) {
95 for ( int x = 0 ; x < w ; x ++ ) {
96 if ( image . getRGB ( x , y ) == target ) image . setRGB ( x , y , 0 ) ;
97 }
98 }
99 }
100 }
101
102 //背景(当たり判定無し)
103 abstract class Background {
104 protected int count , max ;
105 protected int x , y , w , h ;
106 protected BufferedImage image ;
107 Background ( String filename ) {
108 image = imageManager . getImage ( filename ) ;
109 w = image . getWidth ( ) ;
110 h = image . getHeight ( ) ;
111 }
112 //false ならまだ必要
113 abstract public boolean draw ( Graphics g ) ;
114 }
115
116 //爆発(背景)
117 private class Explosion extends Background {
118 static final int N = 4 ; // N回 draw 毎に絵が変わる
119 Explosion ( int cx , int cy , int cw , int ch ) {
120 super ( EXPLOSION_FILENANE ) ;
121 max = h / w * N ;
122 //中心位置を合わせる
123 this . x = cx + ( cw - w ) / 2 ;
124 this . y = cy + ( ch - w ) / 2 ;
125 }
126 public boolean draw ( Graphics g ) {
127 int dy = count / N * w ;
128 g . drawImage ( image , x , y , x + w , y + w , 0 , dy , w , dy + w , null ) ;
129 return ( ++ count < max ) ;
130 }
131 }
132
133 @Override
134 public void paintComponent ( Graphics g ) {
135 super . paintComponent ( g ) ;
136 if ( explosion != null && ! explosion . draw ( g ) ) explosion = null ;
137 }
138
139 //メインループ
140 @Override
141 public void run ( ) {
142 if ( explosion == null && keyManager . pressedEscape ( ) ) { //ESC が押されたら爆発
143 explosion = new Explosion ( 50 , 50 , 20 , 20 ) ;
144 }
145 repaint ( ) ; //再描画依頼
146 }
147
148 private boolean stop = false ;
149 private ScheduledExecutorService scheduler = Executors . newSingleThreadScheduledExecutor ( ) ;
150 private ScheduledFuture < ? > future ;
151 @Override
152 public void focusGained ( FocusEvent e ) {
153 if ( ! stop ) future = scheduler . scheduleAtFixedRate ( this , 0 , 20 , TimeUnit . MILLISECONDS ) ; //20ms毎に run()を呼ぶ
154 }
155
156 @Override
157 public void focusLost ( FocusEvent e ) {
158 if ( future != null ) {
159 future . cancel ( false ) ;
160 future = null ;
161 }
162 }
163 }
164 }