如何获取图像对象的位置
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:
基本上对于您的GameObject
s,您应该有一个类来封装GameObject
的图像及其数据(即X、Y、 height 和 width 等),这个类应该有一个与之关联的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
的图像及其关联的 X 和 Y 坐标矩形):
g2d.drawImage(gameObject.getCurrentImage(), (int) gameObject.getX(), (int) gameObject.getY(), null);
然后您可以使用Rectangle2D
s:
rectangle.getBounds2D();
这将返回一个Rectangle2D
并且您可以简单地调用内置的Rectangle2D#intersects
方法(参见上述GameObject
类的getBounds2D
和intersects(GameObject go)
),即:
gameObject.intersects(anotherGameObject)
【讨论】:
以上是关于如何获取图像对象的位置的主要内容,如果未能解决你的问题,请参考以下文章