|
|
|||||
меценат
|
Буферизация в java
Доброго времени суток, вы уж простите меня, никак не мог определится в каком разделе спросить.
Задумал я немножечко в java поковыряться, может что смогу воплотить ) Помню такой подход был раньше на бейсиках и ассемблере, когда рисунок загоняли в буфер обмена и потом творили на экране с ним все что угодно. Если есть знатоки, может поможете как этот код поправить чтобы картинка забегала как надо 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); } } Вроде загнать в буфер обмена получилось, теперь как его заставить двигаться ? 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 минуты Однако, ничего не понятно но он двигается ) И еще нашел как цвет фона задать. теперь надо посмотреть как заставить его двигаться программно. 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(); } } Ох ) теперь мы движемся с отскоком от стенок ) 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(); } }
__________________
Безвыходных положений небывает © Барон Мюнхаузен=)Исходники Последний раз редактировалось D12; 24.02.2017 в 21:29. |
Часовой пояс GMT +4, время: 07:10. |
|
« Предыдущая тема | Следующая тема » |
|
|