import java.applet.*; import java.awt.*; import java.awt.event.*; import java.awt.image.*; //-------------------------------------------------- // チップセレクトキャンバスクラス //-------------------------------------------------- class SelectChipCanvas extends Canvas implements MouseListener{ // 横幅 static final int WIDTH = 16 * 6; // 縦幅 static final int HEIGHT = 16 * 27; // モード(下層レイヤーか上層レイヤーか) int mode; // DOWN_LAYER_MODE or UP_LAYER_MODE // マップウィンドウキャンバス MapCanvas map_window_canvas; // マップ管理クラス MapManage manage; //オフスクリーンのグラフィックス Graphics og; // オフスクリーン Image off_screen; // メモリから作成したイメージ Image memory_image; // その基にするメモリ MemoryImageSource source; // オフスクリーンのピクセルデータ int[] OffPix; //-------------------------------------------------- // デバッグプリント //-------------------------------------------------- void DebugPrint( String str ){ System.out.println( str ); } //-------------------------------------------------- // 初期化 //-------------------------------------------------- public void Initialize( MapManage manage, MapCanvas canvas, int mode ){ //マウスイベント受付 this.addMouseListener( this ); this.manage = manage; this.map_window_canvas = canvas; // モード this.mode = mode; // オフスクリーン関連 Dimension d = getSize(); // オフスクリーン作成 off_screen = createImage( d.width, d.height ); og = off_screen.getGraphics(); OffPix = new int[ d.width * d.height ]; source = new MemoryImageSource( d.width, d.height, new DirectColorModel(24, 0xff0000, 0x00ff00, 0x0000ff), OffPix, 0, d.width ); source.setAnimated( true ); //source.setFullBufferUpdates( true ); //描画バッファを作成する memory_image = createImage( source ); // 配列から画像作成 // チップ描画(オフスクリーンに) manage.DspMapWindow( OffPix, mode ); // ピクセル更新 //source.newPixels(); } //-------------------------------------------------- // 描画 //-------------------------------------------------- public void update( Graphics g ){ paint(g); } public void paint( Graphics g ){ //DebugPrint("paint()"); // オフスクリーンに、メモリイメージを描画 og.drawImage( memory_image, 0, 0, this ); // 枠を作る manage.SetGraphics( og ); manage.DrawRect( this.mode ); // オフスクリーンを描画 g.drawImage( off_screen, 0, 0, this ); } //-------------------------------------------------- // クリックしてチップ選択 //-------------------------------------------------- public void mousePressed(MouseEvent e){ int x = e.getX(); int y = e.getY(); //左クリックの場合 if((e.getModifiers() & e.BUTTON1_MASK) != 0){ byte id = (byte)( (x / MapManage.CHIP_SIZE) + 6 * ( y / MapManage.CHIP_SIZE ) ); // 下層レイヤなら海分のオフセット加算 if( this.mode == manage.DOWN_LAYER_MODE ){ if( id == 0 ){ id = 0; }else{ id += manage.SEA_NUM; } } // IDは適正な値? boolean ret = manage.IsCorrectID( id, this.mode ); // 正しいなら更新 if( ret ){ manage.SetSelectedID( id ); // メインに通知 manage.SetChipMode( this.mode ); // マップウィンドウも更新 map_window_canvas.repaint(); } } //右クリックの場合 /* else if((e.getModifiers() & e.BUTTON3_MASK) != 0){ // マップモード切り替え manage.ChangeMapWindowMode(); // チップ描画(オフスクリーンに) manage.DspMapWindow( OffPix ); // ピクセル更新 source.newPixels(); } */ repaint(); } public void mouseClicked( MouseEvent e ){ } public void mouseReleased(MouseEvent e){} public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} }