One Note Jam

MIDlet版(& iアプリ版)「Rev.2」公開 (2006-10-28)

Rev.2 タイトル画面

MIDlet版(& iアプリ版)の「Rev.2」を公開しました。変則的な盤面でのリバーシゲームです。2年前に作成した「変則リバーシ Rev.」のバージョンアップ版です。

MIDlet版 & iアプリ版「Rev.2」
http://end.skr.jp/rev2.html

開発のきっかけ

少し前に、S60 3rd Edition上での開発についていろいろ調べていたわけですが(2006-06-30)、 3rd Edition(というよりSymbian OS v9)開発の敷居の高さや、2ndと3rdの互換性の無さ、また、804NKのインストール制限(2006-08-31)の話などもあり、今ひとつやる気がなくなっていました。

そこでふと、お手軽なMIDPでの開発というのもいいかもな、と気が向いて、何か作ってみたくなりました。MIDlet(MIDP仕様で作成したアプリケーション)であれば、2nd Editionだろうが3rd Editionだろうが動きますし、それどころか世界中のMIDP対応端末でも動きます(実際には細かい動作の違いなどの問題はあるでしょうけど)。私が現在使っている「WX310SA」がMIDP2.0対応であるというのも理由のひとつです。

移植のつもりが、作り直しに

手始めに、以前作成したiアプリ「変則リバーシ Rev.」をMIDletに移植してみることにしたわけですが、けっこう手間がかかってしまいました。原作を開発していた際は、一応それなりにポータブルなソースコードを書くように心がけてはいたのですが、意外にDoJaに依存したつくりになっていて、広範囲に渡って手直しが必要な状態でした。そこでこれを機に、ゲームのコアとなる部分をPure Javaで書いて、(MIDP・DoJaなどの)環境に依存した部分をきっちり分離するようにリファクタリングしてみました。

これでMIDP環境でもゲームが一通り動作するようになったので、さっそく自分が使っている端末にインストールして、主に移動中の空き時間を利用して動作テスト(と称して遊んでいただけですが)を行いました。そうやって実際に自分で遊んでみると、不便なので改良したい点がいろいろと出てきます。まず真っ先に、ゲーム途中で中断した後、次回起動時に中断したところから再開できる機能を追加しました。それと、返せる石の数を盤面のマス上に表示するようにしてみたり。その他、細かい部分についてもいろいろ追加・変更を行いました。

そういうわけで、結局ほぼ完全に作り直しに近い状態になってしまったため、タイトルも「Rev.2」と変更しました。まあ、内部的には作り直しではあるものの、外から見ると大差ないにもかかわらず「2」というのはどうかとも思いますが、「Rev. Revision 2」の略で「Rev.2」ということでひとつ。

また、iアプリ版の「Rev.2」も用意してあります。リファクタリングしたおかげで、環境に依存する部分を最小限にすることができたので、マルチプラットフォーム化も簡単です。残念なことに、機能追加によってjarファイルのサイズが30KBytesを超えてしまったため、900iシリーズのみの対応となります。

スクリーンショット

Rev.2 盤面選択画面 16種類の盤面を選択できます。

Rev.2 ゲーム画面 最高レベルの「LV6-CPU」は、高速な端末での実行をおすすめします。

Rev.2 ゲーム画面 ゲームを中断した場合でも、再起動時に続きから再開できます。

posted at 2006-10-28 | Permalink

S60開発・設定リストのスライダ設定アイテムをカスタマイズ(2) (2006-10-26)

前回の記事(2006-10-17)の続きです。

グラフィック表示を文字表示に

設定リストにおける「スライダ設定アイテム」は、デフォルトのままだと設定リスト上でもスライダのグラフィックが表示されます。

スライダによるグラフィック表示

このようなグラフィック表示は、直感的にわかりやすい表示方法ではありますが、正確な値を知りたい場合には不便です。こういった場合、以下のように設定値を文字(数字)で表示させるようにすると、正確な値が一目でわかるようになるので便利です。

数字による文字表示

このように、設定リスト上の表示をカスタマイズする方法について、以下に説明します。

ヘッダファイル

設定リスト上の表示をカスタマイズする場合は、S60標準のスライダ設定アイテムクラス(CAknSliderSettingItem)を継承して、デフォルトの動作をオーバーライドして変更する必要があります。以下に、派生クラス(ここではCMySliderSettingItemという名前にしました)の定義例を示します。

class CMySliderSettingItem : public CAknSliderSettingItem
    {
public:
    CMySliderSettingItem(TInt aIdentifier, TInt& aExternalSliderValue);
    virtual ~CMySliderSettingItem();

public:
    // from CAknSliderSettingItem.
    const TDesC& SettingTextL(void);

private:
    // from CAknSliderSettingItem.
    CFbsBitmap* CreateBitmapL(void);

private:
    TBuf<32> iLabelText;
//  (以下略)
    };

ソースファイル

オーバーライドする必要があるメンバ関数は、SettingTextL()とCreateBitmapL()の2つです。

SettingTextL()
const TDesC& CMySliderSettingItem::SettingTextL(void)
    {
    _LIT(KFormat, "%d秒");  // サンプルなので、ソース内に直書き
    iLabelText.Format(KFormat, InternalSliderValue());

    return iLabelText;
    }

