「線」の長方形を作成します。これは、回転する「レーザーサイト」です
public Rectangle getLaserBox() {
float lOriginX = (leon.getPosition().x + 0.27f);
float lOriginY = (leon.getPosition().y + 0.7f);
float lEndX = lOriginX + (float)Math.cos((leonAimLaserSprite.getRotation())/57) * 5f;
float lEndY = lOriginY + (float)Math.sin((leonAimLaserSprite.getRotation())/57) * 5f;
Rectangle laserBox = new Rectangle(lOriginX, lOriginY, lEndX, lEndY);
return laserBox;
}
次に、長方形の重なりをチェックし、重なりが検出された場合は「レーザーサイト」スプライトを短くするメソッドがあります。今のところ、render メソッドで laserCol() メソッドを呼び出します (MVC を壊していることはわかっていますが、動作させようとしているだけです)。 LaserWidth は、レーザー スプライトの幅として適用されます。
private float laserWidth;
public void laserCol() {
Vector2 laserOrigin = new Vector2(leon.getPosition().x + 0.55f, leon.getPosition().y + 0.7f);
boolean laserIsCol = false;
for (Tile t : world.getTiles()) { //pulling in tiles as t, from world method getTiles()
laserWidth = laserOrigin.dst(t.getPosition().x + 0.1f, t.getPosition().y + 0.7f);
if (Intersector.overlapRectangles(getLaserBox(), t.getBounds())) {
laserIsCol = true;
}
}
if (laserIsCol) {
for (Tile t : world.getTiles()) { //pulling in tiles as t, from world method getTiles()
laserWidth = laserOrigin.dst(t.getPosition().x, t.getPosition().y + t.getBounds().y);
}
}
if (!laserIsCol) {
laserWidth = 8f;
}
}
しかし、スクリーンショットでわかるように、レーザーは短くなりません。私は他の例を見てきましたが、これを行うためのより良い方法を理解できないようです.
コードに「thing」と呼ばれる単一のオブジェクトを追加した後、作成したスプライト バウンディング ボックスをチェックすることにしました。
その後、いくつかのコードを変更し、光線を使用しようとしていますが、ある程度動作するようになりましたが、希望するほど近くはありません。何か提案はありますか?
public Ray getLaserRay() {
lOriginX = (leon.getPosition().x + 0.27f);
lOriginY = (leon.getPosition().y + 0.7f);
lEndX = lOriginX + (float)Math.cos((leonAimLaserSprite.getRotation())/57) * 10f;
lEndY = lOriginY + (float)Math.sin((leonAimLaserSprite.getRotation())/57) * 10f;
laserO = new Vector3(lOriginX, lOriginY, 0);
laserD = new Vector3(lEndX, lEndY, 0);
Ray laserRay = new Ray(laserO, laserD);
return laserRay;
}
private float laserWidth;
public void laserCol() {
Vector2 laserOrigin = new Vector2(leon.getPosition().x + 0.55f, leon.getPosition().y + 0.7f);
boolean laserIsCol = false;
if (Intersector.intersectRayBoundsFast(getLaserRay(), thing.getBB())) {
laserIsCol = true;
}
if (laserIsCol) {
laserWidth = laserOrigin.dst(thing.getPosition().x, thing.getPosition().y);
}
if (!laserIsCol) {
laserWidth = 10f;
}
}
衝突検出を機能させるために、2 つの線分を使用することになりました。レーザーサイト用に 1 つ、オブジェクト (敵) 用に 1 つ作成し、下部の x ポイントから上部の x ポイントまで延長しました。基本的に同じコードですが、libgdx のセグメント インターセクターを使用しました。
レーザーサイトで弾丸やダメージを発生させる方法を知っている人はいますか?