找回密码
 马上注册

QQ登录

只需一步,快速开始

查看: 8671|回复: 13

有胜于无,【飞机大战】半成品

  [复制链接]
发表于 2013-9-9 09:19:53 | 显示全部楼层 |阅读模式
本帖最后由 iRobot 于 2013-9-9 17:02 编辑

上周抽空做了一个飞机大战,后来没时间了就成了烂尾工程。在帖子末尾有代码,有兴趣的朋友可以继续完成剩余部分。

已完成:
飞机控制
敌机飞行
子弹飞行

未完成:
击毁敌机(有bug)


设计图纸
DSC_0620.JPG


绘制图形
f6.JPG


试镜
DSC_0607.JPG


测试视频



代码
  1. import java.util.ArrayList;
  2. import java.util.Random;

  3. import javax.microedition.lcdui.Graphics;
  4. import javax.microedition.lcdui.Image;

  5. import lejos.nxt.Button;
  6. import lejos.nxt.ButtonListener;
  7. import lejos.nxt.LCD;
  8. import lejos.nxt.Motor;
  9. import lejos.util.Delay;

  10. public class NXTFlight {

  11.         // 飞机
  12.         static Image flight = new Image(14, 13, new byte[] { (byte) 0x08,
  13.                         (byte) 0x48, (byte) 0xec, (byte) 0xff, (byte) 0xe3, (byte) 0xa6,
  14.                         (byte) 0xae, (byte) 0xbe, (byte) 0xb6, (byte) 0xa4, (byte) 0xa0,
  15.                         (byte) 0xa0, (byte) 0xe0, (byte) 0x40, (byte) 0x02, (byte) 0x02,
  16.                         (byte) 0x06, (byte) 0x1f, (byte) 0x18, (byte) 0x0c, (byte) 0x0e,
  17.                         (byte) 0x0f, (byte) 0x0d, (byte) 0x04, (byte) 0x00, (byte) 0x00,
  18.                         (byte) 0x00, (byte) 0x00, });
  19.         // 子弹
  20.         static Image bullet = new Image(4, 2, new byte[] { (byte) 0x03,
  21.                         (byte) 0x03, (byte) 0x03, (byte) 0x03, });

  22.         // 暂停
  23.         static Image pause = new Image(6, 6, new byte[] { (byte) 0x33, (byte) 0x33,
  24.                         (byte) 0x33, (byte) 0x33, (byte) 0x33, (byte) 0x33, });

  25.         // 敌机
  26.         static Image enemy = new Image(7, 7, new byte[] { (byte) 0x08, (byte) 0x1c,
  27.                         (byte) 0x36, (byte) 0x77, (byte) 0x14, (byte) 0x3e, (byte) 0x08, });

  28.         // 子弹列表
  29.         static ArrayList<Integer> lstBullet = new ArrayList<Integer>();

  30.         // 子弹计数器
  31.         static int BulletCount = 0;
  32.         // 发射计时器
  33.         static int BulletSec = 12;

  34.         // 鼠标起始坐标
  35.         static int initX = 19;
  36.         static int initY = 31;
  37.         // 鼠标当前坐标
  38.         static int MouseX = 19;
  39.         static int MouseY = 31;

  40.         // 敌机计时器
  41.         static int EnemySec = 10;
  42.         // 敌机列表
  43.         static ArrayList<Integer> lstEnemy = new ArrayList<Integer>();

  44.         /**
  45.          * @param args
  46.          */
  47.         public static void main(String[] args) {
  48.                 // TODO Auto-generated method stub
  49.                 Button.ESCAPE.addButtonListener(new ButtonListener() {

  50.                         @Override
  51.                         public void buttonReleased(Button b) {
  52.                                 // TODO Auto-generated method stub

  53.                         }

  54.                         @Override
  55.                         public void buttonPressed(Button b) {
  56.                                 // TODO Auto-generated method stub
  57.                                 System.exit(0);
  58.                         }
  59.                 });

  60.                 LCD.setAutoRefreshPeriod(50);
  61.                 // 注册鼠标线程
  62.                 Thread Thread1 = new Thread(new Runnable() {

  63.                         @Override
  64.                         public void run() {
  65.                                 // TODO Auto-generated method stub
  66.                                 MoveMouse();// 移动鼠标
  67.                         }
  68.                 });
  69.                 Thread1.start();

  70.                 Graphics g = new Graphics();
  71.                 // g.drawImage(flight, 30, 30, 0);

  72.                 // g.drawImage(bullet, 30, 20, 0);
  73.                 // g.drawImage(bullet, 30, 10, 0);

  74.                 // g.drawImage(pause, 3, 3, 0);

  75.                 // g.drawImage(enemy, 50, 30, 0);

  76.                 // 飞机起始位
  77.                 drawFlight(g, 19, 31);
  78.                 // 子弹起始位
  79.                 // drawBullet(g, 23, 31);
  80.                 // 暂停起始位
  81.                 g.drawImage(pause, 91, 2, 0);
  82.                 // 敌机起始位
  83.                 // g.drawImage(enemy, 50, 40, 0);
  84.                 // g.drawImage(enemy, 70, 15, 0);

  85.                 // 一发子弹的运行轨迹
  86.                 int bx = 0;
  87.                 int by = 0;
  88.                 // Shoot();
  89.                 // 一架敌机的运行轨迹
  90.                 int ex = 0;
  91.                 int ey = 0;

  92.                 int e = 1;
  93.                 // 清空单个敌机
  94.                 Graphics g3 = new Graphics();
  95.                 g3.setColor(1);

  96.                 while (true) {

  97.                         // 让子弹飞
  98.                         if (BulletSec == 12) {
  99.                                 // if(BulletCount>10)
  100.                                 // {

  101.                                 // }
  102.                                 lstBullet.add(0, MouseX);// 鼠标坐标
  103.                                 lstBullet.add(1, MouseY);// 鼠标坐标
  104.                                 BulletSec = 0;

  105.                                 if (lstBullet.size() > 20) {
  106.                                         lstBullet.remove(21);
  107.                                         lstBullet.remove(20);
  108.                                 }
  109.                                 // BulletCount++;
  110.                         }
  111.                         // 飞行的子弹
  112.                         if (lstBullet.size() > 1) {

  113.                                 // 依次处理每一发子弹
  114.                                 for (int i = 0; i < lstBullet.size(); i += 2) {
  115.                                         bx = lstBullet.get(i);
  116.                                         by = lstBullet.get(i + 1);

  117.                                         // 击毁敌机
  118.                                         if (LCD.getPixel(bx + 3, by + 3) == 1) {
  119.                                                 Destory(bx + 3);
  120.                                         }

  121.                                         LCD.setPixel(bx, by, 0);
  122.                                         LCD.setPixel(bx, by + 1, 0);
  123.                                         bx += 1;
  124.                                         lstBullet.set(i, bx);

  125.                                         LCD.setPixel(bx + 2, by, 1);
  126.                                         LCD.setPixel(bx + 2, by + 1, 1);

  127.                                 }
  128.                         }
  129.                         BulletSec++;
  130.                         // 让敌机飞
  131.                         if (EnemySec == 20) {
  132.                                 // 产生一个敌机
  133.                                 // if (lstEnemy.size() < 5) {
  134.                                 lstEnemy.add(0, 80);
  135.                                 lstEnemy.add(1, GetEnemy() + 10);
  136.                                 lstEnemy.add(2,1);
  137.                                 // }

  138.                                 if (lstEnemy.size() > 30) {
  139.                                         lstEnemy.remove(32);
  140.                                         lstEnemy.remove(31);
  141.                                         lstEnemy.remove(30);
  142.                                 }

  143.                                 EnemySec = 0;
  144.                         }
  145.                         // 飞行的敌机
  146.                         if (lstEnemy.size() > 1) {

  147.                                 // 依次处理每一架敌机
  148.                                 for (int i = 0; i < lstEnemy.size(); i += 3) {
  149.                                         ex = lstEnemy.get(i);
  150.                                         ey = lstEnemy.get(i + 1);
  151.                                         e = lstEnemy.get(i + 2);
  152.                                         g3.fillRect(ex + 1, ey, 7, 7);
  153.                                         if (e == 1) {
  154.                                                 g3.drawImage(enemy, ex, ey, 0);
  155.                                         }
  156.                                         ex -= 1;
  157.                                         lstEnemy.set(i, ex);
  158.                                 }
  159.                         }
  160.                         EnemySec++;
  161.                         Delay.msDelay(20);
  162.                 }
  163.                 // Button.waitForAnyPress();
  164.         }

  165.         private static void Destory(int bx) {
  166.                 int n = 999;
  167.                 // TODO Auto-generated method stub
  168.                 for (int i = 0; i < lstEnemy.size(); i += 2) {
  169.                         if (Math.abs(lstEnemy.get(i) - bx) < n)
  170.                                 n = i;
  171.                 }

  172.                 lstEnemy.set(n+2, 0);
  173.                 //lstEnemy.remove(n + 2);
  174.                 //lstEnemy.remove(n + 1);
  175.                 //lstEnemy.remove(n);

  176.         }

  177.         // 射击
  178.         private static void Shoot() {
  179.                 Graphics _g = new Graphics();
  180.                 // TODO Auto-generated method stub
  181.                 for (int i = 0; i < 100; i++) {
  182.                         _g.drawImage(bullet, i, 31, 0);
  183.                         Delay.msDelay(20);
  184.                 }
  185.         }

  186.         // 绘制飞机
  187.         private static void drawFlight(Graphics draw, int x, int y) {
  188.                 draw.drawImage(flight, x - 14, y - 7, 0);
  189.         }

  190.         // 绘制子弹
  191.         private static void drawBullet(Graphics draw, int x, int y) {
  192.                 draw.drawImage(bullet, x - 3, y - 1, 0);
  193.         }

  194.         // 初始化和移动鼠标
  195.         private static void MoveMouse() {
  196.                 // TODO Auto-generated method stub
  197.                 // Image img = MemeryMouse();

  198.                 // 绘制鼠标初始位置
  199.                 Graphics g1 = new Graphics();
  200.                 g1.setColor(1);
  201.                 Graphics g2 = new Graphics();

  202.                 // Image mouse = new Image(5, 8, new byte[] { (byte) 0x7f, (byte) 0x22,
  203.                 // (byte) 0x64, (byte) 0xf8, (byte) 0x90, });
  204.                 // g.drawImage(mouse, MouseX, MouseY, 0);

  205.                 int offsetX = 0, offsetY = 0;
  206.                 // 灵敏度(数值越小,速度越快)
  207.                 int accX = 15, accY = 15;

  208.                 while (true) {

  209.                         offsetY = Motor.A.getTachoCount() / accY;
  210.                         offsetX = Motor.B.getTachoCount() / accX;

  211.                         if (initY + offsetY != MouseY || initX + offsetX != MouseX) {
  212.                                 g1.fillRect(MouseX - 14, MouseY - 7, 14, 13);
  213.                                 MouseX = initX + offsetX;
  214.                                 MouseY = initY + offsetY;

  215.                                 drawFlight(g2, MouseX, MouseY);
  216.                                 // g2.drawImage(flight, MouseX, MouseY, 0);
  217.                         }
  218.                 }
  219.         }

  220.         // 产生一个敌机
  221.         private static int GetEnemy() {
  222.                 return new Random().nextInt(40);
  223.         }
  224. }