設定リスト上に表示したい文字列を戻り値として返すように実装すればOKです。上の例の場合、InternalSliderValue()にて現在のスライダの値を取得して、その値に単位「秒」を付加した文字列を返す実装になっています。結果として、設定リスト上には「5秒」といった文字列が表示されることになります。

CreateBitmapL()
CFbsBitmap* CMySliderSettingItem::CreateBitmapL(void)
    {
    return NULL;
    }

常にNULLを返すように実装すれば、設定リスト上のグラフィックは消えます。

CreateBitmapL()関数は、設定リスト上に表示するビットマップを返すメンバ関数です。S60標準のスライダ設定アイテムや音量設定アイテム(CAknVolumeSettingItem)では、このメンバ関数でスライダやボリュームのグラフィックを表示するように実装されているようです。なので、常にビットマップとしてNULLを返すように実装し直すことで、設定リスト上のグラフィックが消えるわけです。

ちなみに、CreateBitmapL()をオーバーライドしないでSettingTextL()のみオーバーライドした場合、標準のCreateBitmapL()内の処理でスライダのグラフィックが表示されて、その上に、オーバーライドしたSettingTextL()内の処理で文字列が表示されることになります。

posted at 2006-10-26 | Permalink

S60開発・設定リストのスライダ設定アイテムをカスタマイズ(1) (2006-10-17)

数値に単位をつけたい

設定リストにおける「スライダ設定アイテム」は、一定範囲内の数値を入力させる際などに有用なコントロールです。しかし、デフォルトのままでは何かと使いづらい点があるので、カスタマイズしてみます。

まずはこちら。

スライダ(単位なし)スライダ(単位あり)

デフォルトのままだと、現在のスライダが示す数値がそのまま表示されますが、この数値に単位をつけて表示してみました。

リソースファイル

この程度の変更であれば、ソースコードには手を入れずに、リソースファイルの修正のみで可能です。

RESOURCE SLIDER r_getpixels_slider_delaytime
    {
    layout = EAknSettingsItemSliderLayout;
    minvalue = 0;
    maxvalue = 60;
    step = 1;
    valuetype = EAknSliderValueBareFigure;
    minlabel = "0秒";
    maxlabel = "60秒";
    valuelabel = "%U秒";
    }

重要なのは、"valuelabel"フィールドです。見てのとおり、ここでの"%U"という文字列の部分に、現在のスライダが示す数値が入った状態で表示が行われるようになります。

(なお、上記例はあくまでサンプルなので、各種フィールドに文字列リテラルを直接埋め込んでいますが、本来ならばローカライズ等を考慮して、文字列リテラルは別ファイルにて定義するべきです)

posted at 2006-10-17 | Permalink

「GetPixels」(一応)完成版 (2006-10-10)

今更ながら……

以前の記事(2006-03-13)にも書きましたが、以前から開発を進めていた――というより開発が凍結していたS60用画面キャプチャアプリケーションの「GetPixels」ですが、今更ながら(一応)完成しましたので置いておきます。今更ながらS60 2nd Editionのみの対応なので、804NK(Nokia N71)などの3rd Edition端末では使用できません。

GetPixels for S60 2nd Edition
http://end.skr.jp/getpixels.html

実のところ、現在では画面キャプチャアプリケーションとして「Screenshot for Symbian OS」という優れたアプリケーションがあるので、あんまり存在意義がなかったりします。

Screenshot for Symbian OS
http://www.antonypranata.com/screenshot/

「Screenshot for Symbian OS」はS60 3rd Editionにも対応しており、しかも「Symbian Signed」のアプリケーションなので、インストール制限の厳しい804NKにもインストール可能です。3rd Editionへの対応というのもけっこう手間のかかる作業ですが、Symbian Signedへの対応となると対応の手間が段違いなわけで、作者の方の労力は並大抵のものではないと思われます。画面キャプチャアプリケーションの場合、キー入力を横取りするためのケイパビリティが必要な関係上、どうしてもSymbian Signedへの対応が必要となってくるんですよね……。

それはさておき、拙作「GetPixels」には怪しげな機能がいろいろと用意されているので、特殊なシチュエーションにおいては何らかの使い道があるかもしれません。例によってソースコードも置いておくので、興味のある方は参考にしてください(例によってコメントはほとんどありませんが)。

スクリーンショット

GetPixels スクリーンショット1 GetPixels スクリーンショット2 怪しげな機能の筆頭に挙げられるのが「外部イベントをトリガとした撮影」機能です。充電機が接続されたタイミングや、メール受信などをトリガとしてキャプチャを行います。

GetPixels スクリーンショット3 撮影完了の通知をスーパーインポーズ表示で行います。スーパーインポーズ表示自体をキャプチャすることはできないので、エミュレータ上にてキャプチャしています。

GetPixels スクリーンショット4 最後に撮影した画像ファイルを送信する機能です。S60プラットフォームでは、非常に簡単に「送信」機能を実装することができるので、試しに実装してみました。

posted at 2006-10-10 | Permalink

© 2004-2008 ENDO