いきなり概念的な話から始まりますが、本来プログラムとは複雑な処理をまとめた手続きとしてその必要性が認められていったものと思われます。




そして次に、あらかじめ埋め込まれた情報のみならずデータの入力を可能にすることにより、汎用性やインタラクティビティといったものが発達していったのではないでしょうか。




もし入力を受け付けなければ紙芝居以上のものは作れない訳で、だからこそ昔の人は延々とパンチカードを通す作業をしてでも入力をしたわけですね。




もっとも、パンチカードで入力したのはプログラムのコードそのものだったとは思いますが。




 




前置きが長くなりましたが、今日はボタン入力についてです。





protected void keyPressed(int keyCode){

  int action = getGameAction(keyCode);

  if (action == Canvas.UP){

   //上を押された時の処理

  }else if (action == Canvas.RIGHT){

    //右を押された時の処理

  }




   //……

}




入力はkeyPressedで受け取ることになるでしょう。マルチスレッドならば、synchronized修飾子を必要とするかもしれません。




似たようなメソッドにkeyRepeatedがあった気がしますが、ゲームプログラミングをするなら、keyPressedやらに実際の処理を記述するのは得策ではありません。特にクラス数をなるべく削減したい携帯電話プログラミングならば、scene変数あたりでシーン変遷を管理すると思うので、メインループとボタンイベント時で二重にシーン管理が必要になってしまいます。更にサブ的なシーンの分け方(戦闘時かつアニメーション時や、移動時かつアニメーション時など)を行うならば、それを再現しなくてはならず非常に面倒なことになってきます。






keyPressedメソッドでは、あらかじめ用意したクラス内でのボタン用フラグ変数に押されたボタンの情報を保持しておき、メインループでその値を参照する、というのがいいと思われます。






しかし書いといて難ですが、同時に二つのボタンが押し下げられた時ってちゃんと二回呼ばれてくれるんですかね…?






あと個人的には、getGameActionって”Game”って名前が入ってるメソッド名が胡散臭くて嫌です。






さて、長くなってしまったので、実装例は明日にまわすことにしましょう…。






昨日偉そうに「色違い画像も出来るかもしれませんね~」なんて書いたのですが、pngの仕様見る限り相当精通してないと難しそうですね…




PLTEというチャンクにパレットデータがあり、ここをいじればいいとは思うのですが、




データ長って何桁?とか




このデータってどういう形式だ…?とか




CRCって何よ!という




三つの壁に阻まれて出来ませんでした。




下二つはともするとパレットデータだけ変更した同一画像を比較することで何らかのヒントが得られるかもしれませんが…




 




今は昔、走れクワービィというアプリの作者であるkuriさんという方が動的に画像をいじるということをやってらしたと思うのですが、もう6年近く前の話で情報が残っておりません…




 




差し当たり、時間のあるときにでももう少し研究を続けたいと思います。




 




 




個人的な話ですが、今日はphpからFPDFでPDFを書き出すということをしておりました。非常に楽しかったです^^




いつかはネット連携の話も書きたいですね。




 




では、駄文失礼しました。今日のTipsは次の記事にて…




プログラムの汎用性や開発効率を上げるため、外部ファイルを読み込むメソッドはもはや必須でしょう。



しかし元々Java自体がファイル入出力を毛嫌いしているせいもあり、Javaのセキュリティ意識の高さも相まってファイル入出力は非常に面倒くさい操作となっています。



J2MEではFileInputStream等も利用できないため、基本的に全てInputStreamで処理する羽目になる…はずです。



正直、ここらへんに関しては私自身も非常に情報が欲しいです^^;



以下に、resフォルダにあるファイルを読み込むメソッドを紹介します。






byte[] allData;

public void readFile(String filename){

  InputStream is = null;
  ByteArrayOutputStream os = null;

  try{

    is=getClass().getResourceAsStream(""+filename);
    os = new ByteArrayOutputStream();

    int data;

    if(allData != null){

      os.write(allData);
      allData = null;
    }
    while ((data = is.read()) != -1) os.write(data);

    allData = os.toByteArray();

  }catch(Exception e){
  }
}





さて、とりあえず効率等は置いておいてこれによりファイルをバイト列で読み込むことが出来ます。





クラス内でStringに変換して文字列として扱ってもよいですし、やりようによっては数値処理によって一つの画像ファイルから複数の色違いImageを作り出すことも出来るでしょう。





メモリの使用量は同じですが、実行ファイルの軽量化に寄することが出来るかもしれませんね。