// 旋转坦克得到新的坐标点
double[][] rotate_tank(double[] center, double rotate_angle, double tank_length, double tank_width, double panel_width, double core_width, double core_length, double canon_length, double canon_width) {
double radium = gougu(tank_length, tank_width);
double ini_angle = -1 * (Math.atan(tank_width/tank_length) + PI/2);
double[] pt1 = new double[2];
//System.out.println("aa="+ aa);
pt1[0] = center[0] + radium * Math.cos(ini_angle + rotate_angle);
pt1[1] = center[1]+ radium * Math.sin(ini_angle + rotate_angle);
//--
double[] pt2 = new double[2];
pt2= point_and_angle(pt1, rotate_angle, panel_width);
//-----
double[] pt4 = new double[2];
pt4= point_and_angle(pt2, rotate_angle + PI05, tank_length*2.0);
//----
double[] pt3 = new double[2];
pt3= point_and_angle(pt4, rotate_angle + PI, panel_width);
//---
double[] pt5 = new double[2];
pt5 = point_and_angle(pt2, rotate_angle + PI05, tank_length-core_length);
//----
double[] pt6 = new double[2];
pt6 = point_and_angle(pt4, rotate_angle - PI05, tank_length-core_length);
//---
radium = gougu(tank_length, tank_width);
ini_angle = -1 * (PI/2 - Math.atan(tank_width/tank_length));
double[] pt10 = new double[2];
pt10[0] = center[0]+ radium * Math.cos(ini_angle + rotate_angle);
pt10[1] = center[1]+ radium * Math.sin(ini_angle + rotate_angle);
//---
double[] pt9 = new double[2];
pt9= point_and_angle(pt10, rotate_angle - PI, panel_width);
//-----
double[] pt11 = new double[2];
pt11= point_and_angle(pt9, rotate_angle+ PI05, tank_length*2.0);
//---
double[] pt12 = new double[2];
pt12= point_and_angle(pt11, rotate_angle, panel_width);
//--
double[] pt7 = new double[2];
pt7= point_and_angle(pt9, rotate_angle+ PI05, tank_length-core_length);
//--
double[] pt8 = new double[2];
pt8= point_and_angle(pt11, rotate_angle- PI05, tank_length-core_length);
//---
//炮管
double[] pt15 = new double[2];
double[] temp= point_and_angle(original_pt, rotate_angle, canon_width);
pt15[0] = center[0] + temp[0];
pt15[1] = center[1] + temp[1];
//--
double[] pt14 = new double[2];
pt14 = point_and_angle(pt15, rotate_angle - PI05, tank_length);
//---
double[] pt13 = new double[2];
pt13 = point_and_angle(pt14, rotate_angle - PI, canon_width * 2.0);
//---
double[] pt16 = new double[2];
temp= point_and_angle(original_pt, rotate_angle - PI, canon_width);
pt16[0] = center[0] + temp[0];
pt16[1] = center[1] + temp[1];
//---
double[][] re = new double[16][2];
re[0]=pt1;
re[1]=pt2;
re[2]=pt3;
re[3]=pt4;
re[4]=pt5;
re[5]=pt6;
re[6]=pt7;
re[7]=pt8;
re[8]=pt9;
re[9]=pt10;
re[10]=pt11;
re[11]=pt12;
re[12]= pt13;
re[13] = pt14;
re[14] = pt15;
re[15] = pt16;
return re;
}double gougu (double x, double y) {
return Math.sqrt(x *x + y * y);
}void forward_tank(OneTank tank) {
double[][] re= rotate_tank(tank.center, tank.angle, tank.tank_length, tank.tank_width, tank.panel_width, tank.core_width, tank.core_length, tank.canon_length, tank.canon_width);
tank.pt1=re[0];
tank.pt2=re[1];
tank.pt3=re[2];
tank.pt4=re[3];
tank.pt5=re[4];
tank.pt6=re[5];
tank.pt7=re[6];
tank.pt8=re[7];
tank.pt9=re[8];
tank.pt10=re[9];
tank.pt11=re[10];
tank.pt12=re[11];
tank.pt13 = re[12];
tank.pt14= re[13];
tank.pt15 = re[14];
tank.pt16 = re[15];}
    // 这里为了让程序有时间响应用户的操作,必须使用Thread。
    class Thread8 extends Thread {
        public void run() {
            while (true) {
                DrawTank();
            }
        }
    }    public void actionPerformed(ActionEvent e) {        if (e.getSource() == btnstart) {            // 一旦按下这个开始键,程序开始运行太阳系
            if (firstTimeRunning) {
                Thread8 t = null;
                t= new Thread8();
                // 目前哪一个星球是被聚焦的,默认是0号,即第一个
                WhichPlanetFocus= 0;
                ThreadRunning = true;
                t.start();
                } else {
                ThreadRunning = !ThreadRunning;
            }
        }
    }
}public class Tank {
    public static void main(String[] args) throws IOException {
        // 这个办法可以暂停程序以便开发者调试        JFrame dd= new TankSys();
    }
}

解决方案 »

  1.   

    之所以会运行起来慢,是因为你把操作都放到键盘监听里了,正确的做法应该是:
    创建一个全局变量:private static boolean keyDown[256];   //256个按键的状态
    键盘监听:if key Down{
    keyDown[keyCode] = true;
    }
    if key Release{
    keyDown[keyCode] = false;
    }键盘的监听里只改变状态,不进行任何操作。
    对于操作,在你的游戏线程里进行。
    例如,你可以在游戏线程里再写这样一段代码:.....
    if(keyDwon[KeyEvent.VK_UP]){
    ...}
    else if
    ...保证不卡