我写的一个小坦克程序,但发现它运行起来比较慢,请各位给点建议。运行程序后,点击start按钮,再用鼠标点击一下画面中间,然后按下上下左右箭头键就可以让坦克动起来。
程序名为Tank.java,只有一个文件。因为太长,无法一次贴完,所以分两次发出。
--------------------------------------
import java.util.*;
import java.applet.*;
import java.awt.event.*;
import java.awt.*;
import java.awt.image.*;
import javax.swing.*;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.Color;
import java.io.*;
import java.lang.Math.*;
import java.text.DecimalFormat;
class OneTank {
//坦克的长度
double tank_length = 30;
// 坦克的宽度
double tank_width = 20;
//履带的宽度
double panel_width = 6;
// 坦克中心部分的宽度
double core_width = tank_width - panel_width;
// 坦克中心部分的长度
double core_length = tank_length * 0.75;
// 坦克炮管的长度
double canon_length = tank_length / 2;
//坦克炮管的宽度
double canon_width = 4;
//----------------
// 坦克所处的中心位置
double[] center;
//坦克旋转的角度
double angle;
// 敌我双方的哪一方
String side;
//坦克颜色
Color color;
//坦克速度
double speed;
//坦克生命值
double value;
double[] pt1, pt2, pt3, pt4, pt5, pt6, pt7, pt8, pt9, pt10, pt11, pt12, pt13, pt14, pt15, pt16;
OneTank() {
}
void draw(Graphics g, Color c) {
Graphics2D d2=(Graphics2D)g;
d2.setColor(c);
/*
AffineTransform at=new AffineTransform();
at.setToIdentity();
at.translate((int) center[0], (int)center[1]);
at.rotate(angle);
d2.setTransform(at);
*/
d2.drawLine((int) pt1[0], (int)pt1[1], (int) pt2[0], (int)pt2[1]);
d2.drawLine((int) pt2[0], (int)pt2[1], (int) pt4[0], (int)pt4[1]);
d2.drawLine((int) pt4[0], (int)pt4[1], (int) pt3[0], (int)pt3[1]);
d2.drawLine((int) pt3[0], (int)pt3[1], (int) pt1[0], (int)pt1[1]);
d2.drawLine((int) pt5[0], (int)pt5[1], (int) pt7[0], (int)pt7[1]);
d2.drawLine((int) pt7[0], (int)pt7[1], (int) pt8[0], (int)pt8[1]);
d2.drawLine((int) pt8[0], (int)pt8[1], (int) pt6[0], (int)pt6[1]);
d2.drawLine((int) pt6[0], (int)pt6[1], (int) pt5[0], (int)pt5[1]);
d2.drawLine((int) pt10[0], (int)pt10[1], (int) pt9[0], (int)pt9[1]);
d2.drawLine((int) pt9[0], (int)pt9[1], (int) pt11[0], (int)pt11[1]);
d2.drawLine((int) pt11[0], (int)pt11[1], (int) pt12[0], (int)pt12[1]);
d2.drawLine((int) pt12[0], (int)pt12[1], (int) pt10[0], (int)pt10[1]);
//炮管
d2.drawLine((int) pt13[0], (int)pt13[1], (int) pt14[0], (int)pt14[1]);
d2.drawLine((int) pt14[0], (int)pt14[1], (int) pt15[0], (int)pt15[1]);
d2.drawLine((int) pt15[0], (int)pt15[1], (int) pt16[0], (int)pt16[1]);
d2.drawLine((int) pt16[0], (int)pt16[1], (int) pt13[0], (int)pt13[1]);
}
}
class TankSys extends JFrame implements ActionListener, KeyListener{
boolean firstTimeRunning = true;
// 标志线程是否运行
boolean ThreadRunning = false;
// 目前哪一个星球是被聚焦的,默认是0号,即第一个
int WhichPlanetFocus= 0;
double PI =Math.PI;
double PI20 = PI * 2.0;
double PI05 = PI / 2.0;
double[] original_pt = new double[] {0, 0};
double final_angle, temp_angle, temp;
// 这是绘画所有运动星球图画的区域
// 初始化记录所有星球类
ArrayList<OneTank> tanks = new ArrayList<OneTank>();
// 这是在cvs上面的图像,它用于在上面画星球的图像
Image image;
// 这是image的Graphics
Graphics cvsimage, gimage;
// 获取屏幕大小
Toolkit kit = Toolkit.getDefaultToolkit();
Dimension screenSize = kit.getScreenSize();
// 屏幕宽度
int swidth = screenSize.width;
// 屏幕高度
int sheight = screenSize.height;
// 屏幕中心位置
int ScreenCenterx = (int)(swidth / 2);
int ScreenCentery = (int)(sheight / 2);
// 这是用鼠标点击屏幕所获得的绘画中心的偏移量
int CenterOffsetx = ScreenCenterx;
int CenterOffsety = ScreenCentery;
Canvas cvs;
// 这是cvs的大小
int cvsw = swidth;
int cvsh = sheight - 100;