1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

コラボフローAdvent Calendar 2023

Day 23

【コラボフロー】経緯を残す(テトリス申請編)

Last updated at Posted at 2023-12-23

コラボフロー Advent Calendar 2023 の23日目の記事です。
昨年のAdvent Calendarでは、コラボフローでテトリス申請を作成しました。
今年はテトリス申請に機能を追加します!

結果の報告だけでなく、結果に至った経緯も大事、という場面ありますよね?
申請書に結果だけ記載しても、良し悪しの判断ができない、など。

テトリス申請でも判定時に申請者のプレイ状況を確認したい、
といったご要望の声が聞こえてきました(脳内で🤯)

ということで、JavaScriptカスタマイズで「リプレイ機能」を追加してみます!!

DEMO

リプレイ機能の完成イメージです。
プレイ後や判定/閲覧画面でクリックできる「▶️ REPLAY」ボタンを配置しました。
このボタンをクリックすると、ゲームオーバーになる状況が再生されます。

ac2023-3.gif
(リーゼント風??)

それでは主な改修内容を紹介していきます。

【1】 Excelで申請書レイアウトや配色を変更

今年は緑を基調にしてみました:christmas_tree:
昨年と同じ説明ですが、申請書のレイアウトをExcelで作成しているので、
Excelで編集してアップロードするだけで、簡単に画面デザインを変えられます :heart_eyes:

image.png

(参考:Excelフォームを作成する

【2】 ラベルパーツにボタンを配置

「▶️ REPLAY」ボタンを、ラベルパーツで配置しました。
ラベルパーツは、HTMLタグが使えるので密かに便利なパーツです!

申請書に画像をimgタグで埋め込んだり、入力ガイドなどへのリンクを
aタグで付けたり、JavaScript無しでも申請書に追加できるんです。

image.png

【3】 非表示パーツで履歴管理

リプレイ用のブロック位置情報を、非表示パーツに登録しました。
テキスト(一行)パーツは、見せたくない値を非表示にして隠すことができます。

以下はパーツを非表示にせず、位置情報の履歴をセットしていくイメージです。
ac2023-history.gif

parts.tbl_1.value[0].fidHistory.value = JSON.stringify(histories)

JSON.stringify()で構造体を、JSON形式の文字列にしてパーツへセットできます!
(参考:パーツのデータと状態の操作 - valueプロパティへの値設定

テキスト(一行)パーツに登録できる値は最大999文字ですが、
今回は数値配列の位置情報だけなのでJSON形式でも問題なく収まりました。
パーツに値を登録することで、判定/閲覧画面でもデータを取得できるようになります。

一つ注意点として、この値を判定画面のJavaScriptカスタマイズで取得した際は
「"(ダブルクォーテーション)」が「"」という文字に変換されていました:disappointed_relieved:
ですが以下のような置換処理を入れることで、構造体のオブジェクトに戻せました。

var historyValue = parts.tbl_1.value[0].fidHistory.value;
historyValue = historyValue.replaceAll('"', '"');
const histories = JSON.parse(historyValue);

【4】 ボタンのクリックイベント

idを付けておいた「▶️ REPLAY」ボタンに、クリックイベントを設定しました。

setReplayButton() {
    if (!this._replayButtonId) {
        return;
    }

    this.replayButton = document.querySelector(`#${this._replayButtonId}`);
    this.replayButton.disabled = false;
    this.replayButton.addEventListener('click', (event) => {
        event.preventDefault();
        this.replay();
    });
}

event.preventDefault();で、入力フォームがsubmitされないようにしています。

async replay() {
    const delay = 500;

    for (let rowIndex = 1; rowIndex <= this.rowLength; rowIndex++) {
        // ブロックの表示を書き換える処理
        // (省略)

        await this.wait(delay);
    }
}

async wait(delay) {
    await new Promise(resolve => setTimeout(resolve, delay));
}

リプレイ処理では、非表示パーツに登録したブロック位置情報をもとに、
プレイ画面用のテキストパーツの値を順に書き換えていきます。
wait()処理で間を開けて更新することで、アニメーションっぽく表現できました🎉

おわりに

結果には原因がある、を意識してみましたがいかがでしょうか。

以下リンクからzip形式のフォームと経路の情報をダウンロードし、
コラボフローでインポートするとテトリス風の申請書を利用できます♪
(追記:アレンジを加えたバージョンに差し替えました)

  1. [ テトリス風申請 ]のフォームと経路のzipファイルをダウンロードする
  2. フォームをインポートする
  3. 経路をインポートする

因みに、テトリスのブロックを積んで描く絵は「テトリスアート」と呼ばれますが、
上のDEMO画面内の横顔2つはチートで作りました:boom:
リプレイされるシーンが少ないから、ごまかせる...🫠

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?