[scratch-vm] pickメソッドで高度なスプライトの操作を制御する
※ 当ページには【広告/PR】を含む場合があります。
2021/03/02
vm内でrenderを使うときの問題点
vmでpickメソッドを使うときの問題点
/**
* Set logical size of the stage in Scratch units.
* @param {int} xLeft The left edge's x-coordinate. Scratch 2 uses -240.
* @param {int} xRight The right edge's x-coordinate. Scratch 2 uses 240.
* @param {int} yBottom The bottom edge's y-coordinate. Scratch 2 uses -180.
* @param {int} yTop The top edge's y-coordinate. Scratch 2 uses 180.
*/
setStageSize (xLeft, xRight, yBottom, yTop) {
this._xLeft = xLeft;
this._xRight = xRight;
this._yBottom = yBottom;
this._yTop = yTop;
// swap yBottom & yTop to fit Scratch convention of +y=up
this._projection = twgl.m4.ortho(xLeft, xRight, yBottom, yTop, -1, 1);
this._setNativeSize(Math.abs(xRight - xLeft), Math.abs(yBottom - yTop));
}
vmとrenderのステージサイズの違いを捉える
(0,0)
(240,180)
(x',y')
(x,y)
x' = x + 240
y' = -y + 180
簡単なpickメソッドの利用例
<svg width="50" height="50" version="1.1" viewBox="0 0 50 50" xmlns="http://www.w3.org/2000/svg">
<g fill="#00bb00">
<rect x=".32977" y=".32977" width="49.34" height="49.34" stroke="#de9700" stroke-linecap="round" stroke-linejoin="round" stroke-width=".65955"/>
<path d="m0 25.151h50" stroke="#000" stroke-width=".30238"/>
<path d="m25.15 0v50" stroke="#000" stroke-width=".3"/>
</g>
</svg>
//👇拡張機能のindex.jsのgetInfo関数
getInfo () {
return {
//...
blocks: [
//....
{
opcode: 'pick',
text: 'Pick from ([CX], [CY])',
blockType: BlockType.REPORTER,
arguments: {
CX: {
type: ArgumentType.NUMBER,
defaultValue: 0
},
CY: {
type: ArgumentType.NUMBER,
defaultValue: 0
}
}
},
//....
],
//...
};
}
//👇pickブロックの中身
pick(args, util) {
const cx_vm = Cast.toNumber(args.CX);
const cy_vm = Cast.toNumber(args.CY);
console.log(`${cx_vm}:${cy_vm}`);
let pickedId_;
const cx_rndr = _cx + 240;
const cy_rndr = - _cy + 180;
pickedId_ = this.runtime.renderer.pick(cx_rndr, cy_rndr);
console.log(`Detected a drawble#${pickedId_}`);
return pickedId_;
}
まとめ
記事を書いた人
ナンデモ系エンジニア
これからの"地方格差"なきプログラミング教育とは何かを考えながら、 地方密着型プログラミング学習関連テーマの記事を不定期で独自にブログ発信しています。
カテゴリー