プログラミング

データ軽量化編 β版へ向けて 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ポケモン66
プログラミング
PHP,PHPポケモン,ポケモン
ビジュアル作り込み編(序) PHPポケモン66

ビジュアルの作り込み 最近は内部の作り込みが多かったので、今回のPHPポケモンでは見た目を少しだけ作り込んでいきます。とはいっても、機能自体がそこまで揃っていないため、あくまで仮の見た目となります。 ある程度見た目が整っていると、プレイする側のモチベーションや楽しみも増えると思ったので、こちらは並...

食に関する考察 自炊と節約は成立するのか?
雑記
食に関する考察 自炊と節約は成立するのか?

スキル関係の記事が多めの当ブログですが、今回は「食」をテーマに触れていきます。突き詰めていけば食も立派なスキルであり、奥が深いものです。更に、生活の基盤となるため多くの人がこの問題に直面することであり、健康とも直結するため仕事などにおけるパフォーマンスにも大きく関係します。   これから一人暮ら...

HPバーアニメーション前編 サーバー側の対応 PHPポケモン 43
プログラミング
PHP,PHPポケモン,ポケモン
HPバーアニメーション前編 サーバー側の対応 PHPポケモン 43

動きのあるHPバーづくり それではデモ公開に先立ち、HPバーの作り込みをしていきたいと思います。 現在のPHPポケモンは、ダメージ計算などが終わった結果をすべて返却しているため、技選択をして次の画面に移行すると、HPが減った状態でスタートしていました。これでは、どの技でどれぐらいのダメージを与え、状態変...

アーカイブのディスクリプションを管理画面で設定する方法【SEOに強いWordPressブログ・サイト作り】
プログラミング
PHP,SEO,WordPress
アーカイブのディスクリプションを管理画面で設定する方法【SEOに強いWordPressブログ・サイト作り】

  WordPressで作ったサイトやブログはSEO対策がしやすいという利点があり、より検索に強いサイトへ仕上げることができます。 ですが、SEO対策に特化しているテーマでもアーカイブページのディスクリプション設定ができないものは多く、別で設定する必要があるものがほとんどです。   今回は、より検索で強く...

Toastr(トースト)活用編 PHPポケモン 100
プログラミング
JavaScript,PHP,PHPポケモン,ポケモン
Toastr(トースト)活用編 PHPポケモン 100

記念すべき第100回目です!   色々考えましたが、100回目だからと言って特別な内容ではなく、いつもの流れの延長での開発進行となります。ご了承ください。 今回は、何人かのプレイユーザーの声も参考にしながら、ユーザビリティをあげるための機能追加を進めていきます。   Toastr(トースト)と...

ポケモン預かりシステム編 ボックスの作成 PHPポケモン 86
プログラミング
PHP,PHPポケモン,ポケモン
ポケモン預かりシステム編 ボックスの作成 PHPポケモン 86

ポケモン預かりシステムの実装 今回は、前回ざっくりと仕様決めをした「ポケモン預かりシステム」を実装していきます。ボックス内では操作する項目が多いため、ボックス自体に1つの画面を用意して、できる限りPHPによる制御だけで完結できるように作成していきます。   ボックスクラスの作成 それではまず、今...

コンテンツ配信業でバズるために大切な3つの法則〜『1ヶ月でチャンネル登録者数1000人』は参考にするな
マーケティング
YouTube,YouTuber,ブログ
コンテンツ配信業でバズるために大切な3つの法則〜『1ヶ月でチャンネル登録者数1000人』は参考にするな

  YouTubeやブログを始めたけど思ったように伸びない・・・   こういった人は、チャンネル登録者数を伸ばす方法などの動画を見ても参考にならなく、結果に繋がらないという場合がほとんどです。 その理由は、その人自身に問題があるわけではなく、動画の前提条件がそもそも違っているからです。   今回は「...

カテゴリ

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

タグ

5G Adobe AfterEffects AI ajax amazon Animate api artisan atom Automator AWS Bluetooth CSS CVR description EC-CUBE4 ECショップ ESLint Facebook feedly foreach fortify function Google Google AdSense Honeycode htaccess HTML IEEE 802.11ax Illustrator Instagram IoT JavaScript jetstream 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 独立 神戸 福祉 秘密鍵 翻訳 自己啓発 英語 見積書 計算機 認証 読書 起業 迷惑メール 配列 銀の弾丸 集客 雑学力