【问题标题】:How to draw an image multiple times [duplicate]如何多次绘制图像[重复]
【发布时间】:2013-08-20 14:27:11
【问题描述】:

所以这是我的问题,我正在做一个基本的平台游戏,将瓷砖绘制为地面。瓷砖基本上是一个纹理,在网格中绘制了一个碰撞箱。但我不能多次绘制相同的图像。那么我只是制作成千上万的图像变量还是有更好的方法?

我试过了

public void paint(Grapihcs g){
    ground.draw(mapX * tilesize, mapY * tilesize);
    ground.draw(mapX * tilesize, mapY * tilesize);
}

我尝试了一个 for 循环...

public void paint(Grapihcs g){
    for(int i = 0; i < 10; i++){
        ground.draw(mapX * tilesize, mapY * tilesize);
    }
}

似乎没有任何效果......就像它只是最后一次绘制它一样。

【问题讨论】:

  • 你能告诉我们你到目前为止尝试了什么吗?
  • 您不会在任何示例中更改 x 和 y 坐标...这将导致同一图像在其自身之上多次绘制。或者几乎与仅上次绘制的相同。尝试修改 x 和 y 坐标,你会看到它的工作原理。
  • 我在下面的回答中为您提供了一个可能的解决方案。正如@haraldK 所说,您不会更改图像的渲染位置,因此您的所有图块都在同一位置渲染了 10 次。

标签: java image


【解决方案1】:

您可以根据网格中的值多次绘制同一张图像。您可以使用存储在 2D 数组中的值来引用另一个 1D 图像数组。

假设你有一个像这样的数组:

[1, 1, 0, 1, 1]
[1, 1, 0, 1, 1]

还有一个一维图像数组,其中包含索引 0 中的棕色图块和索引 1 中的绿色图块。

您将遍历 2D 数组,并使用存储在每个索引中的值来引用您的 1D 图像数组,如下所示:

for(int x=0;x<array2D.length;x++){
    for(int y=0;y<array2D[0].length;y++){
        int pixelX = //calculate x position of this tile image;
        int pixelY = //calculate y position of this tile image.
        g.drawImage(images[array2D[x][y]],pixelX,pixelY,null);
    }
}

编辑:

根据您更新的问题,您没有修改传递给ground.draw 的 X 和 Y 坐标。这意味着图像在自身上被渲染了 10 次。您需要更改渲染图块的 X 位置。

试试这样的:

int mapYPos = mapY*tileSize;
for(int i=0;i<10;i++){
    ground.draw(i*tileSize, mapYPos);
}

在这里,我将 [0-10] * tilesize 传递给 X,并将相同的值 mapYPos 传递给 Y。这将为您提供一个水平的瓷砖条,从左到右呈现。

【讨论】:

  • 在可能的情况下,应为drawImage 方法提供ImageObserver,这样可以确保如果图像仍在开始加载,它可以触发重绘。鉴于 java.awt.Component 实现了 ImageObserver 以及 AWT 和 Swing 中的大多数其他组件直接或间接地从 java.awt.Component 扩展,因此建议并不难 - 恕我直言
  • 我从来没有将空值传递给绘图图像,也从来没有遇到过问题。不过我从来没有用过ImageObserver;你会比我更清楚。我现在将按原样留下答案。 OP似乎已经很困惑了。我很感激这个提示......可能需要了解ImageObserver
  • ImageObserver 可以追溯到旧的Applet 和拨号天,此时下载图像可能需要很长时间。如果您有一个大的或复杂的图像,它也很有用,因为ImageObserser 会自动为您触发重绘;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多