さて、昨日の記事の気をつけなければいけない点をいくつか。



一点目は、処理A呼び出しのタイミングです。処理Aは、移動確定後、先頭のキャラクターの移動前に行わなければなりません。そうでないと移動時でないときも進んでしまったり、「重なっているときに動かない」というifの条件を常に満たさなくなったりしてしまうからです。




二点目は、処理Bを書く場所です。Aでmovingフラグをtrueにするならば、BはAの前になければなりません。さもなくば、A→Bの処理が1ループの中で実行され、プレイヤーの目にはアニメーションが映らないことになります。




三点目は、先頭キャラクターの向きです。移動不可能な方向にキーを押したときも、先頭キャラクターはその方向を向かなければなりません(話しかけたり、調べたりするため)。しかしこの追跡方法では、自分の前のキャラクターの向きを頼りに追跡するので、移動不可な方向を向いた後にどこかへ移動すると、後続のキャラクターが思わぬ方向へ散っていってしまいます。



これを回避するためには、先頭キャラクターの描画についてだけは違う変数を用意しておく必要があります。



長々とした上に分かりにくくて申し訳ありません…(´ω`)




動いてるとこはこんな感じです→http://twitpic.com/14kag7







こんばんは。




特にネタもないので、ドラクエ的にぞろぞろと歩くパーティーを実装してみましょう。




まず準備段階として、向きを保存しておく必要があります。Characterクラスに整数型のdirectionを宣言し、上、下、左、右をそれぞれ3、0、1、2としておきましょう。いつか、話しかける時に何らかの方向の「逆」がすぐに計算できるよう、正反対の方向が足して3になるよう調整しておきます(微々たるものですが…)。




後は、Character配列のpartyと、現在のパーティーの人数をあらわすpartylengthさえあれば、以下の処理(Aとします)




for(int i = partylength-1; i > 0 ; i--){

  if(!(party[i-1].x == party[i].x && party[i-1].y == party[i].y)){

   if(party[i-1].direction == 2)

     party[i].x+=14;

   else if(party[i-1].direction == 1)

     party[i].x-=14;

   else if(party[i-1].direction == 0)

     party[i].y+=14;

   else

     party[i].y-=14;




   party[i].direction = party[i-1].direction;

 }


}





を移動が発生した時に呼び出せば、後をテクテクついて歩くパーティーの完成です。本当は1マス28ピクセルでやっているのですが、半マスずつの移動をアニメーションするために14という値になっています。




アニメーションを完成させるには、次のループにて以下の処理Bを実行すればいいです。

if(moving){

//さっき動いたばっかり。という訳で描画位置とか調整

 for(int i = 0; i < partylength; i++){

   if(party[i].x%28!=0){

     if(party[i].direction == 2)

       party[i].x+=14;

     else

       party[i].x-=14;

   }

   if(party[i].y%28!=0){

     if(party[i].direction == 0)

       party[i].y+=14;

     else

       party[i].y-=14;

   }

}




 




ただし、必ず気をつけなければいけない点がいくつかありますので、明日にでも説明したいと思います。










こんばんは。


誰しも一度はウィンドウにメッセージを表示しようとして、多重構造や入力処理の場合分けに手間取ったことがあるのではないでしょうか。



いや、無いですかね普通…
まぁ、とりあえず溜め込んでおいた文章を表示用に整形する関数を作ってみましょう。



String[] waiting_lines; //溜め込んだ文章
  String[] display_lines;//表示用の配列
  int DISPLAY_LINE = 3;
  int DISPLAY_CHARS = 10;
  public void adjustDisplayLines(){

    if(display_lines == null)
     display_lines = new String[DISPLAY_LINE];

    //waiting_lines をdisplay_linesに安全にコピーする
    //Stringは参照型なのに気をつける。

    int d_index = 0; //display_linesの添え字
    int w_index = 0; //waiting_linesの添え字
    while(d_index < DISPLAY_LINE){
      if(waiting_lines.length <= w_index){
        display_lines[d_index] = "";
        d_index++;
      }
      else if(waiting_lines[w_index].length() > DISPLAY_CHARS){
        //表示可能文字数を越えているとき
        display_lines[d_index] = waiting_lines[w_index].substring(0, DISPLAY_CHARS);
        waiting_lines[w_index] = waiting_lines[w_index].substring(DISPLAY_CHARS, waiting_lines[w_index].length());
        d_index++;
      }
      else{
        display_lines[d_index] = waiting_lines[w_index].substring(0, waiting_lines[w_index].length());
        d_index++;
        w_index++;
      }
    }
    if(waiting_lines.length <= w_index){
      waiting_lines = null;
    }
    else{
      String[] temp = new String[waiting_lines.length -w_index];
      for(int i = 0; i < waiting_lines.length -w_index;i++){
        temp[i] = waiting_lines[w_index+i];
      }
      waiting_lines = temp;
    }
  }


とこんな感じでしょうか。あとは読み込み時に


waiting_lines = split(message,"<br>");


adjustDisplayLines();


とでもしておいて、ボタン入力時にはwaiting_linesがnullならウィンドウ表示フラグを解除し、nullでないならadjustDisplayLines();を実行すれば大丈夫です。




今日も一日お疲れ様でした。詳しい説明は明日にでも…