TOP > Java>

Javaアプレットでブロック崩しを作ろう

説明

初心者でも分かりやすいように簡単なソースにまとめてみました。
ゲームなどを作るときあたり判定などを考えるのが大変ですが、
このソースは結構わかりやすいあたり判定だと思います。
今のところ説明が少ないですが、少しずつ解説と改良などをしていけたらいいなと思っております。
実行画面

ここでは重くなるので画像で表示しています。
実際のゲームはこちらです。
ソース

import  java.applet.Applet;
import  java.awt.Graphics;
import  java.awt.Image;
import  java.net.URL;
import  java.awt.*;
import  java.awt.event.*;
public  class  Buro  extends  Applet  implements  Runnable,KeyListener{//メインクラス
  
  Thread  th;
  
//  ブロックなどの配置情報///////////
  int[][]  men  =  new  int[20][15];
////////////////////////////////////
  
//  バーの座標/////
  int  x  =  5;
  int  y  =  19;
/////////////////
  
//  残りブロック数カウントに使用
  int  c_r  =  0;
//////////////////////////////
  
//  ボールの座標/////
  int  b_x  =  7;
  int  b_y  =  18;
///////////////////
  
//  ボールの動き/////
  int  b_xu  =  1;
  int  b_yu  =  -1;
//////////////////
  
//  ゲーム状況フラグ
  int  gam_f  =  0;
//////////////////
  
  
  boolean  key_m;//右キーが押されたときtrue
  boolean  key_h;//左キーが押されたときtrue
  
  URL  url;//URLを格納
  
//  ダブルバッファ関連///////////////////////////////////////
  Dimension  d;
  int  w,  h;//画面サイズ
  Image  buff;    //  ダブルバッファリング用のバッファ
  Graphics  buff_g;  //  ダブルバッファリング用のグラフィックス
////////////////////////////////////////////////////////////
  
  
//  画像格納変数/////////////////////////////
  Image  img1  ;
  Image  img2;
  Image  img3;
  Image  img4;
///////////////////////////////////////////
  
