新手小项目-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.键盘控制坦克的移动。(第一,键盘事件,第二,一下键盘事件使图片移动一下)

  • 加键盘事件监测,获得键盘事件,则执行适配器中的方法使图片移动

 

posted @ 2017-09-13 22:00  S-Mustard  阅读(18022)  评论(4编辑  收藏  举报