石橋を叩いて壊すブログ

絵画や額縁のスポーンと向きの変更について調べてみた

絵画(Painting)や額縁(ItemFrame)といった壁掛けアイテムは、Hanging(=吊るす・壁掛け等の意味)インターフェースを実装している。
モンスターや動物などと異なり、壁掛けアイテムは壁が無いところにはスポーンできない。
また、向きなどに制約がある。その辺を調べてみた。

この記事では絵画を中心に記載するが、額縁も同様である。

まず、絵画をスポーンさせるには以下のようにする。
今回は、手に骨を持ってブロックを右クリックすると、そこに絵画がスポーンするようにした。

/**
 * プレイヤーがクリックしたときに呼ばれる
 */
@EventHandler
public void onPlayerInteractEvent(PlayerInteractEvent e){

	//ブロックを右クリックしたのか
	if(e.getAction().equals(Action.RIGHT_CLICK_BLOCK)){

		//手に持っているのは骨か
		if(e.getPlayer().getItemInHand().getType() == Material.BONE){

			//クリックされたブロックの座標を取得
			Location loc=e.getClickedBlock().getLocation();

			//クリックされたブロックに絵画を貼り付ける
			loc.getWorld().spawnEntity(loc,EntityType.PAINTING);
		}
	}
}


ゲームを起動して木のブロックを骨で右クリックしたところ。ブロックの左側面に絵画が貼り付けられた。

ここで重要なのは、絵画をスポーンするには、spawnEntityメソッドの第1引数には絵画をかける固体ブロックの座標を与えなければならないことである。
もし動物を固体ブロックと同一座標にスポーンさせたら、(大きさにもよるが)動物はきっとブロックに埋まって窒息してしまうだろう。
このため、動物をスポーンさせるなら通常は空気ブロックの座標を指定する。
しかし壁掛けアイテムだけは例外で、空気ブロックの座標を指定するとスポーンしない。Exceptionも起こらないので問題が発覚しづらい。
固体ブロックの座標を指定するとスポーンする。このことを忘れないようにしよう。

絵画は、向きを指定してスポーンさせることができない。
絵画は指定したブロックの側面にスポーンするが、その向きは東→北→西→南の順に優先順位が決まっている。

このため、ブロックの東側面が空いていれば、絵画は常に東向きにスポーンする。
東側面が空いていない場合は、2番目の優先順位である北側面を確認し、空いていれば北向きにスポーンする。
以後同様に西向きと南向きがチェックされ、どの向きも空いていない場合は、絵画はスポーンしない。Exceptionも発生しない。



中央の木ブロックに絵画をスポーンさせる例。
1枚目の画像では、4方向すべてが空いているので、最も優先順位が高い東の向きに絵画がスポーンする。
東側面が埋まっている場合は、北向きの絵画がスポーンする。
以後同様に、西向き、南向きとなり、どのスペースも埋まっていると絵画はスポーンしない。

絵画の向きを変えたい場合は、以下のようにすればよい。
ここでは、リンゴを手に持って絵画を右クリックすると、絵画が回転するようにした。

/**
 * プレイヤーがエンティティを右クリックしたときに呼ばれる
 */
@EventHandler
public void onEvent(PlayerInteractEntityEvent e){

	//手に持っているのはリンゴか
	if(e.getPlayer().getItemInHand().getType() == Material.APPLE){

		//絵画を右クリックしたのか
		if(e.getRightClicked().getType() == EntityType.PAINTING){

			//絵画を南向きにする
			((Hanging) e.getRightClicked()).setFacingDirection(BlockFace.SOUTH);
		}
	}
}


絵画を右クリックしたところ。 北向きの絵画が、南向きに変化している。
絵画の設置時と異なり、今回は壁を中心とした回転ではなく、絵画自体が回転しているのが分かる。

絵画の設置時は、絵画は掛けられた固体ブロックを中心として向きを変えていた。
しかし絵画の向きの変更時は、絵画自体があるブロックを中心として向きが変わる。
うーん、ややこしいことこの上ない話である。

なお、絵画は東西南北の4方向しか向かないので、斜めや上下などを向かせることはできない。
また、絵画を回転させたとき、その向きに絵画を掛けられるブロックがない場合、回転は失敗し何も起こらない。やっぱりExceptionも起こらない。
(例えば上記画像で、ピンク色の羊毛ブロックが無かったら、回転させても絵画を掛ける壁がないので回転が失敗する。)


回転できないはずなのに、どういうわけか無理やり回転してしまう場合もある。
絵画を繰り返し回転させるようなコードを書く場合は、十分に注意しないと絵画がどっか他所へ行ってしまう可能性もある。

絵画を別の場所に移動する方法は分からなかった。移動させようとするとアイテム化してしまう。
移動は既存絵画の撤去と新規絵画の設置で対応するしかなさそうだ。

絵画の差し替えについては後日書く。

この記事を評価

11 6

コメント

  1. 【スチーブ】 お久しぶりです。この記事とは全く関連性の無いお話で申し訳無いのですが、マインクラフトPS3にてレッドストーンブロックが見当たらなくて···マインクラフトPS3にはレッドストーンブロックは無いのでしょうか?
    長文すみませんm(_ _)m [2014/8/22 07:14]
  2. 【石橋】 びっくりするほど関係ないな。調べてみたけどないんじゃないの。 [2014/8/22 21:27]
  3. 【ゲスト】 getType() == (ry ではなくgetType().equals(Material)の方がいいんじゃないですか? [2014/9/18 18:18]
  4. 【石橋】 Enum型は==比較で大丈夫らしいよ→http://www.ne.jp/asahi/hishidama/home/tech/java/enum.html#h2_usage 。まあ、大丈夫か否かと良いか悪いかは別の気もするけど、自分はたぶんこれで良いかなと。このサイトは面白くていろいろためになる。 [2014/9/18 21:57]

【この記事にコメント】
お名前:
コメント:

295,354

記事カテゴリー

最近の記事

  1. FF14を翻訳したら国によって結構特色が違った[12/11]
  2. ゼロから始めるFactorioの回路構築(実践例編)[7/24]
  3. ゼロから始めるFactorioの回路構築(条件回路・論理演算編)[7/24]
  4. ゼロから始めるFactorioの回路構築(定数回路・算術回路編)[7/24]
  5. ゼロから始めるFactorioの回路構築(入力・出力・混合編)[7/24]

RSS1.0 RSS2.0

最近のコメント

  1. おー、お役に立てたようでなによりです。再起…[9/11]
  2. この記事が非常の役立ちました。おかげさまで…[9/9]
  3. 1.14.2のAPIで試しましたが、MapInitializeEv…[9/9]
  4. 天晴れ!押したらポーションのモヤモヤでまし…[5/26]
  5. 習うより慣れろって感じで。この記事は記事冒…[4/7]

記事を検索


管理人

石橋

パソコンデスクは座椅子