  public  void  init(){
    
    url  =  this.getDocumentBase();//url取得
    
    th  =  new  Thread(this);//スレッドインスタンス化
    
    th.start();
    
    haiti();
    
    //画像をメモリーに格納/////////////////
    img1  =  getImage(url,  "hai.gif");
    img2  =  getImage(url,  "buro.gif");
    img3  =  getImage(url,  "tama.gif");
    img4  =  getImage(url,  "bar.gif");
    ///////////////////////////////////////
    
    
    addKeyListener(this);//キーボードリスナー
    
    //ダブルバッファ関連//////////////////////////
    this.d  =  getSize();
    this.w  =  d.width;
    this.h  =  d.height;
    if  (buff_g==  null)
    {
      buff=createImage(w,h);
      buff_g=buff.getGraphics();
    }
    //////////////////////////////////////////////
    
    
    
  }
  
  
//  オーバーライド
  public  void  update(Graphics  g){
    paint(g);
  }
  
  
//  変数初期化//////////////////////
  void  rise(){
    //バーの座標/////
    x  =  5;
    y  =  19;
    /////////////////
    
    //残りブロック数カウントに使用
    c_r  =  0;
    //////////////////////////////
    
    //ボールの座標/////
    b_x  =  7;
    b_y  =  18;
    ///////////////////
    
    //ボールの動き/////
    b_xu  =  1;
    b_yu  =  -1;
    //////////////////
    
  }
////////////////////////////////////////
  
  
  public  void  paint(Graphics  g)  {
    buff_g.drawImage(img1,0,0,this);
    
    
    c_r  =  0;
    for(int  i  =  0;  i  <  20;  i++){
      for(int  j  =  0;  j<  15;  j++){
        
        if(j==x  &&  i==y){
          buff_g.drawImage(img4,j*10+5,i*10+5,this);
          
        }else{
          if(j==b_x  &&  i==b_y){
            buff_g.drawImage(img3,j*10+5,i*10+5,this);
          }else{
            switch(men[i][j])
            {
            case  0:
              
              break;
            case  1:
              buff_g.drawImage(img2,j*10+5,i*10+5,this);
              c_r  =  c_r  +  1;
              break;
            }
          }
          
        }
      }
      
    }
    
    
    
    
    //ブロック数が0ならゲーム状況をクリアに
    if(c_r==0){
      gam_f  =  3;
    }
    
    
    switch(gam_f)
    {
    case  0:
      
      break;
    case  1:
      
      break;
    case  2:
      buff_g.drawString("GAME  OVER",40,150);
      rise();
      haiti();
      break;
    case  3:
      buff_g.drawString("GAME  CLEAR",40,150);
      rise();
      haiti();
      break;
    }
    
    g.drawImage(buff,  0,  0,  this);
  }
  
//  スレッドにより実行
  public  void  run(  ){
    
    while(true){
      

      
      //ゲーム状況により処理////////////////
      switch(gam_f)
      {
      case  0:
        
        break;
      case  1:
          //バーの移動//////////////////////
          if(key_m==true  &&  x!=11){
                  x  =  x  +  1;
          }
          
          if(key_h==true  &&  x!=0){
                  x  =  x  -  1;
          }
          //////////////////////////////////
          
          b_ugo();
          break;
      }
      //////////////////////////////////////
      
      repaint();//画面更新
      
      try{
        th.sleep(100);//0.01秒STOP
      }catch(InterruptedException  e){
        
      }
    }
  }
  
  
  
//  ボールを動かす処理、接触判定
  void  b_ugo()
  {
    
    b_x  =  b_x  +  b_xu;
    b_y  =  b_y  +  b_yu;
    
    
    //ブロックとの接触判定
    if(men[b_y][b_x]==1){
      men[b_y][b_x]=0;
      if(b_yu==1){
        b_yu  =  -1;
      }else{
        b_yu  =  1;
      }
      
    }
    
    
    
    //壁との接触判定/////////////
    if(b_xu==-1  &&  b_x==0){
      b_xu  =  1;
    }
    
    if(b_xu==1  &&  b_x==14){
      b_xu  =  -1;
    }
    
    
    if(b_yu==-1  &&  b_y==0){
      b_yu  =  1;
    }
    
    
    if(b_yu  ==  1  &&  b_y==19){
      if((b_x==x  &&  b_y==y)  ||  (b_x==x+1  &&  b_y==y) 
                  ||  (b_x==x+2  &&  b_y==y)  ||  (b_x==x+3  &&  b_y==y)  ){
        if(key_m==true  &&  b_x<=12){
          b_x  =  b_x+1;
        }
        
        if(key_h==true  &&  b_x>=5){
          b_x  =  b_x-1;
        }
        
        b_yu  =  -1;
        
        b_y  =  b_y  -  1;
        
      }else{
        gam_f  =  2;
      }
    }
    
    
    
  }
  
  
//  ブロックの配置
  void  haiti()
  {
    men[0][11]  =  1;
    men[0][12]  =  1;
    
    men[2][2]  =  1;
    men[2][3]  =  1;
    men[2][4]  =  1;
    
    men[5][7]  =  1;
    men[5][8]  =  1;
    men[5][9]  =  1;
    
    men[7][11]  =  1;
    men[7][12]  =  1;
    men[7][13]  =  1;
    
    men[8][0]  =  1;
    men[8][1]  =  1;
    men[9][0]  =  1;
    men[9][1]  =  1;
    men[9][2]  =  1;
    
  }
  
  
  public  void  keyPressed(KeyEvent  e)  {
    //キーボードが押されたときの処理
    
    if(e.getKeyText(e.getKeyCode())=="Right"){    //→が押されたとき
      key_m  =  true;  
    }
    if(e.getKeyText(e.getKeyCode())=="Left"){      //←が押されたとき
      key_h  =  true;  
    }
    if(e.getKeyText(e.getKeyCode())=="Space"){
      gam_f  =  1;
    }
  }
  
  public  void  keyReleased(KeyEvent  e)  {
    //キーボードを離したときの処理
    
    if(e.getKeyText(e.getKeyCode())=="Right"){    //→が押されたとき
      key_m  =  false;  
    }
    if(e.getKeyText(e.getKeyCode())=="Left"){      //←が押されたとき
      key_h  =  false;  
    }
    
  }
  
  public  void  keyTyped(KeyEvent  e)  {
    
  }
}

最近の記事
当サイトについて  免責事項  プライバシーポリシー
Copyright (C) Sasuke 2012 All rights reserved.