Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 碰撞边界的旋转_Java_Collision - Fatal编程技术网

Java 碰撞边界的旋转

Java 碰撞边界的旋转,java,collision,Java,Collision,我正在做我的2D java游戏,我有一个关于碰撞边界旋转的问题 我有一门攻击课: public void render(Graphics g) { Graphics2D g2d = (Graphics2D) g; AffineTransform old = g2d.getTransform(); g2d.rotate(Math.toRadians(player.getDir()), (double) player.getX() + 16, (double) player.

我正在做我的2D java游戏,我有一个关于碰撞边界旋转的问题

我有一门攻击课:

public void render(Graphics g) {
    Graphics2D g2d = (Graphics2D) g;
    AffineTransform old = g2d.getTransform();
    g2d.rotate(Math.toRadians(player.getDir()), (double) player.getX() + 16, (double) player.getY() + 16);
    g2d.setComposite(makeTransparent(alpha));
    g.setColor(Color.gray);
    g.fillRect((int) x, (int) y, 32, 32);
    g2d.setComposite(makeTransparent(1));
    g.setColor(Color.red); // drawing the results
    g2d.draw(getBounds()); // drawing the getBounds();
    g2d.setTransform(old);

}

private AlphaComposite makeTransparent(float alpha) {
    int type = AlphaComposite.SRC_OVER;
    return (AlphaComposite.getInstance(type, alpha));
}

public Rectangle getBounds() {

    return new Rectangle((int) x, (int) y, (int) width + 32, (int) height + 32);
}

但在实践中,它只会对角色右侧造成“伤害”——就像没有旋转一样。我试图使用: 解决方案,但我有点失败了,不确定我做错了什么

几点提示:

  • 攻击是一个单独的类

  • 攻击是由玩家类通过键盘输入引起的

  • 碰撞发生在敌方舱内

    if (tempObject.getId() == ID.Attack){
        if (getBounds().intersects(tempObject.getBounds())){
            health-=3;
        }
    }
    

我一直在寻找一些“简单”的方法来做这件事,因为我希望在很多事情上使用它;)如果没有简单的方法,那么困难的方法也可以-接受挑战

我找到了一个非常简单的解决方案(stackoverlow.com;p)。它并不完美,但至少它是有效的。只需使用一种方法在绘制矩形边界的起点周围移动

 public Rectangle getBounds() {

        double newX = 0;
        double newY = 0;
        Rectangle attack = new Rectangle((int) newX, (int) newY, 32, 32);

        double[] pt = { x, y };
        AffineTransform
                .getRotateInstance(Math.toRadians(player.getDir()), (double) player.getX(), (double) player.getY())
                .transform(pt, 0, pt, 0, 1);
//playeer.getDir() - method to return the rotation angle in degress
        newX = pt[0];
        newY = pt[1];

        attack = new Rectangle((int) newX, (int) newY, 32, 32);

        return attack;
    }

我希望你发现它有用。干杯