[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
私の実家は新潟にあるのだが、ここに帰省してきた。東京から日帰りで。
実家の話をしてもしょうがないのでいくつか美味しかったものを共有する。
とりあえず次男が楽しそうだったので良し。東京じゃあまり見られないような大きなバッタやトンボも見られたし。
TRPGオンセ界隈交流会(2019/09) https://t.co/Cu0kTMOVVm
— HillTop@プロット4 (@HillTop_TRPG) June 30, 2019
これに出席してきました。
開発やサーバ管理などに関するいくつかのノウハウの共有や、如何にしてモチベーションを維持するか等の話をのんのんと。Discord のチャットを IRC に、IRC の発言内容を Discord に転送することでバックアップなどの意味を持たせるという話はかなり興味深かった。GitHub - reactiflux/discord-irc
その他各々が何故今携わっているタスクを始めたのか経緯共有など。それぞれ全然違う経緯で始めているのも興味深い所。
この手のは今後もちょこちょこ参加していきたいなぁ。
<div style="position: relative; height: 200px; width: 200px; background-color: white; border: 3px double black; border-radius: 100px;">
<div style="position: absolute; left: 100px; top: 100px; width: 100px; border-top: 1px hsl(0,60%, 50%) solid; transform-origin: left top;"></div>
<div style="position: absolute; left: 100px; top: 100px; width: 100px; border-top: 1px hsl(45,60%, 50%) solid; transform-origin: left top; transform: rotate(45deg);"></div>
<div style="position: absolute; left: 100px; top: 100px; width: 100px; border-top: 1px hsl(90,60%, 50%) solid; transform-origin: left top; transform: rotate(90deg);"></div>
<div style="position: absolute; left: 100px; top: 100px; width: 100px; border-top: 1px hsl(135,60%, 50%) solid; transform-origin: left top; transform: rotate(135deg);"></div>
<div style="position: absolute; left: 100px; top: 100px; width: 100px; border-top: 1px hsl(180,60%, 50%) solid; transform-origin: left top; transform: rotate(180deg);"></div>
<div style="position: absolute; left: 100px; top: 100px; width: 100px; border-top: 1px hsl(225,60%, 50%) solid; transform-origin: left top; transform: rotate(225deg);"></div>
<div style="position: absolute; left: 100px; top: 100px; width: 100px; border-top: 1px hsl(270,60%, 50%) solid; transform-origin: left top; transform: rotate(270deg);"></div>
<div style="position: absolute; left: 100px; top: 100px; width: 100px; border-top: 1px hsl(315,60%, 50%) solid; transform-origin: left top; transform: rotate(315deg);"></div>
</div>
線は border-top:1px black solid; 等として描く。width を使って長さをコントロールしている。別に hr でやってもいいのかもしれない。
CSS の transform の値に rotate を使えば要素を回転させられるので、これで線の向きをコントロールしている。ただし、回転の際に基準となる点はそのままだと要素の中央なので、これを transform-origin: left top; で左上にしている。
だいぶ邪道な気がするが、こんなやり方もできたよ、という例。また、点A から 点B という指定もできず、「点A からどの方向に長さいくつの」という指定しかできないのも難点。計算が必要となる。
この手の事やりかたかったら canvas や svg 使った方が楽。
やることとしては以下。
適当な要素を使ってメニューっぽい html を作る。とりあえずは何もしなくても表示しぱなっしにしておけばよい。
イベントハンドリング -vue.js にある通り、右クリックへのイベントバインドは簡単である。@click.right="onRightClick" で終わり。イベントのトリガーの詳細を . で繋いで記載できるのは楽であることだなぁ。
そう難しい話ではなく、preventDefault() (説明) すればいい話である。
methods: {
onRightClick: function(e){
// 処理
event.preventDefault();
}
}
しかし、そんなことをしなくてもイベントのバインドの際に .prevent を付けてやれば vue が勝手にやってくれる (紹介)。
イベントの pageX, pageY や offsetX, offsetY を利用して表示位置を計算し、最初に作った右クリックメニューとなる要素をそこに移動させる。右クリックメニューとなる要素の CSS の position を absolute とかにしておき、CSS の left, top をいじって位置を設定する。なんか上手くいかなかったら適当に計算していい感じの位置にする。
最初に作った要素に v-show (説明) を設定し、右クリックされた直後は表示し、メニューの外やメニューのいずれかの項目をクリックした際に消すように設定する。
キャラクターの位置関係をなんか厳密に管理するツールが欲しい、と思い書いてみたのがこんな感じのツールである。
機能として以下のようなものをつけている。
また、キャラクターの追加・削除や名前・色の変更も可能。位置の移動はキャラクターをドラッグ/ドロップで実施。