Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Флейм (http://www.flasher.ru/forum/forumdisplay.php?f=53)
-   -   Буферизация в java (http://www.flasher.ru/forum/showthread.php?t=213908)

D12 22.02.2017 02:46

Буферизация в 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();
        }
}



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

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