PlayStation Suite SDK/プログラムの基本構造
PlayStation Suite SDKを用いたプログラムの基本構造は、以下のようになっている。
namespace PssApp01
{
using System;
using System.Collections.Generic;
using Sce.Pss.Core;
using Sce.Pss.Core.Environment;
using Sce.Pss.Core.Graphics;
using Sce.Pss.Core.Input;
public class AppMain
{
private static GraphicsContext graphics;
public static void Main (string[] args)
{
Initialize ();
// ゲームループ
while (true) {
SystemEvents.CheckEvents ();
Update ();
Render ();
}
}
public static void Initialize ()
{
graphics = new GraphicsContext ();
}
public static void Update ()
{
// ここにキー入力やキャラの移動、当たり判定などの
// ゲーム内容を書く
}
public static void Render ()
{
graphics.SetClearColor (0.0f, 0.0f, 0.0f, 0.0f);
graphics.Clear ();
// ここに描画処理を書く
graphics.SwapBuffers ();
}
}
}
目次
Mainメソッド[編集 | ソースを編集]
PssStudioで新規プロジェクトを作成すると、AppMain.csファイルが自動生成され、その中のAppMainクラスにエントリポイント(起点)となるMainメソッドがある。
以下のような記述がエントリポイント(起点)として必ず1個ある、というはC#の基礎中の基礎なので、深く考えずにこういうものだと覚えておけばいい。
public static void Main (string[] args)
{
}
なお、複数のクラスにMainメソッドがある場合はPssStudioでプロジェクトの設定画面を開き「ビルド」→「一般」→「Mainクラス」で選択できるが、まず使わない。なお、Mainメソッドが複数あるのに上記設定をしていないとビルドエラーとなる。
Initializeメソッド[編集 | ソースを編集]
Initializeメソッドの中では主に初期化に関する処理を記述する。
whileループ[編集 | ソースを編集]
while (true)、いわゆる永久ループ。 ゲームプログラミングの世界ではゲームループと呼ばれるもので、基本的に「ゲームメイン処理」、「画面描画」、「ウェイト(フレームレート調整)」を延々と繰り返すことでゲームが進行するようになっている。
SystemEvents.CheckEventsメソッド (Sce.Pss.Core.Environment)[編集 | ソースを編集]
旧来の家庭用ゲーム機であればゲームのみが動くのが一般的であり上記の3つだけで良かったが、近年のPCに近い環境ではアプリ切り替えなどにより、ゲームを一時中断させられたりするため、定期的にシステムのイベントのチェックを行う必要がある。
本気モードの場合は、チェックした内容で細かい制御を書いたりする。
UpdateメソッドとRenderメソッド[編集 | ソースを編集]
Updateメソッドには主にCPUを使う計算処理を書く。 いわゆるゲームメイン処理。 ようするにキー入力やキャラクターの移動、当たり判定などを行う。
Renderメソッドには主にGPUを使う描画処理を書く。
「何でUpdateとRenderの2つのメソッドを分けてるの?意味ないじゃん。デザインパターンの一種?」と思われるかもしれないが、この例ではシングルスレッドで処理しているが、本気モードのときはゲームメイン処理が重いときは描画処理をすっ飛ばしたり(フレームスキップ)、ゲームメイン処理と描画処理でスレッドをわけたりする(いわゆるマルチスレッド)のが一般的だからである。つまり本気モードへの移行時にソースコードの書き換えを最小限にするためである。
GraphicsContext.SwapBuffersメソッド (Sce.Pss.Core.Graphics)[編集 | ソースを編集]
SwapBuffersメソッドは垂直同期のタイミングでフレームバッファを切り替える。いわゆるダブルバッファ。
「垂直同期のタイミングで」というのがミソで、PlayStation Vitaでは垂直同期が約16.6ミリ秒、1秒間に60回の画面書き換えを行うが、前回のSwapBuffersメソッドの呼び出しから16.6ミリ秒以内であれば垂直同期が来るまで待つ。つまり、処理が軽い場合は16.6ミリ秒になるように調整される。言い換えれば、描画処理を行うと自動的にウェイト処理も行ってくれる。
なお、Android端末では、秒間60フレームではない機種や、「垂直同期なにそれ?」なクソ機種が大量に存在するので必ずしもこの限りではない。なめらかさがちょっと損なわれるくらいなのであんまり神経質になる必要はないと思うが。
また、「処理が軽い場合」の「ウェイト処理」は自動的にやってくれるが、「処理が重い場合」の「フレームスキップ」は自動でやってくれないので注意すること。
備考[編集 | ソースを編集]
このドキュメントはPlayStation Suite SDK付属のドキュメントを個人的にわかりやすいように万人向け解説部分を改悪したものである。よって公式ドキュメントも見ろ。
関連項目[編集 | ソースを編集]
参考文献[編集 | ソースを編集]