プログラミング

忘れさせる技選択 前編(覚えるのを諦める) PHPポケモン 55

PHP PHPポケモン ポケモン
忘れさせる技選択 前編(覚えるのを諦める) PHPポケモン 55

忘れさせる技の選択

PHPポケモンでは技習得時に忘れさせる技の選択が出来ず、古いものから順番に消えていっていました。ですが、これでは主力技として使っているものが、覚えたくもない技に消されてしまうということが起こってしまいます。

実際のゲームでも、技を覚えようとした際に既に最大数の4枠が埋まっていれば、代わりに忘れさせる技を選ぶことができます。今回はその「忘れさせる技の選択」を実装していきましょう。

 

技習得時の分岐

まず、技習得時の分岐について考えてみましょう。

忘れさせる技を選択させる以上、強制的に技を置き換える処理は一旦中断させなければなりません。なので、技習得時の選択肢は以下の2つになります。 

  1. 新しい技を覚えるのを諦める
  2. 現在覚えている技を指定して忘れさせる

 

新しい技を覚えるのを諦める

まずは処理が簡単な方から実装していきます。「新しい技を覚えるのを諦める」のは、現在の技構成から変更する必要がありません。なので、レスポンスに対して処理を行わなければ現在の技構成を維持することが可能です。

 

まずは、レベルアップ処理時の技習得処理に処理を加えていきましょう。

 

