プログラミング

データ軽量化編 β版へ向けて PHPポケモン 90

PHP PHPポケモン ポケモン
データ軽量化編 β版へ向けて  PHPポケモン 90

β版の実装に向けて

大型アップデートにより、ある程度機能改善や実装箇所も増えてきましたが、それと同時に次の段階への移行が本格的に見えてきました。それがβ版です。

 

PHPポケモンは2020年12月現在α版となっており、完全な試作段階のWEBアプリケーションです。セーブ機能はなく、セッションの有効期限や破棄により最初からやり直さなければいけなくなるという点が最大の難点となっており、β版の実現に要求されている項目でもあります。

 

では、そのセーブ機能を実現するためにもいくつか課題となっている項目を取り上げていきましょう。

 

セーブデータの軽量化

まずは、データを記録するためにはデータの軽量化が求められます。PHPポケモンではDBを使用せずにセッションによるデータの受け渡しをしているため、セッションに格納しているデータ自体を軽量化することが、この実現に繋がります。

そして、セッション容量の大半を占めているのはインスタンスです。

 

ポケモン

ポケモン情報はインスタンスをシリアライズして格納するという方式が現段階では最善なので、形式はこのままで進めていきます。

定数と静的変数 ピカチュウとイーブイで学ぶオブジェクト指向 定数と静的変数 ピカチュウとイーブイで学ぶオブジェクト指向

PHPポケモンも順調に開発が進んでいると思いきや、ふとした気づきが自分の理解力を思い知らせることとなった今日このごろです。 プログラミングは奥が深く、しっかりと段階を追って理解を進めていけば、「これ・・・便利やんけ!」ってなることがかなり多いということがわかります。   それでは、かの有名な黄色い...

 

前回の記事で紹介したように、現在はほとんどの値をプロパティとして格納しているため、情報の追加やステータス・技の変更等によるアップデートも効きません。しかも、プロパティが多ければ多いほど、データ容量は膨れ上がるため、共通項目を定数または静的変数として、オブジェクト自体に持たせるといった仕様に変更します。

 

