Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flasher.ru > Флейм

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 22.02.2017, 02:46
D12 вне форума Посмотреть профиль Отправить личное сообщение для D12 Найти все сообщения от D12
  № 1  
Ответить с цитированием
D12
меценат
 
Аватар для D12

блогер
Регистрация: Jan 2004
Адрес: D
Сообщений: 1,592
Записей в блоге: 2
По умолчанию Буферизация в 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();
	}
}
__________________
Безвыходных положений небывает © Барон Мюнхаузен=)Исходники


Последний раз редактировалось D12; 24.02.2017 в 21:29.
Создать новую тему Ответ Часовой пояс GMT +4, время: 13:57.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 13:57.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.