关于实践周的第一个项目选择了制作Flying Birds小游戏,预备知识包括面向对象的封装,swing和awt包,Math类,事件监听器,多线程。
关于一些具体参数为何设置实际上应该是和所给素材图片的大小有关,其实也可以利用相关get函数读取相关参数输出后,就可以知道。
以此造成的影响包括图片设置的位置x,y的设定以及小鸟初始位置的设定,以及窗口大小设定。
总的来说,关于设计一个完整项目,最重要的是了解类的属性关系以及类的相关方法。
回顾总设计流程如下
1.绘制面板,放入背景图。
2.设计地面、柱子类完成移动的效果(移动方法实现)。
3.设计小鸟,完成飞行轨迹、与柱子是否碰撞的方法等。
4.设计游戏类,完成游戏类界面的绘制。
5.设计游戏开始的方法与流程。
6.增加鼠标监听器完成对小鸟飞行及游戏运行的控制。
具体知识点包括
变量
1.分支语句
2.循环语句
3.面向对象
4.异常处理
5.Random随机数
6.StringBuffer字符串操作
7.IO操作
8.多线程
9.swing组件和awt组件
10.Math类函数调用
相关知识点是在边学习边使用,需要更加理解并灵活运使用
Flying Birds总结回顾要点
动画参数中重要参数循环中的i
1 2 3 4 5 6 7 8 9 10 11
| //初始化动画帧参数 images=new Image[8]; for(int i=0;i<8;i++) { images[i]=new ImageIcon("source/"+i+".png").getImage(); } index=0; }
|
由于在source的文件里表示小鸟的图片有8张i是从0开始对应图片source0.jpg,所以i的循环中从0到7满足就是对souce里面source0.jpg到source7.jpg的遍历。
此处弧度作用
1 2 3 4 5 6 7 8 9 10 11
| public boolean hit(Ground ground) { boolean hit =y+size/2>ground.y; if(hit) { y=ground.y-size/2; alpha=Math.PI/2; } return hit; }
|
判断条件中判断到撞击地面后, alpha=Math.PI/2实际上将小鸟的弧度重置为Math.PI/2,表现在游戏中gameover的时候小鸟摔了个底朝天。
More info: 小鸟被撞翻啦
repaint()方法
1 2 3
| //休眠1000/60毫秒 Thread.sleep(1000/60); repaint();
|
repaint()这个方法是一个具有刷新页面效果的方法,如果你要页面进行重画就可以调用.一般都是在AWT的图形绘制当中调用的到
工作原理如下:
repaint()方法
|
|
V
AWT线程--->paint()方法-->图形绘制
|
|
V
update()方法--->paint()方法--图形绘制
主要需要判断出现的两大界面
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| int state;//游戏状态 //状态常量 public static final int START=0;//开始 public static final int RUNNING=1;//运行 public static final int GAME_OVER=2;//结束
public void mousePressed(MouseEvent e) { try { switch(state) { case START: //在开始前按下鼠标转为运行状态 state=RUNNING; break; case RUNNING: //在运行状态,按下鼠标小鸟向上飞行 bird.flappy(); break; case GAME_OVER: //在结束状态,按下鼠标重置数据变为开始 column1=new Column(1); column2=new Column(2); bird=new Bird(); score=0; state=START; break; } } //绘制开始和结束界面 switch(state) { case START: g.drawImage(startImage, 0, 0, null); break; case GAME_OVER: g.drawImage(overImage, 0, 0, null); break; }
|
通过Bird类里面的碰撞判断再来判断Birdgame类里面的state//状态常量,通过状态常量在switch语句里面的条件判断情况后,绘制
不同情况下所应该显示的对应图片。
JFrame的使用到的代码
1 2 3 4 5 6 7 8 9 10 11 12 13
| public static void main(String[] args) throws Exception { JFrame frame=new JFrame(); BirdGame game=new BirdGame(); frame.add(game); frame.setSize(440,670); frame.setLocationRelativeTo(null);//设置窗口相对于指定组件的位置。如果组件当前未显示或者 为 null,则此窗口将置于屏幕的中央 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//如果在代码里没加这个方法,那么在点击框架的”叉叉“退出框架后,程序仍然没有退出,只是JFrame被关闭了。 frame.setVisible(true); game.action(); }
|
JFrame是最底层,JPanel是置于其面上,同一个界面只有一个JFrame,一个JFrame可以放多个JPanel。
JFrame 用来设计类似于 Windows 系统中窗口形式的界面。JFrame 是 Swing 组件的顶层容器,该类继承了 AWT 的 Frame 类,支持 Swing 体系结构的高级 GUI 属性。
JPanel 是一种中间层容器,它能容纳组件并将组件组合在一起,但它本身必须添加到其他容器中使用。
JFrame常见使用方法
1 2 3 4 5 6 7
| JFrame jf = new JFrame("我是标题鸭!!!");//创建一个JFrame对象 jf.setTitle("我是标题鸭!!!");//标题的设置 jf.setSize(20,10)//设置了一个长为20,高为10的框图。 jf.setBounds(1,2,20,10)//设置一个左上角顶点在(1,2),长为20,宽为10的窗体。 jf.setLocation(1,2)//设置一个左上角顶点在(1,2)的窗体。 jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置同步开关 jf.setVisible(true);//设置窗体可见
|
JPanel常见使用方法
1 2 3 4 5 6 7 8 9
| //构造方法 JPanel():使用默认的布局管理器创建新面板,默认的布局管理器为 FlowLayout。 JPanel(LayoutManagerLayout layout):创建指定布局管理器的 JPanel 对象。 //常见函数 Component add(Component comp) 将指定的组件追加到此容器的尾部 void remove(Component comp) 从容器中移除指定的组件 void setFont(Font f) 设置容器的字体 void setLayout(LayoutManager mgr) 设置容器的布局管理器 void setBackground(Color c) 设置组件的背景色
|
More info: JPanel和JFrame的使用方法
Welcome back AM1ng!