当前位置: 代码迷 >> Android >> android 游戏之场景的兑现以及拓展应用照片浏览器
  详细解决方案

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

热度:3   发布时间:2016-05-01 12:25:42.0
android 游戏之场景的实现以及拓展应用照片浏览器

        有些天没有写博客了,最近一直在为游戏打基础,主要因为之前是做应用,对游戏还不够了解.(这里瞎扯一点,我之所以转游戏,一方面:因为应用比较简单,开发人员跳级性的增长,加上HTML5的流行,如果HTML5移动上面完全铺开的话,后面可想而知...第二嘛:挣钱多,这也是我要转行的最主要的因素,敢问当今,这年代没钱能做什么!!!扯淡话不多说了,总之程序这条路是为我集资.吃苦受累都是浮云.钱才是王道.)   

         下面我们说下有游戏,当我们过关卡的时候游戏中或许出现场景切换,这对做游戏开发的同学们在熟悉不过了,这里我简单介绍下,一来自己巩固下学习的知识,二来把我学习的心得分享出来,以便大家共同进步.

  实现原理:首先我们对屏幕进行clipRect获取相应的矩形模块.然后在用图片进行填充.

 矩形(横向)交差场景实现:

/***	 * 矩形场景(横向)	 */	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的特殊操作。

百叶窗场景实现:

/***	 * 百叶窗场景	 */	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的宽高分割成若干个正方形然后一一进行填充.

滚动(向右)水纹场景:

/***	 * 滚动水纹场景(右移动)	 */	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);// 绘制第三条矩形	}
简单说明:首先我们将屏幕分割四个长方形.第一个会时时增大及向右移动,而其余三个长方形也跟随右移动,所以感觉类似于滚动波纹.滚动(向左)水纹场景同理.

横向分割场:

/***	 * 横向分割图片	 */	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方法.

/**	 * 绘制一个矩形	 * 	 * @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只提供了对矩形的剪裁,比如说圆形、弧形可是没有,所以我没有办法做到这些,不过提供矩形的剪裁已经不错了,只要你有好的实现想法,都可以自己一一构造。场景就介绍到这里.


下面我们进行拓展:其实也不叫拓展,因为我是做应用的,所以第一个想到的就是这东东在应用中可以实现什么效果. 比如个性相册播放器.或者图片浏览器等等.其实把游戏中的效果运用到应用的话,效果会很不错的.

下面我介绍下实现的流程:首先我们要自定义SurfaceView控件,将获取图片数组集合射入到该自定义控件中.然后就是逻辑处理,我们要每5分钟执行一下图片切换,也就是场景切换效果.而执行场景切换的效果最好是随机的.就这么多简单吧.

只要你明白原理,其实实现起来一点也不难,难的是我们的逻辑要进行如何处理,这也是游戏开发的难点,不同于应用,应用控件都是现成的,顶多重写其控件额外增加些辅助功能.所以最重要的一点:你要有耐心.


好了,下面我们看下效果吧.(看着还不错吧. 截屏工具不好,所以看起来有点卡,手机模拟器运行没有什么问题的.)




就说到这里,如有疑问请留言。

另外,如果对您有帮助的话,记得赞一个.

在此:Thanks for you !


4楼jie8975496635天前 00:35
本人新手,请问你都是用java做的吗?你是上大学学的吗?
Re: jj1205224天前 18:51
回复jie897549663n嗯,java做的.工作中学的.
Re: jie8975496634天前 22:39
回复jj120522n大学里能学到吗?觉得很好,属于自学吗?
Re: jj120522昨天 15:10
回复jie897549663n大学里或许很少吧,不过自学没问题的,网上资料很多的.n悲剧,我大学那会就接触了点J2EE,共同努力吧!
3楼vvqiu5天前 00:30
[quote=jie897549663]本人新手,请问你都是用java做的吗?你是上大学学的吗?[/quote]n其实等你大学学出来,这技术不说过时,也基本饱和了。要么你参加培训,要么自学。安卓巴士资料多一点,QQ群:安卓游戏开发 群主恋你建了好几个 首页就能看到。大学只能学基础,不会跟着社会步伐前进的
2楼feng33ge5天前 00:26
求源码!!!!!!!!
1楼qqOO37475天前 00:17
有点复杂
  相关解决方案