Işın izleme
Genel olarak ışın izleme koordine sistem yoluyla parçacık yolunu belirlemenin bir yöntemidir. SpongeAPI’de bu, alanda gelişigüzel bir sıra yolundaki engelleri keşfetmek için the BlockRay sınıfıyla uygulanır. Yaygın kullanım sorunu bir :javadoc:`Player`ın baktığı engeli bulmak olur.
Işınımın kaynağını Location, Extent ve “Vector3d” ya da bir Entity teriminden geçirerek “BlockRay#from’’ yöntemini kullanarak belirtebilirsiniz. Yöntem, bir BlockRay.BlockRayBuilder döndürecektir.
Tüyo
Eğer Entity
olacak ışının kaynağını belirtirseniz, varsayılan yönü ``Entity``nin işaret ettiği yön olacaktır.
To specify the end point, you can use the BlockRay.BlockRayBuilder#to(Vector3d) method, which will set both the direction and ending location. Alternatively, you can specify a direction using BlockRay.BlockRayBuilder#direction(Vector3d) and also a distance limit using BlockRay.BlockRayBuilder#distanceLimit(double).
Not
The default distance limit is 1000 blocks as a safeguard to prevent infinite iteration. To disable the distance
limit, use a negative value with BlockRayBuilder#distanceLimit(double)
.
Filtreleme
Filters determine what blocks are accepted by the BlockRay
. To add a filter, use the BlockRayBuilder#stopFilter
or BlockRayBuilder#skipFilter
method, passing in one or many Predicate<BlockRayHit<E>>
s (where E
extends
Extent
). The BlockRayBuilder#stopFilter
continues the ray cast when it hits a block that passes the given
filter and the BlockRayBuilder#skipFilter
skips all blocks that pass the filter. These filters can be chained
together to create a complex BlockRay
. For convenience, BlockRay
contains the following methods for common
filter use cases:
allFilter
: bütün blokları kabul eden bir filtre döndürür
onlyAirFilter
: sadece havayı kabul eden bir filtre döndürür
blockTypeFilter(BlockType)
: sadece belirlenmiş :javadoc:`BlockType`ı kabul eden bir filtre döndürür
continueAfterFilter(Predicate<BlockRayHit<E>>, int)
: belirlenmiş sayıda engeller tarafından verilen filtrenin geçmişinde devam eden filtreye geri döner.
Tabi ki kendi Predicate<BlockRayHit<E>>
filtrenizi de yazabilirsiniz.
Son olarak BlockRay
oluşturmayı bitirmek için BlockRay.BlockRayBuilder#build() kullanın.Bir Player``ın baktığı ilk havasız bloğu almak için örnek bir ``BlockRayBuilder
kullanımı aşağıda sağlanmıştır.
import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.util.blockray.BlockRay;
import org.spongepowered.api.world.World;
Player player;
BlockRay<World> blockRay = BlockRay.from(player)
.skipFilter(BlockRay.onlyAirFilter()).stopFilter(BlockRay.onlyAirFilter()).build();
We can rewrite the above to use BlockRay#skipFilter(Predicate<BlockRayHit>)
in addition to
BlockRay#stopFilter(Predicate<BlockRayHit>)
. This will skip all air blocks and stop at the first non-air block it
hits.
BlockRay<World> blockRay = BlockRay.from(player)
.skipFilter(BlockRay.onlyAirFilter()).stopFilter(BlockRay.allFilter()).build();
BlockRay kullanma
BlockRay
, Iterator
dahil ettiğinden beri, `` BlockRay`` tarafından üretilen BlockRayHit’leri yinelemek için` hasNext` ve next
gibi yöntemleri (remove
değil) kullanabilirsiniz. Buna ek olarak, yineleyiciyi başlangıç konumuna sıfırlamak için BlockRay#reset() yöntemini kullanabilirsiniz. BlockRayHit
aracılığıyla tekrar yapmaktansa, BlockRay#end() yöntemini kullanarak, filtrenin kabul ettiği son bloğu elde etmek için blok yolunu sonuna kadar izleyebilirsiniz(veya block limitine erişildiyse hiçbirini).
BlockRayHit kullanmak
`` BlockRayHit``, ışınla kesişen her blok hakkında bilgi içerir. Blokun yerini, ışının yönünü, ışının ve bloğun kesişim noktasının * koordinatlarını ve diğer benzer verileri içerir. Aşağıdaki kod, önceki örnekteki “BlockRay” ‘i, oynatıcı önünde ilk hava tahliye edilmemiş bloğun yerini yazdırmak için kullanmaktadır.
import org.spongepowered.api.util.blockray.BlockRayHit;
import java.util.Optional;
BlockRay<World> blockRay = ...;
Optional<BlockRayHit<World>> hitOpt = blockRay.end();
if (hitOpt.isPresent()) {
BlockRayHit<World> hit = hitOpt.get();
System.out.println("Found " + hit.getLocation().getBlockType() + " block at "
+ hit.getLocation() + " with intersection at " + hit.getPosition());
}