复制代码
附言:
飞机打不好,真的不能怨手机性能不好。




评分

参与人数 1乐币 +100 人气 +10 收起 理由
webspider + 100 + 10

查看全部评分

如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
发表于 2013-9-9 10:40:56 | 显示全部楼层
高手好多啊
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2013-9-9 13:54:40 | 显示全部楼层
学java的时候,就一直没怎么用过容器类。一会仔细读一下,看睦容器到底是干什么的……

容器貌似用的人很少呢……?
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2013-9-9 14:18:58 | 显示全部楼层
容器   好不错啊
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2013-9-10 09:15:51 | 显示全部楼层
lego 的高人好多!11
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2013-9-10 09:39:19 | 显示全部楼层
忒高了  居然做游戏开发了
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2013-9-10 20:48:42 | 显示全部楼层
神马呀
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2013-9-15 16:14:44 | 显示全部楼层
尼玛,吊炸天!!!!!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2013-9-16 11:34:44 | 显示全部楼层
java做的,不错。顶一个。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2013-12-28 18:26:20 | 显示全部楼层
太太太牛了
牛人处处有
问一下楼主,是用哪种编程程序
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2014-2-20 12:56:01 | 显示全部楼层
学习了,呵呵
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2014-3-10 14:47:33 | 显示全部楼层
这是什么情况?难道是我开了个坏头?怎么都开始用NXT做游戏了?太糟蹋NXT了。唉!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2014-3-19 14:47:17 | 显示全部楼层
我擦,碉堡了
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2014-6-20 20:31:25 | 显示全部楼层
Programus 发表于 2014-3-10 14:47
这是什么情况?难道是我开了个坏头?怎么都开始用NXT做游戏了?太糟蹋NXT了。唉!

是你
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|中文乐高 ( 桂ICP备13001575号-7 )

GMT+8, 2024-5-10 21:54 , Processed in 0.115560 second(s), 28 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表