カードの画像を切り分けて描画する

カードの画像を切り分けて描画する card object class を定義します。
C#でも カードを描画 を作成しています。
Windows でも タイマ設定でカードを表示 を作成しています。

前田稔の超初心者のプログラム入門

プログラムの作成

  1. メモ帳などでタイプして cardview.java の名前で保存して下さい。
    Applet はサーバーにアップロードすることが前提なので、ファイル名やクラス名を小文字で統一しています。
    //★ CARD を切り出して描画    前田 稔
    //   appletviewer cardview.htm
    import java.applet.*;
    import javax.swing.*;
    import java.awt.*;
    import java.io.*;
    import javax.imageio.ImageIO;
    import java.net.URL;
    
    public class cardview extends JApplet
    {   card    obj;
    
        // Initialize
        public void init()
        {   obj = new card(getCodeBase(),"card.gif",56,65);
            setBackground(Color.gray);
        }
    
        // Paint Method
        public void paint(Graphics g)
        {   obj.View(g,0,20,50);
            obj.View(g,1,80,50);
            obj.View(g,2,140,50);
            obj.View(g,13,20,120);
            obj.View(g,39,80,120);
            obj.View(g,53,140,120);
        }
    }
    
    //★ 画像を切り分けるクラス
    class card extends JApplet
    {   private Image   Img;            // CARD Image
        private int     Width,Height;   // CARD の幅,高さ
        private int     Wnum,Hnum;      // CARD 横枚数,縦枚数
        private int     frameNum;       // Wnum*Hnum
        int             Sp_no;          // CARD の番号
        float           posX, posY;     // CARD の座標
    
        // Constructor
        card(URL url, String file, int ws, int hs)
        {   Width= ws;
            Height= hs;
            Wnum=Hnum= 1;
            Sp_no= 99;                  // flag:OFF
            posX=posY= 0f;              // 座標
            Img= null;
            try
            {   URL u = new URL(url, file);
                Img = ImageIO.read(u);
            }
            catch (IOException e)
            {   System.out.println("Image File Load Error");
                return;
            }
            Wnum= Img.getWidth(null)/Width;
            Hnum= Img.getHeight(null)/Height;
            frameNum = Wnum*Hnum;
            if (Wnum<1 || Hnum<1)   System.out.println("Image File Error");
        }
    
        // CARD View
        public void View(Graphics g, int n, int dx, int dy)
        {   int sx, sy;
            if (n>=frameNum)    return;
            sx = (n%Wnum) * Width;
            sy = (n/Wnum) * Height;
            if (Img != null)
            {   g.drawImage(Img,dx,dy,dx+Width,dy+Height,sx,sy,sx+Width,sy+Height,this);  }
        }
        public void View(Graphics g)
        {   View(g, Sp_no, (int)posX, (int)posY);
        }
    
        // CARD 番号と座標の設定
        public void Set(int num,float xp,float yp)
        {   Sp_no= num;
            posX= xp;
            posY= yp;
        }
    }
    
  2. カードの画像(card.gif)をプログラム(cardview.class)と同じフォルダーに格納して下さい。
  3. ホームページを表示する cardview.htm を作成します。
    <html>
      <body>
        <h3>カードの画像を切り出して描画</h3>
        <applet code="cardview.class" width="256" height="256">
        </applet>
      </body>
    </html>
    

Java プログラムの説明

  1. Applet のプログラムは java.applet.* を import して、extends(クラスの継承) で JApplet を指定して下さい。
    Java ウインドウ操作用の API を使用するので java.awt.* をインポートします。
    ImageIO で画像を入力するので java.io.*, javax.imageio.ImageIO, java.net.URL をインポートします。
    card obj; は card object class の領域です。
        import java.applet.*;
        import javax.swing.*;
        import java.awt.*;
        import java.io.*;
        import javax.imageio.ImageIO;
        import java.net.URL;
    
        public class cardview extends JApplet
        {   card    obj;
        
  2. init() はアプレットの初期化を行うメソッドです。
    new card() で card class をインスタンス化します。
    Java Applet の動作環境では、ローカルフォルダーはセキュリティで保護されています。
    一般的に画像は、アプレットのディレクトリ(CodeBase または DocumentBase)から入力します。
    getCodeBase() で URL を取得して "card.gif" と共にパラメータで渡します。
    56, 65 はカード一枚分の幅と高さです。
    背景色を gray に設定しています。
        public void init()
        {   obj = new card(getCodeBase(),"card.gif",56,65);
            setBackground(Color.gray);
        }
        
  3. paint() メソッドで何枚かのカードを描画しています。
    obj.View(g,0,20,50); の 0 が描画する Sprite(カード)の番号で、20,50 が座標です。
        // Paint Method
        public void paint(Graphics g)
        {   obj.View(g,0,20,50);
            obj.View(g,1,80,50);
            obj.View(g,2,140,50);
            obj.View(g,13,20,120);
            obj.View(g,39,80,120);
            obj.View(g,53,140,120);
        }
        

card object class の説明

  1. 詳細は Image(画像)の描画 を参照して下さい。
    Image Img; は画像データ(イメージ)の領域です。
    Width, Height は Sprite(カード一枚分)の幅と高さです。
    Wnum, Hnum は切り分ける Sprite(カード)の横と縦の枚数です。
    frameNum は切り分ける Sprite(カード)の総枚数です。
        class card extends JFrame
        {   private Image   Img;            // CARD Image
            private int     Width,Height;   // CARD の幅,高さ
            private int     Wnum,Hnum;      // CARD 横枚数,縦枚数
            private int     frameNum;       // Wnum*Hnum
            int             Sp_no;          // CARD の番号
            float           posX, posY;     // CARD の座標
        
  2. Constructor では url と file と Sprite(カード一枚分)の幅と高さを受け取ります。
    url と file から画像ファイルの URL を取得して ImageIO で画像を入力します。
    Sprite(カード)の横と縦の枚数は画像サイズから計算します。
        // Constructor
        card(URL url, String file, int ws, int hs)
        {   Width= ws;
            Height= hs;
            Wnum=Hnum= 1;
            Sp_no= 99;                  // flag:OFF
            posX=posY= 0f;              // 座標
            Img= null;
            try
            {   URL u = new URL(url, file);
                Img = ImageIO.read(u);
            }
            catch (IOException e)
            {   System.out.println("Image File Load Error");
                return;
            }
            Wnum= Img.getWidth(null)/Width;
            Hnum= Img.getHeight(null)/Height;
            frameNum = Wnum*Hnum;
            if (Wnum<1 || Hnum<1)   System.out.println("Image File Load Error");
        }
        
  3. Sprite(カード)を描画するメソッドです。
    n 番目のカードを、座標 dx, dy に描画します。
    n, dx, dy が省略されてときは Sp_no, posX, posY が既定値として使われます。
        // CARD View
        public void View(Graphics g, int n, int dx, int dy)
        {   int sx, sy;
            if (n>=frameNum)    return;
            sx = (n%Wnum) * Width;
            sy = (n/Wnum) * Height;
            if (Img != null)
            {   g.drawImage(Img,dx,dy,dx+Width,dy+Height,sx,sy,sx+Width,sy+Height,this);  }
        }
        public void View(Graphics g)
        {   View(g, Sp_no, (int)posX, (int)posY);
        }
        
  4. Sp_no, posX, posY を設定するメソッドです。
        // CARD 番号と座標の設定
        public void Set(int num,float xp,float yp)
        {   Sp_no= num;
            posX= xp;
            posY= yp;
        }
        

Java Game Program