俄罗斯方块——制作道具

来源:互联网 发布:淘宝手机端优惠券连接 编辑:程序博客网 时间:2024/06/10 03:38

俄罗斯方块旗舰版——关于道具的制作

俄罗斯方块经典版是没有道具的,本次改进是在原有版本的基础上加上了道具的功能。

效果图如下

俄罗斯方块游戏的实现是用到数组实现。一个砖块使用一个4*4的数组保存的。整个游戏的场景是用11*23的数组保存数据的。如果这两个数组任何一个数组的值为1,则用画图函数将小方块画在场景上面。整个游戏的线程是在Handler里面执行的,利用Handler来更新主线程UI,以达到移动方块的目的。具体handler的定义和作用请移步:

http://blog.csdn.net/eastlhu/article/details/7960855

http://blog.csdn.net/eastlhu/article/details/7960507

界面的道具、得分、消行、等级、控制器都是用画笔画出。整个界面类继承View类。在ViewonDraw()方法里面将游戏画出。

此游戏的整体构思请移步:

使用道具的结果是:消除最底下两层的砖块。

第一步:绘制道具。

    先获得你要放置道具图片的位置坐标并保存。同时保存图片的宽度和高度。

    然后获得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.csdn.net/dasha 



原创粉丝点击