俄罗斯方块旗舰版——关于道具的制作
俄罗斯方块经典版是没有道具的,本次改进是在原有版本的基础上加上了道具的功能。
效果图如下
俄罗斯方块游戏的实现是用到数组实现。一个砖块使用一个4*4的数组保存的。整个游戏的场景是用11*23的数组保存数据的。如果这两个数组任何一个数组的值为1,则用画图函数将小方块画在场景上面。整个游戏的线程是在Handler里面执行的,利用Handler来更新主线程UI,以达到移动方块的目的。具体handler的定义和作用请移步:
http://blog.youkuaiyun.com/eastlhu/article/details/7960855
http://blog.youkuaiyun.com/eastlhu/article/details/7960507
界面的道具、得分、消行、等级、控制器都是用画笔画出。整个界面类继承View类。在View的onDraw()方法里面将游戏画出。
此游戏的整体构思请移步:
使用道具的结果是:消除最底下两层的砖块。
第一步:绘制道具。
先获得你要放置道具图片的位置坐标并保存。同时保存图片的宽度和高度。
然后获得Bitmap位图资源。
用画笔将道具位图资源画在场景的右侧。
第二步:添加监听。
在游戏的View类的onTouchEvent()函数的监听事件中写判断。判断当前点击是否是在道具图片位置的范围之内。是则执行第三步动作。
第三步:执行动作。
由于道具的功能是消除固定的底层两行砖块。则是将场景的二维数组的整体下移两行。
第一步的具体实现:
整个游戏的运行是运行在TetrisView类上。效果的实现是用画笔在View类的画布上。
先加载道具图片
Bitmap bmpProp = BitmapFactory.decodeResource(getResources(), R.drawable.prop); //加载道具图片
这时候已经得到一个一个Bitmap 的位图资源。然后再调用自己写的DrawTool类的paintImage()方法将得到的Bitmap画在画布上面(根据起始位置画)。此时就在TetrisView类上显示出来了。
DrawTool.paintImage( canvas,bmpProp,(int)(getBlockDistance(Court.COURT_WIDTH)+getRightMarginToCourt()),(int)getBlockDistance(7));
实现此功能的函数如下:
private void paintProps(Canvas canvas)
{
mPaint.setColor(Color.BLUE);
mPaint.setTextSize(30);
canvas.drawText("道具: "+String.valueOf(propsNum),getBlockDistance(Court.COURT_WIDTH)+getRightMarginToCourt(), getBlockDistance(6),mPaint);
Bitmap bmpProp = BitmapFactory.decodeResource(getResources(), R.drawable.prop); //加载道具图片
DrawTool.paintImage( canvas,bmpProp,(int)(getBlockDistance(Court.COURT_WIDTH)+getRightMarginToCourt()),(int)getBlockDistance(7));
}
第二步的具体实现:
本次游戏开始时候有4个道具。点击一次少一次。然后再用onTouchEvent()方法监听点击的范围。如果是点击在此道具上面,就产生此道具事件。
public boolean onTouchEvent(MotionEvent event) {
float currentX =event.getX();
float currentY =event.getY();
float X= getBlockDistance(Court.COURT_WIDTH)+getRightMarginToCourt();//
float Y= getBlockDistance(7);
if (propsNum>0&&X<=currentX&¤tX<=X+75&&Y<=currentY&¤tY<=Y+75){
for (int i=0;i<11;i++){
for(int j=20;j>3;j--){
Court.mCourt[i][j+2]=Court.mCourt[i][j];
}
}
propsNum--;
}
}
第三步的具体实现:
其中在onTouchTEvent()函数里的下面部分代码是将整个场景下移两行的。
for (int i=0;i<11;i++){
for(int j=20;j>3;j--){
Court.mCourt[i][j+2]=Court.mCourt[i][j];
}
}
下移两行以后再将道具的数量自减。
propsNum--;
具体Court.mCourt 的功能用作场景的构造。详细实现,思路请看袁大傻的博客。。http://blog.youkuaiyun.com/dasha