/**
*
* @author yangshuohao
*/
public class Stars3D
{
private final float m_spread;
private final float m_speed;
private final float m_starX[];
private final float m_starY[];
private final float m_starZ[];
public Stars3D(int numStars,float spread,float speed)
{
m_spread=spread;
m_speed=speed;
m_starX=new float[numStars];
m_starY=new float[numStars];
m_starZ=new float[numStars];
for(int i=0;i<m_starX.length;i++)
{
InitStar(i);
}
}
private void InitStar(int i)
{
m_starX[i]=2 * ((float)Math.random()-0.5f)*m_spread;
m_starY[i]=2 * ((float)Math.random()-0.5f)*m_spread;
m_starZ[i]=((float)Math.random()+0.00001f)*m_spread;
}
public void UpdateAndRender(Bitmap target,float delta)
{
target.Clear((byte)0x00);
float halfWidth=target.GetWidth()/2.0f;
float halfHeight=target.GetHeight()/2.0f;
for(int i=0;i<m_starX.length;i++)
{
m_starZ[i]-=delta*m_speed;
if(m_starZ[i] <=0 )
{
InitStar(i);
}
int x=(int)((m_starX[i]/m_starZ[i])*halfWidth+halfWidth);
int y=(int)((m_starY[i]/m_starZ[i])*halfHeight+halfHeight);
if(x<0 || x>=target.GetWidth() || (y<0 || y>=target.GetHeight()))
{
InitStar(i);
}
else
{
target.DrawPixel(x, y, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff);
}
}
}
}
修改Display.java
import java.awt.Canvas;
import java.awt.Graphics;
import java.awt.Dimension;
import java.awt.image.BufferedImage;
import java.awt.image.BufferStrategy;
import java.awt.image.DataBufferByte;
import javax.swing.JFrame;
/**
*
* @author yangshuohao
*/
public class Display extends Canvas
{
private final JFrame m_frame;
private final Bitmap m_frameBuffer;
private final BufferedImage m_displayImage;
private final byte[] m_displayComponents;
private final BufferStrategy m_bufferStrategy;
private final Graphics m_grGraphics;
public Bitmap GetFrameBuffer() { return m_frameBuffer; }
public Display(int width,int height,String title)
{
Dimension size=new Dimension(width,height);
setPreferredSize(size);
setMinimumSize(size);
setMaximumSize(size);
m_frameBuffer=new Bitmap(width,height);
m_displayImage=new BufferedImage(width,height,BufferedImage.TYPE_3BYTE_BGR);
m_displayComponents=((DataBufferByte)m_displayImage.getRaster().getDataBuffer()).getData();
m_frameBuffer.Clear((byte)0x80);
for(int i=0;i<100;i++)
{
m_frameBuffer.DrawPixel(100+i, 100+i, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xff);
}
m_frame=new JFrame();
m_frame.add(this);
m_frame.pack();
m_frame.setResizable(false);
m_frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
m_frame.setLocationRelativeTo(null);
m_frame.setTitle(title);
m_frame.setVisible(true);
createBufferStrategy(1);
m_bufferStrategy=getBufferStrategy();
m_grGraphics=m_bufferStrategy.getDrawGraphics();
}
public void SwapBuffers()
{
m_frameBuffer.CopyToByteArray(m_displayComponents);
m_grGraphics.drawImage(m_displayImage, 0, 0, m_frameBuffer.GetWidth()
,m_frameBuffer.GetHeight(),null);
m_bufferStrategy.show();
}
}
修改Main.java
/**
*
* @author yangshuohao
*/
public class Main
{
public static void main(String[] args)
{
Display display=new Display(800,660,"Render");
Bitmap target=display.GetFrameBuffer();
Stars3D stars=new Stars3D(4096,64.0f,20.0f);
long previousTime=System.nanoTime();
while (true)
{
long currentTime=System.nanoTime();
float delta=(float)((currentTime-previousTime)/1000000000.0);
previousTime=currentTime;
stars.UpdateAndRender(target, delta);
display.SwapBuffers();
}
}
}
结果