Добавление полос прокрутки и проблем с изменением размера изображения - PullRequest
1 голос
/ 12 февраля 2012

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

import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;

public class AnimTest
{
public static void main(String[] args)
{
    AnimTest test = new AnimTest();
    test.go();
}

public void go()
{
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    MyDrawP drawP = new MyDrawP();
    frame.getContentPane().add(drawP);
    frame.setSize(640,640);
    frame.setVisible(true);
    frame.setResizable(true);

}
}

class MyDrawP extends JPanel
{

public void paintComponent(Graphics g)
{
    super.paintComponent(g);
    try {

        BufferedImage bigImg = ImageIO.read(new File("C:/Users/scott/Desktop/Personal Work/Pixel Art/terrain.png"));

        final int width = 64;
        final int height = 64;
        final int rows = 5;
        final int cols = 16;
        final int mapX = 10;
        final int mapY = 8;

        BufferedImage[][] sprites = new BufferedImage[cols][rows];

        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < cols; j++)
            {
                //System.out.println("J is: " + j);
                //System.out.println("I is: " + i);
                //System.out.println("i * width is: " + i * width);
                //System.out.println("j * height is: " + j * height);
                //System.out.println("");

                sprites[j][i] = bigImg.getSubimage(j * width, i * height, width, height);
                //g.drawImage(sprites[j][i], 5, 5, this);
            }
        }
            for (int i = 0; i < mapX; i++)
            {
                for (int j = 0; j < mapY; j++)
                {
                ArrayList<BufferedImage> spriteListRoad = new ArrayList<BufferedImage>();
                BufferedImage road4way = sprites[0][0];
                spriteListRoad.add(road4way);
                BufferedImage roadS = sprites[1][0];
                spriteListRoad.add(roadS);
                BufferedImage roadV = sprites[2][0];
                spriteListRoad.add(roadV);
                BufferedImage roadH = sprites[3][0];
                spriteListRoad.add(roadH);
                BufferedImage roadEndU = sprites[4][0];
                spriteListRoad.add(roadEndU);
                BufferedImage roadEndL = sprites[5][0];
                spriteListRoad.add(roadEndL);
                BufferedImage roadEndR = sprites[6][0];
                spriteListRoad.add(roadEndR);
                BufferedImage roadEndD = sprites[7][0];
                spriteListRoad.add(roadEndD);
                BufferedImage roadLU = sprites[8][0];
                spriteListRoad.add(roadLU);
                BufferedImage roadRU = sprites[9][0];
                spriteListRoad.add(roadRU);
                BufferedImage roadLD = sprites[10][0];
                spriteListRoad.add(roadLD);
                BufferedImage roadRD = sprites[11][0];
                spriteListRoad.add(roadRD);
                BufferedImage roadUT = sprites[12][0];
                spriteListRoad.add(roadUT);
                BufferedImage roadLT = sprites[13][0];
                spriteListRoad.add(roadLT);
                BufferedImage roadRT = sprites[14][0];
                spriteListRoad.add(roadRT);
                BufferedImage roadDT = sprites[15][0];
                spriteListRoad.add(roadDT);

                ArrayList<BufferedImage> spriteListRiver = new ArrayList<BufferedImage>();
                BufferedImage riverV = sprites[0][1];
                spriteListRiver.add(riverV);
                BufferedImage riverH = sprites[1][1];
                spriteListRiver.add(riverH);
                BufferedImage riverLU = sprites[2][1];
                spriteListRiver.add(riverLU);
                BufferedImage riverRU = sprites[3][1];
                spriteListRiver.add(riverRU);
                BufferedImage riverLD = sprites[4][1];
                spriteListRiver.add(riverLD);
                BufferedImage riverRD = sprites[5][1];
                spriteListRiver.add(riverRD);
                BufferedImage riverRoadV = sprites[6][1];
                spriteListRiver.add(riverRoadV);
                BufferedImage riverRoadH = sprites[7][1];
                spriteListRiver.add(riverRoadH);

                ArrayList<BufferedImage> spriteListTerrain = new ArrayList<BufferedImage>();
                BufferedImage grass = sprites[0][2];
                spriteListTerrain.add(grass);
                BufferedImage trees = sprites[1][2];
                spriteListTerrain.add(trees);
                BufferedImage mountain = sprites[2][2];
                spriteListTerrain.add(mountain);

                ArrayList<BufferedImage> spriteListOre = new ArrayList<BufferedImage>();
                BufferedImage copper = sprites[0][3];
                spriteListOre.add(copper);
                BufferedImage dornite = sprites[1][3];
                spriteListOre.add(dornite);
                BufferedImage kryz = sprites[2][3];
                spriteListOre.add(kryz);
                BufferedImage iron = sprites[3][3];
                spriteListOre.add(iron);
                BufferedImage shallux = sprites[4][3];
                spriteListOre.add(shallux);
                BufferedImage mithril = sprites[5][3];
                spriteListOre.add(mithril);

                ArrayList<BufferedImage> spriteListWood = new ArrayList<BufferedImage>();
                BufferedImage oak = sprites[0][4];
                spriteListWood.add(oak);
                BufferedImage olive = sprites[1][4];
                spriteListWood.add(olive);
                BufferedImage rath = sprites[2][4];
                spriteListWood.add(rath);
                BufferedImage yew = sprites[3][4];
                spriteListWood.add(yew);
                BufferedImage eeth = sprites[4][4];
                spriteListWood.add(eeth);
                BufferedImage ebony = sprites[5][4];
                spriteListWood.add(ebony);

                g.drawImage(spriteListTerrain.get((int) (Math.random() * 3)), i* width, j * height, this); //this one works by itself

                }
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

}

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

Спасибо.

Ответы [ 2 ]

2 голосов
/ 12 февраля 2012

Почему при выполнении этого кода каждый раз, когда я изменяю размер окна, оно запускается снова и переделывает мою карту?

Ваш код для создания карты находится в paintComponent() метод.Этот метод вызывается каждый раз, когда Swing определяет, что компонент должен быть перекрашен.Изменение размера рамки является одним из случаев, когда компоненты должны быть перекрашены.

По этой причине ваш метод paintComponent () должен быть максимально эффективным.Вы не должны делать ввод / вывод в этом методе.

Ваш текущий код не имеет большого смысла для меня.У вас есть два цикла с использованием переменных i, j, но вы строите списки ArrayLists, используя жестко закодированные значения.Единственный раз, когда вы используете переменную i, j, это метод drawImage ().

Итак, я думаю, код для создания карты должен быть выполнен во внешнем методе, а затем в методе paintComponent ().должен вызывать drawImage (..) только внутри ваших циклов.

Кроме того, поскольку метод drawImage () использует метод random (), каждый раз, когда вызывается метод paintComponent (), вы будете изменять изображение.Это, вероятно, не то, что вы хотите, поэтому в действительности вам, вероятно, нужно создать весь BufferedImage извне.Затем изображение можно добавить в JLabel и добавить метку к рамке, чтобы вам не требовалось настраивать рисование на панели.

2 голосов
/ 12 февраля 2012

Нарисуйте объекты, представляющие интерес для BufferedImage и поместите его в метку. Обратите внимание, что размер не будет изменяться автоматически.

Также вы можете нарисовать объекты в BI и просто масштабировать их до размера кадра. Это имело бы смысл только в том случае, если на его создание уходит много времени.


Идентификатор должен сохранить все эти данные в одном большом BI, что я не знаю, как сделать.

Видимо, вы понимаете, как обращаться с Graphics объектом. Можно получить из BI, используя getGraphics() или createGraphics().

...