⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 missile.java~1~

📁 手机上一个坦克游戏
💻 JAVA~1~
字号:
package demo;

/**
 * <p>Title: </p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2003</p>
 * <p>Company: </p>
 * @author not attributable
 * @version 1.0
 */

import java.io.IOException;
import java.io.PrintStream;
import javax.microedition.lcdui.*;
import net.jscience.util.MathFP;

public class Missile
    implements Runnable {

    //导弹的速率
    private boolean isMain;
    private int speed;
    public int demage;
    //得到导弹发射装置的发射角度
    private int angle;
    private Image pic; //导弹的图片
    private Thread ctlThread;
    public BattleField battleCanvas;
    public Tank tank; //归属的坦克类
    public int direction;
    public boolean isCrash; //是否爆炸
    private Image img;
    private int barrelEndX; //导弹发射装置末尾的x坐标
    private int barrelEndY; //导弹发射装置末尾的y坐标
    public int m_x; //导弹的x坐标
    public int m_y; //导弹的y坐标
    public int attackRadius;
    static final int s = MathFP.toFP("0.0174532");

    // 以下是一些中间计算用的变量
    int m;
    int f;
    int c;
    int t;
    int j;
    int q;
    int p;
    int d;

    public Missile(Tank e1, BattleField d1, boolean main, int angle_add) throws // e1 是发射的坦克
        ArrayIndexOutOfBoundsException {

        //toFP("0.1")
        m = MathFP.toFP("0.1");
        //toFP(0.1")
        f = MathFP.toFP("0.1");

        //System.out.println("init f: " + f);
        //toFP("9.82")
        c = MathFP.toFP("9.82");
        //System.out.println("init c:" + c);
        //toFP(0.5")
        t = MathFP.toFP("0.5");
        //System.out.println("init t:" + t);
        isMain = main;
        tank = (Tank) e1; //它是为那个坦克创建,并把创建者得到
        pic = creatMisslePic(); //Create Image
        direction = tank.direction;
        demage = ( (Tank) e1).basicDamage;
        attackRadius = tank.attackRadius;
        battleCanvas = d1; //pass thought the dl(may be the environment)
        speed = tank.speed; //导弹的速率
        angle = tank.angle + angle_add; //得到炮管的发射角度
        barrelEndX = tank.tank_x + tank.direction * 8;
        barrelEndY = tank.tank_y - 8;
        //System.out.println("tank.tank_x = " + tank.tank_x);
        //System.out.println("tank.tank_y = " + tank.tank_y);
        //System.out.println("tank.dir = " + tank.direction);
        setMissleX(tank.tank_x + tank.direction * 8); //炮管末尾的x坐标
        setMissleY(tank.tank_y - 8); //炮管末尾的y坐标
        //System.out.println("m_x = " + m_x);
        //System.out.println("m_y = " + m_y);
        //j = 角度* 0.0174532
        j = MathFP.mul(MathFP.toFP(angle), s);
        //q = cos(j)
        q = MathFP.cos(j);
        //p = sin(j)
        p = MathFP.sin(j);
        //d = toFP(l)速率
        d = MathFP.toFP(speed);

        ctlThread = new Thread(this); // 开始一个导弹线程
        ctlThread.start();
    }

    public Image creatMisslePic() {
        try {
            img = Image.createImage("/demo/res/bullet.png");
        }
        catch (IOException ioexception) {
            ioexception.printStackTrace();
        }
        return img;
    }

    //设置导弹发射装置末尾的x坐标
    public void setMissleX(int i1) {
        m_x = i1;
    }

    //设置导弹发射装置末尾的y坐标
    public void setMissleY(int i1) {
        m_y = i1;
    }

    //得到导弹x坐标
    /*public int getMissleX() {
        return m_x;
    }

    //得到导弹的y坐标
    public int getMissleY() {
        return m_y;
    }*/

    //导弹坐标确定公式
    // 速率 velocity 角度 angle 系数 f
    //x = velocity * cos(angle) * f
    //tmp = velocity * sin(angle)*f - 0.5*9.85*f*f
    //y = tmp - 2*tmp + 原始y坐标
    //f = f + 0.1
    public void run() throws NullPointerException {
        //System.out.println("missile run!");
        while (!isCrash) {
            if (m_x < battleCanvas.MAP_WIDTH && m_x > 0 &&
                m_y > 0 && m_y < battleCanvas.screen_h) { // 在地图范围内
                //System.out.println("in map!!!!!!!");
                if (!battleCanvas.isClision(this)) { //如果没有碰到任何东西,也就是不爆炸
                    //System.out.println("d: " + d + "q: " + q + " t : " + "f: " + f + t + " p: " + p);
                    if (tank.direction == 1) { //向右
                        //i1 = 速率* cos(角度)*f
                        int i1 = MathFP.mul(MathFP.mul(d, q), f); // f = MathFP.toFP("0.1");q = cos(角度* 0.0174532);d = MathFP.toFP(speed);
                        int new_x = MathFP.toInt(i1) + barrelEndX; //确定x坐标
                        //System.out.println("right m_x = " + m_x);
                        if (new_x >
                            battleCanvas.screen_w * 3 / 4 -
                            battleCanvas.SCREEN_X &&
                            -battleCanvas.SCREEN_X <
                            battleCanvas.MAP_WIDTH - battleCanvas.screen_w) {
                            //System.out.println("need translate m_x = " + m_x);
                            int trans = - (new_x - m_x);
                            //System.out.println("right trans = " + trans);
                            battleCanvas.setTranslateX(trans);

                        }
                        m_x = new_x;
                    }
                    if (tank.direction == -1) { //向左
                        //j1 = 速率* cos(角度)*f
                        int j1 = MathFP.mul(MathFP.mul(d, q), f);
                        //System.out.println("j1: " + j1 + " t : " + t + " p: " + p);
                        int new_x = barrelEndX - MathFP.toInt(j1);
                        if (new_x <
                            -battleCanvas.SCREEN_X + battleCanvas.screen_w / 4 &&
                            battleCanvas.SCREEN_X < 0) {
                            //System.out.println("left m_x = " + m_x);
                            int trans = - (new_x - m_x);
                            battleCanvas.setTranslateX(trans);

                        }
                        m_x = new_x;
                    }
                    //k1 = 速率*sin(角度)*f  - 0.5*9.82*f*f
                    int k1 = MathFP.sub(MathFP.mul(MathFP.mul(d, p), f),
                                        MathFP.mul(t,
                        MathFP.mul(c, MathFP.mul(f, f))));

                    k1 = (MathFP.toInt(k1) - 2 * MathFP.toInt(k1)) + barrelEndY;
                    int new_y = k1;
                    if(new_y < m_y){ // 向上
                        if (new_y <
                            battleCanvas.screen_h / 4 - battleCanvas.SCREEN_Y &&
                            battleCanvas.SCREEN_Y > 0) {
                            battleCanvas.setTranslateY(Math.min(m_y - new_y,
                                - (battleCanvas.MAP_HEIGHT -
                                   battleCanvas.screen_h))
                                );
                        }
                    }else{ // 向下
                        if (new_y >
                            battleCanvas.screen_h * 3 / 4 -
                            battleCanvas.SCREEN_Y &&
                            -battleCanvas.SCREEN_Y <=
                            battleCanvas.MAP_HEIGHT - battleCanvas.screen_h) {
                            battleCanvas.setTranslateY( -Math.min(new_y - m_y,
                                  battleCanvas.MAP_HEIGHT -
                                  battleCanvas.screen_h + battleCanvas.SCREEN_Y));
                        }
                    }
                    m_y = new_y;
                    //f = f + 0.1
                    f = MathFP.add(f, m);

                }
                else {
                    //在现在的屏幕范围内爆炸,不再画弹头了
                    isCrash = true;
                }
            }
            else { //超出了屏幕范围

                //System.out.println("out out out map!!!!!!!");
                isCrash = true;
            }

            if (isCrash) { // 如果已经爆炸了
                if (m_x < battleCanvas.MAP_WIDTH && m_x >= 0 &&
                    m_y > 0 && m_y < battleCanvas.screen_h) {
                    battleCanvas.crash.addElement(new Animation(battleCanvas, 3,
                        "/demo/res/explosion/explosion", 12, this));
                }
                else {
                    battleCanvas.repaint(0, 0, battleCanvas.MAP_WIDTH,
                                         battleCanvas.screen_h);
                }

                if (isMain && !tank.userName.equals(battleCanvas.userName)) { // 如果是主导弹,并且不是自己发的,控制战场;
                    //System.out.println("before main missile set next Tank!!!!!");
                    try {
                        ctlThread.sleep(50L);
                    }
                    catch (InterruptedException ex) {
                        ex.printStackTrace();
                    }


                    battleCanvas.now = battleCanvas.nextTank();
                    //System.out.println("***********init tank_x************ " +
                                      // battleCanvas.now.tank_x);
                    //System.out.println("***********init tank_y************ " +
                                      // battleCanvas.now.tank_y);
                    battleCanvas.now.setInit();
                    if (battleCanvas.now.userName.equals(battleCanvas.userName)) {
                      // System.out.println(
                           //"missile set GAME_VIEW!!!!!!!!!!!!!!!!!!!!!!!!!!!");
                       battleCanvas.gameStatus = battleCanvas.GAME_VIEW;
                   }
                   else {
                       //System.out.println(
                           //"missile set GAME_OTHERS!!!!!!!!!!!!!!!!!!!!!!!!!!!");
                       battleCanvas.gameStatus = battleCanvas.GAME_OTHERS;
                   }

                    battleCanvas.sentMissile = false; //发射导弹标志位设置为false

                    if (battleCanvas.now.tank_x > battleCanvas.screen_w / 2 &&
                        battleCanvas.now.tank_x <
                        battleCanvas.MAP_WIDTH - battleCanvas.screen_w / 2) { //滚屏
                        battleCanvas.scrollScreenX(battleCanvas.now.tank_x -
                                                  battleCanvas.screen_w / 2);

                    }
                    else {
                        if (battleCanvas.now.tank_x < battleCanvas.screen_w / 2) {
                            battleCanvas.scrollScreenX(0);
                        }
                        if (battleCanvas.now.tank_x >
                            battleCanvas.MAP_WIDTH - battleCanvas.screen_w / 2) {
                            battleCanvas.scrollScreenX(battleCanvas.MAP_WIDTH -
                                battleCanvas.screen_w);
                        }

                    }
                    //攻击力$导弹个数$攻击范围$移动力$  改回原来被修改的值
                    battleCanvas.repaint(0, 0, battleCanvas.MAP_WIDTH,
                                         battleCanvas.screen_h);
                    battleCanvas.serviceRepaints();
                    return;
                }
            }

            battleCanvas.repaint(0, 0, battleCanvas.MAP_WIDTH,
                                 battleCanvas.screen_h);
            battleCanvas.serviceRepaints();
        }
    }

    //画出导弹
    public void paint(Graphics g1) {
        if (!isCrash) {
            //System.out.println("paint missile in " + isMain);
            g1.drawImage(img, m_x, m_y, 20);
        }
    }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -