ブロックの 3D 配列をチャンクに分割して、Minecraft スタイルのゲームを作成しています。しかし、世界の変更を実行するには、プレイヤーが指しているブロックを確認する必要があります。これは私がこれまでに思いついたものです:
private Block getBlockLookedAt(EntityPlayer ep) {
double px = ep.getPosition().x;
double py = ep.getPosition().y;
double pz = ep.getPosition().z;
float pPitch = ep.getPitch()*-1;
float pYaw = ep.getYaw()*-1;
double searchRadius = 6;
double targetX = searchRadius * Math.cos(Math.toRadians(pYaw))*Math.sin(Math.toRadians(pPitch));
double targetY = searchRadius * Math.sin(Math.toRadians(pYaw))*Math.sin(Math.toRadians(pPitch));
double targetZ = searchRadius * Math.cos(Math.toRadians(pPitch));
//System.out.println("=");
//System.out.println(px + "," + py + "," + pz);
//System.out.println(targetX + "," + targetY + "," + targetZ);
//System.out.println("=");
for(double i = 0; i<searchRadius; i+=0.01){
targetX = i * Math.cos(Math.toRadians(pYaw))*Math.sin(Math.toRadians(pPitch));
targetY = i * Math.sin(Math.toRadians(pYaw))*Math.sin(Math.toRadians(pPitch));
targetZ = i * Math.cos(Math.toRadians(pPitch));
int bx = (int)Math.ceil(targetX+px);
int by = (int)Math.ceil((targetY*-1)+py);
int bz = (int)Math.ceil(targetZ+pz);
System.out.println(bx + "," + by + "," + bz + "," + getBlock(bx,by,bz).getID());
if(getBlock(bx,by,bz).getID()!=0)return getBlock(bx,by,bz);
}
return Block.air;
}
私がここでやっていることは、球座標を使用し、範囲内に空気とは異なるブロックがあるかどうかを確認するために半径の確認に 0.01 を追加することです。それはうまくいかないようですが(常に空気を返します。他のブロックを検出するにはブロックの内側にいる必要があります)誰かが解決策を持っていますか、それとももっと良い方法がありますか?
PS。私は schabby のチュートリアルを読みましたが、正しく理解している限り、Z 軸をチェックしていないため、探しているものではありません。