|
本帖最后由 iRobot 于 2013-9-9 17:02 编辑
上周抽空做了一个飞机大战,后来没时间了就成了烂尾工程。在帖子末尾有代码,有兴趣的朋友可以继续完成剩余部分。
已完成:
飞机控制
敌机飞行
子弹飞行
未完成:
击毁敌机(有bug)
设计图纸
绘制图形
试镜
测试视频
代码- import java.util.ArrayList;
- import java.util.Random;
- import javax.microedition.lcdui.Graphics;
- import javax.microedition.lcdui.Image;
- import lejos.nxt.Button;
- import lejos.nxt.ButtonListener;
- import lejos.nxt.LCD;
- import lejos.nxt.Motor;
- import lejos.util.Delay;
- public class NXTFlight {
- // 飞机
- static Image flight = new Image(14, 13, new byte[] { (byte) 0x08,
- (byte) 0x48, (byte) 0xec, (byte) 0xff, (byte) 0xe3, (byte) 0xa6,
- (byte) 0xae, (byte) 0xbe, (byte) 0xb6, (byte) 0xa4, (byte) 0xa0,
- (byte) 0xa0, (byte) 0xe0, (byte) 0x40, (byte) 0x02, (byte) 0x02,
- (byte) 0x06, (byte) 0x1f, (byte) 0x18, (byte) 0x0c, (byte) 0x0e,
- (byte) 0x0f, (byte) 0x0d, (byte) 0x04, (byte) 0x00, (byte) 0x00,
- (byte) 0x00, (byte) 0x00, });
- // 子弹
- static Image bullet = new Image(4, 2, new byte[] { (byte) 0x03,
- (byte) 0x03, (byte) 0x03, (byte) 0x03, });
- // 暂停
- static Image pause = new Image(6, 6, new byte[] { (byte) 0x33, (byte) 0x33,
- (byte) 0x33, (byte) 0x33, (byte) 0x33, (byte) 0x33, });
- // 敌机
- static Image enemy = new Image(7, 7, new byte[] { (byte) 0x08, (byte) 0x1c,
- (byte) 0x36, (byte) 0x77, (byte) 0x14, (byte) 0x3e, (byte) 0x08, });
- // 子弹列表
- static ArrayList<Integer> lstBullet = new ArrayList<Integer>();
- // 子弹计数器
- static int BulletCount = 0;
- // 发射计时器
- static int BulletSec = 12;
- // 鼠标起始坐标
- static int initX = 19;
- static int initY = 31;
- // 鼠标当前坐标
- static int MouseX = 19;
- static int MouseY = 31;
- // 敌机计时器
- static int EnemySec = 10;
- // 敌机列表
- static ArrayList<Integer> lstEnemy = new ArrayList<Integer>();
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- Button.ESCAPE.addButtonListener(new ButtonListener() {
- @Override
- public void buttonReleased(Button b) {
- // TODO Auto-generated method stub
- }
- @Override
- public void buttonPressed(Button b) {
- // TODO Auto-generated method stub
- System.exit(0);
- }
- });
- LCD.setAutoRefreshPeriod(50);
- // 注册鼠标线程
- Thread Thread1 = new Thread(new Runnable() {
- @Override
- public void run() {
- // TODO Auto-generated method stub
- MoveMouse();// 移动鼠标
- }
- });
- Thread1.start();
- Graphics g = new Graphics();
- // g.drawImage(flight, 30, 30, 0);
- // g.drawImage(bullet, 30, 20, 0);
- // g.drawImage(bullet, 30, 10, 0);
- // g.drawImage(pause, 3, 3, 0);
- // g.drawImage(enemy, 50, 30, 0);
- // 飞机起始位
- drawFlight(g, 19, 31);
- // 子弹起始位
- // drawBullet(g, 23, 31);
- // 暂停起始位
- g.drawImage(pause, 91, 2, 0);
- // 敌机起始位
- // g.drawImage(enemy, 50, 40, 0);
- // g.drawImage(enemy, 70, 15, 0);
- // 一发子弹的运行轨迹
- int bx = 0;
- int by = 0;
- // Shoot();
- // 一架敌机的运行轨迹
- int ex = 0;
- int ey = 0;
- int e = 1;
- // 清空单个敌机
- Graphics g3 = new Graphics();
- g3.setColor(1);
- while (true) {
- // 让子弹飞
- if (BulletSec == 12) {
- // if(BulletCount>10)
- // {
- // }
- lstBullet.add(0, MouseX);// 鼠标坐标
- lstBullet.add(1, MouseY);// 鼠标坐标
- BulletSec = 0;
- if (lstBullet.size() > 20) {
- lstBullet.remove(21);
- lstBullet.remove(20);
- }
- // BulletCount++;
- }
- // 飞行的子弹
- if (lstBullet.size() > 1) {
- // 依次处理每一发子弹
- for (int i = 0; i < lstBullet.size(); i += 2) {
- bx = lstBullet.get(i);
- by = lstBullet.get(i + 1);
- // 击毁敌机
- if (LCD.getPixel(bx + 3, by + 3) == 1) {
- Destory(bx + 3);
- }
- LCD.setPixel(bx, by, 0);
- LCD.setPixel(bx, by + 1, 0);
- bx += 1;
- lstBullet.set(i, bx);
- LCD.setPixel(bx + 2, by, 1);
- LCD.setPixel(bx + 2, by + 1, 1);
- }
- }
- BulletSec++;
- // 让敌机飞
- if (EnemySec == 20) {
- // 产生一个敌机
- // if (lstEnemy.size() < 5) {
- lstEnemy.add(0, 80);
- lstEnemy.add(1, GetEnemy() + 10);
- lstEnemy.add(2,1);
- // }
- if (lstEnemy.size() > 30) {
- lstEnemy.remove(32);
- lstEnemy.remove(31);
- lstEnemy.remove(30);
- }
- EnemySec = 0;
- }
- // 飞行的敌机
- if (lstEnemy.size() > 1) {
- // 依次处理每一架敌机
- for (int i = 0; i < lstEnemy.size(); i += 3) {
- ex = lstEnemy.get(i);
- ey = lstEnemy.get(i + 1);
- e = lstEnemy.get(i + 2);
- g3.fillRect(ex + 1, ey, 7, 7);
- if (e == 1) {
- g3.drawImage(enemy, ex, ey, 0);
- }
- ex -= 1;
- lstEnemy.set(i, ex);
- }
- }
- EnemySec++;
- Delay.msDelay(20);
- }
- // Button.waitForAnyPress();
- }
- private static void Destory(int bx) {
- int n = 999;
- // TODO Auto-generated method stub
- for (int i = 0; i < lstEnemy.size(); i += 2) {
- if (Math.abs(lstEnemy.get(i) - bx) < n)
- n = i;
- }
- lstEnemy.set(n+2, 0);
- //lstEnemy.remove(n + 2);
- //lstEnemy.remove(n + 1);
- //lstEnemy.remove(n);
- }
- // 射击
- private static void Shoot() {
- Graphics _g = new Graphics();
- // TODO Auto-generated method stub
- for (int i = 0; i < 100; i++) {
- _g.drawImage(bullet, i, 31, 0);
- Delay.msDelay(20);
- }
- }
- // 绘制飞机
- private static void drawFlight(Graphics draw, int x, int y) {
- draw.drawImage(flight, x - 14, y - 7, 0);
- }
- // 绘制子弹
- private static void drawBullet(Graphics draw, int x, int y) {
- draw.drawImage(bullet, x - 3, y - 1, 0);
- }
- // 初始化和移动鼠标
- private static void MoveMouse() {
- // TODO Auto-generated method stub
- // Image img = MemeryMouse();
- // 绘制鼠标初始位置
- Graphics g1 = new Graphics();
- g1.setColor(1);
- Graphics g2 = new Graphics();
- // Image mouse = new Image(5, 8, new byte[] { (byte) 0x7f, (byte) 0x22,
- // (byte) 0x64, (byte) 0xf8, (byte) 0x90, });
- // g.drawImage(mouse, MouseX, MouseY, 0);
- int offsetX = 0, offsetY = 0;
- // 灵敏度(数值越小,速度越快)
- int accX = 15, accY = 15;
- while (true) {
- offsetY = Motor.A.getTachoCount() / accY;
- offsetX = Motor.B.getTachoCount() / accX;
- if (initY + offsetY != MouseY || initX + offsetX != MouseX) {
- g1.fillRect(MouseX - 14, MouseY - 7, 14, 13);
- MouseX = initX + offsetX;
- MouseY = initY + offsetY;
- drawFlight(g2, MouseX, MouseY);
- // g2.drawImage(flight, MouseX, MouseY, 0);
- }
- }
- }
- // 产生一个敌机
- private static int GetEnemy() {
- return new Random().nextInt(40);
- }
- }
复制代码 附言:
飞机打不好,真的不能怨手机性能不好。
|
评分
-
查看全部评分
|