2013-08-18 6 views
-2

Итак, вот моя проблема. Я делаю базовый платформер с плитами, нарисованными как земля. Плитки в основном представляют собой текстуру с хитом, нарисованным в сетке. Но я не могу сделать один и тот же образ несколько раз. так что я просто делаю тысячи переменных изображения или есть лучший способ?Как нарисовать изображение несколько раз

Я попытался

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

Я попробовал цикл ...

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

Ничто не похоже на работу ... Это как это только рисует его в последний раз.

+5

Можете ли вы показать нам, что вы пробовали до сих пор? –

+2

Вы не меняете координаты x и y в любом из ваших примеров ... Это приведет к тому, что одно и то же изображение будет окрашено * поверх самого себя * несколько раз. Или почти так же, как только последний раз нарисован. Попробуйте изменить координаты x и y, и вы увидите, что он работает. – haraldK

+0

Я дал вам возможное решение в моем ответе ниже. Как говорит @haraldK, вы не меняете позицию, в которой отображается изображение, поэтому все ваши фрагменты отображаются в том же положении 10 раз. –

ответ

0

Вы можете нарисовать одно и то же изображение несколько раз в зависимости от значения в вашей сетке. Вы используете значения, хранящиеся в вашем 2D-массиве, для ссылки на другой 1D-массив изображений.

Допустим, вы имеете массив, как:

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

И в 1D массив изображений, содержащих коричневую плитку в индекс 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); 
    } 
} 

EDIT:

Исходя из вашего обновленного вопроса, вы не изменяете координаты X и Y, переданные в ground.draw. Это означает, что изображение обрабатывается само по себе 10 раз. Вам нужно изменить положение X, в котором вы показываете плитку.

попробовать что-то вроде этого, вместо:

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

Здесь я передаю его [0-10] * tilesize для X, и то же самое значение, mapYPos, снова и снова Y. Это даст вам одну горизонтальную полоску плитки , вынесенный слева направо.

+1

По возможности в метод 'drawImage' должен быть предоставлен' ImageObserver', это гарантирует, что если изображение все еще загрузится, оно может вызвать перерисовку. Учитывая, что 'java.awt.Component' реализует' ImageObserver', и большинство других компонентов в AWT и Swing распространяются прямо из 'java.awt.Component' прямо или косвенно, это было бы нелегко предложить - IMHO – MadProgrammer

+0

I ' никогда не пропускал ничего, кроме нулевого, чтобы рисовать изображение и никогда не испытывал проблем. Я никогда не использовал «ImageObserver»; вы бы знали лучше, чем я. Я собираюсь оставить ответ так, как сейчас. Оппозиция, похоже, уже запуталась. Я ценю подсказку ... возможно, вам нужно узнать о «ImageObserver». –

+1

'ImageObserver' возвращается к старым« Applet »и набирает дни, когда для загрузки изображения может потребоваться длительный период времени. Это также полезно, если у вас есть большое или сложное изображение, так как «ImageObserser» автоматически выведет репликации для вас;) – MadProgrammer