当前位置:操作系统 > 安卓/Android >>

android 游戏之场景的实现以及拓展应用照片浏览器

  下面我们说下有游戏,当我们过关卡的时候游戏中或许出现场景切换,这对做游戏开发的同学们在熟悉不过了,这里我简单介绍下,一来自己巩固下学习的知识,二来把我学习的心得分享出来,以便大家共同进步.
  实现原理:首先我们对屏幕进行clipRect获取相应的矩形模块.然后在用图片进行填充.
 矩形(横向)交差场景实现:
[java]  
/*** 
     * 矩形场景(横向) 
     */  
    public void doRect_H() {  
        /** 交错的实现矩形相交 **/  
        int ractHeight = (mScreenHeight / ractCount);// 获取每个矩形宽度.  
        // 左边开始(偶数0,2,4...)  
        for (int i = 0; i < ractCount; i += 2) {  
            drawFillRect(mCanvas, Color.BLACK, 0, i * ractHeight, rectStep,  
                    ractHeight);  
        }  
        // 右边开始(奇数1,3,5...)  
        for (int i = 1; i < ractCount; i += 2) {  
            drawFillRect(mCanvas, Color.BLACK, mScreenWidth - rectStep, i  
                    * ractHeight, rectStep, ractHeight);  
        }  
  
    }  
我简单讲解下流程:针对屏幕我们分割成10条矩形,然后我们在对这10条矩形进行一一填充.而填充的就是下一个的场景.矩形(纵向)交差场景同理.
这里要说明一点,你要理解canvas的save和restore方法.
          save:用来保存Canvas的状态。save之后,可以调用Canvas的平移、放缩、旋转、错切、裁剪等操作。 
          restore:用来恢复Canvas之前保存的状态。防止save后对Canvas执行的操作对后续的绘制有影响。
          save和restore要配对使用(restore可以比save少,但不能多),如果restore调用次数比save多,会引发Error。save和restore之间,往往夹杂的是对Canvas的特殊操作。
百叶窗场景实现:
[java] 
/*** 
     * 百叶窗场景 
     */  
    public void doSQUARE() {  
        /** 百叶窗效果利用双for循环 修改每个矩形绘制的宽度 **/  
        for (int i = 0; i <= (mScreenWidth / squareRange); i++) {// 算取宽包含多少个正方形,  
            for (int j = 0; j <= (mScreenHeight / squareRange); j++) {// 算去高包含多少正方形.  
                drawFillRect(mCanvas, Color.BLACK, i * squareRange, j  
                        * squareRange, rectStep, rectStep);  
            }  
        }  
    }  
简单说明:根据View的宽高分割成若干个正方形然后一一进行填充.
滚动(向右)水纹场景:
[java]  
/*** 
     * 滚动水纹场景(右移动) 
     */  
    public void doSHADOW_RINGHT() {  
        /*** 
         * 在这里我们要算去各个矩形的宽度以及起始的X坐标 
         *  
         * 注意要理解其含义. 
         */  
        int X1 = rectStep + rectX1;// 矩形1的x坐标  
        int rectWidth1 = rectW + 12;// 矩形1的宽度  
        int X2 = X1 + rectWidth1 + rectX2;  
        int rectWidth2 = rectW + 5;  
        int X3 = X2 + rectWidth2 + rectX3;  
        int rectWidth3 = rectW;  
  
        /** 水纹效果其实绘制了4个矩形 中间留一些缝隙 **/  
        drawFillRect(mCanvas, Color.BLACK, 0, 0, rectStep, mScreenHeight);  
  
        drawFillRect(mCanvas, Color.BLACK, X1, 0, rectWidth1, mScreenHeight);  
  
        drawFillRect(mCanvas, Color.BLACK, X2, 0, rectWidth2, mScreenHeight);// 绘制第二条矩形  
  
        drawFillRect(mCanvas, Color.BLACK, X3, 0, rectWidth3, mScreenHeight);// 绘制第三条矩形  
  
    }  
简单说明:首先我们将屏幕分割四个长方形.第一个会时时增大及向右移动,而其余三个长方形也跟随右移动,所以感觉类似于滚动波纹.滚动(向左)水纹场景同理.
横向分割场:
[java]  
/*** 
     * 横向分割图片 
     */  
    public void doHalf_V() {  
        int Y = mScreenHeight / 2;// 获取中间分割线  
        int Y1 = Y - rectStep;// 上半部分X坐标  
  
        drawFillRect(mCanvas, Color.BLACK, 0, Y1, mScreenWidth, rectStep);// 绘制上部分  
  
        drawFillRect(mCanvas, Color.BLACK, 0, Y, mScreenWidth, rectStep);// 绘制下部分  
    }  
这个我就不说明了,因为这个是最简单的一个.
最后我们来看下drawFillRect方法.
[java] 
/** 
     * 绘制一个矩形 
     *  
     * @param canvas 
     * @param color 
     * @param x 
     * @param y 
     * @param w 
     * @param h 
     */  
    public void drawFillRect(Canvas canvas, int color, int x, int y, int w,  
            int h) {  
        int backColor = mPaint.getColor();  
        mPaint.setColor(color);  
        canvas.save();  
        canvas.clipRect(x, y, x + w, y + h);  
        int id = currentId + 1;  
        if (id == bitmap.length)  
            id = 0;  
        // 绘图  
        canvas.drawBitmap(bitmap[id], null, rectF, null);  
        canvas.restore();  
        mPaint.setColor(backColor);  
    }  
这个方法是对你剪裁的矩形进行填充图片.代码都比较简单,相信大家都能看明白.
或许大家发现了,我们的场景其实都是由矩形得来的,这也得益于API提供了这个clipRect方法,但是API只提供了对矩形的剪裁,比如说圆形、弧形可是没有,所以我没有办法做到这些,不过提供矩形的剪裁已经不错了,只要你有好的实现想法,都可以自
补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,