Java Appletの解説

<18.お絵かきソフト(その4)>

画像の重なりにより色が変わる事の改善してます。
オフスクリーン描画(ダブルグラフィックバッファ)という方法を使って改善するのですが、私にもいまいち分からない部分があります。

1.オフスクリーン描画

17.「お絵かきソフト」を改善したものです。
1.<Javaファイル>
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

public class tpaint5 extends Applet{

Graphics offg;
Dimension offd,clo;
Image offImage;
int gclr=3;
public void init(){

offg=getGraphics();
Dimension clo=getSize();
offd=clo;
offImage=createImage(clo.width,clo.height);
offg=offImage.getGraphics();

public void mouseReleased(MouseEvent e){
if(chi==3){offg.fillRect(xx1,yy1,w1,h1);}
else if ((chi==6)||(chi==5)){if (taka<9){offg.drawLine(spx1,spy1,spx2,spy2);taka=taka+1; xpl[taka]=spx2;ypl[taka]=spy2;}
else{chi=4;pmeth.setText("細線");}}
repaint();}

public void mouseDragged(MouseEvent e){
px2=e.getX();py2=e.getY();
if(chi==2){offg.clearRect(e.getX(),e.getY(),20,20);repaint();}
else if(chi==3){revwh(px2,py2);repaint(););
else if(chi==4){offg.drawLine(oldx,oldy,e.getX(),e.getY());oldx=e.getX();oldy=e.getY();repaint();}
else if((chi==5)||(chi==6)){spx2=e.getX();spy2=e.getY();repaint();}

class MyListener implements ActionListener{
public void actionPerformed(ActionEvent e){
if(e.getSource()==bmt1){offg.clearRect(0,0,getSize().width-1,getSize().height-1);repaint();
tadi=0;taka=0;chi=1;pmeth.setText("全消去");}

if(e.getSource()==bt1){offg.setColor(Color.blue);bdisp.setBackground(Color.blue);gclr=1;}
else if(e.getSource()==bt2){offg.setColor(Color.red);bdisp.setBackground(Color.red);gclr=2;}
else if(e.getSource()==bt3){offg.setColor(Color.black);bdisp.setBackground(Color.black);gclr=3;}

void plydisp(int tadi){
if (tadi==1){offg.drawPolygon(xpl,ypl,taka+1);}
if (tadi==2){offg.fillPolygon(xpl,ypl,taka+1);}
repaint(); }
public void paint(Graphics g){update(g); }
public void update(Graphics g){
if (gclr==1){g.setColor(Color.blue);}
else if(gclr==2){g.setColor(Color.red);}
else if(gclr==3){g.setColor(Color.black);}
g.drawImage(offImage,0,0,this);
if (chi==3){g.fillRect(xx1,yy1,w1,h1);}
if((chi==5)||(chi==6)){g.drawLine(spx1,spy1,spx2,spy2);}
}}
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
例1.ここをクリックして下さい。
2.<解説>
1)初期設定
1.Graphics offg;Dimension offd,clo;Image offImage;
Graphics offg;オフスクリーンバッファーのグラフィック
Dimension offd,clo;オフスクリーンバッファーの大きさ
Image offImage;オフスクリーンイメージ
2.int gclr=3;
オフスクリーン法では理由は不明ですが、ボタンからの色の選択だけではうまく色の変換ができないため 色の決定変数としてgclrを使います。gclr=3初期設定は黒です。
2)オフスクリーン
あるものを参考に作ったので、詳細は分かりません。
offg=getGraphics();グラフィック・オブジェクトを得る。
Dimension clo=getSize();サイズを得る。
offd=clo;
offImage=createImage(clo.width,clo.height);オフスクリーン描画イメージを作成。
offg=offImage.getGraphics();上記の方法で作ったイメージのグラフィックオブジェクトを得る。
3)マウスボタンが放された時、public void mouseReleased(MouseEvent e){
1.中塗四角の処理
if(chi==3){offg.fillRect(xx1,yy1,w1,h1);}
offg.fillRect(xx1,yy1,w1,h1);最終的に決まった中塗四角をオフスクリーンバッファーoffgに描く。
2.多角形の処理
else if ((chi==6)||(chi==5)){if (taka<9){offg.drawLine(spx1,spy1,spx2,spy2);taka=taka+1;
xpl[taka]=spx2;ypl[taka]=spy2;}
offg.drawLine(spx1,spy1,spx2,spy2);最終的に決まった直線をオフスクリーンバッファーoffgに描く。
4)マウスドラッグ中の処理
1.if(chi==2){offg.clearRect(e.getX(),e.getY(),20,20);repaint();}
chi==2は部分消去。オフスクリーンバッファーoffg上で、部分消去する。
2.else if(chi==3){revwh(px2,py2);repaint(););
chi==3は中塗四角形。revwh(px2,py2);新しい四角形の座標を求めrepaint();する。これは、g上で描画することを意味します。 g上で描画するとちらつきはありますが、色が重なっても色変わりしません。
3.else if(chi==4){offg.drawLine(oldx,oldy,e.getX(),e.getY());oldx=e.getX();oldy=e.getY();repaint();}
chi==4は細線。オフスクリーンバッファーoffg上に線を引く。
4.else if((chi==5)||(chi==6)){spx2=e.getX();spy2=e.getY();repaint();}
(chi==5)||(chi==6)は多角形。新しい座標を求めてrepaint();する。g上に多角形の位置を決めるため の線を描きます。色が重なっても色変わりしません。
5)ボタン処理
1.if(e.getSource()==bmt1){offg.clearRect(0,0,getSize().width-1,getSize().height-1);
bmt1の時、オフスクリーンバッファーoffgをクリアーする。
2.if(e.getSource()==bt1){offg.setColor(Color.blue);bdisp.setBackground(Color.blue);gclr=1;}
オフスクリーンバッファーoffgの色を指定します。gclr=1;
6)多角形の処理void plydisp(int tadi){
if (tadi==1){offg.drawPolygon(xpl,ypl,taka+1);}
if (tadi==2){offg.fillPolygon(xpl,ypl,taka+1);}
tadi==1はoffgに多角形、tadi==2は中塗多角形を描画します。
7)描画public void update(Graphics g){
1.色の指定
if (gclr==1){g.setColor(Color.blue);}
else if(gclr==2){g.setColor(Color.red);}
else if(gclr==3){g.setColor(Color.black);}
理由はわかりませんが、ここで色指定しないと黒で描画されます。
2.g.drawImage(offImage,0,0,this);
オフスクリーンバッファーの画像offImageを画面に描き出す。
3.if (chi==3){g.fillRect(xx1,yy1,w1,h1);}
マウスドラック中に中塗四角形の位置を決めるためにg上に描かれる四角形
4.if((chi==5)||(chi==6)){g.drawLine(spx1,spy1,spx2,spy2);}
マウスドラック中に多角形の位置を決めるためg上に描かれる線



トップページ

趣味のトップページ

娯楽室の各部屋
Aplletの解説へ戻る

Scriptの解説 Scriptのゲーム Appletのゲーム Linuxの部屋 物置部屋