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());
}