Işın izleme

Genel olarak ışın izleme, bir parçacık yolunu bir koordinat sistemi aracılığıyla belirleyen bir yöntemdir. SpongeAPI’da, bu uzaydaki rastgele bir satırın yolundaki blokları keşfetmek için “org.spongepowered.api.util.blockray.BlockRay” sınıfıyla uygulanır. Ortak bir kullanım durumu, bir oyuncunun aradığı bloğu bulmak olabilir.

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 ‘’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 ‘’BlockRayBuilder#to(Vector3d)’’ yöntemini kullanabilirsiniz. Alternatif olarak, ‘’BlockRayBuilder#direction(Vector3d)’’ kullanarak bir yön belirtebilir ve ayrıca ‘’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 belirtilen ‘’BlockType’’ alanını 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, ‘’BlockRayBuilder#build’’ işlevini kullanarak ‘’BlockRay’’ işlemini tamamlayın. “BlockRayBuilder”ın bakmakta olduğu ilk hava tahliye bloğunu almak için “BlockRayBuilder”a örnek bir 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’‘, ‘’Iterato’’ uygular, ‘’hasNext’’ ve ‘’next’’ (but not ‘’remove’‘) gibi yöntemleri kullanarak ‘’BlockRayHit’’ arasında yineleme yapabilirsiniz. “BlockRay” tarafından üretilen. Buna ek olarak, yineleyiciyi başlangıç ​​konumuna sıfırlamak için ‘’BlockRay#reset’’ yöntemini kullanabilirsiniz. ‘’BlockRayHit’’ aracılığıyla tekrarlamaktansa, blok rayını yolun sonuna kadar izlemek için “BlockRay#end” yöntemini de kullanabilirsiniz, bu da son blok filtre tarafından kabul edilmesini sağlar (ya da yok blok sınırına ulaşır).

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