前回の作品を変更して、マウスボタンを押した所で、さかなのSpritAを生成して追加するプログラムに 変更しました。(変更箇所はこの色)です。(比較ください)
package fishgame; import java.awt.*; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.imageio.*; import javax.swing.*; import sprite.SpriteBasic;//ライブラリ利用 import sprite.SpriteFrame; import sprite.SpriteThread; class SpriteFishA extends SpriteBasic {//右から左に移動するクラス double speed_x; // 移動速度(1回のactionで変更する横移動量) SpriteFishA(Image img,int px, int py, int speed){//コンストラクタ super(img); this.x = px;//初期位置 this.y = py; this.speed_x = speed; //速度 } public void action(){//移動処理(SpriteThreadのanimationIntervalミリ秒ごとに実行される) super.action();//スーパクラス:SpriteBasicのactionを実行 this.x += this.speed_x;//移動 if(this.x < -100) {//左に隠れたか? this.x = 680; //右の見えない所に出現させる。 this.y = rand.nextInt(450)+30;;//出現させるY座標は乱数を使う this.speed_x = -( rand.nextInt(8)+4 );//速度も乱数 } } } public class TestSplitePanel1 extends JPanel implements MouseListener{ static Image bg;//背景素材イメージ static Image ch;//素材1イメージ static { try{ bg = ImageIO.read(TestSplitePanel1.class.getResource("aqua00.jpg"));//背景素材イメージ ch = ImageIO.read(TestSplitePanel1.class.getResource("sanma00.gif"));//素材1イメージ } catch(Exception e){ e.printStackTrace(); } } SpriteThread spriteThread; // 描画、アニメーションスレッド SpriteBasic back = new SpriteBasic(bg); SpriteFishA fish1 = new SpriteFishA(ch, 10, 100, -1); SpriteFishA fish2 = new SpriteFishA(ch, 100, 200, -1); JLabel label = new JLabel("匹います。"); public TestSplitePanel1() throws Exception { int w = bg.getWidth(this);//背景画像サイズ取得 int h = bg.getHeight(this); this.setPreferredSize(new Dimension(w,h)); spriteThread = new SpriteThread(w, h, this); this.add(label);//ラベル追加 label.setFont(new Font("Serif", Font.BOLD, 20)); label.setForeground(Color.white); spriteThread.add( back );//背景を追加 spriteThread.add( fish1 );//魚追加 spriteThread.add( fish2 );//魚追加 spriteThread.subSprite.get(1).x=10;//2番目に追加したSpriteの位置を変更 spriteThread.subSprite.get(1).y=100; spriteThread.start(10);//0.01秒のアクションスレッド スタート this.addMouseListener(this); } public void paintComponent(Graphics g){//間隔(0.01秒)で呼び出される。 super.paintComponent(g); if (spriteThread != null) spriteThread.paintTo(g); label.setText(spriteThread.subSprite.size()-1 + " 匹います。"); } public static void main(String[] arg) throws Exception{ new SpriteFrame(new TestSplitePanel1());//フレーム作品実行 } @Override public void mouseClicked(MouseEvent e) { } @Override public void mousePressed(MouseEvent e) { this.spriteThread.add(new SpriteFishA(ch, e.getX(), e.getY(), -1)); } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } }
なお、Spriteライブラリで描画対象にしたJPanelは、
これまで通りさまざまなJComponent派生部品を配置できます。
追加生成した数をラベルで表示するコードしています。