ポケモンクラスのチェック用トレイト(/App/Traits/Class/Pokemon/ClassPokemonCheckTrait.php
/**
* 現在のレベルで覚えられる技があるか確認する処理
*
* @return void
*/
protected function checkMove()
{
    // レベルアップして覚えられる技があれば習得する
    $level_move_keys = array_keys(
        array_column($this->level_move, 0),
        $this->level
    );
    foreach($level_move_keys as $key){
        $move_class = $this->level_move[$key][1];
        // 覚えようとしている技(クラス)が存在かつ重複していないか
        if(!in_array($move_class, array_column($this->move, 'class'), true)){
            // インスタンス化
            $move = new $move_class;
            if(count($this->move) < 4){
                /**
                * 技が4つ未満なら即習得
                */
                // 技クラスをセット
                $this->setMove($move);
                $this->setMessage($move->getName().'を覚えた!');
            }else{
                /**
                * 技選択用モーダルの返却
                */
                // メッセージIDを生成
                $msg_id = $this->issueMsgId();
                // レベルアップメッセージ
                $this->setMessage($this->getNickName().'は'.$move->getName().'を覚えたい');
                $this->setMessage('しかし技を4つ覚えるので精一杯だ');
                $this->setMessage($move->getName().'の代わりに他の技を忘れさせますか?', $msg_id);
                // レスポンスデータをセット
                $this->setResponse([
                    'toggle' => 'modal',
                    'target' => '#'.$msg_id.'-modal',
                    'move' => $move_class
                ], $msg_id);
                // モーダル用のレスポンスをセット
                $this->setModal([
                    'id' => $msg_id,
                    'modal' => 'selectmove',
                    'move' => array_merge($this->getMove(), [[
                        'class' => $move,
                        'remaining' => $move->getPp(),
                        'correction' => 0,
                    ]]),
                ]);
                // 諦めメッセージを事前に用意しておく
                $this->setMessage($this->getNickName().'は'.$move->getName().'を覚えるのを諦めた');
            }
        }
    }
}

 

現在習得している技が4つ未満であれば、今まで通りの処理です。もし4つ以上だった場合は強制的に書き換えるのではなく、確認メッセージを返却するようにしています。

モーダルのパラメータ(move)には、現在覚えている技と、新しく覚えようとしている技を配列で返却しています。この時点では覚えている技は変わっておらず、あくまで新しい技はレスポンス(モーダル)に追加しただけになります。

 

また、諦めメッセージについてですが、こちらは技習得段階で用意しておきましょう。諦めるという選択をした際にJavaScriptで追加するよりも処理が簡単で、もし諦めなかった場合はその時点でフォームの送信が発生するためメッセージはそのまま破棄することができるからです。

 

次に、返却されたモーダルの作成です。

 

忘れさせる技の選択モーダル(/Resources/Partials/Battle/Modals/selectmove.php
<!-- Modal -->
<div class="modal fade" id="<?=$modal['id']?>-modal" tabindex="-1" role="dialog" aria-labelledby="<?=$modal['id']?>-modal-title" aria-hidden="true" data-keyboard="false" data-backdrop="static">
    <div class="modal-dialog modal-dialog-centered" role="document">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title" id="<?=$modal['id']?>-title">忘れさせる技を選ぶ</h5>
            </div>
            <div class="modal-body">
                <?php # 覚えている技 ?>
                <table class="table table-bordered table-sm table-hover">
                    <thead class="thead-light">
                        <tr>
                            <th scope="col">覚えている技</th>
                            <th scope="col">タイプ</th>
                            <th scope="col">PP</th>
                        </tr>
                    </thead>
                    <tbody>
                        <?php foreach($modal['move'] as $key => $move): ?>
                            <tr class="move-detail-link forget-selectmove <?php if($key === 4) echo 'active new-move'; ?>"
                                data-target="#<?=$modal['id']?>_<?=get_class($move['class'])?>-content"
                                data-name="<?=$move['class']->getName()?>"
                                data-num="<?=$key?>">
                                <th scope="row" class="w-50"><?=$move['class']->getName()?></th>
                                <td><?=$move['class']->getType()->getName()?></td>
                                <td><?=$move['remaining']?>/<?=$move['class']->getPp($move['correction'])?></td>
                            </tr>
                        <?php endforeach; ?>
                    </tbody>
                </table>
                <?php # 技説明 ?>
                <div class="overflow-auto p-3 border" style="height:160px;">
                    <?php foreach($modal['move'] as $key => $move): ?>
                        <div class="move-detail-content <?php if($key === 4) echo 'active'; ?>" id="<?=$modal['id']?>_<?=get_class($move['class'])?>-content">
                            <h6><?=$move['class']->getName()?></h6>
                            <hr>
                            <p><?=$move['class']->getDescription()?></p>
                        </div>
                    <?php endforeach; ?>
                </div>
            </div>
            <div class="modal-footer">
                <button type="button"
                class="btn btn-danger btn-sm"
                id="btn-forget-move"
                data-msg_id="<?=$modal['id']?>"
                style="display:none;">
                <span class="move-name"></span>を忘れる</button>
                <button type="button" class="btn btn-secondary btn-sm action-message-box" id="btn-abandon-move" data-dismiss="modal">
                    <?=$modal['move'][4]['class']->getName()?>を諦める
                </button>
            </div>
        </div>
    </div>
</div>

 

ホーム画面用の技詳細と同じテーブルを使用しました。忘れさせる手順は、テーブルから技を選択して、決定ボタンを押すという流れです。技を忘れさせる場合は別のボタンを用意し、モーダルを閉じるだけの処理を行います。

もし「忘れさせる」ボタンを押せば、そこで必要データをPOSTして処理を行います。諦める場合は、そのままモーダルを閉じることで、事前に用意した諦めメッセージが表示されます。

 

それでは、技習得時の流れを確認してみましょう。

 

  

問題なくモーダルが表示されました。技選択を諦める場合はモーダルをそのまま閉じて処理を進行させているだけなので、レベルアップ後のステータス表示処理とさほど変わりませんね。

これで、技選択の分岐1が完成です。

 

まとめ

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

今回のPHPポケモンは「技を忘れさせる(諦める)」の処理作成についてご紹介しました。

いろんな処理を作成しましたが、処理途中で分岐が入るのがWEBプログラミング(PHP)にとってはそこそこ厄介だということが、後編を見ればわかるはずです。ですが、実現できないわけではありません。

それでは、後編を乞うご期待ください。

 

注目の記事

PHPポケモン「バトルシステム実装編〜ダメージ計算〜」20
プログラミング
PHP,PHPポケモン,ポケモン
PHPポケモン「バトルシステム実装編〜ダメージ計算〜」20

バトルシステムの実装  今回はバトルシステムの中でもメインとなるダメージ計算と、命中判定の部分を実装していきます。   ダメージ計算  ポケモンのダメージ計算は初代から現在までそこまで大きな変化はありません。最新世代ではダメージに関係する要素(アイテム等)が多く、それにより補正値の修正はあります...

OSI参照モデルとTCP/IP 〜ネットワークモデルとは〜【第3回 ド素人のためのネットワーク講座】
ネットワーク
OSI参照モデル,TCP/IP,ネットワークモデル,プロトコル
OSI参照モデルとTCP/IP 〜ネットワークモデルとは〜【第3回 ド素人のためのネットワーク講座】

  ド素人のためのネットワーク講座! 栄えある第3回は「ネットワークモデル」についてです。   横文字や英字が多くなってきたり、歴史的経緯が関係してきたりとややこしくなってくる部分ですが、ネットワークを理解するためには押さえておきたいポイントです。   プログラミングやシステムエンジニアとし...

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

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

へんしん編 PHPポケモン 74
プログラミング
PHP,PHPポケモン,ポケモン
へんしん編 PHPポケモン 74

へんしんとは 今回はサムネイルに合わせて、特別技の1つ「へんしん」を実装します。  へんしん https://wiki.ポケモン.com/wiki/へんしん   へんしんを使うことで、相手ポケモンをコピーすることができますが、その全てをコピーするわけではありません。コピーできる項目とそうでない項目は以下の通りで...

お金を生む仕組みを理解しよう【知っておきたい3つのポイント】
マーケティング
お金を生む仕組みを理解しよう【知っておきたい3つのポイント】

  どんなビジネスが儲かるのか・・・   一度はこういった悩みを持ったことがあるのではないでしょうか。 それを知るためには、どういった要素がお金を生むために作用しているのかを理解しておく必要があります。 今回は「お金を生む仕組み」について、知っておいてためになる基礎的な部分をわかりやすく...

フリーランスのための値段交渉術!案件はこうやって見極めろ
フリーランス
フリーランスのための値段交渉術!案件はこうやって見極めろ

  「これもっと安くならない?」 「他の人はこれぐらいの金額でやってくれるよ」   こういった値切り交渉を受けたことがある人もいるのではないでしょうか?技術を提供するフリーランスであれば、金額を落とすということは自分の価値を下げているということを理解しておかなければなりません。 値段交渉...

進化アニメーション 前編 PHPポケモン 59
プログラミング
PHP,PHPポケモン,ポケモン
進化アニメーション 前編 PHPポケモン 59

進化アニメーションの実装 今回は後回しにしていた進化アニメーションの作り込みをしていきます。今までもレベルに達すれば進化はしていましたが、その演出はありませんでした。また、ポケモンではBボタンを押すことで進化のキャンセルをすることができます。なので、この辺りも実際のゲームを再現していきましょう。...

【無料】早起きをして神戸へ行こう!「為になる雑談朝活」
イベント
三宮,朝活,神戸
【無料】早起きをして神戸へ行こう!「為になる雑談朝活」

  朝活を実施することになりましたので、その目的な概要をまとめました。 神戸三宮での開催を予定しておりますので、もしお近くにお住まいの方で日時が会いましたらご参加ください。 土日祝辺りで週1日程度の不定期開催を予定しています。学びにつながる、けど参加しやすい雑談形式ということを主としています...

カテゴリ

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