import java.awt.*; import java.awt.event.*; import java.applet.*; import java.io.*; import java.net.URL; import java.net.URLConnection; public class KnightTravel extends Applet implements MouseListener,MouseMotionListener,Runnable{ //-------------------------------------------------- // 定数 //-------------------------------------------------- // FPS(フレーム数/秒) int FPS; // SPF(ミリ秒/フレーム) int SPF; // スリープ時間(ミリ秒) final byte SLEEP_TIME = 5; // 固定小数の1の値(16=1) final byte ONE = 0x10; // 固定小数シフト数 final byte SHIFT = 4; //-------------------------------------------------- // メンバ変数定義 (m_と命名) //-------------------------------------------------- // スレッド volatile Thread m_thread; // イメージバッファ Image m_image_buffer; // 現在時刻保存用 long m_waitTime; // バックバッファ Graphics m_back_bufferg; // ゲームクラス Game game; // クリアしてセーブしたかフラグ boolean m_save_flag; // レベル int m_level; //-------------------------------------------------- // 初期化 //-------------------------------------------------- public void init(){ int width, height; String file; System.out.println("init()"); m_save_flag = false; // 外部からパラメータ取得 // FPS FPS = Integer.parseInt( getParameter("FPS") ); SPF = (int)( 1000 / FPS ); // 横と高さ width = Integer.parseInt( getParameter("SIZE_WIDTH") ); height = Integer.parseInt( getParameter("SIZE_HEIGHT") ); game = new Game( width, height ); // レベル m_level = Integer.parseInt( getParameter("LEVEL") ); // レベルが0なら自動解答モード //マウスイベント受付 this.addMouseListener( this ); this.addMouseMotionListener( this ); // メディアトラッカー(先ロード用) MediaTracker mediaT = new MediaTracker(this); // 領域取得(デフォは320*240) Dimension d = getSize(); //現在時刻保存(単位はミリ秒) m_waitTime = System.currentTimeMillis(); //描画バッファを作成する m_image_buffer = createImage( d.width, d.height ); // 画像ロード file = getParameter("CHARA_FILE"); game.LoadImage( this, file ); mediaT.addImage( game.GetImage() , 0 ); // ロード待ち try{ mediaT.waitForAll(); }catch( InterruptedException e ){} } //-------------------------------------------------- // スタート(initの次に呼ばれる。最小化から復帰したときも呼ばれる。) //-------------------------------------------------- public void start(){ System.out.println("start()"); // スレッド開始 if(m_thread == null){ m_thread = new Thread(this); m_thread.start(); } } //-------------------------------------------------- // ストップ(ウインドウが消えると呼ばれる。最小化でも。) //-------------------------------------------------- public void stop(){ System.out.println("stop()"); m_thread = null; } //-------------------------------------------------- // ゲームループ //-------------------------------------------------- public void run(){ System.out.println("run()"); Thread thisThread = Thread.currentThread(); try{ //ゲームループ while( m_thread == thisThread ){ m_waitTime = System.currentTimeMillis(); //描画 repaint(); // メイン処理 game.ToMove(); // 自動解答 game.AutoMoveByHistory(); // クリアしていたらセーブ if( game.IsClear() && !m_save_flag ){ if( m_level >= 1 ){ SaveData(); } m_save_flag = true; } //1フレーム while( System.currentTimeMillis() < m_waitTime + SPF ){ //ちょっと休憩 Thread.sleep( SLEEP_TIME ); } } m_thread = null; } catch(Exception e){ System.out.println( e ); } System.out.println("endrun()"); } //-------------------------------------------------- // データセーブ //-------------------------------------------------- void SaveData(){ // クリアしたら称号保存 // CGIアクセス try{ URL url = new URL(getDocumentBase(),"check.cgi"); //POSTコマンドのデータ部分に突っ込む文字列 String poststr = "level="+m_level; URLConnection conn = url.openConnection(); conn.setDoOutput(true); PrintStream pout = new PrintStream(conn.getOutputStream()); pout.print(poststr); pout.close(); //POSTコマンドを発行したので、次にその結果を読み込む。 BufferedReader reader = new BufferedReader( new InputStreamReader(conn.getInputStream() ) ); String line; while( (line = reader.readLine() ) != null){ System.out.println(line); } reader.close(); }catch(Exception e){ System.out.println("POSTの実行に失敗しました"); } } //-------------------------------------------------- // 描画更新 //-------------------------------------------------- public void update( Graphics g ){ paint( g ); } //-------------------------------------------------- // 描画 //-------------------------------------------------- public void paint( Graphics g ){ Dimension d = getSize(); // バッファのグラフィックコンテキストを取得する if( m_back_bufferg == null){ m_back_bufferg = m_image_buffer.getGraphics(); } // バッファをクリア m_back_bufferg.setColor( Color.gray ); m_back_bufferg.fillRect( 0, 0, d.width, d.height ); // 盤 game.DspMap( m_back_bufferg ); // 画像 game.DrawImage( m_back_bufferg, this ); //ウインドウを更新する g.drawImage( m_image_buffer, 0, 0, this ); } //マウスをクリックした場合 public void mousePressed(MouseEvent e){ Point point = new Point( 0, 0 ); //左クリックの場合 if((e.getModifiers() & e.BUTTON1_MASK) != 0){ point.x = e.getX(); point.y = e.getY(); game.Clicked( point ); } //右クリックの場合 else if((e.getModifiers() & e.BUTTON3_MASK) != 0){ // レベルが0なら自動解答モード if( m_level == 0 ){ game.Initialize(); game.think_flag = true; System.out.println("think()"); game.Solve( point ); game.think_flag = false; game.ClearMap(); }else{ // リセット game.Initialize(); } } } //マウスを動かした時 public void mouseMoved(MouseEvent e){} //MouseListener public void mouseClicked(MouseEvent e){} // クリックを放した時 public void mouseReleased(MouseEvent e){} public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} //MouseMotionListener public void mouseDragged(MouseEvent e){ } }