我即将完成一个程序,该程序使用JFrame和JTextField(不涉及j3d)打印出一个3D框的循环。
我希望能够点击一个方框,它会提供有关该方框的具体信息(例如方框编号,简短说明等)。这纯粹是为了修行目的。
下面我有一个关于我的程序的截图[编辑:没关系它因为缺乏声誉而让我失望]和我的屏幕课程,它完成了程序的大部分繁重工作。我有很多代码,所以如果有人想要任何具体的东西,请告诉我。
public class Screen extends JPanel implements KeyListener, MouseListener, MouseMotionListener, MouseWheelListener{
static ArrayList<Box3D> Boxes3D = new ArrayList<Box3D>();
static ArrayList<Cube> Cubes = new ArrayList<Cube>();
static ArrayList<Trapezoid> Traps = new ArrayList<Trapezoid>();
static ArrayList<BigTrapezoid> BTraps = new ArrayList<BigTrapezoid>();
static Box3DObject PolygonOver = null;
Robot r;
//Change starting location of center-cross
static double[] ViewFrom = new double[] { 80, 200, 100},
ViewTo = new double[] {0, 0, 0},
LightDir = new double[] {1, 1, 1};
//Only change MovementSpeed if desired
static double zoom = 1000, MinZoom = 500, MaxZoom = 1500, MouseX = 0, MouseY = 0, MovementSpeed = 10;
double drawFPS = 0, MaxFPS = 1000, SleepTime = 1000.0/MaxFPS, LastRefresh = 0, StartTime = System.currentTimeMillis(), LastFPSCheck = 0, Checks = 0;
//VertLook goes from 0.999 to -0.999, minus being looking down and plus being looking up, HorLook goes round in radians
//aimSight changes the size of the center-cross. The lower HorRotSpeed or VertRotSpeed, the faster the camera will rotate in those directions
double VertLook = -0.999, HorLook = -1.57, aimSight = 4, HorRotSpeed = 800, VertRotSpeed = 800, SunPos = 0;
int[] NewOrder;
static boolean OutLines = true;
boolean[] Keys = new boolean[7];
long repaintTime = 0;
double step = 5.3;
//Constants
final int MAXY = 23;
final int MAXX = 28;
public Screen()
{
this.addKeyListener(this);
setFocusable(true);
this.addMouseListener(this);
this.addMouseMotionListener(this);
this.addMouseWheelListener(this);
invisibleMouse();
/*
for(int k=0;k<=MAXY;k++){
for(int i=0;i<=(MAXX-k);i++){
double x=(k/2+i)*step;
double y=k*step;
Cubes.add(new Cube(x, y, 0, 5.2, 5.2, 2.8, Color.cyan));
}
}*/
//Cubes.add(new Cube(0, 0, 0, 5.2, 5.2, 2.8, Color.cyan));
//Cubes.add(new Cube(0, 0, 0, 10, 10, 2.8, Color.yellow));
/*
Cube(x Plane location,y Plane location,z Plane location,x size,y size,z size, color)
This is the same for Trapezoid and BigTrapezoid constructors
The x,y,z Plane locations are the starting points for the objects
*/
for(int k=0;k<=MAXY/2;k++){
for(int i=MAXX/2;i<=MAXX-k;i++){
Cubes.add(new Cube((i)*step,k*2*step,0,5.2,5.2,2.8,Color.cyan));
Cubes.add(new Cube((i)*step-step/2,k*2*step+step,0,5.2,5.2,2.8,Color.cyan));
}
}
for(int k=0;k<=MAXY/2;k++){
for(int i=MAXX/2;i>=0+k;i--){
Cubes.add(new Cube((i)*step,k*2*step,0,5.2,5.2,2.8,Color.cyan));
Cubes.add(new Cube((i)*step+step/2,k*2*step+step,0,5.2,5.2,2.8,Color.cyan));
}
}
Traps.add(new Trapezoid(-2.65,0,2.9,159,127.2,-66.8,Color.white));
BTraps.add(new BigTrapezoid(-2.65,0,3.9,159.127,127.2,-68.8,Color.white));
}
public void paintComponent(Graphics g)
{
//Clear screen and draw background color
g.setColor(new Color(140, 180, 180));
g.fillRect(0, 0, (int)Box3DApp.ScreenSize.getWidth(), (int)Box3DApp.ScreenSize.getHeight());
CameraMovement();
//Calculated all that is general for this camera position
Calculator.SetPrederterminedInfo();
//Updates each polygon for this camera position
for(int i = 0; i < Boxes3D.size(); i++)
Boxes3D.get(i).updatePolygon();
//Set drawing order so closest polygons gets drawn last
setOrder();
//Set the polygon that the mouse is currently over
setPolygonOver();
//draw polygons in the Order that is set by the 'setOrder' function
for(int i = 0; i < NewOrder.length; i++)
Boxes3D.get(NewOrder[i]).DrawablePolygon.drawPolygon(g);
//draw the cross in the center of the screen
drawMouseAim(g);
//Message display
g.drawString("FPS: " + (int)drawFPS + " (Benchmark)", 40, 40);
g.drawString("To Zoom Press:",40,60);
g.drawString("-W for in",40,80);
g.drawString("-S for out",40,100);
g.drawString("To Move Press:",40,120);
g.drawString("-A to move left",40,140);
g.drawString("-D to move right", 40,160);
g.drawString("-E to move up", 40,180);
g.drawString("-Q to move down", 40,200);
g.drawString("To Move Automatically:", 40,220);
g.drawString("-1 to move", 40,240);
g.drawString("-2 to stop", 40,260);
SleepAndRefresh();
}
void setOrder()
{
double[] k = new double[Boxes3D.size()];
NewOrder = new int[Boxes3D.size()];
for(int i=0; i<Boxes3D.size(); i++)
{
k[i] = Boxes3D.get(i).AvgDist;
NewOrder[i] = i;
}
double temp;
int tempr;
for (int a = 0; a < k.length-1; a++)
for (int b = 0; b < k.length-1; b++)
if(k[b] < k[b + 1])
{
temp = k[b];
tempr = NewOrder[b];
NewOrder[b] = NewOrder[b + 1];
k[b] = k[b + 1];
NewOrder[b + 1] = tempr;
k[b + 1] = temp;
}
}
void invisibleMouse()
{
Toolkit toolkit = Toolkit.getDefaultToolkit();
BufferedImage cursorImage = new BufferedImage(1, 1, BufferedImage.TRANSLUCENT);
Cursor invisibleCursor = toolkit.createCustomCursor(cursorImage, new Point(0,0), "InvisibleCursor");
setCursor(invisibleCursor);
}
void drawMouseAim(Graphics g)
{
g.setColor(Color.black);
g.drawLine((int)(Box3DApp.ScreenSize.getWidth()/2 - aimSight), (int)(Box3DApp.ScreenSize.getHeight()/2), (int)(Box3DApp.ScreenSize.getWidth()/2 + aimSight), (int)(Box3DApp.ScreenSize.getHeight()/2));
g.drawLine((int)(Box3DApp.ScreenSize.getWidth()/2), (int)(Box3DApp.ScreenSize.getHeight()/2 - aimSight), (int)(Box3DApp.ScreenSize.getWidth()/2), (int)(Box3DApp.ScreenSize.getHeight()/2 + aimSight));
}
void SleepAndRefresh()
{
long timeSLU = (long) (System.currentTimeMillis() - LastRefresh);
Checks ++;
if(Checks >= 15)
{
drawFPS = Checks/((System.currentTimeMillis() - LastFPSCheck)/1000.0);
LastFPSCheck = System.currentTimeMillis();
Checks = 0;
}
if(timeSLU < 1000.0/MaxFPS)
{
try {
Thread.sleep((long) (1000.0/MaxFPS - timeSLU));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
LastRefresh = System.currentTimeMillis();
repaint();
}
void CameraMovement()
{
Vector ViewVector = new Vector(ViewTo[0] - ViewFrom[0], ViewTo[1] - ViewFrom[1], ViewTo[2] - ViewFrom[2]);
double xMove = 0, yMove = 0, zMove = 0;
Vector HorizontalVector = new Vector (0, 0, 1);
Vector VerticalVector = new Vector (0,1,0);
Vector SideViewVector = ViewVector.CrossProduct(HorizontalVector);
Vector FrontViewVector = ViewVector.CrossProduct(VerticalVector);
//w key (zoom in)
if(Keys[0])
{
xMove += ViewVector.x ;
yMove += ViewVector.y ;
zMove += ViewVector.z ;
}
//s key (zoom out)
if(Keys[2])
{
xMove -= ViewVector.x ;
yMove -= ViewVector.y ;
zMove -= ViewVector.z ;
}
//a key (move left)
if(Keys[1])
{
xMove += SideViewVector.x ;
yMove += SideViewVector.y ;
zMove += SideViewVector.z ;
}
//d key (move right)
if(Keys[3])
{
xMove -= SideViewVector.x ;
yMove -= SideViewVector.y ;
zMove -= SideViewVector.z ;
}
//q key (move down)
if(Keys[4])
{
zMove -= FrontViewVector.z ;
}
//e key (move up)
if(Keys[5])
{
zMove += FrontViewVector.z ;
}
//1 & 2 key (move right automatic and stop)
if(Keys[6])
{
xMove += SideViewVector.x ;
yMove += SideViewVector.y ;
}
Vector MoveVector = new Vector(xMove, yMove, zMove);
MoveTo(ViewFrom[0] + MoveVector.x * MovementSpeed, ViewFrom[1] + MoveVector.y * MovementSpeed, ViewFrom[2] + MoveVector.z * MovementSpeed);
}
void MoveTo(double x, double y, double z)
{
ViewFrom[0] = x;
ViewFrom[1] = y;
ViewFrom[2] = z;
updateView();
}
void setPolygonOver()
{
PolygonOver = null;
for(int i = NewOrder.length-1; i >= 0; i--)
if(Boxes3D.get(NewOrder[i]).DrawablePolygon.MouseOver() && Boxes3D.get(NewOrder[i]).draw
&& Boxes3D.get(NewOrder[i]).DrawablePolygon.visible)
{
PolygonOver = Boxes3D.get(NewOrder[i]).DrawablePolygon;
break;
}
}
void MouseMovement(double NewMouseX, double NewMouseY)
{
double difX = (NewMouseX - Box3DApp.ScreenSize.getWidth()/2);
double difY = (NewMouseY - Box3DApp.ScreenSize.getHeight()/2);
difY *= 6 - Math.abs(VertLook) * 5;
VertLook -= difY / VertRotSpeed;
HorLook += difX / HorRotSpeed;
if(VertLook>0.999)
VertLook = 0.999;
if(VertLook<-0.999)
VertLook = -0.999;
updateView();
}
void updateView()
{
double r = Math.sqrt(1 - (VertLook * VertLook));
ViewTo[0] = ViewFrom[0] + r * Math.cos(HorLook);
ViewTo[1] = ViewFrom[1] + r * Math.sin(HorLook);
ViewTo[2] = ViewFrom[2] + VertLook;
}
void CenterMouse()
{
try {
r = new Robot();
r.mouseMove((int)Box3DApp.ScreenSize.getWidth()/2, (int)Box3DApp.ScreenSize.getHeight()/2);
} catch (AWTException e) {
e.printStackTrace();
}
}
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_W)
Keys[0] = true;
if(e.getKeyCode() == KeyEvent.VK_A)
Keys[1] = true;
if(e.getKeyCode() == KeyEvent.VK_S)
Keys[2] = true;
if(e.getKeyCode() == KeyEvent.VK_D)
Keys[3] = true;
if(e.getKeyCode() == KeyEvent.VK_Q)
Keys[4] = true;
if(e.getKeyCode() == KeyEvent.VK_E)
Keys[5] = true;
if(e.getKeyCode() == KeyEvent.VK_1)
Keys[6] = true;
if(e.getKeyCode() == KeyEvent.VK_ESCAPE)
System.exit(0);
}
public void keyReleased(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_W)
Keys[0] = false;
if(e.getKeyCode() == KeyEvent.VK_A)
Keys[1] = false;
if(e.getKeyCode() == KeyEvent.VK_S)
Keys[2] = false;
if(e.getKeyCode() == KeyEvent.VK_D)
Keys[3] = false;
if(e.getKeyCode() == KeyEvent.VK_Q)
Keys[4] = false;
if(e.getKeyCode() == KeyEvent.VK_E)
Keys[5] = false;
if(e.getKeyCode() == KeyEvent.VK_2)
Keys[6] = false;
}
public void keyTyped(KeyEvent e) {
}
public void mouseDragged(MouseEvent arg0) {
MouseMovement(arg0.getX(), arg0.getY());
MouseX = arg0.getX();
MouseY = arg0.getY();
CenterMouse();
}
public void mouseMoved(MouseEvent arg0) {
MouseMovement(arg0.getX(), arg0.getY());
MouseX = arg0.getX();
MouseY = arg0.getY();
CenterMouse();
}
public void mouseClicked(MouseEvent arg0) {
}
public void mouseEntered(MouseEvent arg0) {
}
public void mouseExited(MouseEvent arg0) {
}
public void mousePressed(MouseEvent arg0) {
/*
if(arg0.getButton() == MouseEvent.BUTTON1)
if(PolygonOver != null)
//PolygonOver.
//PolygonOver.Transparent = false;
if(arg0.getButton() == MouseEvent.BUTTON3)
if(PolygonOver != null)
//PolygonOver.Transparent = true;
*/
}
public void mouseReleased(MouseEvent arg0) {
}
public void mouseWheelMoved(MouseWheelEvent arg0) {
if(arg0.getUnitsToScroll()>0)
{
if(zoom > MinZoom)
zoom -= 25 * arg0.getUnitsToScroll();
}
else
{
if(zoom < MaxZoom)
zoom -= 25 * arg0.getUnitsToScroll();
}
}
}