Добрый день.
Существует фрэйм, на который я рисую маленькие картинки. Каждая из них - фрагмент одной большой. Как пазл, знаете?) Так вот.. Проблема в том, что при добавлении каждого нового фрагмента, приходится перерисовывать весь фон - все старые, уже нарисованные фрагменты. Я помещал их в лист и перерисовывал при добавлении новой. Когда их 3, 5, еще куда ни шло, а когда их десятки и даже сотни - это уже по моему не правильно.
Подскажите пожалуйста, как мне это реализовать более правильно? Ну там, например, считать уже имеющийся фон (нарисованные фрагменты) одной большой картинкой и рисовать ее как единое целое, а не как совокупность маленьких объектов. Не знаю. гуглил на эту тему, но все как то не то...
import javax.swing.*;
import java.awt.*;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.util.*;
import java.util.List;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
public class Main extends JComponent implements Runnable {
private static JFrame frame;
private Image source;
// private final Image source = new ImageIcon("d:\\source.png").getImage();
private int imageWight;
private int imageHeight;
private List<MySprite> imageSprite = new CopyOnWriteArrayList<>();
private List<MySprite> temp = new CopyOnWriteArrayList<>();
private AtomicInteger position = new AtomicInteger();
private MySprite sprite;
public Main() {
position.set(0);
loadImageFromNet("https://3d-linker.ru/components/com_jshopping/files/img_products/full_2049.jpg");
int col = imageWight / 50;
int frame_side = 50;
if (imageHeight > imageWight) {
System.out.println("2");
col = col + 1;
}
int frame = 0;
int pos_x = 0;
int pos_y = 0;
System.out.println(imageWight / 50);
int name = 0;
while (pos_y < imageHeight){
temp.add( new MySprite(String.valueOf(name++), source, pos_x, pos_y, col, frame, frame_side, frame_side) );
frame ++;
pos_x += frame_side;
if (pos_x >= imageWight){
pos_x = 0;
pos_y += frame_side;
}
}
Collections.shuffle(temp);
}
private void loadImageFromNet(String url){
try {
URL website = new URL(url);
ReadableByteChannel rbc = Channels.newChannel(website.openStream());
FileOutputStream fos = new FileOutputStream("source.jpg");
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
source = new ImageIcon("source.jpg").getImage();
imageWight = source.getWidth(null);
imageHeight = source.getHeight(null);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
public void run() {
while (true) {
int x = new Random().nextInt(2000);
try {
Thread.sleep(x);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
if (position.get() < temp.size()) {
imageSprite.add( temp.get(position.getAndIncrement()));
frame.repaint(0, 0, 0, frame.getWidth(), frame.getHeight());
} else {
break;
}
}
}
void drawSpriteFrame(Image source, Graphics2D g2d, int x, int y, int columns, int frame, int width, int height) {
int frameX = (frame % columns) * width;
int frameY = (frame / columns) * height;
g2d.drawImage(source, x, y,
x+width, y+height,
frameX, frameY,
frameX+width, frameY+height, this);
}
@Override
public void paintComponent(Graphics g) {
}
@Override
public void paint(Graphics g) {
Graphics2D graphics = (Graphics2D)g;
if (imageSprite.size() > 0) {
for (MySprite sprite : imageSprite) {
// System.out.println(sprite.getFrameName());
drawSpriteFrame(
sprite.getImage(), graphics,
sprite.getPosX(), sprite.getPosY(),
sprite.getColumn(), sprite.getFrame(),
sprite.getSpriteWidth(), sprite.getSpriteHeight()
);
}
}
}
public static void main(String[] args) {
Main main = new Main();
frame = new JFrame("test");
frame.setLocation(500, 300);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.add(main);
frame.setVisible(true);
frame.setResizable(false);
frame.repaint(0, 0, 0, frame.getWidth(), frame.getHeight());
frame.setSize(main.source.getWidth(main), main.source.getHeight(main));
for (int i = 0; i < 15; i++) {
new Thread(main).start();
}
}
}
------------------------------------------------------------------------------
public class MySprite {
private String frameName;
private Image image;
private int posX;
private int posY;
private int column;
private int frame;
private int spriteWidth;
private int spriteHeight;
.......
}