/* RocketSlip author 49 */ import java.awt.*; import java.awt.event.*; import java.applet.*; import java.io.*; import java.security.*; public class mapread extends Applet implements Runnable,KeyListener{ Image[] im = new Image[6]; Image imc=null; Image canvus=null; static int G_WIDTH=360; static int G_HEIGHT=360; String[] sdat = new String[20]; int x=0; int y=0; int lnum=0; int wt=100; //100=stop <10=key <0=map int v=0;//1ur2sita3migi4hidari public static void main(String args[]) { //アプレットの作成 Applet app=new mapread(); //アプレットの初期化 app.init(); //フレームの初期化 Frame frame = new Frame(); frame.pack(); frame.setVisible(true); frame.setVisible(false); frame.pack(); frame.setSize(G_WIDTH,G_HEIGHT); //これを忘れると閉じるボタンを押しても閉じなくなってしまいます frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {System.exit(0);}}); frame.setResizable(false); //フレームにアプレットを貼り付けています frame.add(app); frame.setVisible(true); } public void init(){ //画像の読み取りはこの形にしないとjarをダブルクリックでは実行できません。 im[0]=Toolkit.getDefaultToolkit().getImage(getClass().getResource("ue.GIF")); im[1]=Toolkit.getDefaultToolkit().getImage(getClass().getResource("sita.GIF")); im[2]=Toolkit.getDefaultToolkit().getImage(getClass().getResource("migi.GIF")); im[3]=Toolkit.getDefaultToolkit().getImage(getClass().getResource("hidari.GIF")); im[4]=Toolkit.getDefaultToolkit().getImage(getClass().getResource("stp.GIF")); im[5]=Toolkit.getDefaultToolkit().getImage(getClass().getResource("agari.GIF")); imc=Toolkit.getDefaultToolkit().getImage(getClass().getResource("cha.GIF")); sdat[0]="aa"; int i=0; lnum=0; //キーリスナー、スレッドの作成 addKeyListener(this); requestFocus(); new Thread(this).start(); //ファイルの読み込みはこの形にしないとhtmlに張ったときに失敗します。 BufferedReader sequenceReader = null; try { if(sequenceReader != null) sequenceReader.close(); InputStream is = getClass().getResource("stage.txt").openStream(); InputStreamReader isr = new InputStreamReader(is); sequenceReader = new BufferedReader(isr); String line; while ((line = sequenceReader.readLine()) != null) { sdat[i]=line;i+=1; } sequenceReader.close(); } catch(Exception e) {e.printStackTrace();} if(i>0){lnum=i-1;} } public void keyTyped(KeyEvent e){ } public void keyPressed(KeyEvent e){ if(wt>0){ //このようにすると、押されたキーの大文字小文字によって処理を変更できます。 if(e.getKeyChar()=='s'){v=1;if(wt>50){wt=2;}} if(e.getKeyChar()=='x'){v=2;if(wt>50){wt=2;}} if(e.getKeyChar()=='c'){v=3;if(wt>50){wt=2;}} if(e.getKeyChar()=='z'){v=4;if(wt>50){wt=2;}} if(e.getKeyChar()=='H'){v=1;if(wt>50){wt=2;}} if(e.getKeyChar()=='N'){v=2;if(wt>50){wt=2;}} if(e.getKeyChar()=='M'){v=3;if(wt>50){wt=2;}} if(e.getKeyChar()=='B'){v=4;if(wt>50){wt=2;}} //こちらの方がゲームでは一般的です。VK_Sなどとすれば大文字小文字を無視してsキーに対応できます。 if(e.getKeyCode()==KeyEvent.VK_UP){v=1;if(wt>50){wt=2;}} if(e.getKeyCode()==KeyEvent.VK_DOWN){v=2;if(wt>50){wt=2;}} if(e.getKeyCode()==KeyEvent.VK_RIGHT){v=3;if(wt>50){wt=2;}} if(e.getKeyCode()==KeyEvent.VK_LEFT){v=4;if(wt>50){wt=2;}} } } public void keyReleased(KeyEvent e){if(wt>0){wt=100;v=0;}} public void run(){ while(true){ if(wt<30){wt-=1;System.out.println(wt);} if(wt==0 || wt<-6){ if(v==1){y-=1;} if(v==2){y+=1;} if(v==3){x+=1;} if(v==4){x-=1;} if(wt<-6){wt=-4;} if(wt==0){wt=100;} if(y<0){y=0;} if(x<0){x=0;} if(x>=(int)(sdat[0].length())){x=(int)(sdat[0].length())-1;} if(y>lnum){y=lnum;} if(sdat[y].substring(x,x+1).equals("1")){wt=-4;v=1;} if(sdat[y].substring(x,x+1).equals("2")){wt=-4;v=2;} if(sdat[y].substring(x,x+1).equals("3")){wt=-4;v=3;} if(sdat[y].substring(x,x+1).equals("4")){wt=-4;v=4;} if(sdat[y].substring(x,x+1).equals("5")){wt=50;v=0;} if(sdat[y].substring(x,x+1).equals("6")){wt=50;v=0;x=0;y=0;System.out.println("clear");} } repaint(); try{ Thread.sleep(100); }catch(Exception e){} } } public void paint(Graphics g){ /* 描画で画面がちらつく理由は、例えば三つの絵を描くときに、A、B、Cを一瞬のうちでは描くことが出来ず 一瞬だけAだけが表示された状態などになってしまうことにあります。 それを回避するために、ユーザからは見えない画面を作り、そこにA,B,Cと必要な絵を全て描いてから、その画面の内容を ディスプレイに表示します。どの言語でも描画では必ずといって良いほど使う重要な概念です。 */ //ユーザに見えない画面(Graphics bu)の作成 Graphics bu; //実際にディスプレイに書き込む時の形はImageなので、書き込み用イメージ(Image cauvus)とbuのつながりを作っておく。 if(canvus==null){canvus=createImage(G_WIDTH,G_HEIGHT);} bu=canvus.getGraphics(); //見えない画面を塗りつぶしておく bu.fillRect(0,0,G_WIDTH,G_HEIGHT); //ステージ、キャラクターの描画 int i,s; for(i=0;i<=lnum;i++){ for(s=0;s<(int)(sdat[0].length());s++){ if(sdat[i].substring(s,s+1).equals("1")){bu.drawImage(im[0],s*32,i*32,this);} if(sdat[i].substring(s,s+1).equals("2")){bu.drawImage(im[1],s*32,i*32,this);} if(sdat[i].substring(s,s+1).equals("3")){bu.drawImage(im[2],s*32,i*32,this);} if(sdat[i].substring(s,s+1).equals("4")){bu.drawImage(im[3],s*32,i*32,this);} if(sdat[i].substring(s,s+1).equals("5")){bu.drawImage(im[4],s*32,i*32,this);} if(sdat[i].substring(s,s+1).equals("6")){bu.drawImage(im[5],s*32,i*32,this);} } } bu.drawImage(imc,x*32,y*32,this); //見えない画面の開放 bu.dispose(); //ディスプレイへの描画 g.drawImage(canvus,getInsets().left,getInsets().top,this); //g.drawString("yutori bajai!!"+ sdat[0].substring(0,1) + sdat[0],100,100); } public void update(Graphics g){ paint(g); }