?? missile.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 + -