如何获取图像对象的位置

Posted

技术标签:

【中文标题】如何获取图像对象的位置【英文标题】:how to get the position of an Image object 【发布时间】:2021-03-15 08:16:41 【问题描述】:

我正在开发一个垂直滚动游戏,为了创建命中检测/碰撞,我决定从 Rectangle 类中窃取 intersects 方法:

public boolean intersects(Rectangle r)
  return r.width > 0 && r.height > 0 && width > 0 && height > 0
   && r.x < x + width && r.x + r.width > x
   && r.y < y + height && r.y + r.height > y; 

并使用 Image 方法更改此方法的所有“内部组件”。 问题是,图像类中没有方法可以返回图像对象在 jpanel 上的位置,如“.getX()”。我尝试为屏幕上的每个 Image 创建一个单独的 Rectangle 对象并将其用作 hitbox,但这似乎有点浪费,而且我的想法也用完了。

【问题讨论】:

【参考方案1】:

This was something I did a long time ago:

基本上对于您的GameObjects,您应该有一个类来封装GameObject 的图像及其数据(即XY heightwidth 等),这个类应该有一个与之关联的Rectangle2D 并且这个GameObject 上的任何移动实际上应该移动与它们关联的Rectangle2D 看到一些提取代码如下:

class GameObject extends Animator 

    protected Rectangle2D.Double rectangle;

    public GameObject(int x, int y, ArrayList<BufferedImage> frames, ArrayList<Long> timings, int pos, int conW, int conH) 
        super(frames, timings);
        //...
        // I have a list of images thats set in the Animator class but if you had one image you would have the setter for it here and it would be passed into the constructor and this GameObject would have a getCurrentImage or similar method which returns the BufferedImage associated with the GameObject.
        rectangle = new Rectangle2D.Double(x, y, getCurrentImage().getWidth(), getCurrentImage().getHeight());
        //...
    

    public void setX(double x) 
        rectangle.x = x;
    

    public void setY(double y) 
        rectangle.y = y;
    

    public void setWidth(double width) 
        rectangle.width = width;
    

    public void setHeight(double height) 
        rectangle.height = height;
    

    public double getX() 
        return rectangle.x;
    

    public double getY() 
        return rectangle.y;
    

    public double getWidth() 
        if (getCurrentImage() == null) //there might be no image (which is unwanted ofcourse but  we must not get NPE so we check for null and return 0
            return rectangle.width = 0;
        

        return rectangle.width = getCurrentImage().getWidth();
    

    public double getHeight() 
        if (getCurrentImage() == null) 
            return rectangle.height = 0;
        
        return rectangle.height = getCurrentImage().getHeight();
    

    public Rectangle2D getBounds2D() 
        return rectangle.getBounds2D();
    

    public boolean intersects(GameObject go) 
        return rectangle.intersects(go.getBounds2D());
    

然后您只需使用以下逻辑绘制您的GameObject(您将获得GameObject 的图像及其关联的 XY 坐标矩形):

g2d.drawImage(gameObject.getCurrentImage(), (int) gameObject.getX(), (int) gameObject.getY(), null);

然后您可以使用Rectangle2Ds:

rectangle.getBounds2D();

这将返回一个Rectangle2D 并且您可以简单地调用内置的Rectangle2D#intersects 方法(参见上述GameObject 类的getBounds2Dintersects(GameObject go)),即:

gameObject.intersects(anotherGameObject)

【讨论】:

以上是关于如何获取图像对象的位置的主要内容,如果未能解决你的问题,请参考以下文章

如何获取光标:嵌入对象上的指针?

在 ARKit 中进行动画时如何获取 3D 对象的当前位置?

如何从 PHPhotoLibrary 获取图像的位置?

如何在android中的图像中获取单个数字文本位置?

如何在opencv中获取真实位置的图像像素?

图像经过Canny算子处理后如何获取边缘位置的像素坐标