金曜日, 12月 26, 2008

PyCon2008 OLPC Tutorial 超要約 その4

その3からだいぶあいたけど、とりあえずメモ訳のまとめ。
未来の自分と、これからこのTutorialをやろうとする人のための参考として。

注意点
reStructuredTextでまとめたものをHTMLに変換したので、変なHTMLソースになってます。
また実際には、複数日かけてやってるので、口調や編集の仕方が変化している上に、最後の方は結構適当です。

ではスタート。


Auto-generate a Skeletal Wrapper (Step 002)


Sugarアクティビティには、作るのがちょっとだけ苦痛な"boilerplateコード"が結構あります。さっき(その3で)落としたOLPCGamesには、新しいActvityの構成を作ってくれる、スケルトン生成スクリプトが入っています。
使い方はこんな感じです。実行してみてね。



cd OLPCGames-1.6/skeleton/
./buildskel.py -n HelloPygame -t "Hello Pygame" -s org.laptop.community.HelloPygame

buildskel.pyのオプション:


-n NAME, --name=NAME
分かりやすく簡潔な名前 (ファイル名に使われる)

-t TITLE, --title=TITLE
分かりやすく、人間が読むための名前
(ウィンドウやアイコンのタイトルに使われる)

-m MAINLOOP, --mainloop=MAINLOOP
メインモジュールと関数名。package.module 見たいな感じで。

-s SERVICE, --service=SERVICE
DBUSのサービス名。提供されないなら接頭辞の名前(?)

今回使わないのは、-mだけ。今回はデフォルトである、run.pyのmain関数を使います。
それと、-sはD-BUSで使われるので一意になるように名前付けをしてね。



boilerplateコード

面倒で苦痛で決まりきった書き方の繰り返しみたいな意味。
特に関数化やモジュール化も出来ないものを言う気がする。
Sugar-Activityの場合、フォルダ構造とかMANIFESTファイルとかがそれにあたる。


新しいActivityの登録


ActivityをSugarで使うには登録しないと駄目です。じゃないとSugarのランチャーに出てきません。
まず、sugar-shellを起動します。sugar-jhbuildの場合は"sugar-jhbuild shell"をbuntuのパッケージでSugarを入れてるならsugar-shellコマンドを実行します。
次に、あなたがOLPCGames-1.*/skeletonディレクトリにいるとして次の順に実行します。
(注:HelloPygame.activityディレクトリはさっきbuildskel.pyで作られているはずです)



cd HelloPygame.activity
python setup.py dev

そして、今後楽をするため、シンボリックリンクを張ります。



cd ../../../
ln -s OLPCGames-1.*/skeleton/HelloPygame.activity .

そしてsugar-emulatorを実行してHelloPygameっていうActivityが登録されていたらOKです。
うまく行かなかったらlogを見てね。


ラッパーを見てみよう


好きなIDEで自動生成されたファイルを見てください。
OLPCGamesはGTK Socket (X-Embed) プロトコルを通して、GTKアプリケーションのウィンドウの中にPygame(SDL)を埋め込むための、薄いラッパーです。
これからどんどんカスタマイズしていきます。
さて、何が作られたでしょうか。


メタデータ


HelloPygame.activityディレクトリの下のactivityディレクトリにあるもの



activity.info

何を動かすかとか、アイコンデータの指定とか
http://wiki.laptop.org/go/Activity_Bundles#.info_File_Format

activity.svg

アイコンデータ
http://wiki.laptop.org/go/Sugar_Icon_Format


GTK Wrapper(activity.py)


概要



  • クラス定義

    • PygameActivityを継承

  • GTKイベントの割り込みや生成

  • Sugar用ツールバーの追加

  • Pygameウィンドウのサイズの宣言

  • 名前、タイトルの宣言

  • メインループ関数の宣言

  • 別のPygameスレッドを作ること


Pygameメインループ詳細



  • import

    • pygame : 描画、メインループ、そしてそれら素晴らしいモノ全て

    • olpcgames.pausescreen : sleep状態に素早く移行するためのイベントを発生させる

    • logging : 標準モジュールのログです。使い方を知っている必要があります

    • olpcgames : イベントの定数にアクセスするために



  • loggingセットアップ

  • main関数

    • 画面の準備をする

    • フレームの限界値を設定(25か50がいい)

    • ダブルバッファリング

    • イベント開始

      • 非アクティブ時は画面描画を止める

      • そうでないならイベントを発生させる






サポートメカニズム


setup.py
パッケージング用のスクリプト。stuptoolsではないので注意。
MANIFEST.in, POTFILES.in
setup.pyに食べさせる。

step003


Activityを走らせることは出来たけど、微妙な状態ですね。
というわけで、"Hello World"的なものを加えてみます。
これにはOLPCGamesのTextClassを使う。これはPangoテキストレンダリングエンジンのラッパーです。
Pygameのスプライトクラスは、多くのラスタ画像を表示するのに非常に効率的なメカニズムになってます。
Pygameの大概のことは、スプライト関連のクラスを使うとうまくいきます。
「Hello world」がスプライトエンジンを激しく使わない内に、関連操作に慣れるために使っていきます。



  • Sprite と Sprite-Groups

    • Sprites: imageと長方形の枠(Rect)

      • Rects in Pygame

      • Group タイプとなぜRenderUpdates()するか

      • Group 追加/除去 操作





  • TextSpriteを使ったテキストレンダリング

    • PangoFont クラス

    • Fontの仕様

    • Fontレンダリング結果、画像とRect

    • 文字列の翻訳のためにgettextをつかえ



  • layout関数とRect

    • Rectの仮想プロパティとそれらへの課題



0 件のコメント: