なお、先日ヴィータに作った「有機EL照明」をベースに話をさせて頂きたく、よろしくお願いいたします(ヴィータ有機EL照明の記事はこちら)。
この「有機EL照明」は、強制的に「消灯」状態で起動する仕様のアプリとして作ってありました。
今回は、アプリの終了前の状態をファイルに記録しておいて、起動時にそのファイルを読み取り、終了前の状態(「消灯」か「点灯」か)を再現するという仕様に修正してみたのです。
■実際の動きです■
※具体的なプログラムについては後述いたします。
アプリを起動すると、「消灯」状態になっています。
消灯と言いつつ、タイトル文字が白く浮かんでいるのは、有機ELの特長を生かした(ような気がするだけですが)「仕様」になっています。
ヴィータの「Rキー」を押して、有機EL照明を「点灯」させます。
そして、スタートキーを押してアプリを終了して、PS Suite DEVのライブエリアに帰還します。
ライブエリアのゲートからアプリ一覧に戻り、再びアプリを起動します。
この時、前回は「点灯」状態で終了しているので、今回はその「点灯」状態でスタートするはずです。
というわけで、ファイルから前回の状態を無事に読み取り、「点灯」状態で起動しました。
今度は、「Lキー」で消灯します。
消灯したまま、スタートキーで終了してまたライブエリアに帰還。
次に起動すると、前回の状態である「消灯」でスタートします。
■具体的なプログラムについて■
C#言語による具体的なプログラミングですが、ファイルの読み書きには、System.IO名前空間のクラスを使っていきます。
しかし、いかんせんMainがstaticなので、インスタンス化しないと使えないクラスは、今回のスタイルでは駄目でした。
StreamReaderクラスや、StreamWriterクラスは使えないわけです。
今回は、安全のために、System.IO.Fileクラスのstaticメソッドのみでプログラムを作ってみました。
ここで出てくるのが「ファイルの読み書きというけど、どの場所に読み書きするの?」という問題ですね。
正直言って、ヴィータの専用メモリカード(ストレージ)の構造はよく分かりません。
ただ、/Documents/ディレクトリの中ならば、自由にファイルの読み書きが可能だったので、今の段階ではここに決め打ちでやってしまおうというわけです。
有機EL照明のプログラムは、元々短いので、今回も全文を掲載してみます。
前回との違いは何かというと・・・。
まず、起動時の初期化処理の中に、前回の状態を読み取る処理を加えています。
次は、RキーとLキーにて「点灯」「消灯」をスイッチングする度に、その状態をファイルに記録する処理を加えています。
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; using Sce.Pss.HighLevel.UI; using System.IO; namespace mmmVitaIllumination { public class AppMain { private static string cINFILE = "/Documents/mmmVitaIllumination_Setting.dat"; private enum COLOR_MODE : int { White = 1, Black } private enum FILE_MODE: int { Read = 1, Write } private static GraphicsContext graphics; private static COLOR_MODE eCM; private static bool bEND; public static void Main (string[] args) { try { Initialize (); UseSettingFile(FILE_MODE.Read); //@@@@@@@@@@[LOOP-START]@@@@@@@@@@ while (!bEND) { SystemEvents.CheckEvents (); Update (); Render (); } //@@@@@@@@@@[LOOP-END ]@@@@@@@@@@ } catch(System.Exception oE) { MessageDialog.CreateAndShow(MessageDialogStyle.Ok,"ヴィータからの通知",oE.Message); } } //有機EL照明の状態の取得&記録 private static void UseSettingFile(FILE_MODE eFM) { string sREC; try { //現在の有機EL照明の状態記録 if(eFM.Equals(FILE_MODE.Write)) { switch(eCM) { case COLOR_MODE.Black: sREC = "BLACK"; break; case COLOR_MODE.White: sREC = "WHITE"; break; default: sREC = ""; break; } File.WriteAllText(cINFILE,sREC); } //現在の有機EL照明の状態取得 else if(eFM.Equals(FILE_MODE.Read)) { if(File.Exists(cINFILE)) { sREC = File.ReadAllText(cINFILE); switch(sREC) { case "BLACK": eCM = COLOR_MODE.Black; break; case "WHITE": eCM = COLOR_MODE.White; break; default: break; } } } } catch(System.Exception oE) { throw oE; } } public static void Initialize () { graphics = new GraphicsContext (); UISystem.Initialize(graphics); Scene oSC = new Sce.Pss.HighLevel.UI.Scene(); Label oLBL = new Label(); oLBL.X = 10; oLBL.Y = 10; oLBL.Width = 960; oLBL.Text = "PlayStation VITA -有機EL照明-"; oSC.RootWidget.AddChildLast(oLBL); UISystem.SetScene(oSC,null); bEND = false; //有機EL照明の前回の状態(あれば)取得 UseSettingFile(FILE_MODE.Read); } public static void Update () { // Query gamepad for current state var gamePadData = GamePad.GetData (0); if((gamePadData.ButtonsDown & GamePadButtons.R) !=0) { eCM = COLOR_MODE.White; //有機EL照明の状態記録 UseSettingFile(FILE_MODE.Write); } else if((gamePadData.ButtonsDown & GamePadButtons.L) !=0) { eCM = COLOR_MODE.Black; //有機EL照明の状態記録 UseSettingFile(FILE_MODE.Write); } else if((gamePadData.ButtonsDown & GamePadButtons.Start) !=0) { bEND = true; } } public static void Render () { if(eCM.Equals(COLOR_MODE.White)) { graphics.SetClearColor (1.0f,1.0f, 1.0f, 1.0f); } else if(eCM.Equals(COLOR_MODE.Black)) { graphics.SetClearColor (0.0f, 0.0f, 0.0f, 0.0f); } graphics.Clear (); UISystem.Render (); graphics.SwapBuffers (); } } }
それにつけても、例によって内容はともかくとしても、何はともあれヴィータを買っておいて心底良かったなぁと思います。
プログラミングもそうですが、ヴィータから派生した色々な事柄の勉強や経験が出来るので、かなり重みがあるんですよね。
ただのゲーム機、ただの情報端末ではない、そんなベストマシンとして走り始めたという感じがします。