提问者:小点点

JavaArc2D碰撞检测(带旋转)


我尝试过用视锥创造NPC可以“看到”玩家的角色,NPC会一直来回旋转。

我的问题是弧有一个通用的和不变的位置,但是当它被绘制到屏幕上时,它看起来是正确的。[碰撞截图][1][java文件的GitHub链接][2]

我在NPC课上用Arc2D画出这样的形状

// Update the shapes used in the npc
    rect.setRect(x, y, w, h);
    ellipse.setFrame(rect);
    visionArc.setArcByCenter(cx, cy, visionDistance, visionAngle, visionAngle * 2, Arc2D.PIE); 

/Center X, Center Y(npc的),/圆弧到npc的距离/45度左右的恒定值和90度左右的恒定值(制作饼形)

我尝试过将位置和角度乘以NPC当前角度的sin和余弦

>

  • 像这样的东西

    visionArc. setArcByCenter(cx*(Math.cos(Math.toRadians(角度)))、cy(Math.sin(Math.toRadians(角度))、vision距离、visionAngle、visionAngle*2、Arc2D.PIE);

    visionArc. setArcByCenter(cx,cy,vision距离,visionAngle-角度,(visionAngle角度)*2,Arc2D.PIE);

    visionArc. setArcByCenter(cx,cy,vision距离,visionAngle*(Math.cos(Math.toRadians(Angans))),visionAngle*2,Arc2D.PIE);

    我尝试了很多,但似乎找不到有效的方法。使视觉角度不恒定会产生一个膨胀和收缩的弧线,将位置乘以角度的sin或余弦会使弧线在屏幕上飞来飞去,这也不起作用。

    这是绘制给定NPC公共无效绘制NPC的函数(NPCnpc, Graphics2D g2,AffineTransform old){

      // translate to the position of the npc and rotate
      AffineTransform npcTransform = AffineTransform.getRotateInstance(Math.toRadians(npc.angle), npc.x, npc.y);
      // Translate back a few units to keep the npc rotating about its own center
      // point
      npcTransform.translate(-npc.halfWidth, -npc.halfHeight);
      g2.setTransform(npcTransform);
    
      // g2.draw(npc.rect); //<-- show bounding box if you want 
      g2.setColor(npc.outlineColor);
      g2.draw(npc.visionArc);
      g2.setColor(Color.BLACK);
      g2.draw(npc.ellipse);
    
      g2.setTransform(old);
    

    }

    这是我的冲突检测算法-NPC是忍者的超类(范围更短,外围更高)

    公共无效检查Ninjas(级别){for(int i=0; i

          // Check collision
          if (playerRect.getBounds2D().intersects(ninja.visionArc.getBounds2D())) {
              // Create an area of the object for greater precision
              Area area = new Area(playerRect);
              area.intersect(new Area(ninja.visionArc));
              // After checking if the area intersects a second time make the NPC "See" the player
              if (!area.isEmpty()) {
                  ninja.seesPlayer = true;
              }
              else {
                  ninja.seesPlayer = false;
              }
          }
      }
    

    }

    你能帮我纠正冲突检测中弧线的实际位置吗?我尝试过创建新形状,这样我就可以有一个做数学运算,一个绘制到屏幕上,但我放弃了它,从这里重新开始。[1]:https://i.stack.imgur.com/rUvTM.png[2]:https://github.com/ShadowDraco/ArcCollisionDetection


  • 共1个答案

    匿名用户

    经过几天的编码、学习和测试新想法,我回到这个程序,用我最初的想法(光线投射)实现了冲突检测,并用光线创建了等效的东西!新产品的截图Github链接到教我解决方案的项目

    • 这是新的数学
    public void setRays() {
        for (int i = 0; i < rays.length; i++) {
            double rayStartAngleX = Math.sin(Math.toRadians((startAngle - angle) + i));
            double rayStartAngleY = Math.cos(Math.toRadians((startAngle - angle) + i));
            rays[i].setLine(cx, cy, cx + visionDistance * rayStartAngleX, cy + visionDistance * rayStartAngleY);
        }
    }
    

    >

  • 这是我问了这个问题后开始的程序的链接,并继续了解更多信息,以及新产品的图片(原始github页面已更新为新分支:)我现在也在学习git hub

    我不相信以我想要的方式使用Arc2D是可能的,但是有. setArcByTangent方法,它可能是可以使用的,但我不打算进入。光线更冷。