欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    javaTankWar设计.docx

    • 资源ID:7321201       资源大小:258.34KB        全文页数:35页
    • 资源格式: DOCX        下载积分:3金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    javaTankWar设计.docx

    1、javaTankWar设计Java版坦克大战(TankWar)设计 08计本一班时英祥时间:2011年1月20日一 项目介绍 11年寒假任务之一,主要是复习java2 se 基本知识和熟悉面向对象编程,达到java 5000行代码要求。 TankWar,坦克大战,模仿FC 90坦克,完成联机跨平台的娱乐。二 项目需求 1、单机版坦克大战 2、联机版坦克大战 3、在线版坦克大战 4、地图编辑器 5、图片美化三 总体思路 UDPListenerTCPListenerServer接收客户端连接转发游戏数据Tank(as sever and client)Server四 版本控制 版本任务需求单机版0

    2、.1新建java项目,创建一个800*600的JFrame0.2创建一个可以8个方向移动的坦克,坦克类0.3创建子弹类,坦克可以开火,建立坦克炮筒0.4敌方坦克,能将敌方坦克击毙0.5敌方坦克的人工智能0.6添加地图管理与显示、地图编辑器0.7实现坦克不能相互重叠0.8实现坦克子弹与地图的融合0.9实现爆炸效果0.9.1实现主坦克血条0.9.2实现浮动的物块(血块,后期会有装备)0.9.3坦克换装,地图管理器使用,以及关卡设计1.0单机版Ver1.0 a 测试联机版1.1创建一个TankServer,负责建立坦克客服端之间的连接和转发消息1.2服务器建立UDP转发线程1.3服务器转发消息的设计

    3、1.4客服端看见其他坦克的行为1.5非友方坦克可以互相攻击在线版2.1在线服务器的设计,在线游戏模式竞技和闯关设计与实现2.2 5 详细实现 0.1版本 任务:新建java项目,创建一个800*600的JFrame。创建一个TankClient继承自JFrame,首先设置窗口大小和禁用最大化框。Frame双缓冲实现:定义个缓冲画布:Image offScreenImage = null;因为repaint方法首先调用的是update方法,所以重写update方法实现双缓冲。 public void update(Graphics g) /双缓冲技术 Graphics gOffScreen =

    4、offScreenImage.getGraphics(); Color c = gOffScreen.getColor(); gOffScreen.setColor(Color.GREEN); gOffScreen.fillRect(0, 0, GAME_WIDTH , GAME_HEIGHT); gOffScreen.setColor(c); paint(gOffScreen); g.drawImage(offScreenImage , 0 , 0 , null);很多时候我们是使用一个专门的线程来更新界面的!PaintThread pt = new PaintThread();new Th

    5、read(pt).start(); class PaintThread implements Runnable public void run() int fps = 1000 / FPS; while(true) try Thread.sleep(fps); repaint(); catch (InterruptedException e) System.out.println(异常终止); JFrame双缓冲,因为JFrame中,repaint只调用paint方法,所以可以在JFrame 上加个JPanel在其上执行双缓冲,而swing的组件默认是实现双缓冲的,只要开启 即可!当然我们也可

    6、以简单点的(原创,不知道可有问题!):在JFrame构造的时候保存他的Graphics gJF;对象,直接重写repaint方法: public void repaint() /双缓冲技术 Graphics gOffScreen = offScreenImage.getGraphics(); Color c = gOffScreen.getColor(); gOffScreen.setColor(Color.GREEN); gOffScreen.fillRect(0, 0, GAME_WIDTH , GAME_HEIGHT); gOffScreen.setColor(c); paint(gOf

    7、fScreen); gJF.drawImage(offScreenImage , 0 , 0 , null);0.2 版本任务:创建一个可以8个方向移动的坦克,坦克类。在主窗口中添加键盘事件:this.addKeyListener(new KeyMonitor();class KeyMonitor extends KeyAdapter public void keyPressed(KeyEvent e) myTank.keyPressed(e); public void keyReleased(KeyEvent e) myTank.keyReleased(e); 这样就可以把键盘事件交给我们的

    8、tank自己处理了!Tank中,如何可以使坦克8个方向移动?可以使用四个boolean变量来记录键盘四个方向的按键情况,按下为true,释放为false,比如DOWN和RIGHT按下时,坦克的方向就为RD,从而实现了坦克8个方向的移动!实现代码如下:private boolean bL = false , bU = false ,bR = false , bD = false; public void keyPressed(KeyEvent e) int key = e.getKeyCode(); switch(key) case KeyEvent.VK_CONTROL: /fire(); b

    9、reak; case KeyEvent.VK_RIGHT: bR = true; break; case KeyEvent.VK_LEFT: bL = true; break; case KeyEvent.VK_UP: bU = true; break; case KeyEvent.VK_DOWN: bD = true; locaeDirection(); public void keyReleased(KeyEvent e) int key = e.getKeyCode(); switch(key) case KeyEvent.VK_CONTROL: /fire(); break; case

    10、 KeyEvent.VK_RIGHT: bR = false; break; case KeyEvent.VK_LEFT: bL = false; break; case KeyEvent.VK_UP: bU = false; break; case KeyEvent.VK_DOWN: bD = false; break; locaeDirection(); void locaeDirection() if(bL & !bU & !bR & !bD) dir = Direction.L; else if(bL & bU & !bR & !bD) dir = Direction.LU; else

    11、 if(!bL & bU & !bR & !bD) dir = Direction.U; else if(!bL & bU & bR & !bD) dir = Direction.RU; else if(!bL & !bU & bR & !bD) dir = Direction.R; else if(!bL & !bU & bR & bD) dir = Direction.RD; else if(!bL & !bU & !bR & bD) dir = Direction.D; else if(bL & !bU & !bR & bD) dir = Direction.LD; else if(!b

    12、L & !bU & !bR & !bD) dir = Direction.STOP;0.3 创建子弹类,坦克可以开火,建立坦克炮筒子弹类:首先子弹可以每个坦克持有一个Bullet的集合,在每帧画坦克的时候在画出坦克打出的所有子弹,这是一种比较常用的方法,但我们统一交给TankClient管理,在TankClient中有个bullets的List,每帧就重新画bullets中的所有Bullet,而我们的Bullet类负责画自己和管理自己,而我们的Tank只需要打出个子弹即可!这样Tank和Bullet就用面向对象的思想给分离了。主要代码:public class Bullet private i

    13、nt x , y; private Direction dir; private int xBulletSpeed = 5 , yBulletSpeed = 5; public static final int BULLETHEIGHT = 8 , BULLETWIDTH = 8; private boolean live = false; public boolean isLive() return live; public void setLive(boolean live) this.live = live; TankClient tc = null; public Bullet(int

    14、 x, int y, Direction dir) this.x = x; this.y = y; this.dir = dir; live = true; public Bullet(int x2, int y2, Direction dir2, TankClient tc) this(x2, y2, dir2); this.tc = tc; public void draw(Graphics g) Color c = g.getColor(); g.setColor(Color.BLACK); g.fillOval(x, y, BULLETWIDTH, BULLETHEIGHT); g.s

    15、etColor(c); move(); public void move() switch(dir) case L: x -= xBulletSpeed; break; case LU: x -= xBulletSpeed; y -= yBulletSpeed; break; case U: y -= yBulletSpeed; break; case RU: y -= yBulletSpeed; x += xBulletSpeed; break; case R: x += xBulletSpeed; break; case RD: x += xBulletSpeed; y += yBulle

    16、tSpeed; break; case D: y += yBulletSpeed; break; case LD: y += yBulletSpeed; x -= xBulletSpeed; break; case STOP: break; if(xTankClient.GAME_WIDTH | y TankClient.GAME_HEIGHT ) live = false; if(!live) tc.bullets.remove(this); 因为Bullet自己需要管理自己,当自己超出边界时,自己灭了自己,所以需要TankClient中的bullets对象,我们持有TankClient的引

    17、用,从而得到bullets对象,而这个需要在构造子弹的时候传递给子弹,而子弹是tank生成的,所以坦克自己要持有TankClient的引用!添加tank一个构造方法: public Tank(int i, int j, TankClient tankClient) this(i , j); this.tc = tankClient;并且当tank中的监听键盘按下某个键时发出个子弹,我们以按下Ctrl,代码如下:case KeyEvent.VK_CONTROL: fire(); break; private void fire() int x = this.x + TANKWIDTH/2 - B

    18、ullet.BULLETWIDTH/2; int y = this.y + TANKHEIGHT/2 - Bullet.BULLETHEIGHT/2; Bullet b = new Bullet(x, y, dir/*dirPt*/, tc); tc.bullets.add(b);这样当坦克移动时可以打出子弹的,但当坦克静止时,构造出的子弹也是不动,所以我们必须给坦克指定个炮筒!当坦克静止是也可以打出往某个方向的子弹:Direction dirPt = Direction.R;而炮筒的方向怎么确定?我们可以在locaeDirection,keyReleased,keyPressed中确定,但这

    19、样理论上可以但很难打出45度的子弹,按下和释放的间隔必须非常的短!所以我们可以把确定方向放到tank的move中,可以得到比较满意的效果! if(dir != Direction.STOP) dirPt = dir; 还有画出炮筒,一个苦力活!贴上一个方向的:private void drawPt(Graphics g) switch(dirPt) case L: g.drawLine(x + Tank.TANKWIDTH/2, y + Tank.TANKHEIGHT/2, x, y + Tank.TANKHEIGHT/2); break;/。0.4 敌方坦克,能将敌方坦克击毙阵营:Camp;

    20、 添加Camp枚举类型:public enum Camp FRIEND , ENEMY , UNKNOW , GOD ,SELF; public static boolean isEnemy(Camp c1, Camp c2) if( (c1=FRIEND & c2 = ENEMY) | (c1 = ENEMY & c2 = FRIEND) return true; if( (c1 = SELF & c2 = ENEMY) | (c1 = ENEMY & c2 = SELF) return true; return false; 给每个tank一个Camp,每个子弹一个camp,子弹的camp

    21、有所发出的tank的camp决定。检测子弹是否击中坦克:1)可以检测每个子弹是否击中敌方坦克;2)检测坦克是否被子弹撞上;这两种方法都是可以的,我们以检测子弹实现:在TankClient画子弹之前检测:b.hitTank(myTank);/检测敌方是否击中主坦克b.hitTanks(tanks);/检测我放是否集中敌方坦克 public boolean hitTank(Tank myTank) if(getRect().intersects(myTank.getRect() & Camp.isEnemy(camp, myTank.getCamp() myTank.setLive(false);

    22、 this.setLive(false); return true; return false; public boolean hitTanks(ArrayList tanks) for(int i=0; i 38) fire(); 慢慢发现tank越来越大,越来越复杂,逻辑上有点混乱,所以我们把敌人坦克分离出去!Tank分解为TankMain和TankEnemy,而上代码添加到TankEnemy中,在TankEnemy中重写move方法,添加我们简单的人工智能!而在TankClient中只需要在生成Tank的时候修改代码,其他的可以使用多态精简代码!0.6添加地图管理与显示 地图编辑器1、地

    23、图是一个20*15的矩阵,可用一个int2015存储,其中的每个值代表一个图片。思路很清楚的,本来准备用简单的矩形等代替的,但还是用实际的图片来代替吧!Graphics中有画Image的方法,首先我们要加载图片,我们首先把要显示的图片加 载到内存中:private static Toolkit tk = Toolkit.getDefaultToolkit();private static Image tankImages = null;public static Map imgs = new HashMap();static tankImages = new Image tk.getImage

    24、(MapMgr.class.getClassLoader().getResource(res/diban.gif),; imgs.put(diban, tankImages0);响应鼠标拖动事件时要注意:MouseAdapter mAdapter = new MouseAdapter() public void mouseDragged(MouseEvent e) System.out.println(mouseDragged); public void mouseMoved(MouseEvent e) System.out.println(mouseMoved FRAME); ; addMo

    25、useListener(mAdapter);addMouseMotionListener(mAdapter);2、Java中显示GIF,可以使用swing中的控件,并且可以重写控件的paint的方法重而改变控件的外观,并且支持GIF动态的显示,并可以在GIF上画画,实在是强大和方便啊!在一个JLabel上显示GIF: JLabel jl = new JLabel(1111111111111); jl.setIcon(new ImageIcon(D:/1.GIF); jl.setBounds(10, 570, 100, 100); this.add(jl);在JLable上显示的GIF上画画:c

    26、lass SyxGifLabel extends JLabel public void paint(Graphics g) super.paint(g); Graphics2D g2D = (Graphics2D)g; g2D.setStroke(new BasicStroke(5.0f); g2D.drawRoundRect(5, 5, this.getWidth()-10, this.getHeight()-10, 10, 10); SyxGifLabel sjl = new SyxGifLabel(); sjl.setIcon(new ImageIcon(D:/1.GIF); sjl.setBounds(130, 570, 100, 100); this.add(sjl);在JButton上显示GIF图片: JButton jbtn = new JButton(1111); jbtn.setIcon(new ImageIcon(D:/1.GIF); jbtn.setBounds(230, 570, jbtn.getIcon().getIconWid


    注意事项

    本文(javaTankWar设计.docx)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 冰点文库 网站版权所有

    经营许可证编号:鄂ICP备19020893号-2


    收起
    展开