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.
Bitiş noktasını belirtmek için, yönü ve bitiş konumunu ayarlayacak olan BlockRay.BlockRayBuilder#to(Vector3d) yöntemini kullanabilirsiniz. Alternatif olarak, BlockRay.BlockRayBuilder#direction(Vector3d) kullanarak bir yön belirtebilir ve ayrıca BlockRay.BlockRayBuilder#blockLimit(int) yapabilirsiniz.
Not
Varsayılan blok sınırı, sonsuz yinelemeyi önlemek için bir koruma olarak 1000 blok’tur. Engelleme limitini devre dışı bırakmak için, negatif bir `BlockRayBuilder#blockLimit(int)``değerini kullanın.
Filtreleme
Filtreler BlockRay
tarafından hangi engellerin kabul edildiğini saptar. Filtre eklemek için (E``nin ``Extent``i genişlettiği) bir veya daha fazla ``Predicate<BlockRayHit<E>>
içinde geçen BlockRayBuilder#filter
yöntemini kullanın. Uygunluk için BlockRay
yaygın filtre kullanma durumları için aşağıdaki teknikleri içerir:
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
maxDistanceFilter(Vector3d, double)
: verilen ``Vector3d``den belirli bir mesafe uzaklıkta duran bir filtreye geri döner
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)
.filter(BlockRay.continueAfterFilter(BlockRay.onlyAirFilter(), 1)).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());
}