Боже мой, ты решил мою проблему, которая поставила меня в тупик на 5 дней.Я только что закончил печатать вопрос и собирался представить его.ВНИМАТЕЛЬНО (теперь, когда я знаю, что использование Images работает), когда вы используете bufferedImage в g2d.drawImage (Image, at, this), рисование НАМНОГО медленнее, чем если вы используете Image.Что-то вроде в 50 раз медленнее.Преобразовав BufferedImages в изображения (я не знал, что вы могли бы сделать это, но это помогло бы решить проблему) следующим образом: Внутри функции loadBullets:
BufferedImage a;
Image b;
a = spriteSheetPositive.getSubimage(
//going to use the same image 252 times until I get the motherload of data string converted to the format:
//sprites[shotId]=spriteSheetPositive.getSubimage(x, y, width, height);
520, //x 520,1,536,16 (small lime star) id=100
1, //y
16, //width
15 //height
);
b= createImage(a.getSource());
sprites[shotID]=b;
Теперь я могу использовать изображения из таблицы спрайтов в качествеснайперские спрайты с целым 1000 на экране одновременно без задержек!Ура!
Мой оригинальный вопрос:
Это код в функции рисования:
for (int i = 0; i < Projectiles.size(); i++) {
Shot02 m = (Shot02) Projectiles.get(i);
//m.getImage();
// g2d.drawImage(m.getImage(), m.getIntX(), m.getIntY(), this);
AffineTransform at = new AffineTransform();
// 4. translate it to the center of the component
at.translate(m.getDrawX(), m.getDrawY());
// 3. do the actual rotation
at.rotate(m.getAngle()); //rotation is Clockwise
g2d.drawImage(m.getImage(), at, this);
}
Я работаю над перспективной платформерной стрелялкой.Я переключился с использования простого изображения с изображением на bufferedImage, созданное как вспомогательное изображение из листа спрайта.Тем не менее, в результате этого программа отстает от всего лишь 20 снарядов на экране, тогда как раньше я мог иметь до около 1000.
private void loadBullets() {//is done only once, when the window starts
// Get Image
ImageIcon icon = new ImageIcon(this.getClass().getResource("AbsoluteWin\\CustomShotsPositive.png"));
Image image = icon.getImage();
// Create empty BufferedImage, sized to Image
BufferedImage spriteSheetPositive =
new BufferedImage(
image.getWidth(null),
image.getHeight(null),
Transparency.BITMASK);
// Draw Image into BufferedImage
Graphics g = spriteSheetPositive.createGraphics();
g.drawImage(image, 0, 0, null);
int shotID = 1;
System.out.println(shotID);
while (shotID <= length) {//fills the array with the bullets from the sprite sheet spriteSheetPositive
sprites[shotID] = spriteSheetPositive.getSubimage(
//going to use the same image 252 times until I get the coordinates for all the other sub-images
//sprites[shotId]=spriteSheetPositive.getSubimage(x, y, width, height);
520, //x 520,1,536,16 (small lime star) id=100
1, //y
16, //width
15 //height
);
shotID += 1;
}
System.out.println(shotID);
}
Shot02 Класс:
ImageIcon ii =
new ImageIcon(this.getClass().getResource("missile.png"));
image = ii.getImage();
//image=Destination.sprites[100];//is the source
Это код класса Shot02, который управляет тем, какое изображение используют пули.Опять же, если я раскомментирую второй вариант и использую BufferedImages, программа замедлится как сумасшедшая.