我尝试过用视锥创造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
经过几天的编码、学习和测试新想法,我回到这个程序,用我最初的想法(光线投射)实现了冲突检测,并用光线创建了等效的东西!新产品的截图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方法,它可能是可以使用的,但我不打算进入。光线更冷。