2012-07-13 206 views
1

我正在嘗試製作隨機像素的圖像。我寫了這個代碼,但沒有用處 LadderSnack.java隨機像素的圖像

import java.awt.*; 
import java.awt.image.BufferStrategy; 
import java.awt.image.BufferedImage; 
import java.awt.image.DataBufferInt; 
import javax.swing.*; 

public class LadderSnack extends Canvas implements Runnable { 
    public static JFrame frame = new JFrame("EmiloLadderSnack v. 1.0"); 
    public static int width = Toolkit.getDefaultToolkit().getScreenSize().width, height = Toolkit.getDefaultToolkit().getScreenSize().height; 
    public boolean run = false; 
    public Thread thread; 
    public BufferedImage img; 
    public int[] pixels; 
    public Screen screen; 

    public LadderSnack() { 
     screen = new Screen(width, height); 
     img = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR); 
     pixels = ((DataBufferInt) img.getRaster().getDataBuffer()).getData(); 
    } 

    public void start() { 
     if (run) 
      return; 
     run = true; 
     thread = new Thread(this); 
     thread.start(); 
    } 

    public void stop() { 
     if (!run) 
      return; 
     try { 
      thread.join(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      System.exit(0); 
     } 
    } 

    public void run() { 
     while (run) { 
      trick(); 
      render(); 
     } 
    } 

    private void trick() { 
    } 

    private void render() { 
     screen = new Screen(width, height); 
     BufferStrategy bs = this.getBufferStrategy(); 
     if (bs == null) { 
      createBufferStrategy(3); 
      return; 
     } 
     for (int i = 0; i < width * height; i++) 
      pixels[i] = screen.pixels[i]; 
     Graphics g = bs.getDrawGraphics(); 
     g.drawImage(img, 0, 0, width, height, null); 
     g.dispose(); 
     bs.show(); 
    } 

    public static void main(String[] args) { 
     LadderSnack ladderSnack = new LadderSnack(); 

     frame.setSize(width, height); 
     frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE); 
     frame.add(ladderSnack); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 

     ladderSnack.start(); 
    } 
} 

Render.java

public class Render { 

public int width, height; 
    public int[] pixels; 

    public Render(int width, int height) { 
     this.width = width; 
     this.height = height; 
     pixels = new int[width * height]; 
    } 

    public void draw(Render render, int xOffset, int yOffset) { 
     int xPixel, yPixel, y, x; 
     for (x = 0; x < width; x++) { 
      xPixel = x + xOffset; 
      for (y = 0; y < height; y++) { 
       yPixel = y + yOffset; 
       pixels[xPixel + yPixel * width] = render.pixels[xPixel + yPixel * width]; 
      } 
     } 
    } 
} 

Screen.java

import java.awt.Toolkit; 
import java.util.Random; 

public class Screen extends Render { 

    private Render test; 

    public Screen(int width, int height) { 
     super(width, height); 
     int i; 
     Random rand = new Random(); 
     test = new Render(Toolkit.getDefaultToolkit().getScreenSize().width, Toolkit.getDefaultToolkit().getScreenSize().height); 
     for (i = 0; i < width * height; i++) 
      pixels[i] = rand.nextInt(); 
    } 

    public void render() { 
     draw(test, 0, 0); 
    } 
} 

在運行時

public void render() { 
    draw(test, 50, 50); 
} 
在Screen.java

從不執行移動我想要的圖像通過幀移動圖像 ,作爲步驟,使動畫和動畫隨機像素的圖像。請幫幫我。

+0

** LadderSnack.java ** – RofaelEmil 2012-07-14 08:02:00

回答

0

LadderSnack.java

import java.awt.*; 
import java.awt.image.BufferStrategy; 
import java.awt.image.BufferedImage; 
import java.awt.image.DataBufferInt; 
import javax.swing.*; 

public class LadderSnack extends Canvas implements Runnable { 
    public static JFrame frame = new JFrame("EmiloLadderSnack v. 1.0"); 
    public static int width = Toolkit.getDefaultToolkit().getScreenSize().width, height = Toolkit.getDefaultToolkit().getScreenSize().height; 
    public boolean run = false; 
    public Thread thread; 
    public BufferedImage img; 
    public int[] pixels; 
    public Screen screen; 

    public LadderSnack() { 
     screen = new Screen(width, height); 
     img = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR); 
     pixels = ((DataBufferInt) img.getRaster().getDataBuffer()).getData(); 
    } 

    public void start() { 
     if (run) 
      return; 
     run = true; 
     thread = new Thread(this); 
     thread.start(); 
    } 

    public void stop() { 
     if (!run) 
      return; 
     try { 
      thread.join(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      System.exit(0); 
     } 
    } 

    public void run() { 
     while (run) { 
      trick(); 
      render(); 
     } 
    } 

    private void trick() { 
    } 

    private void render() { 
     BufferStrategy bs = this.getBufferStrategy(); 
     if (bs == null) { 
      createBufferStrategy(3); 
      return; 
     } 
     for (int i = 0; i < width * height; i++) 
      pixels[i] = screen.pixels[i]; 
     Graphics g = bs.getDrawGraphics(); 
     g.drawImage(img, 0, 0, width, height, null); 
     g.dispose(); 
     bs.show(); 
    } 

    public static void main(String[] args) { 
     LadderSnack ladderSnack = new LadderSnack(); 

     frame.setSize(width, height); 
     frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE); 
     frame.add(ladderSnack); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 

     ladderSnack.start(); 
    } 
} 

Render.java

public class Render { 


public int width, height; 
    public int[] pixels; 

    public Render(int width, int height) { 
     this.width = width; 
     this.height = height; 
     pixels = new int[width * height]; 
    } 

    public void draw(Render render, int xOffset, int yOffset) { 
     int xPixel, yPixel, y, x; 
     for (x = 0; x < render.width; x++) { 
      xPixel = x + xOffset; 
      for (y = 0; y < render.height; y++) { 
       yPixel = y + yOffset; 
       pixels[xPixel + yPixel * width] = render.pixels[xPixel-xOffset + (yPixel-yOffset) * render.width]; 
      } 
     } 
    } 
} 

Screen.java

import java.awt.Toolkit; 
import java.util.Random; 

public class Screen extends Render { 
    private Render test; 

    public Screen(int width, int height) { 
     super(width, height); 
     int i; 
     Random rand = new Random(); 
     test = new Render(333,333);//Toolkit.getDefaultToolkit().getScreenSize().width, Toolkit.getDefaultToolkit().getScreenSize().height); 
     for (i = 0; i < 333 * 333; i++) 
      test.pixels[i] = rand.nextInt(); 
     render(); 
    } 

    public void render() { 
     draw(test, 50, 50); 
    } 
} 
1

你的代碼是一團糟。這裏是你可能想看看出來的東西:Painting pixels images in Java

,這裏是問題:

  • private void LadderSnack()我想這應該是如此,應書面構造private LadderSnack()

  • Runnable實現應該再想一想。避免使用while(true){},而是使用while(true) {Thread.sleep(xxx)}來避免您的應用程序凍結。

  • 您創建一個pixels隨機值數組,但隨後使用pixels = ((DataBufferInt) img.getRaster().getDataBuffer()).getData();,它們覆蓋您的值與任何在databuffer中的值。

  • 您從不使用pixels陣列。

  • 我認爲你應該檢討整個概念。