碰撞边界的旋转

时间:2016-02-27 11:49:33

标签: 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.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);
}

Sample of result

但在实践中它只会造成伤害"在角色的右边 - 就像没有旋转一样。我试图使用: https://stackoverflow.com/a/5925715/5502471 解决方案,但我有点失败,不知道我做错了什么。

几点提示:

  • 攻击是一个单独的类,

  • 攻击是由键盘输入的播放器类引起的,

  • 碰撞发生在敌人的班级,

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

我正在寻找一些" easy"这样做的方式,因为我希望在许多事情中使用它;)如果没有简单的方法,那么艰难的方式也会这样做 - 接受挑战!

1 个答案:

答案 0 :(得分:0)

我找到了一个非常简单的解决方案(某处在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;
    }

Results

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