Буферизация в java
Доброго времени суток, вы уж простите меня, никак не мог определится в каком разделе спросить.
Задумал я немножечко в java поковыряться, может что смогу воплотить )
Помню такой подход был раньше на бейсиках и ассемблере, когда рисунок загоняли в буфер обмена и потом творили на экране с ним все что угодно. Если есть знатоки, может поможете как этот код поправить чтобы картинка забегала как надо :(
Код AS1/AS2:
package ship2;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.awt.Graphics;
import java.awt.Graphics2D;
public class ship2 extends JFrame
{
static BufferedImage buffer;
static Graphics2D g2;
public int z = 200;
public int h = 200;
public void rebuildBuffer()
{
buffer = new BufferedImage(z, h, BufferedImage.TYPE_INT_ARGB);
g2 = buffer.createGraphics();
g2.drawOval(z, h, 60, 60);//рисует круг
}
public void paint(Graphics g)
{
////g.drawLine(0, 0, 100, 100);//рисует линию
////g.setColor(Color.WHITE);
//super.paint(g);
//Graphics2D g2d = (Graphics2D)g;
//g.drawOval(z, h, 60, 60);//рисует круг
super.paint(g);
if (buffer == null)
{
rebuildBuffer();
}
g.drawImage(buffer, 0, 0, this);
}
public void update(Graphics g)
{
paint(g);
}
public void DrawRect()
{
this.repaint();//перерисовка при изменении координат
this.getGraphics().drawOval(z, h, 60, 60);
}
public class MyKeyListener implements KeyListener
{
public void keyPressed(KeyEvent e)
{
if (e.getKeyCode() == KeyEvent.VK_RIGHT)
{
z += 5;
DrawRect();
}
if (e.getKeyCode() == KeyEvent.VK_LEFT)
{
z -= 5;
DrawRect();
}
if (e.getKeyCode() == KeyEvent.VK_DOWN)
{
h += 5;
DrawRect();
}
if (e.getKeyCode() == KeyEvent.VK_UP)
{
h -= 5;
DrawRect();
}
//System.out.println("Key typed: " + e.getKeyChar());
}
}
public static void main(String[] args)
{
new ship2();
}
public ship2()
{
super("Просто так");
JFrame.setDefaultLookAndFeelDecorated(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(800, 600);
setVisible(true);
KeyListener listener = new MyKeyListener();
addKeyListener(listener);
}
}
Добавлено через 19 часов 44 минуты
Вроде загнать в буфер обмена получилось, теперь как его заставить двигаться ?
Код AS1/AS2:
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.Graphics;
import java.awt.Graphics2D;
public class Test extends JFrame
{
public int z = 100;
public void paint(Graphics g) {
Image img = createImageWithText();
g.drawImage(img, z, 30, this);
}
private Image createImageWithText(){
BufferedImage bufferedImage = new BufferedImage(60,60,BufferedImage.TYPE_INT_ARGB);
Graphics g = bufferedImage.getGraphics();
g.setColor(Color.RED);
g.drawOval(0, 0, 60, 60);//рисует круг
return bufferedImage;
}
public void DrawRect()
{
}
public class MyKeyListener implements KeyListener
{
public void keyPressed(KeyEvent e)
{
if (e.getKeyCode() == KeyEvent.VK_RIGHT)
{
z += 5;
DrawRect();
//System.out.println("You clicked a button!");
}
}
}
public Test()
{
super("Run");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(600, 400);
setVisible(true);
KeyListener listener = new MyKeyListener();
addKeyListener(listener);
}
public static void main(String[] args)
{
Test app = new Test();
}
}
Добавлено через 21 часов 44 минуты
Однако, ничего не понятно но он двигается ) И еще нашел как цвет фона задать.
теперь надо посмотреть как заставить его двигаться программно.
Код AS1/AS2:
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
public class Test extends JFrame
{
public int z = 270;
public int h = 150;
public Container colorFon;
public void paint(Graphics g)
{
Image img = createImageWithText();//выводим элемент из буфера
super.paint(g);
g.drawImage(img, z, h, this);
}
private Image createImageWithText()
{
//BufferedImage bufferedImage = new BufferedImage(60,60,BufferedImage.TYPE_INT_RGB);//без альфа канала
BufferedImage bufferedImage = new BufferedImage(60,60,BufferedImage.TYPE_INT_ARGB);//альфа канал для буфера
Graphics g = bufferedImage.getGraphics();//рисуем в буфер
g.setColor(Color.RED);
g.drawOval(0, 0, 60, 60);//рисует круг
return bufferedImage;
}
public void DrawRect()
{
repaint();//перерисовка при изменении координат
createImageWithText();
System.out.println("You clicked a button!");//системное сообщение
}
public class MyKeyListener implements KeyListener
{
public void keyPressed(KeyEvent e)
{
if (e.getKeyCode() == KeyEvent.VK_RIGHT)
{
z += 5;
DrawRect();
}
if (e.getKeyCode() == KeyEvent.VK_LEFT)
{
z -= 5;
DrawRect();
}
if (e.getKeyCode() == KeyEvent.VK_DOWN)
{
h += 5;
DrawRect();
}
if (e.getKeyCode() == KeyEvent.VK_UP)
{
h -= 5;
DrawRect();
}
}
}
public Test()
{
super("Run");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(600, 400);//размер окна
setLocation(300, 300);//позиция при активации окна
setVisible(true);
KeyListener listener = new MyKeyListener();//вызываем слушателя на нажатие клавиш
addKeyListener(listener);
colorFon=getContentPane();//цвет фона а именно JFrame можно задать создав контейнер
colorFon.setLayout(null);
colorFon.setBackground(Color.BLACK);
}
public static void main(String[] args)
{
Test app = new Test();
}
}
Ох ) теперь мы движемся с отскоком от стенок )
Код AS1/AS2:
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.Timer;
public class Test3 extends JFrame
{
public int z = 270;
public int h = 150;
public int speedX = 5;
public int speedY = 5;
public Container colorFon;
public void paint(Graphics g)
{
Image img = createImageWithText();//выводим элемент из буфера
super.paint(g);
g.drawImage(img, z, h, this);
}
private Image createImageWithText()
{
//BufferedImage bufferedImage = new BufferedImage(60,60,BufferedImage.TYPE_INT_RGB);//без альфа канала
BufferedImage bufferedImage = new BufferedImage(60,60,BufferedImage.TYPE_INT_ARGB);//альфа канал для буфера
Graphics g = bufferedImage.getGraphics();//рисуем в буфер
g.setColor(Color.RED);
g.drawOval(0, 0, 60, 60);//рисует круг
return bufferedImage;
}
public void DrawRect()
{
repaint();//перерисовка при изменении координат
createImageWithText();
System.out.println("You clicked a button!");//системное сообщение
}
public class MyActionListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
//if (z > 500 || z < 40)
if (z > 540)
{
z = 540;
speedX *= -1;
}
if (z < 0)
{
z = 0;
speedX *= -1;
}
if (h < 30)
{
h = 30;
speedY *= -1;
}
if (h > 340)
{
h = 340;
speedY *= -1;
}
z += speedX;
h += speedY;
DrawRect();
System.out.println("You run!");
}
}
public Test3()
{
super("Run");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(600, 400);//размер окна
setLocation(300, 300);//позиция при активации окна
setVisible(true);
colorFon=getContentPane();//цвет фона а именно JFrame можно задать создав контейнер
colorFon.setLayout(null);
colorFon.setBackground(Color.BLACK);
Timer timer = new Timer(30, new MyActionListener());
timer.start();
}
public static void main(String[] args)
{
Test3 app = new Test3();
}
}
|