コードエディタ&プレイヤー

Pyxenでは、コードエディタと実行中のゲームが同じウインドウに並びます。コードペインでPyxen Scriptを書き、その横のプレビューでゲームを遊びます。

コードエディタ

エディタはPyxen Scriptを色分けし、入力しながらコードをチェックします。問題はその行に、理由とともに表示されます。

Macでも、ハードウェアキーボードをつないだiPadでも、選択、コピー、ペースト、取り消し、やり直しといった標準のショートカットが使えます。マウスやトラックパッドでカーソルを正確に置けます。

入力中のパラメータ

world.get( や hero.tween( のように呼び出しの ( を入力すると、行の上にカードが出て、その呼び出しが受け取るものを示します。パラメータの一覧、今入力しているパラメータの強調、そのパラメータのリファレンスの説明、ページを開く リファレンス › です。カンマを入力しても、内側の呼び出しに入っても付いてきて、閉じる ) を入力すると消えます。自分で書いた関数にもカードが出て、docstring の1行目が表示されます。

行の下のリストは、合うものから先に出します。world.get( ではプロジェクトに書かれたエンティティ名、ease= の後ではイージング名、まだ渡していないキーワード、そのあとにいつもの名前です。文字列として書かれた名前しか知らないので、ゲームの実行中に名付けたエンティティは出てきません。

Esc を1回押すとリストが閉じ、2回押すとその呼び出しのカードが隠れます。Cmd+Shift+Space(編集 › パラメータを表示)で戻り、Ctrl+Space(編集 › 補完候補を表示)でリストが開きます。iPad ではカードをタップするとリファレンスが開きます。画面キーボードでは、呼び出しの中で入力行の . キーが , を入力します。

入力中のアセット

Sprite("、Sound("、Music("、Text(…, font="、GridMap(tilemap=" のように、呼び出しが受け取る名前の引用符の中では、リストにプロジェクトのその種類のアセットが出て、そのあとに各アセットパックのものが続きます。それぞれ絵付きです。画像は最初のタイル(または画像全体)とサイズ、アニメーション、フォントは呼び出しのテキストをそのフォントで、マップは小さく描いたものです。animation=" の後では、同じ呼び出しで名前を指定した画像のアニメーションが、それぞれ再生されながら並びます。選んでいるものはリストの横に大きく表示され、スプライト で開く ›(または種類に合ったペイン)で開けます。

サウンドと音楽には ▶ があります。クリックするか、選んでいる行で Option+Return(編集 › ピッカーを表示)を押すと聞けます。リストを移動しているあいだは何も鳴らず、Esc で止まります。サウンドバンクのサウンドは "bank/sound" と書きます。

リストは文字列として書かれた名前しか知りません。変数に入れた名前や組み立てた名前にはリストが出ず、カードがゲームの実行中に決まることを伝えます。システムの「視差効果を減らす」がオンのときは、アニメーションは止まったままです。

タイルの引数、Sprite("tiles", tile=( やマップの level.set(…, tile=( では、呼び出しが指定する画像がグリッド付きで行の下に開きます(タイルピッカー)。タイルをクリックするか、複数にまたがってドラッグすると、選ぶそばから数値がコードに書き込まれます。スプライトはピクセルで (x, y, w, h)、マップはセルで (column, row) です。数値を自分で入力すると、選択がそれに合わせて動きます。Return で確定(iPad では完了)、Esc で元の値に戻り、取り消す1回で選択全体が元に戻ります。空の tile=( では自動で開きます。すでに書いたタイルは、数値の直前にある小さな画像をクリックするか、Option+Return(編集 › ピッカーを表示)を押して矢印キーで選びます(Shift で複数のタイル)。HERO * 16 のように定数から計算される数値は破線で示され、数値で上書きする前にピッカーがそう伝えます。グリッドのない画像は、数値が示すサイズで、なければ 16 ピクセル単位で選びます。

Cmdを押したまま、コード内のアセット名(Sprite("ninja", animation="run")の"ninja"など)にポインタを合わせると、名前に下線が引かれ、カードにアセットの画像、サイズ、アニメーションが表示されます。Cmd+クリックすると、呼び出しが指す場所でアセットがエディタに開きます。スプライトエディタならrunアニメーション、tile=(16, 0, 16, 16)ならその矩形が選択された状態、バンクのサウンド(Sound("sfx/coin"))ならサウンドバンクでそのサウンドが選ばれた状態です。プロジェクトにない名前では何も開きません。

逆向きも使えます。アセットのペインにはコードで使用と、そのアセットを指すスクリプトの行数が表示されます。メニューから行を選ぶとその行へ移動します。ペインのバーが狭くて表示できないときは、ペインの⋯メニューの先頭にあります。

Sprite("ninjaa") の "ninjaa" のように、プロジェクトにない名前は、ゲームを実行する前から黄色の下線で示されます。カーソルを置くと、カードに「プロジェクトに「ninjaa」という名前のものはありません。」と表示され、「ninja」を使う でいちばん近い名前に書き換え、新規画像… で作成できます(種類によっては 新規タイルマップ…、新規フォント…、新規サウンドバンク…)。画像にないアニメーションも同じように下線で示されます。同じ Sprite の tile= と animation= も同時に使えないため同様です。これらはエラーではなく警告です。名前はあとで追加するアセットパックから来ることもあるので、ゲームはそのまま実行できます。チェックされるのは、テキストとして書かれた名前だけです。

シンボルへジャンプ

Cmd+Shift+O(編集 › シンボルへジャンプ…)を押すと、プロジェクトの関数や名前と、リファレンスの項目が一覧になります。入力して絞り込み、選ぶとそこへ移動します。

定義へジャンプ

関数名や変数名をCmd+クリックするか、カーソルを置いてCmd+J(編集 › 定義へジャンプ)を押すと、それが定義されている場所へ移動します。プロジェクト内のファイルをまたいで使えます。utils.pyで定義されmain.pyで呼ばれている関数なら、Cmd+クリックで直接そこへ飛べます。名前に定義が複数ある場合や、プロジェクト内に定義がない場合は、その名前でシンボルへジャンプが開きます。

単語単位の移動

Option+矢印キーで、カーソルを1文字ではなく1単語ずつ動かせます。Shiftと組み合わせると単語単位で選択でき、変数名や関数呼び出しをすばやく選ぶのに便利です。

文字サイズとテーマ

Cmd+= でコードを大きく、Cmd+- で小さくできます。表示 › 文字を大きく/文字を小さく からも選べます。設定 › エディタ では、サイズを 10〜32 ポイントで設定し、コードのテーマを 10 種類から選べます。「自動」は外観に合わせて Pyxen Dark か Pyxen Light になります。ほかに Pyxen Deep Dark、Pyxen Deep Light、Dracula、GitHub Light、One Dark、One Light、Solarized Dark、Solarized Light があります。

幅の狭い iPad のウインドウでは

ウインドウの幅が 900 ポイントより狭いとき(縦向きの 11 インチ iPad、Split View、Slide Over)、Pyxen はペインを一度に 1 つ表示し、ほかのペインはその上のタブになります。ペインのツールはウインドウの下端のトレイにあります。ハンドルをタップすると高さが変わり、下へドラッグすると折りたためます。コードペインのトレイには次のものがあります。

画面のキーボードが出ているときは、コード用のキーはキーボードの上の列にあります。ハードウェアキーボードでは、コードペインにトレイはありません。

ゲームの実行

実行(Cmd+R)を選ぶと、コードをチェックしてコンパイルし、実行します。ゲームはプレビューで始まります。停止(Cmd+.)で終了し、プレビューのバーの一時停止で1フレームに止められます。

コードにエラーがあると、Pyxenはそのメッセージを該当する行に表示します。直してもう一度実行してください。

フレームインスペクタ

実行中のゲームを一時停止すると、フレームインスペクタが起動します。これはPyxenの内蔵デバッガです。

インスペクタでは以下のことができます:

タイムスクラバー

Pyxenはゲーム実行中に最大300フレーム(毎秒30フレームで10秒)の履歴を記録します。一時停止すると、時間を前後にスクラブできます。

各フレームはエンティティと描画内容をメモリの予算内で保持します。エンティティやdrawが多い負荷の高いゲームでは保持するフレームが少なくなり、古いものから消えます。どこまで戻れるかはスクラバーに表示されます。予算は設定 › ゲームプレビュー › デバッガ › 履歴メモリで設定します。初期値はデバイスの推奨値(その下に表示)で、ほとんどのゲームで300フレームを保持できます。

つまり以下のことが可能です:

タイムスクラバーはデバッグを推測から観察に変えます。print文を追加して再実行する代わりに、一時停止し、巻き戻し、見るだけです。

ワークフロー

Pyxenでの典型的なワークフロー:

  1. エディタでコードを書く/編集する
  2. 実行してテスト
  3. 何かおかしければ、ゲームを一時停止
  4. 時間を遡って問題のフレームを見つける
  5. エンティティを検査して予期しない状態を確認
  6. 停止、コードを修正、繰り返し