プログラミング

状態異常演出編 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プログラミングに興味がある方は、ぜひ参考にしてみてくださいね。

 

注目の記事

熟練者ほど実践するプログラミングが上達する3つの法則
プログラミング
PHP
熟練者ほど実践するプログラミングが上達する3つの法則

  「なかなかプログラミングが上達しない・・・」 「やったことはあるけど覚えられない」   プログラミングを習得しても、勉強と一緒で使っていなければ忘れてしまいます。また、どんどん上達する人や、長い間プログラミングの技術で生計を立てているような熟練者は、日頃からの取り組み方自体が違ってい...

進化の石編(構成) PHPポケモン 102
プログラミング
PHP,PHPポケモン,ポケモン
進化の石編(構成) PHPポケモン 102

進化の石 ピカチュウさんもそろそろ進化したがっているので、β版の公開に向けて進化の石を実装していきます。しかし、イーブイなど特別な進化先や条件を持ったポケモンを考慮すると、少し実装が手間取りそうだったので、今回は構成部分のみのまとめとなっておりますので、ご了承ください。   アイテムクラスの作...

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

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

フリーランスなら心がけておきたい3つのルール【仕事と遊びは両立させろ】
フリーランス
フリーランス,独立
フリーランスなら心がけておきたい3つのルール【仕事と遊びは両立させろ】

  フリーランスになっても不安がいっぱい   会社というものに縛られないというのは楽なイメージがありますが、それ相応の不安がついてまわります。 その結果、会社員へと舞い戻ってしまうと再度そこから抜け出すことは非常に困難です。   今回は、現在活動している人や、これから独立しようとしている...

フリーランスの仕事の取り方教えます!この3つを押さえておけばOKです【企業も応用可】
フリーランス
フリーランス,独立,起業
フリーランスの仕事の取り方教えます!この3つを押さえておけばOKです【企業も応用可】

  仕事ってどうやってとればいいの?   独立したい、起業したいと考えている人の多くが、仕事はどうやってとればいいのかと悩んで足踏みしています。 実は、基本的な3つのポイントさえ知っていれば、継続して仕事を受注することは簡単です。 今回は自分が実際にやっていることを例に「フリーランスなら...

PHPポケモン「オートロード編(修正版)」17 おまけ:日本語化
プログラミング
PHP,PHPポケモン,ポケモン
PHPポケモン「オートロード編(修正版)」17 おまけ:日本語化

  前回実装したオートローダーの使い方が盛大に間違っていたので、今回その間違いの説明をしながら、正しい実装方法をご紹介します。 申し訳ありません。(誠意)    オートロードについて(再)  必要なタイミングで必要なファイルをrequireまたはincludeするあれです。   前回spl_autoload_reg...

ネコにこばん編 PHPポケモン73
プログラミング
PHP,PHPポケモン,ポケモン
ネコにこばん編 PHPポケモン73

ネコにこばんとは 初代ポケモンでは、基本的にトレーナーとのバトルでしかお金を増やすことができず、もし手持ち金が0円の状態で金が必要なイベントが発生すると詰んでしまうという隠された落とし穴がありました。 ですが、初代でも唯一トレーナー意外からお金を得る方法があります。それが「ネコにこばん」という...

パーティーの並び替え編 PHPポケモン 82
プログラミング
PHP,PHPポケモン,ポケモン
パーティーの並び替え編 PHPポケモン 82

パーティーの並び替え ポケモンをバトルに選出する際に欠かせないのが「パーティーの並び替え」です。パーティーの先頭(ひんし状態でない)がポケモンでは自動的に選択されるため、戦闘前に並び替えをしておく必要があります。 ゲーム上では簡単に見える処理ですが、これがPHPで行うとなれば少し厄介な問題が出てき...

カテゴリ

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