AP计算机科学A(APcomputer science A)复习备考攻略视频教程
43756 人在学
贪吃蛇与打砖块的游戏代码分析
游戏代码分析:下面我们分析上面开发的游戏代码。
1.类的结构图。
在java开发中,我们非常重视面向对象开发,表现在我们把功能模块封闭到类中,通过调用类来实现不同的功能。在这个游戏中,我们主要使用了五个类:
它们分别是:
(1)程序主类Peng作为游戏的顶层容器和程序的入口
(2)画图面版类MyPanel作为游戏画面的显示组件,同时用来运行循环游戏,并对用户输入进行处理
(3)挡板类Pad用来设计档板的属性,并对其运动逻辑进行更新
(4)砖块类Block用来绘制砖块
(5)小球类Ball用来绘制小球,并对小球的运动逻辑进行更新
各类之间的关系如下图:
下面我们逐一分析每一个类:
(1)主类Peng.主类Peng和我们前面做过的每一道题目都相同,它的作用是创建一个窗体(app),和实例化MyPanel画板,把MyPanel装入窗体显示出来。
(2)MyPanel类,MyPanel类主要用来设计画板组件。MyPanel才是整个游戏的主框架,在这里,我们先定义了一些变量:
然后在构造函数MyPanel()里,我们先设定窗体宽和高,然后创建了Pad,Block,Ball类的实例,下面蓝色框部分,用这种方式调用了Pad,Block,Ball类:
接下来,我们看MyPanel运行的过程,在Run()方法中我们看到:
在MyPanel中运行过程是GameUpdate()->GameRender()->GamePaint()
所以我们阅读的时候也按这个次序进行:
GameUpdate()是判断小球的运动方向
GameRender()是擦掉上一个页面,然后画出一个新页面
GamePaint()将图片装入内存显示
重要:要强调的是,在这里,用户按了向左或向右键的时候,怎么控制砖块的左右运动。
注意看MyPanel中监视用户输入的代码:
从上面的代码我们看到,当用户按了向左或向右键时,给变量padMoveRight和padMoveleft赋值true或false.这个值会传递给Pad类,我们打开Pad类,这时我们会看到这两个变量,Pad类获取这两个变量的值,来决定档板的走向,如下图:
下面我们来看Pad类:
Pad类,下面我们分析Pad类:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
public class Pad {
public Point location;//创建一个Point变量locatoin
public Point size;//创建一个Point变量size
private MyPanel gameP;//创建MyPanel实例,获取MyPanel中的一些变量值
public Pad(MyPanel gp) {
gameP = gp;//将MyPanel对象传给gameP,下面要用到它的padMoveRight
size = new Point(100, 20);//给size变量赋值
location = new Point((gp.width - size.x) / 2, gp.heigth - size.y);//给location变量赋值
}
public void update() {
if (gameP.padMoveRight) {//如果MyPanel中padMoveRight的值是true
if (location.x + size.x < gameP.width) {//如果没到右边缘
location.x += 10;//向右移
}
}
if (gameP.padMoveLeft) {//如果MyPanel中padMoveLeft的值是true
if (location.x > 0) {//如果没到左边缘
location.x -= 10;//向左移
}
}
}
public void draw(Graphics g) {
g.setColor(Color.BLACK);//设置黑色
g.fillRoundRect(location.x, location.y, size.x, size.y,10,10);//画出档板
}
}
Pad类运行的方法,是先获取MyPanel中传过来的padMoveLeft和padMoveRight值,然后用它在draw()方法中画出档板的位置,在MyPanel中调用了pad。Draw()实现画档板。
(4)Block类,Block类的方法和上面的Pad类很相似,不同的是它是负责画砖块,由于有很多砖,我们定义一个数组来记录每一块砖的位置,再用一个boolean值来判断每一个砖是不是被敲掉了。代码和注释请看上面。此处略
(6)Ball类,Ball类在这里非常重要,它除了画出球之外,还负责判断碰撞,碰撞的判断是游戏开发中最难和最重要的部分。