玉が動かない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
bun

玉が動かない

#1

投稿記事 by bun » 15年前

http://sasuke.main.jp/javaburokku.html
上記のサイトを参考に、2次元マップを作りブロック崩しを作成したのですが、ブロックを崩す玉が動きません。おそらくスレッドの部分に問題があってアニメーションが出ないのだと思いますが、どこがおかしいかわかりません。どなたかご協力お願いします。
ソースは長いので次の書き込みに続きます。
import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class TileBasedGame extends Applet implements  Runnable{

  Thread  th;
  //マップの作成
  char map[/url][/url];
  int MX = 15, MY = 20;
  String map_str[/url] = {"VVV               ",//V:ブロック
                      "        VVV       ",
                      "               ",
                      "   VVV            ",
                      "               ",
                      "               ",
                      "               ",
                      "               ",
                      "               ",
                      "    T           ",//T:玉
                      "    M           ",//M:玉を弾くラケット
                      "               ",
                      "               ",
                      "               ",
                      "               ",
                      "               ",
                      "               ",
                      "               ",
                      "               ",
                      "               "}; 
  int  x = 5;//バーの座標
  int  y = 11;
  int  c_r = 0;//残りブロック数のカウント
  int  b_x = 5;//ボールの座標
  int  b_y = 10;
  int  b_xu = 1;//ボールの動き
  int  b_yu = -1;
  int  gam_f = 0;//ゲーム状況フラグ
  boolean  key_m;//右キーが押されたときtrue
  boolean  key_h;//左キーが押されたときtrue
  //ダブルバッファ関連
  Dimension  d;
  int  w,  h;//画面サイズ
  Image  buff;    //  ダブルバッファリング用のバッファ
  Graphics  buff_g;  //  ダブルバッファリング用のグラフィックス
  //画像用
  Image  img1;
  Image  img2;
  Image  img3;
  Image  img4;
  int img3_x, img3_y; 
  int img4_x, img4_y;

  public void init() {
    // 画像の読み込み
    img1 = getImage(getDocumentBase(),"hai.gif");
    img2 = getImage(getDocumentBase(),"buro.gif");
    img3 = getImage(getDocumentBase(),"tama.gif");
    img4 = getImage(getDocumentBase(),"bar.gif");

    th  =  new  Thread(this);//スレッドインスタンス化    
    addKeyListener(
      new KeyAdapter() {
        public void keyPressed(KeyEvent e) {
        int key = e.getKeyCode();
        int dir = -1;
          switch ( key ) {
            case 37: dir = 2; break;// left
            case 39: dir = 0; break;// right
          }
        if ( dir >= 0 ) img4Move(dir);
        repaint();
        }
      }
    );

    //マップの周囲を見えない壁で囲む
    map = new char[MY+2][MX+2];
    for (int x = 0; x <= MX+1; x++) {
      map[0][x] = 'B'; 
      map[MY+1][x] = 'B';
    }
    for (int y = 0; y <= MY+1; y++) {//マップデータの読み込み
      map[y][0] = 'B'; 
      map[y][MX+1] = 'B';
    }  
    for (int y = 1; y <= MY; y++) {
      for (int x = 1; x <= MX; x++) {
        map[y][x] = map_str[y-1].charAt(x-1);
        if ( map[y][x] == 'T' ) {
          img3Set(x, y);
        }
        if ( map[y][x] == 'M' ) {
          img4Set(x, y);
        }
      }
    }  
 }

bun

続き

#2

投稿記事 by bun » 15年前

public  void  update(Graphics  g){
    paint(g);
  }
  void  rise(){
    x  =  5;
    y  =  11;
  
    c_r  =  0;
    
    b_x  =  5;
    b_y  =  10;
    
    b_xu  =  1;
    b_yu  =  -1;
    
  }

  public void paint(Graphics g) {//描画
     g.drawImage(img1,0,0,this);
     c_r  =  0;
     for (int y = 1; y <= MY; y++) {
      for (int x = 1; x <= MX; x++) {
       int xx = 40*x+20, yy = 40*y+200;
       switch ( map[y][x] ) {
        case 'V': g.setColor(Color.green);
                    g.fillRect(xx, yy, 10, 5);                   
                    c_r  =  c_r  +  1;
                    break;
        }
      }
    }
     img3Draw(g);
     img4Draw(g);

 if(c_r==0){
      gam_f  =  3;
    }        
    switch(gam_f)
    {
    case  0:     
      break;
    case  1:      
      break;
    case  2:
      buff_g.drawString("GAME  OVER",100,500);
      rise();
      break;
    case  3:
      buff_g.drawString("GAME  CLEAR",100,500);
      rise();
      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;
          }
          
          img3Move();
          break;
      }      
      repaint();//画面更新
      
      try{
        th.sleep(100);//0.01秒止める
      }catch(InterruptedException  e){        
      }
    }
  }
  
  public void img3Set(int x, int y) {
    img3_x = x;
    img3_y = y;
  }

  public void img4Set(int x, int y) {
    img4_x = x;
    img4_y = y;
  }

  public void img3Draw(Graphics g) {
    g.drawImage(img3,40*img3_x+15,40*img3_y+30, this);
  }

  public void img4Draw(Graphics g) {
    g.drawImage(img4,40*img4_x,40*img4_y, this);
  }

  void img3Move(){//ボールを動かす処理、接触判定  

    b_x  =  b_x  +  b_xu;
    b_y  =  b_y  +  b_yu;
    
   //ブロックとの接触判定
    if(map[b_y][b_x]==1){
      map[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;
      }
   }
}
  public void img4Move(int dir) {
    int dx = 0, dy = 0;
    switch ( dir ) {
    case 0: dx =  1; break; // right
    case 2: dx = -1; break; // left
    }
    if ( dx == 0 && dy == 0 ) return;
    if ( map[img4_y+dy][img4_x+dx] == 'B' ) return;
    img4_x += dx; img4_y += dy;
  }
  public  void  keyPressed(KeyEvent  e)  {
    if(e.getKeyText(e.getKeyCode())=="Space"){
      gam_f  =  1;
    }
 }
}

