目次
明るさを取得するAPI
ほぼ私的なメモです。SpongeAPIでは明るさの概念がちょっと難しいです。
なお、ざっくり読んで貰えればわかりますが、太陽の光の強さを示す値を取る手段が無いので、ここに記載の内容だけで明るさを結論づけることは出来ません。
Location<world>やBlockSnapshotから取得可能。明るさレベルは0~15で、値が小さい程暗い。double型として取得できる値については小数点以下を見たことが無いので、基本的には整数で判断でいいと思う。
ちなみにどの値もブロック破壊時に取得に失敗することがある(API5時点)。値を繰り返し取得し直せば大丈夫みたいなので不具合?
基本的には以下の三種類。
GroundLuminanceProperty
反射光の様な物。たいまつなどの光が当たって輝く値だと思う。自然の光は反映されないので、近くにたいまつなどの光源が無い場合は周辺が明るくてもゼロになる。どうもBlockSnapshotからは取れなく、Location<world>で取得可能な模様。
double d = loc.getProperty(GroundLuminanceProperty.class).get().getValue();
SkyLuminanceProperty
環境光の様に思えるが、太陽やたいまつなどの光の影響を一切受けない。地下程暗い(低い)値を示す。太陽の有無も無関係なので、開けた野外なら夜でも明るい(高い)値になる。BlockSnapshotからは取れなく、Location<world>で取得可能な模様。
double d = loc.getProperty(SkyLuminanceProperty.class).get().getValue();
LightEmissionProperty
ブロック自体の自己発光度合いを示す値。たいまつやグロウストーンなど。自己発光しないブロックは常にゼロ。
※光源を破壊した際のChangeBlockEvent.Breakでは、その場所(Location<world>)の値は常にゼロになることに注意。getOriginal()で取得したBlockSnapshotをチェックすること。
@Listener public void onBreak( ChangeBlockEvent.Break event ){ BlockSnapshot bs = event.getTransactions().get(0).getOriginal(); int d = bs.getProperty(LightEmissionProperty.class).get().getValue(); }
その他、検証結果
- 上記にも記載をしているが、GroundLuminanceProperty、SkyLuminancePropertyはLocation<World>のプロパティから取得できるが、Block系(BlockSnapshot/BlockStateなど)からは取得できない。
- 逆に、LightEmissionPropertyはBlockSnapshotのプロパティから取得できる。
- ただ、どのような条件でもAirブロックからは値を取得出来ない模様。
- BlockStateに面(Direction)のpropertyを取得できるメソッドがあるが、ここから各明るさのプロパティを取得することができない。
コメントを残す