ピカチュウクラス(/Classes/Pokemon.php
<?php
$root_path = __DIR__.'/../..';
require_once($root_path.'/Classes/Pokemon.php');
 
/*
* ピカチュウ
*/
class Pikachu extends Pokemon
{
 
    //=====================================
    // オブジェクト定数
    //=====================================
 
    /**
    * ポケモンナンバー
    * @var integer
    */
    public const NUMBER = 25;
 
    /**
    * 正式名称
    * @var string
    */
    public const NAME = 'ピカチュウ';
 
    /**
    * 分類
    * @var string
    */
    public const SPECIES = 'ねずみポケモン';
 
    /**
    * 分類
    * @var string
    */
    public const DESCRIPTION = 'つくる 電気が 強力な ピカチュウほど ほっぺの 袋は 軟らかく よく 伸びるぞ。';
 
    /**
    * タイプ
    * @var array
    */
    public const TYPES = ['TypeElectric'];
 
    /**
    * 基礎経験値
    * @var integer
    */
    public const BASE_EXP = 112;
 
    /**
    * 捕捉率
    * @var integer
    */
    public const CAPTURE = 190;
 
    /**
    * 重さ
    * @var float
    */
    public const WEIGHT = 6.0;
 
    /**
    * レベルアップ技
    * @var array::[習得レベル:integer,技名称:string]
    */
    public const LEVEL_MOVE = [
        [1, 'MoveThunderShock'],
        [1, 'MoveGrowl'],
        [9, 'MoveThunderWave'],
        [16, 'MoveQuickAttack'],
        [26, 'MoveSwift'],
        [33, 'MoveAgility'],
        [43, 'MoveThunder'],
    ];
 
    /**
    * 種族値
    * @var array
    */
    public const BASE_STATS = [
        'H' => 35,
        'A' => 55,
        'B' => 40,
        'C' => 50,
        'D' => 50,
        'S' => 90,
    ];
 
    /**
    * 獲得努力値
    * @var array
    */
    public const REWARD_EV = [
        'S' => 2,
    ];
 
    //=====================================
    // 静的変数
    //=====================================
 
    /**
    * 進化先
    * @var string
    */
    public static $after_class = 'Raichu';
 
}

 

ポケモンそれぞれのクラスに記述するものは、定数・静的変数で解決ができました。これで、ピカチュウのインスタンスを作成しても、これらの情報は含まれず、呼び出す際はオブジェクトそのものを参照してくれることになります。

進化先を静的変数にしたのは、イーブイなどの進化先不定のポケモンがいるためです。こちらについては、前回の記事で細かくまとめているので、ぜひ参考にしてください。

定数と静的変数 ピカチュウとイーブイで学ぶオブジェクト指向 定数と静的変数 ピカチュウとイーブイで学ぶオブジェクト指向

PHPポケモンも順調に開発が進んでいると思いきや、ふとした気づきが自分の理解力を思い知らせることとなった今日このごろです。 プログラミングは奥が深く、しっかりと段階を追って理解を進めていけば、「これ・・・便利やんけ!」ってなることがかなり多いということがわかります。   それでは、かの有名な黄色い...

 

アイテム

次にアイテムについてです。こちらはプレイヤー情報に含まれていますが、既にクラス名と所有数だけを格納した配列をプレイヤーに持たせることで、すでにある程度の軽量化はされています

ただ、毎回アイテムを参照する際にインスタンス化するとなればメモリ負担は多くなってしまうため、こちらも定数を使って実装していきましょう。

 

モンスターボール(/Classes/Item/PokeBall.php
<?php
$root_path = __DIR__.'/../..';
require_once($root_path.'/Classes/Item.php');
 
/**
* モンスターボール
*/
class ItemPokeBall extends Item
{
 
    /**
    * 正式名称
    * @var string
    */
    public const NAME = 'モンスターボール';
 
    /**
    * 説明文
    * @var string
    */
    public const DESCRIPTION = '野生のポケモンに投げて捕まえるためのボール。カプセル式になっている。';
 
    /**
    * カテゴリ
    * @var string::general|health|ball|important|machine
    */
    public const CATEGORY = 'ball';
 
    /**
    * 最大所有数
    * @var integer
    */
    public const MAX = 99;
 
    /**
    * 買値
    * @var integer
    */
    public const BID_PRICE = 200;
 
    /**
    * 売値
    * @var integer
    */
    public const SELL_PRICE = 100;
 
    /**
    * 対象
    * @var string::friend|player|enemy
    */
    public const TARGET = 'enemy';
 
    /**
    * 使用できるタイミング
    * @var array
    */
    public const TIMING = ['battle'];
 
    /**
    * 捕獲補正率
    * @var float
    */
    public const PERFORMANCE = 1.0;
 
}

 

これで、全ての値をインスタンス化せずに取り出すことができます。しかし、現状のままではメソッドを呼び出すためにはインスタンス化が必要です。こちらも解決するために、アイテムで使用しているメソッドはすべて静的メソッドへ変更しましょう。

 

どうぐクラス(/Classes/Item.php
<?php
/**
* どうぐ
*/
abstract class Item
{
 
    /**
    * 性能値(捕獲補正率※ボールのみ個別で設定)
    * @var float
    */
    public const PERFORMANCE = 0;
 
    /**
    * 現在のページで使用できるかどうかの判定
    * @param page:string
    * @return boolean
    */
    public static function allowUsed($page): bool
    {
        return in_array($page, static::TIMING, true);
    }
 
    /**
    * 削除できるかどうかの判定
    * @return boolean
    */
    public static function allowTrashed(): bool
    {
        // 最大所有数が設定されていれば削除可
        if(is_null(static::MAX)){
            return false;
        }
        return true;
    }
 
}

 

静的変数と同じく、静的メソッドもstaticを付与することでインスタンス化せずに呼び出すことができます

これにより、アイテム自体は現状インスタンスが不要なオブジェクトとなりました。他のアイテムなども踏まえてインスタンス化の必要性がなさそうであれば、子クラス自体もabstractを付与してインスタンス化できないようにしても良さそうです。

 

処理の見直し

セーブデータの軽量化については、ある程度定まってきたので次に全体の処理見直しをしましょう。こちらは、現段階での予定となるので本格実装するかどうかは未定のものも含まれています

 

クラスの抽象化

ポケモン・アイテムクラスでも説明しましたが、ほとんどのクラスは抽象化することで解決ができそうです。アイテムですら現状インスタンス化が不要な段階まで見えてきたので、おそらく他のクラスは抽象化が可能になります。

現在実装されているものであれば、以下のクラスが該当します。 

  • タイプ
  • 状態異常
  • 状態変化
  • フィールド

 

以上の5クラスについてはほぼ抽象化が可能です。抽象化することにより、毎回インスタンスを作成していた手間が省けるため、現在の仕様と比較すればメモリ消費を大幅に削減できる見込みです。

こちらは、ほぼ確定で実装予定となります。

 

base64の画像処理

こちらは軽量化とは逆の内容になります。現在は公開ディレクトリに保管した画像へパスでアクセスをしています。画像自体はPHPポケモンオリジナルのものではないため、パスを指定することで他の画像へのアクセスができること自体はそこまで大きな問題ではありませんが、システム上大きな問題点が上がってきました。それがアクセスエラーです。

 

エラー等の関係上、一部レスポンスコードによる管理を行なっている処理があるため、もし404が返ってくるとレスポンスが上書きされてしまい、データ消失につながる可能性があります。セーブ機能が実装できれば、保険としてオートセーブを取り入れるなどして対応できるかも知れませんが、プレイの進行に支障が出ることは間違いありません。

なので、画像不定などのリスクを少しでも軽減するために、画像へのアクセスはPHPを使ってサーバー処理で行いbase64を生成、フロントでは生成されたデータを使うというのが候補として上がりました。

gifや画像数の関係上、処理速度にも不安が残るため、この方法が有効かどうかはわかりませんが、一部の画像についてはbase64で管理したほうが良さそうです

 

TypeScriptの導入

処理自体はPHPで行なっているため、jsそのもののエラーによりデータが消失してしまうというケースはまずありません。ただ、画面入力などの操作機能全般はjsに頼っているため、エラーにより読み込みが上手く行かないなどが発生すれば、実質フリーズ状態に陥ってしまい強制リセットを余儀なくされます

こういったリスクを軽減するためにも、TypeScriptを使ったjsファイルの作成・管理を視野に入れています。

ただ、jQueryとの共存やTypeScript自体を使ったことがないという現段階では悩みどころです。

もし導入するのであれば、記述量が少ないうちに判断したほうが良いのですが、一気に対応することで粗がでそうな気がしており躊躇しています。こちらはβ版では導入せず、γ版で本格的な画面の作り込みが入った時点でも良いかも知れません。

 

まとめ

いかがだったでしょうか。

今回のPHPポケモンでは「β版の実装へ向けたデータの軽量化」についてご紹介しました。

WEBアプリケーションづくりに興味がある方や、ゲーム好きな人は、ぜひ参考にしてみてくださいね。

 

注目の記事

進化の石編(実装)PHPポケモン103
プログラミング
PHP,PHPポケモン,ポケモン
進化の石編(実装)PHPポケモン103

アイテムによる進化 前回作成した、進化アイテムによる構成の続きです。   進化アイテムとして「かみなりのいし」、ピカチュウの進化判定を作成したので、アイテムの使用から進化処理までを作成、実装します。   今回作成する処理は以下の2点です。 アイテムの使用判定 進化画面への移管   それ...

ポケモン入れ替え編 PHPポケモン 83
プログラミング
PHP,PHPポケモン,ポケモン
ポケモン入れ替え編 PHPポケモン 83

ポケモンの入れ替え 複数ポケモンの所有、そして並び替えの機能が整ったので、いよいよバトルでのポケモン交代機能を実装します。ポケモンがバトル中に交代する方法は大きく分けて以下の4つです。 プレイヤー操作による交代 ひんしによる交代 相手ポケモンの技による交代 味方ポケモンの技による交代 ...

フリーランスが見積書を作るときに押さえておきたい3つのポイント+α
フリーランス
フリーランス,仕事依頼,独立,見積書
フリーランスが見積書を作るときに押さえておきたい3つのポイント+α

  仕事の依頼がきたけど、どれぐらいの金額を提示すればいいかわからない   駆け出しのフリーランスや、これから独り立ちしようとしている人に多い悩みです。 今回はそういった方のために「フリーランスが見積書を作るときに押さえておきたい3つのポイント+α」についてご紹介します。     時給...

npm run watch-poll中にPCがフリーズした時の解決法
プログラミング
CSS,JavaScript,Laravel,Linux
npm run watch-poll中にPCがフリーズした時の解決法

  Laravelで開発中にPCが頻繁にフリーズするという問題にぶち辺り、原因がnpm run watch-pollだということが解ったので、その解決方法をまとめておきます。 複雑な原因でもなく大きな問題にもならなかったのですが、これが原因でデータ破損となれば困るので、同じような問題に直面した開発者向けです。    ...

ピカチュウから学ぶオブジェクト指向 〜進化編〜 7
プログラミング
PHP,PHPポケモン,オブジェクト指向,ポケモン
ピカチュウから学ぶオブジェクト指向 〜進化編〜 7

  ※前回(第6回)で意味不明な場所に空変数が入っており、ステータスが一部しか出力できないという問題がありました。修正しています。犯人は「$stats = [];」です。(GetTrait.php)   今回はポケモンのゲームでは欠かせない、楽しみの一つとなる「進化システム」を導入していきます。これからPHPポ...

グローバル&ヘルパー関数編 PHPポケモン 61
プログラミング
PHP,PHPポケモン,ポケモン
グローバル&ヘルパー関数編 PHPポケモン 61

進化や技習得、HPバーや経験値バーの演出ができているのに、なぜ状態異常の演出はされていないの?   そう感じている方が少なからずいるはずです。 現段階では、状態異常になっても次の画面に移管しなければ表示されません。これは、PHP側で内部処理は行われているが、メッセージに合わせた動的な変更がされていな...

ポケモン預かりシステム編 PHPポケモン 85
プログラミング
PHP,PHPポケモン,ポケモン
ポケモン預かりシステム編 PHPポケモン 85

ポケモン預かりシステムとは ポケモンは手持ち(パーティー)に6匹しか入れることができません。そのため、ポケモンを捕まえた際にその上限に達していれば、ボックスへ転送するという仕組みをPHPポケモンでも実装していきます。これが、ポケモン預かりシステムです。 今回は前段階であるボックスの仕様決めをメイン...

忘れさせる技選択 後編(新しい技を習得) PHPポケモン 56
プログラミング
PHP,PHPポケモン,ポケモン
忘れさせる技選択 後編(新しい技を習得) PHPポケモン 56

新しい技を習得 前編に続き、技習得時の処理分岐を作成していきましょう。今回は「新しい技を習得する」です。 前回は覚えようとしている技を諦めるだけだったので、ポケモンのオブジェクトを書き換える必要がありませんでしたね。ですが、新しく覚えようとしている技を既に覚えている技と置き換える場合は、ポケモ...

カテゴリ

SEO対策 イベント デザイン ネットワーク ビジネスモデル フリーランス プログラミング マーケティング ライティング 動画編集 雑記

タグ

5G Adobe AfterEffects AI ajax amazon Animate api artisan atom Automator AWS Bluetooth CSS CVR description EC-CUBE4 ECショップ ESLint Facebook feedly foreach function Google Google AdSense Honeycode htaccess HTML IEEE 802.11ax Illustrator Instagram IoT JavaScript jQuery jQuery UI keyword LAN Laravel Linux MacBook MAMP meta MLM MySQL NoCode note OS OSI参照モデル Paypal Photoshop PHP phpMyAdmin PHPポケモン PremierePro rss SEO SEO対策 Sequel Pro Skype SNS SSH Symfony TCP/IP title Toastr Trait Twig Twitter UCC V系 WAN WebSub Wi-Fi wiki Windows WordPress XAMPP xml Xserver YouTube YouTuber Zoom アーティスト アウトプット アクセス層 アニメーション アフィリエイト イーブイ インターネット インプット エンジニア オブジェクト指向 お金配り クリック単価 クリック数 コミュニケーション能力 コロナ コンサルティング サムネイル システムエンジニア スタートアップ スタイルシート スパム データベース ディープフェイク デザイナー デザイン テレワーク ナンパ ニュース ネットワークモデル ノマドワーク バナー ピカチュウ ビジネス フィード フリーランス ブロガー ブログ プログラマー プログラミング プログラミング学習 プログラミング教育 プロトコル ホームページ制作 ポケモン マークアップ マーケティング メール リモートワーク レンダリング 三井住友 三宮 仕事依頼 児童デイ 児童デイサービス 児童発達支援 公開鍵 初心者 助成金 勉強法 営業 広告 広告収入 必勝マニュアル 放課後等デイサービス 朝活 楽天 深層学習 無線LAN 独立 神戸 福祉 秘密鍵 翻訳 自己啓発 英語 見積書 計算機 読書 起業 迷惑メール 配列 銀の弾丸 集客 雑学力