📄 plane2can.java
字号:
import java.io.IOException;
import java.util.Random;
import java.util.Vector;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
/*练习Vector类应用,利用Vector类实现子弹,(散发子弹)*/
public class Plane2Can extends Canvas implements Runnable {
private final int sm1 = 150,nl1 = 100;
private int defen = 0, sm = sm1, nl = nl1,
gs = 4; // 得分,生命,能量
private Image img, img1, dimg, baoimg,
timg, bImg, mimg, dbImg; // 飞机,飞机个数
// 敌机,爆炸,图表,子弹,滚动地图,敌机图片
private int x = 100, y = 200, pW = 64, pH = 42,
step = 10;// 飞机X,Y坐标, 飞机宽度,高度,移动步长
private int dx = 0, dy = 0,
dStep = 5, dmax = 20;// 敌机X,Y坐标,敌机速度,敌机最大数
private boolean up, down, left, right, fire;// 按键状态
private int bMax = 30, bStep = 15;// 设置子弹最大数和速度
private Vector bV = new Vector(); // 存放所有我机子弹
private Vector dbV = new Vector();// 存放所有敌机子弹
private Vector dV = new Vector(); // 存放所有敌机
private Vector eV = new Vector(); // 存放爆炸位置
private Random r = new Random(); // 随机数
private int mx, my, mStep = 3; // 地图坐标,地图滚动速度
public Plane2Can() {
try {
img = Image.createImage("/plane.png");
img1 = Image.createImage("/f6.png");
bImg = Image.createImage("/bullet.png");
dimg = Image.createImage("/f1.png");
baoimg = Image.createImage("/baozha.png");
mimg = Image.createImage("/skymap.png");
timg = Image.createImage("/f3.png");
dbImg = Image.createImage("/bullet_1.png");
} catch (IOException e) {
e.printStackTrace();
}
mx = 0;
my = -(mimg.getHeight() - getHeight());
new Thread(this).start();
}
protected void paint(Graphics g) {
// 画地图
g.drawImage(mimg, mx, my, g.LEFT | g.TOP);
// 画飞机
g.drawImage(img, x, y, Graphics.LEFT | Graphics.TOP);
// 画飞机
g.drawImage(timg, 0, getHeight() - 21, Graphics.LEFT | Graphics.TOP);
// 画飞机个数
for (int i = 0; i < gs; i++) {
g.drawImage(img1, 16 * i, 0, Graphics.LEFT | Graphics.TOP);
}
// //画敌机
for (int i = 0; i < dV.size(); i++) {
dddd d = (dddd) dV.elementAt(i);
for (int j = 0; j < dV.size(); j++) {
g.drawImage(dimg, d.dx, d.dy, Graphics.LEFT | Graphics.TOP);
g.setColor(0, 255, 0);
g.fillRect(d.dx + 9, d.dy - 5, d.ds, 5);
}
}
// 画爆炸
for (int i = 0; i < eV.size(); i++) {
Explode e = (Explode) eV.elementAt(i);
for (int j = 0; j < eV.size(); j++) {
g.drawImage(baoimg, e.baox, e.baoy, Graphics.LEFT
| Graphics.TOP);
}
}
// 画我机子弹
if (nl > 0 && fire == true) {
for (int i = 0; i < bV.size(); i++) {
Vector v = (Vector) bV.elementAt(i);
for (int j = 0; j < v.size(); j++) {
Bullet b = (Bullet) v.elementAt(j);
g.drawImage(bImg, b.bx, b.by, Graphics.HCENTER
| Graphics.TOP);
}
}
nl -= 3;
} else {
for (int i = 0; i < bV.size(); i++) {
Bullet b = (Bullet) bV.elementAt(i);
g.drawImage(bImg, b.bx, b.by, Graphics.HCENTER | Graphics.TOP);
}
}
// 画敌机子弹
// if(nl>0 && fire == true){
// for (int i = 0; i < bV.size(); i++) {
// Vector v = (Vector) bV.elementAt(i);
// for (int j = 0; j < v.size(); j++) {
// Bullet b = (Bullet) v.elementAt(j);
// g.drawImage(bImg, b.bx, b.by, Graphics.HCENTER | Graphics.TOP);
// }
// }
// nl -= 3;
// }else{
for (int i = 0; i < dbV.size(); i++) {
Bullet2 b = (Bullet2) dbV.elementAt(i);
g.drawImage(dbImg, b.dbx, b.dby, Graphics.HCENTER | Graphics.TOP);
}
// }
// 画得分
g.setColor(0, 255, 0);
g.drawString("得分:" + defen, getWidth() - 50, 0, Graphics.LEFT
| Graphics.TOP);
// 画生命
g.setColor(0, 255, 0);
// g.drawString("生命值:" + sm, 0, 10, Graphics.LEFT | Graphics.TOP);
g.drawRoundRect(36, getHeight() - 25, 151, 10, 8, 8);
g.drawRoundRect(36, getHeight() - 15, 101, 10, 8, 8);
g.setColor(255, 0, 0);
g.fillRoundRect(37, getHeight() - 24, sm, 9, 8, 8);
g.setColor(0, 0, 255);
g.fillRoundRect(37, getHeight() - 14, nl, 9, 8, 8);
// 画结束
if (sm <= 0 && gs <= 0) {
g.setColor(0, 0, 0);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(0, 255, 0);
g.drawString("游戏结束", getWidth() / 2, getHeight() / 2,
Graphics.HCENTER | Graphics.BASELINE);
g.drawString("得分" + defen, getWidth() / 2, getHeight() / 2 + 10,
Graphics.HCENTER | Graphics.BASELINE);
}
}
protected void keyPressed(int keyCode) {
int a = getGameAction(keyCode);
if (a == UP)
up = true;
if (a == DOWN)
down = true;
if (a == LEFT)
left = true;
if (a == RIGHT)
right = true;
if (a == FIRE)
fire = true;
}
protected void keyReleased(int keyCode) {
int a = getGameAction(keyCode);
if (a == UP)
up = false;
if (a == DOWN)
down = false;
if (a == LEFT)
left = false;
if (a == RIGHT)
right = false;
}
public void run() {
long last = 0, last1 = 0, last2 = 0, last3 = 0;
while (true) {
long now = System.currentTimeMillis();
long now1 = System.currentTimeMillis();
long now2 = System.currentTimeMillis();
long now3 = System.currentTimeMillis();
// 地图
my += mStep;
if (my >= 0)
my = -(mimg.getHeight() - getHeight());
if (now - last > 1000) {
// 敌机的随机X坐标
dx = Math.abs(r.nextInt() % getWidth());
if (dx + 48 > getWidth())
dx = dx + 48;
dy = -48;
dddd d = new dddd(dx, dy, dStep);
dV.addElement(d);
last = now;
}
// 敌机运动
for (int i = 0; i < dV.size(); i++) {
dddd d = (dddd) dV.elementAt(i);
d.dy = d.dy + dStep;
dy = d.dy;
if (d.dy > getHeight())
dV.removeElementAt(i);
}
// 敌机输出子弹
if (now3 - last3 > 1000) {
Bullet2 b = new Bullet2(dx + 24, dy + 20, 10);
dbV.addElement(b);
last3 = now3;
}
// 敌机子弹运动,循环出每个子弹,并设置坐标变化位置
for (int i = 0; i < dbV.size(); i++) {
Bullet2 b = (Bullet2) dbV.elementAt(i);
b.dby = b.dby + b.dbstep;
if (b.dby > getHeight())
dbV.removeElementAt(i);
}
// 我机输出子弹
if (nl > 0 && fire == true) {
if (now1 - last1 > 200) {
Vector v = new Vector(); // 每次增加5个子弹
for (int i = 0; i < 5; i++) {
Bullet b = new Bullet(x + pW / 2, y, 10);
v.addElement(b);
}
if (bV.size() < bMax)
bV.addElement(v);
last1 = now1;
}
} else {
if (now2 - last2 > 180) {
Bullet b = new Bullet(x + pW / 2, y, 10);
bV.addElement(b);
last2 = now2;
}
}
// 我机子弹运动,循环出每个子弹,并设置坐标变化位置
if (nl > 0 && fire == true) {
for (int i = 0; i < bV.size(); i++) {
Vector v = (Vector) bV.elementAt(i);
for (int j = 0; j < v.size(); j++) {
Bullet b = (Bullet) v.elementAt(j);
b.by = b.by - b.bstep;
b.bx = b.bx + (2 - j) * 3;
if (b.by < 0)
v.removeElementAt(j);
}
if (v.size() == 0)
bV.removeElementAt(i);
}
} else {
for (int i = 0; i < bV.size(); i++) {
Bullet b = (Bullet) bV.elementAt(i);
b.by = b.by - b.bstep;
if (b.by < 0)
bV.removeElementAt(i);
}
}
// 子弹和敌机碰撞
if (nl > 0 && fire == true) {
for (int i = 0; i < bV.size(); i++) {
Vector v = (Vector) bV.elementAt(i);
for (int j = 0; j < v.size(); j++) {
Bullet b = (Bullet) v.elementAt(j);
for (int h = 0; h < dV.size(); h++) {
dddd d = (dddd) dV.elementAt(h);
if (b.bx > d.dx - 5 && b.bx < d.dx + 48
&& b.by < d.dy + 26) {
bV.removeElementAt(i);
d.ds -= 10;
}
if (d.ds <= 0) {
dV.removeElementAt(h);
// 得分
defen += 10;
// 爆炸位置
Explode e = new Explode(d.dx, d.dy);
eV.addElement(e);
for (int k = 0; k < eV.size(); k++) {
Explode a = (Explode) eV.elementAt(k);
try {
Thread.sleep(50);
} catch (InterruptedException c) {
c.printStackTrace();
}
eV.removeElementAt(k);
}
}
}
}
}
} else {
for (int i = 0; i < bV.size(); i++) {
Bullet b = (Bullet) bV.elementAt(i);
for (int j = 0; j < dV.size(); j++) {
dddd d = (dddd) dV.elementAt(j);
if (b.bx > d.dx - 5 && b.bx < d.dx + 48
&& b.by < d.dy + 26) {
bV.removeElementAt(i);
d.ds -= 10;
}
if (d.ds <= 0) {
dV.removeElementAt(j);
// 得分
defen += 10;
// 爆炸位置
Explode e = new Explode(d.dx, d.dy);
eV.addElement(e);
for (int k = 0; k < eV.size(); k++) {
Explode a = (Explode) eV.elementAt(k);
try {
Thread.sleep(50);
} catch (InterruptedException c) {
c.printStackTrace();
}
eV.removeElementAt(k);
}
}
}
}
}
// 飞机和敌机碰撞
for (int j = 0; j < dV.size(); j++) {
dddd d = (dddd) dV.elementAt(j);
if (d.dx + 48 > x && d.dx < x + pW && d.dy > y - 26
&& d.dy < y + 21) {
dV.removeElementAt(j);
Explode e = new Explode(d.dx, d.dy);
eV.addElement(e);
for (int i = 0; i < eV.size(); i++) {
Explode a = (Explode) eV.elementAt(i);
try {
Thread.sleep(50);
} catch (InterruptedException c) {
c.printStackTrace();
}
eV.removeElementAt(i);
}
sm -= 10;
if (sm <= 0 && gs > 0) {
sm = sm1;
Explode e1 = new Explode(x, y);
eV.addElement(e1);
for (int i = 0; i < eV.size(); i++) {
Explode a = (Explode) eV.elementAt(i);
try {
Thread.sleep(50);
} catch (InterruptedException c) {
c.printStackTrace();
}
eV.removeElementAt(i);
}
gs--;
}
}
}
// 我机和敌机子弹碰撞
for (int i = 0; i < dbV.size(); i++) {
Bullet2 b = (Bullet2) dbV.elementAt(i);
if (b.dbx > x - 5 && b.dbx < x + pW && b.dby > y - 3
&& b.dby < y + pH) {
dbV.removeElementAt(i);
sm -= 5;
if (sm <= 0 && gs > 0) {
sm = sm1;
Explode e1 = new Explode(x, y);
eV.addElement(e1);
for (int j = 0; j < eV.size(); j++) {
Explode a = (Explode) eV.elementAt(j);
try {
Thread.sleep(50);
} catch (InterruptedException c) {
c.printStackTrace();
}
eV.removeElementAt(j);
}
gs--;
}
}
}
// 飞机运动
if (up == true) {
y = y - step;
if (y < 0)
y = 0;
}
if (down == true) {
y = y + step;
if (y + pH > getHeight())
y = getHeight() - pH;
}
if (left == true) {
x = x - step;
if (x < 0)
x = 0;
}
if (right == true) {
x = x + step;
if (x + pW > getWidth())
x = getWidth() - pW;
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
repaint();
if (sm <= 0 && gs <= 0)
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -