【RPGツクールMZ】描画領域(canvas要素)をdiv要素でラップする
あらすじ
RPGツクールMZを買うや否やソースコードを読み始めた砂糖は、思いつきでプラグイン開発に着手するのだった。
概要
ゲーム画面のcanvas
要素をdiv
要素でラップするプラグインを作成する。
これにより、div
要素の大きさを変更することでゲーム画面の大きさを調節できる。
思いついた使用例
- 画面サイズをやや小さくして枠をつける(スーパーゲームボーイの枠のようなもの)
- ゲーム画面にCSS要素で影をつけてお洒落っぽくする
- 室内の絵を作成して、その絵のディスプレイ部分にゲーム画面をはめ込み合成
環境
RPGMZ 1.0.2
既存ソースコードの調査
修正箇所にアタリをつけるために、既存ソースコードの調査を行う。
canvas
要素の作成と追加
Graphics._createCanvas
「createElement("canvas")
」でプロジェクト内検索をしたらヒット。ここでcanvas
要素の作成と追加を行なっている。
表示サイズの変更
Graphics._setupEventHandlers
「resize
」でプロジェクト内検索をしたらヒット。Graphics._onWindowResize
をイベントリスナーに登録している。
Graphics._onWindowResize
Graphics._setupEventHandlers
で登録した、リサイズ時に呼び出されるメソッド。Graphics._updateAllElements
への中継点。
Graphics._updateAllElements
Graphics._onWindowResize
から呼び出される、Graphics._updateRealScale
への中継点。
Graphics._updateRealScale
Graphics._updateAllElements
から呼び出される。canvas
要素の拡大率を計算している。
document
とwindow
って何が違うの?🤔(Graphics._updateRealScale
から呼び出されるGraphics._stretchWidth
とGraphics._stretchHeight
について)
次のページが参考になった。
- ウィンドウサイズとスクローリング(現代の JavaScript チュートリアル)
モバイルデバイスの場合はスクロールバーを含めた大きさ、それ以外の場合はウィンドウの大きさを取得している。
実装
Graphics._createCanvas
body
>canvas
の構造になっているものを、body
>div
>canvas
になるよう変更する。
Graphics._stretchWidth
body
要素の横幅を返していたものを、div
要素の横幅を返すよう変更する。
Graphics._stretchHeight
body
要素の縦幅を返していたものを、div
要素の縦幅を返すよう変更する。
その他
ラップするdiv
要素のIDが競合する可能性もあるので、IDはパラメータから設定できるようにする。
完成品
WrapCanvas.js
js/plugins
ディレクトリに次の内容のファイルを作成する。
/*:
* @target MZ
* @plugindesc canvas要素をdiv要素でラップします。
* @author 氷砂糖
*
* @help WrapCanvas.js(試作バージョン)
*
* @param wrapId
* @text div要素のID
* @desc canvas要素をラップするdiv要素のIDを指定します。
* @type string
* @default wrapGameCanvas
*/
(() => {
'use strict'
const parameters = PluginManager.parameters('WrapCanvas')
const { wrapId } = parameters
Graphics._stretchWidth = function () {
const wrapperDiv = document.querySelector(`#${wrapId}`)
return wrapperDiv.clientWidth
}
Graphics._stretchHeight = function () {
const wrapperDiv = document.querySelector(`#${wrapId}`)
return wrapperDiv.clientHeight
}
Graphics._createCanvas = function () {
this._canvas = document.createElement('canvas')
this._canvas.id = 'gameCanvas'
const wrapperDiv = document.createElement('div')
wrapperDiv.id = wrapId
wrapperDiv.style.position = 'relative'
wrapperDiv.appendChild(this._canvas)
this._updateCanvas()
document.body.appendChild(wrapperDiv)
}
})()
game.custom.css
(ファイル名は任意)
css
ディレクトリに次の内容のファイルを作成する。
body {
margin: 0;
}
#wrapGameCanvas {
width: 100vw;
height: 100vh;
}
index.html
- CSSファイルの読み込みを追加する。
あとがき
初めてのプラグイン開発が思いのほか面白かったので、また何か作ってみたいと思った🤔
Discussion