android 游戏:俄罗斯方块的小结
最近觉得在android上开发游戏是一件很有趣的事情,所以查找了一些资料,自己做出了一个简单俄罗斯方块游戏,现将其总结如下:
1、基础数据模型
一个俄罗斯方块都是以一个4*4的二维数组来存储的,在我的demo游戏中,一共有7种方块类型: I S Z J O L T七种类型。见下图(图形就暂免了)。每种类型都有四种旋转状态, 如何在一个4*4的二位数组表示呢?可以用0和1来表示,1表示该小单元格需要显示,0表示该小单元格不需要显示。
设置屏幕为320*480,每个小单元格是20像素,这样宽就是COLS=16,高就是ROWS=24。
2、涉及到的几个JavaBean
2.1 Shape:把每种图形抽象出来为一个对象,具有的属性是
int的 left(x方向)和top(y方向)、
int的 status 旋转状态,可选择的值是0,1,2,3 默认是0
int[][] body 存储四种旋转状态的数据
int LEFT = 1, RIGHT = 2, DOWN = 3, ROTATE = 4
Shape的最基本方法是checkValue()和checkBound(),checkValue()方法是检查某个单元格的值是1还是0,可传入status,x,y或经过计算后的x,y的值,status作为属性可直接获取。
public boolean chekValue(int x, int y){......}
或 public boolean checkValue(int xyValue){........}
Shape的checkBound()需要根据执行的动作和地面的单元格的条件来检查是否越界,如果地址没有越界,则返回false,否则返回true。
public boolean checkBound(int action, Ground ground){.........}
Shape的drawMe()方法,该方法应该是无参数的,主要的逻辑是把4*4中值为1的单元格在画布上画出来。
public void drawMe(){.............}
Shape还具有四个玩家可以操作的动作方法:moveLeft() moveRight() moveDown()和rotate()四种基本方法,对应模拟器上的四个方向键。
public void moveLeft(){................}
public void moveRight(){................}
public void moveDown(){.........}
public void rotate(){................}
2.2 Ground:地面类 就是各个小单元格堆放起来的那个地面,我们也把它抽象成为一个JavaBean,经过分析,它也应该具有如下的属性和方法。
int[][] body 这个body就是面板的最大面积COLS * ROWS =16*24
Ground也应该具有最基本的方法checkValue(),这个方法和Shape的方法大同小异,值为1返回true,值为0返回false,但是实现的具体逻辑和使用场景有较大的不同,输入参数可以使x,y ,也可以是left, top, x,y
public boolean checkValue(int x, int y){.........}
public boolean checkValue(int left, int right, int x,int y){.........} 二者实现一个即可。
Ground应该有一个addShape()的方法,用于接纳到达地面的Shape(),
public void addShape(int x, int y, Shape shape){......}
它应该有一个drawMe()的方法,显示他目前已经接纳且未消行的小单元格。
public void drawMe(){..........}
另外它应该有消行和统计分数的方法removeRows()
public void removeRows(){.........}
2.3 定义一个GameView,用来显示Shape和Ground的图形变化,需要重写的方法有
onDraw():主要是画Shape和Ground
onKeyDown():处理方向键按下的事件
在它的构造函数GameView()里面需要实现小单元格的静态资源的获取,
调用setFocusable(true); 以显示图形
在正式运行时需要执行定时器,以3秒钟不停刷新页面的数据。
2.4 MainActivity 将系统的标题栏去掉,调用
//以下去掉标题和全屏
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
然后调用GameView。