プログラミング

状態異常演出編 PHPポケモン 62

PHP PHPポケモン ポケモン
状態異常演出編 PHPポケモン 62

状態異常の演出

今回は「状態異常」にかかった際の動的な変更、演出を実装していきます。

どく状態になれば、メッセージに合わせて「どく」を表記、まひ状態になれば、メッセージに合わせて「まひ」をセットするという単純なものです。

 

返り値の変更

それではまず、状態異常をセットしてメッセージを生成しているsetSaに修正をかけていきましょう。

 

ポケモンクラス用セットトレイト(/Traits/Class/Pokemon/ClassPokemonSetTrait.php
/**
* 状態異常をセットする
* @param string $class
* @param integer $turn|0
* @return array
*/
public function setSa($class, $turn=0)
{
    // ひんしをセット
    if($class === 'SaFainting'){
        $this->sa = [$class => $turn];
        // ランク・状態変化・バトルダメージをリセット
        $this->releaseBattleStatsAll();
        // 進化フラグがtureになっていればfalseに変更
        if($this->evolve_flg){
            $this->evolve_flg = false;
        }
        // メッセージの返却
        return [
            'message' => $this->getPrefixName().'は倒れた'
        ];
    }
    // セットできる状態異常一覧
    $sa_list = [
        'SaBurn', 'SaFreeze', 'SaParalysis', 'SaPoison', 'SaBadPoison', 'SaSleep',
    ];
    // クラスチェック
    if(!in_array($class, $sa_list, true) || !class_exists($class)){
        // 不正なクラス
        return [
            'message' => '指定された状態異常は存在しません'
        ];
    }
    // 状態異常にかかっていない場合
    if(empty($this->sa)){
        $sa = new $class;
        // 状態異常をセット
        $this->sa[$class] = $turn;
        return [
            'message' => $sa->getSickedMessage($this->getPrefixName()),
            'sa' => $class
        ];
    }
    if(isset($this->sa[$class])){
        $sa = new $class;
        // 既に同じ状態異常にかかっている
        return [
            'message' => $sa->getSickedAlreadyMessage($this->getPrefixName())
        ];
    }
    return [
        'message' => 'しかし上手く決まらなかった'
    ];
}

今まではメッセージをそのまま返却していましたが、それでは「成功」か「失敗」かの判断が付きません。なので、配列にしてメッセージには「message」というキー、状態異常にかかった際は「saというキーにクラス名を格納して返却しています。

 

メッセージとレスポンスの格納

次に、状態異常メッセージ・レスポンスの受け取りから格納までの流れです。

今まではメッセージだけを返却していたので、技のeffectsメソッド内でメッセージのセットを行なっていましたが、そうなるとそれぞれの技で分岐を作る必要があります。それは保守性も悪く作業効率もよく有りませんので、攻撃トレイト内で共通処理ができるように、effectsではsetSaの返り値をそのまま返却します。

状態異常をセットする技の例として「どくのこな」を見てみましょう。

 

どくのこな(/Classes/Move/MovePoisonPowder.php)
/**
* 追加効果
*
* @param array $args
* @return array
*/
public function effects(...$args)
{
    /**
    * @param Pokemon $atk 攻撃ポケモン
    * @param Pokemon $def 防御ポケモン
    */
    list($atk, $def) = $args;
    // 相手をどく状態にする
    return $def->setSa('SaPoison');
}

 

これで、返り値をそのままトレイトへ返却することができるようになりました。

では、受取先のトレイトに分岐を追加しましょう。

 

攻撃用トレイト(/Traits/Service/Battle/ServiceBattleAttackTrait.php
// attackSuccessメソッド内
 
// 追加効果(相手にHPが残っていれば)
if($def_pokemon->getRemainingHp()){
    // 追加効果
    $effects = $this->effectMove($atk_pokemon, $def_pokemon, $move);
    // バトル終了
    if(isset($effects['end'])){
        $this->setMessage($effects['message']);
        $this->setEmptyMessage('battle-end');
        $this->setResponse(true, 'end');
        return;
 
--省略
 
/**
* 追加効果の処理
*
* @param Pokemon:object $atk
* @param Pokemon:object $def
* @param Move:object $move
* @return array
*/
private function effectMove($atk, $def, $move)
{
    $effects = $move->effects($atk, $def);
    // メッセージが取得できたらセット
    if(isset($effects['message']) && isset($effects['sa'])){
        // 状態異常有り
        $effect_id = issueMsgId();
        $sa = new $effects['sa'];
        setMessage($effects['message'], $effect_id);
        setResponse([
            'param' => json_encode([
                'name' => $sa->getName(),
                'color' => $sa->getColor()
            ]),
            'action' => 'sa',
            'target' => $def->getPosition()
        ], $effect_id);
    }elseif(isset($effects['message'])){
        // メッセージのみ返却
        setMessage($effects['message']);
    }
    // バトル終了
    if(isset($effects['end'])){
        setEmptyMessage('battle-end');
        setResponse(true, 'end');
        // バトル終了判定
        return $effects;
    }
}

 

effects後の記述量が多くなったため、effectMoveメソッド内にまとめました。

まず、effectMoveのメソッドにeffectsを呼び出すために必要な値を引数で渡し、effectsメソッドを呼び出します。配列または全くの空値が返ってくるため、issetを使ってsaとmessageの両方が返ってくれば、メッセージIDを生成してレスポンスと合わせて返却します。今回は新しくsaというactionを指定し、対象ポケモンをtargetにセット、状態異常の名称(name)と色(color)をjson形式でparamにセットしました。

 

ふきとばし等の技ではバトル終了処理が挟まれるため、effectMove後に再度配列をチェックし、endキーに値が存在していればバトル終了処理をして処理を終了させています。

 

状態異常のセット

それでは、演出をするフロント側(JavaScript)の処理を見ていきましょう。

 

バトル用メッセージJS/Public/Assets/js/Battle/message.js
/*----------------------------------------------------------
// 処理内で呼び出す関数
----------------------------------------------------------*/
/**
* メッセージアクション
* @param now element
* @return Promise
**/
var actionMsgBox = function(now){
    return new Promise( async (resolve, reject) => {
        // 最終メッセージかどうか確認
        if((now.length === 0) || now.hasClass('last-message')){
            await doLastMsg();
        }else{
            // メッセージにアクションがセットされていれば実行
            switch (now.data('action')){
                // ==============================================
                // HPバーの処理 =================================
                //
                case 'hpbar':
                await doAnimateHpBar(
                    now.data('target'),
                    now.data('param')
                );
                break;
                // ==============================================
                // 経験値バーの処理 =============================
                //
                case 'expbar':
                await doAnimateExpBar(
                    now.data('param')
                );
                break;
                // ==============================================
                // レベルアップ処理 =============================
                //
                case 'levelup':
                await doAnimateLevelUp(
                    now.data('param')
                );
                break;
                // ==============================================
                // 状態異常処理 =================================
                //
                case 'sa':
                await doAnimateSa(
                    now.data('target'),
                    now.data('param')
                );
                break;
                // ==============================================
            }
            // 次のメッセージへ
            await nextMsg(now);
        }
        resolve();
    });
}
 
// ==============================================
// 状態異常処理 =================================
//
/**
* 状態異常をセット
* @param json
* @return Promise
**/
var doAnimateSa = function (target, param){
    return new Promise ((resolve, reject) => {
        var badge = $('#sa-' + target);
        badge.removeClass("badge-");
        badge.addClass("badge-" + param.color);
        badge.text(param.name);
        resolve();
    });
}

 

分岐に状態異常を追加して、必要箇所にクラスとネームをセットする単純な処理です。状態異常エリアを判別するために、IDを割り振りました。

それでは、実際の動きを見てみましょう。

 

 

これで状態異常の演出処理は完了です。

 

まとめ

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

今回のPHPポケモンでは「状態異常演出」の方法をご紹介しました。

演出自体は些細なものですが、これを実現するために全体の構成を大きく変更しました。システム開発でも、たまにこういったことが起こり得ます。ですが、そうならないためにも事前に要件定義をしっかり立てて、設計していくことが作業負担の軽減に繋がります

 

システムエンジニアを目指している方や、WEBプログラミングに興味がある方は、ぜひ参考にしてみてくださいね。

 

注目の記事

レベニューシェアとは?利益報酬・共同事業に潜む罠
フリーランス
レベニューシェアとは?利益報酬・共同事業に潜む罠

  レベニューシェアという言葉を聞いたことがありますか?   ビジネスの世界にいる人なら、意味は知らなくてもやったことがある方が意外と多いはずです。特にフリーランスの人や、プログラミングやデザインといったスキルを持っている人はレベニューシェアでは重宝されるため多い傾向があります。ここ最近...

HTMLの基本設計「よくわかるSEO対策」構造化(マークアップ)編
SEO対策
HTML,SEO,マークアップ
HTMLの基本設計「よくわかるSEO対策」構造化(マークアップ)編

  HTML5がリリースされて随分経ちました。 それにより多くのタグが増え、それにより今までデザインを目的と使用されていたものが「構造化」という本来の役割を持たされるようになりました。    構造化は、目に見えにくい部分です   それぞれの役割を理解していなければ、せっかくきれいなサ...

【Laravel7】既存makeテンプレートのカスタマイズ Requestサンプル有り
プログラミング
Laravel,Linux,PHP
【Laravel7】既存makeテンプレートのカスタマイズ Requestサンプル有り

  Laravel7では新しい機能が様々導入されており、Webアプリケーションの開発がよりスムーズなものとなってきています。その中でも、もどかしい場所へ手を届いたと感じさせてくれたのが、既存makeコマンドのstubを簡単にカスタマイズできるようになったことです。   今回は既存make用stubの取得コマンドと、リ...

人員配置計算機〜放課後等デイサービス・児童発達支援〜
プログラミング
JavaScript,児童デイ,児童発達支援,放課後等デイサービス,福祉,計算機
人員配置計算機〜放課後等デイサービス・児童発達支援〜

最近はずっとPHPポケモン開発にかかりっきりでしたが、そろそろ「役立つもの」を作りたくなったので、思いつきで作ってみました。 もちろん「汎用性」のあるものは、既に世の中に存在しているため、ありそうでなさそうなニッチなものを攻めてみます。   そんな中、今回挑んだのは「人員配置計算機」です。 ※実際に...

非公開ディレクトリ画像表示編 PHPポケモン 91
プログラミング
PHP,PHPポケモン,ポケモン
非公開ディレクトリ画像表示編 PHPポケモン 91

非公開ディレクトリの画像を表示する 今回は、β版に向けての取り組みの1つとして、表示させる画像のアクセス先を非公開ディレクトリに変更します。 現在は公開ディレクトリ(Public)内のAssetsフォルダ内に配置していますが、これをルート直下においているStorageに移動させるのが目的となります。   gifのbas...

バトルステータス可視化編 PHPポケモン 70
プログラミング
PHP,PHPポケモン,ポケモン
バトルステータス可視化編 PHPポケモン 70

バトルステータスの可視化 現在のポケモンでは、バトルステータスの現状を可視化できるようになっており、どれぐらいのランク補正がかかっているか、フィールドがどういう状態になっているかがわかるようになっています。 初代、第2世代等では確認できなかった内容ではありますが、システムとしては便利な要素でも...

PHPポケモン「バトルシステム実装編〜ランク補正〜」22
プログラミング
PHP,PHPポケモン,ポケモン
PHPポケモン「バトルシステム実装編〜ランク補正〜」22

ランク補正とは  ポケモンでは通常ステータスとは違い、バトル中にのみ変化するステータスが存在します。初代仕様であれば、「なきごえ」や「かたくなる」といった変化技により「こうげき」や「ぼうぎょ」の強化や弱体化をさせるものです。これはバトル中であれば引き継がれるものですが、交代やバトルが終了すればリ...

YouTuber・ブロガー必見!知る人ぞ知るサムネイルの重要性とは
デザイン
Facebook,Instagram,Twitter,YouTuber,サムネイル,ブロガー
YouTuber・ブロガー必見!知る人ぞ知るサムネイルの重要性とは

  サムネイルって本当に重要? ブログの場合はフリー画像でもいいんじゃない?   そう考えている人はいませんか? 残念ですが、それは大きな間違いです。サムネイルを作り込むことは非常に重要であり、集客ポイントを拡大させるのはもちろん、ブランディングにもつながるのです。   今回は「知る人ぞ...

カテゴリ

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 独立 神戸 福祉 秘密鍵 翻訳 自己啓発 英語 見積書 計算機 読書 起業 迷惑メール 配列 銀の弾丸 集客 雑学力