プログラミング

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

プログラミングとは?現役システムエンジニアが教える裏事情
プログラミング
システムエンジニア,プログラマー
プログラミングとは?現役システムエンジニアが教える裏事情

  プログラミングってよくわからない? 実際に何をやっているの?   最近注目されているSE(システムエンジニア)やPG(プログラマー)という職業ですが、「そもそもプログラミングとは?」といった疑問を抱えている方も多いですね。 今回は、そういった方へ向けて「プログラミングの基礎知識と裏事情」...

ひとのものをとったらどろぼう!編 PHPポケモン 99
プログラミング
PHP,PHPポケモン,ポケモン
ひとのものをとったらどろぼう!編 PHPポケモン 99

ひとの ものを とったら どろぼう! ポケモンの中でも有名なセリフの1つです。モンスターボールを投げることでポケモンを捕まえることができますが、既に別トレーナーが所有しているポケモンを捕まえることはできません。 初代から、トレーナー戦でモンスターボールを投げると「ひとの ものを とったら どろぼう!...

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

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

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

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

PHPポケモン「バトルシステム実装編〜補正値計算・乱数・急所〜」21
プログラミング
PHP,PHPポケモン,ポケモン
PHPポケモン「バトルシステム実装編〜補正値計算・乱数・急所〜」21

バトルシステムの実装  今回は「急所」と「乱数」と「タイプ一致」の判定と補正を実装していきます。 ちなみにですが、ポケモンwikiを熟読したところ、補正値の計算にも順番があり、計算後に小数点の切り捨てや五捨五超入をするなど、そこそこ複雑な計算順序がありましたが、今回はそこまで精密に再現せず、補正値(...

ポケモンプロパティ編(全国図鑑No・捕捉率・重さ) PHPポケモン 77
プログラミング
PHP,PHPポケモン,ポケモン
ポケモンプロパティ編(全国図鑑No・捕捉率・重さ) PHPポケモン 77

PHPポケモン記事も記念すべき第77回を迎えることができ、これもひとえに皆様のお力があってのことです。いろんな方のご協力もあり(ドット絵とかドット絵とかドット絵とか)見た目はかなりゲームらしくなってきました。 しかし、肝心のゲーム要素が本家と比べればまだまだ機能も少なく未実装の項目も多いので、これ...

スキル習得で挫折しないための3ステップ
雑記
デザイン,ブログ,プログラミング
スキル習得で挫折しないための3ステップ

  せっかく高い教材を買ったのに、気づいたら積んでしまっている・・・   そんな悩み、あなたには有りませんか? 今回は、そんな方のための勉強方法をテーマに説明していきます。 正しい勉強方法を身に着けていれば、どういったメリットがあるのでしょうか? 三日坊主になりにくい いざという...

カテゴリ

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