zoukankan      html  css  js  c++  java
  • 新手小项目-java坦克大战

    1.界面(图形化-前端部分)

    • 图形化用于交互,不管是用文字形式给用户选择,还是图形方式式的选择都是一种交互方式。在java中如果我们需要用到图形界面,就得想到GUI(Graphic user interface),那么我们需要用到什么,就直接去查看API(图形化显示能让我们做完项目后将结果看得舒服,而不是全部都是代码)
    • 要做GUI,就要想到java中的AWT(abstract windows toolkit),我们写图形化都需要用到这个类库。那为什么叫抽象窗口呢?因为java是跨平台的,java编写的界面源程序最后在计算机的实现可能由其他语言来最终完成。(AWT的初衷是与平台无关性,意思就是界面在任何操作系统上显示的长宽等格局都不会发生变化,保持审美。但是AWT在设计的时候用了关于操作系统的相关东西,没有做到完全的跨平台。AWT的运行没有用到java虚拟机。但是swing开发包用到了java虚拟机,它是完全跨平台的,所以现在都用swing,但是它的基础知识还是AWT)
    • 说到AWT我们就要理解component与container的的区别,见API。component是一切可显示的东西,container继承了component,所以container也是可显示的东西,但是container又有一个特性,可以包含一切可见的东西。所以container可以容纳conponent,也可以容纳它自己。(知道前端工程师知识的也应该能理解container与conponent制之间的区别)

    2.编写窗口windows

    • 我们需要知道窗口显示了哪些东西。百度搜索这个小游戏,或者上小游戏网站玩几次就可以知道游戏规则了http://www.7k7k.com/swf/129505.htm
    • 我们可以看到游戏界面和游戏玩法
    • 先画一个窗口,在编写一个窗口时我们所需要的方法都可以在Frame类中copy下来,以防自己写错。我们需要的窗口:黑底,边框可以随着拖动而改变,设置窗口大小,窗口上方写着tankgame(总共四个要求)
    • 在windows类中我们可以找到这些方法:(1)setSize(int width, int height)(2)setVisible(boolean b)
    • 在Frame类中我们可以找到这些方法:(1)setTitle(String title)(2)setResizable(boolean resizable) (3) setBackground(Color bgColor)
    • 编写的程序遇到的问题(1)应该进入java文件所在的目录。(2)数据类型的问题(见我的java数据类型)
    •  1 import java.awt.*;
       2 public class TankGame extends Frame {
       3   public void showFrame(){
       4     setBackground(Color.black);
       5     setTitle("tankgame");
       6     setResizable(true);
       7     setVisible(true);
       8     setSize(514,450);
       9     
      10     
      11 
      12   }
      13 
      14 
      15   
      16   public static void main(String[] args){
      17    
      18 
      19     new TankGame().showFrame();
      20 
      21 
      22   }
      23   

    • 关掉这个界面需要在命令行输入ctrl+c(还没进行事件处理,就像你为别人创造了一个东西,但是你还没有为别人删除一个东西的能力,那个叉叉只是一个图像,没有任何意义,跟界面上的每个图像一样,都是图像)

    • 计算机屏幕的坐标是从左上方开始的,x轴朝上,y轴朝下
    • 但是这个窗口我们并不满意,因为这个界面跟我们看到的不一样(如下图)
    • 所以我们需要用到panel(这个容器需要跟Frame一起使用才能显示出来)见container的add方法
    • 我们可以通过panel一些方法(从container和component找到)。设置大小,背景颜色,可见的(1)setBackground(Color c)(2)setSize(int width, int height)(3)setVisible(boolean b)
    • 个人的代码只是一种测试,不是完全按照要求来
    •  1 import java.awt.*;
       2 public class TankGame extends Frame {
       3   public void showFrame(){
       4     setBackground(Color.black);
       5     setTitle("tankgame");
       6     setResizable(true);
       7     setVisible(true);
       8     setSize(514,450);
       9     
      10     
      11 
      12   }
      13 
      14 
      15   
      16   public static void main(String[] args){
      17    
      18 
      19     TankGame tankgame=new TankGame();
      20     tankgame.showFrame();
      21     TankGameTwo tankgametwo=new TankGameTwo();
      22     tankgametwo.showPanel();
      23     tankgame.add(tankgametwo);
      24     
      25 
      26   }
      27   
      28 
      29 }
      30  class TankGameTwo extends Panel{
      31    void showPanel(){
      32     setBackground(Color.orange);
      33     setSize(90,90);
      34     setVisible(true);
      35   }
      36 
      37   
      38 
      39 }
    • 如果按照这个代码,我们会发现,我们根本看不见frame的颜色,我们看见的颜色是panel的颜色(如果你晃动边框,frame的颜色会显示出来)
    • 解决办法在两个类中的方法中调用一个方法(因为默认有布局管理器,我们设置大小对他们就没有用了,所以我们需要手动地设置,取消布局管理器)
    •  1 import java.awt.*;
       2 public class TankGame extends Frame {
       3   public void showFrame(){
       4     setBackground(Color.gray);
       5     setTitle("tankgame");
       6     setResizable(true);
       7     setVisible(true);
       8     setSize(514,450);
       9     setLayout(null);
      10     
      11     
      12 
      13   }
      14 
      15 
      16   
      17   public static void main(String[] args){
      18    
      19 
      20     TankGame tankgame=new TankGame();
      21     tankgame.showFrame();
      22     TankGameTwo tankgametwo=new TankGameTwo();
      23     tankgametwo.showPanel();
      24     tankgame.add(tankgametwo);
      25     
      26 
      27   }
      28   
      29 
      30 }
      31  class TankGameTwo extends Panel{
      32    void showPanel(){
      33     setBackground(Color.black);
      34     setSize(415,415);
      35     setVisible(true);
      36     setLayout(null);
      37   }
      38 
      39   
      40 
      41 }
    • 那么怎么使panel相对于Frame往中间去一点呢,有个设置x,y的方法,同时设置大小
    • 界面做的有点丑,这个需要自己花很多次调整,我没有什么工具来慢慢调整的(或者对照网页上游戏的界面来设置,截屏就知道大小了,前端工程师经常这样做)
    • 那么问题来了怎么使panel跟着container改动呢?这种方法由布局管理器来实现
    • 这个接口下有很多种布局管理器
    • 这样就可以让panle随着Frame动而不改变整体布局(这种逻辑关系是frame用弩据管理器来布局panel)
    • 怎么使鼠标按那个叉叉,然后窗口关掉。
    • 这样发现不对,因为少了适配器的概念。而且实现接口是每个方法都必须实现,如果不全部实现,就是上述的错误。

    •  改正之后

    •  但是你还会发现有错误(因为没有引入包)

    •  最后你还会发现一个问题,怎么在事件器中设置当前窗口的setvisible方法。

    •   1 import java.awt.*;

    •  2 import java.awt.event.*;
       3 public class TankGame extends Frame {
       4   public void showFrame(){
       5     setBackground(Color.gray);
       6     setTitle("tankgame");
       7     setResizable(true);
       8     setVisible(true);
       9     setSize(514,450);
      10     setLayout(new FlowLayout());
      11     
      12    li l=new li();
      13    this.addWindowListener(l);
      14     
      15     
      16 
      17   }
      18 
      19 
      20   
      21   public static void main(String[] args){
      22    
      23 
      24     TankGame tankgame=new TankGame();
      25     tankgame.showFrame();
      26     TankGameTwo tankgametwo=new TankGameTwo();
      27     tankgametwo.showPanel();
      28     tankgame.add(tankgametwo);
      29     
      30     
      31 
      32   }
      33   
      34 
      35 }
      36 class li extends  WindowAdapter{
      37 
      38 
      39    public void windowClosing(WindowEvent e){
      40     Window i=(Window)e.getWindow();
      41     i.setVisible(false);
      42     System.exit(-1);
      43 
      44 
      45 }
      46 
      47 
      48 }
      49 class TankGameTwo extends Panel{
      50   void showPanel(){
      51     setBackground(Color.black);
      52     setBounds(35,38,415,415);
      53     setVisible(true);
      54     setLayout(null);
      55     
      56   }
      57  
      63       
      64 65 
      66   
      67 
      68   
      69 
      70 }

    3.窗口图片的处理(不是指窗口的背景)

    • 在窗口上面写图片,写线条(图形),写字,都由paint方法来完成。而那些图形对象是graphics。
    • 所以我们如果要画图,在小游戏界面上我们可以看出我们需要哪些图片,截图就行,然后保存一个文件。
    •  Image image1  = Toolkit.getDefaultToolkit().getImage("images/1.jpg");  获取文件,但是第一次显示的并没有图片,需要按最小化再打开就有了
    • 按照游戏页面上的填图片就行

    4.动画的处理(人工动画+自动动画)

    • 动画的含义是什么,比如一串代码a控制某个图形在1的地方,又一串代码b控制某个图形在2的地方。我们只要执行a代码后执行b代码就可以了,n多个这样的情况就成了动画。
    • 比如手工动画效果
    • 每次最小画窗口,paint方法就要重新执行一次。(那么如何让计算机自己这样不停地执行paint方法呢。通过thread类。这个类能指定重复执行哪个代码,以及执行几次等

    5.键盘控制坦克的移动。(第一,键盘事件,第二,一下键盘事件使图片移动一下)

    • 加键盘事件监测,获得键盘事件,则执行适配器中的方法使图片移动
  • 相关阅读:
    WPF在XAML的资源中定义空字符串String.Empty
    WPF中定义TabItem的可选区域(特别是当使用Label来呈现Header时)
    反转ListBox的ListBoxItem(控件级别,不是数据的反转)
    WPF获取相对位置、坐标的方法
    WPF为ItemsControl设置ItemsPanelTemplate
    WPF中List的Add()与Insert()方法的区别
    返回表达式列表中最小值least(exp1,exp2,exp3,……,expn)
    oracle_基本SQL语言
    JS 实现的浏览器系统通知 iNotify.js
    RHCE认证考前辅导
  • 原文地址:https://www.cnblogs.com/S-Mustard/p/7515096.html
Copyright © 2011-2022 走看看