Işın izleme
Uyarı
These docs were written for SpongeAPI 7 and are likely out of date. If you feel like you can help update them, please submit a PR!
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());
}