めるぽん

Re:続き

#3

投稿記事 by めるぽん » 15年前

ボールを描画する img3Draw メソッドは img3_x と img3_y を使って描画をしているみたいなのですが、
それらの値を更新する img3Set メソッドが初期化時しか呼ばれていないようです。

b_x や b_y を img3_x と img3_y に反映させないと描画される位置が変わらないんじゃないでしょうか。
もしくは img3_x や img3_y を使わず、img3Draw の中で b_x や b_y を使って描画してもいいと思います。

bun

Re:続き

#4

投稿記事 by bun » 15年前

ご回答ありがとうございます。
b_x や b_y を img3_x と img3_y に反映させるのを以下のようにやってみました。
ただ、「img3Set メソッドが初期化時しか呼ばれていないようです。」に関してはどうやったらいいのかわからなかったので、具体的にどのようにしたらよいか説明していただけないでしょうか?
public void img3Set(int x, int y) {
    img3_x = x;
    img3_y = y;

  }

  public void img4Set(int x, int y) {
    img4_x = x;
    img4_y = y;
  }

  public void img3Draw(Graphics g) {    
    g.drawImage(img3,40*img3_x+15,40*img3_y+30, this);
 
}

  public void img4Draw(Graphics g) {
    g.drawImage(img4,40*img4_x,40*img4_y, this);
  }

  void img3Move(){//ボールを動かす処理、接触判定  

    b_x  =  b_x  +  b_xu;
    b_y  =  b_y  +  b_yu;
    
   //ブロックとの接触判定
    if(map[b_y][b_x]==1){
      map[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;
          img3_x = b_x;  
        }        
        if(key_h==true  &&  b_x>=5){
          b_x = b_x-1;
          img3_x = b_x; 
        }        
        b_yu = -1;        
        b_y = b_y - 1;        
        img3_y = b_y;
      }else{
        gam_f  =  2;
      }
   }
}

めるぽん

Re:続き

#5

投稿記事 by めるぽん » 15年前

「それらの値を更新する img3Set メソッドが初期化時しか呼ばれていない」というのは、img3_x と img3_y の値が初期化時以外で更新されてないというのを言いたかっただけです。
img3_x と img3_y を更新することで無事ボールは動くようになりましたか?

bun

Re:続き

#6

投稿記事 by bun » 15年前

すいません。やっぱり動きません。
どこかで何か抜けているのか、定義の仕方が間違っているのでしょうか?

スキマ妖怪

Re:続き

#7

投稿記事 by スキマ妖怪 » 15年前

よくは見てないし、関係あるか分からないですが、
Threadクラスって作成しただけでスレッド起動するんですか?


javaは知らなので、間違ってたらすいません;

ISLe

Re:続き

#8

投稿記事 by ISLe » 15年前

> Threadクラスって作成しただけでスレッド起動するんですか?

インスタンス作っただけでは起動しません。
startメソッド呼んでませんね。

閉鎖

“C言語何でも質問掲示板” へ戻る