当前位置:  编程技术>移动开发
本页文章导读:
    ▪寨子腾讯“爱消除”游戏7日教程-DAY3        山寨腾讯“爱消除”游戏7日教程--DAY3【课程内容】 今天课程的目的是设计一个棋盘,然后叠加上前天的动物素材。研究叠加后的效果。这是后续课程的基础。 【源代码下载地址】http://downloa.........
    ▪ 关于ViewGroup 中listview 跟GridView数据不能动态更新的解决        关于ViewGroup 中listview 和GridView数据不能动态更新的解决在网上找了一份模仿系统Launcher的代码,是一个继承看碟ViewGroup的自定义组件,可以左右划屏,效果与QQ,微信之类的软件第一次启动时欢迎帮.........
    ▪ unity3d学习札记(十七)-unity3d读取csv文件       unity3d学习笔记(十七)--unity3d读取csv文件本系列文章由Aimar_Johnny编写,欢迎转载,转载请标明出处,谢谢。 http://blog.csdn.net/lzhq1982/article/details/12968309 在mac os下写过手游程序的应该都清楚cs.........

[1]寨子腾讯“爱消除”游戏7日教程-DAY3
    来源: 互联网  发布时间: 2014-02-18
山寨腾讯“爱消除”游戏7日教程--DAY3

【课程内容】

今天课程的目的是设计一个棋盘,然后叠加上前天的动物素材。研究叠加后的效果。这是后续课程的基础。

【源代码下载地址】http://download.csdn.net/detail/elong_2009/6444923


1、棋盘设计

好了,有了前面两天课程的经验,我们很容易就能设计出如下效果的一个棋盘。后续我们会以此棋盘作为一个背景素材,逐渐在上面叠加各种各样的特效。

 

要实现交错的棋盘,有很多种方法,可以直接用OpenGL ES提供的绘图函数绘制,也可以采用我们一直使用的纹理贴图方式绘制。在这里,我们还是继续使用已经很熟悉的纹理贴图的方法。

 

2、DrawGrid 类

类似的,DrawGrid 类的核心方法还是公有的draw方法,在该方法中,我们循环调用drawBox私有方法实现棋盘的绘制。

    public void draw(GL10 gl)

    {

     for(int i = 0; i < 7; i++)

     {

     for(int j = 0; j < 7; j++)

     {

     drawBox(gl, (i + j)%2, i, j);

     }    

     }

}

 

drawBox 的实现在前面的课程中已经多次用到了,这里就不再罗嗦,大家直接看附件就行了。

 

3、叠加效果

前面提到,我们的设计思想是设计若干独立的渲染类DrawXxx,每个渲染类都完成独立的图像绘制或效果绘制。现在,我们将我们已经实现的DrawAnimal和DrawGrid叠加起来,看一看最后的效果。

在onDrawFrame 中加入以下代码,就可以看到如下的效果:

         drawAnimal.draw(gl,1,0,3);

         drawAnimal.draw(gl,2,1,3);

         drawAnimal.draw(gl,3,2,3);

         drawAnimal.draw(gl,4,3,3);

         drawAnimal.draw(gl,5,4,3);

         drawAnimal.draw(gl,6,5,3);

         drawAnimal.draw(gl,7,6,3);

         drawGrid.draw(gl);

 

 

 

您是否注意到了,在上图中,Animal对象完全覆盖了对应位置的Grid对象?虽然看起来效果也不差,但这并不是我们要求的最终效果。

我们希望Animal中的图案,不要遮挡棋盘的背景。

 

4、透明的素材

要实现透明的叠加效果,我们需要重新设计animal.png素材,将无关的地方设计为透明的。

用PhotoShop新建一个项目,注意背景内容要选择“透明”。

 

 

 

有套索工具把需要变成透明的部分抠出来。

 


 

 

最后加工后的图片效果图如下:

 

 

加工这个图片耗费了我近一个小时的时间,而最终的效果并不是最理想的。如果你想获得更佳的效果,那么在PhotoShop上您需要学习更多的技巧,并有足够的耐心。

 

5、透明的叠加效果

好了,素材准备好了,现在让我们来看看如何实现透明的叠加效果吧!

要实现透明的叠加效果,关键的地方是在onSurfaceCreated 中加入以下几行代码:

            /*********以下为增加透明效果的代码***********/

            /*透明效果对素材图片也有要求,要求图片的背景是透明的*/

         gl.glEnable(GL10.GL_BLEND);  

         gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);  

         gl.glEnable(GL10.GL_ALPHA_TEST);

         gl.glAlphaFunc(GL10.GL_GREATER,0.1f);

        /*********透明效果***********/

 

效果如下:

 

 

 

继续将DrawLoading叠加后的效果如下:

 

怎么样,看起来是不是很cool!这已经初步达到了我们要的效果。在后续的课程中,我们还会通过各个渲染类,叠加更多更丰富多彩的效果。

要设计出完美的游戏效果,归根结底就是精心设计每一个渲染类。就这么简单,你想明白了么?

 

6、介绍glAlphaFunc函数

public void glAlphaFunc(int func,float ref)

功能:

指定Alpha测试功能。

详细:

Alpha测试依据结果舍弃片段,该结果由引入片段的alpha值与参照值常量进行比较得到。glAlphaFunc指 定参照值与比较方法。只有当alpha测试有效时,比较才有用。使alpha测试有效或无效可以利用glEnable和glDisable方法,它们都是 以GL_ALPHA_TEST为参数的,alpha测试初始为无效。

func与ref指明像素被绘出的条件。引入的alpha值通过func指明的方法与ref指明的参照值进行比较。如果该值通过比较并且通过随后的模型测试与深度缓冲区测试,则将引入的片段绘出。如果该值未通过比较,则该像素区的帧缓冲区不会发生任何变化。比较方法如下:

GL_NEVER:不会通过。

GL_LESS:如果引入的alpha值比参照值小则通过。

GL_EQUAL:如果引入的alpha值与参照值相等则通过。

GL_LEQUAL:如果引入的alpha值小于或等于参照值则通过。

GL_GREATER:如果引入的alpha值比参照值大则通过。

GL_NOTEQUAL:如果引入的alpha值与参照值不相等则通过。

GL_GEQUAL:如果引入的alpha值大于或等于参照值则通过。

GL_ALWAYS:总是通过。(初始设定)

对所有的像素写入操作进行glAlphaFunc操作,包括那些从点、线、多边形的扫描转换得到的结果。glAlphaFunc对glClear无影响。

错误:

当func不是被允许的值会产生GL_INVALID_ENUM(错误枚举)。

参数:

func——指明alpha比较方法,被允许的符合常量有GL_NEVER, GL_LESS,GL_EQUAL, GL_LEQUAL, GL_GREATER, GL_NOTEQUAL, GL_GEQUAL, 和 GL_ALWAYS。初始值为GL_ALWAYS。

ref——指明与引入的alpha值比较的参照值,这个值的属于区间[0, 1],初始值为0。

 


    
[2] 关于ViewGroup 中listview 跟GridView数据不能动态更新的解决
    来源: 互联网  发布时间: 2014-02-18
关于ViewGroup 中listview 和GridView数据不能动态更新的解决

在网上找了一份模仿系统Launcher的代码,是一个继承看碟ViewGroup的自定义组件,可以左右划屏,效果与QQ,微信之类的软件第一次启动时欢迎帮助效果类似.但是发现一问题,我在上面加了GridView,数据只有在程序启动时才能载入,启动后无法动态更新了,费了几个小时,终于找到解决方法



@Override
	protected void onLayout(boolean changed, int l, int t, int r, int b) {
		// TODO Auto-generated method stub		
//		 if (changed) {    
	            int childLeft = 0;    
	            final int childCount = getChildCount();    	                
	            for (int i=0; i<childCount; i++) {    
	                final View childView = getChildAt(i);    
	                if (childView.getVisibility() != View.GONE) {    
	                    final int childWidth = childView.getMeasuredWidth();    
	                    childView.layout(childLeft, 0,     
	                            childLeft+childWidth, childView.getMeasuredHeight());    
	                    childLeft += childWidth;    
	                }    
	            }    
//	        }    
	}

把if(change)注释掉即可.


    
[3] unity3d学习札记(十七)-unity3d读取csv文件
    来源: 互联网  发布时间: 2014-02-18
unity3d学习笔记(十七)--unity3d读取csv文件

本系列文章由Aimar_Johnny编写,欢迎转载,转载请标明出处,谢谢。

http://blog.csdn.net/lzhq1982/article/details/12968309


在mac os下写过手游程序的应该都清楚csv文件,它类似于excel表格文件,但csv文件里的数据是以逗号分隔的。unity3d并未提供直接读取csv文件的方法,那怎么办呢,没关系,很简单,下面看我是怎么做到的。先声明,我的操作系统是mac os。


1、创建csv文件

既然做实验嘛,没有资源怎么行,自己徒手写个csv文件吧,打开Numbers工具,新建一个表格文件,我的文件编辑截图如下:


创建完成后,导出成csv格式,我这里文件名为test.csv;


2、改成txt格式

既然unity3d不认识csv,那么我们人工处理一下,很简单,像上一篇文章一样,简单粗暴的把csv的扩展名改成txt吧,谁让unity3d比较亲txt呢,更改后是test.txt,打开后是这个样子的:


3、读取txt文件

上代码:

private string [][]Array;
void Start ()
{
	//读取csv二进制文件
	TextAsset binAsset = Resources.Load ("test", typeof(TextAsset)) as TextAsset;		
		
	//读取每一行的内容
	string [] lineArray = binAsset.text.Split ("\r"[0]);
 		
 	//创建二维数组
	Array = new string [lineArray.Length][];
		
	//把csv中的数据储存在二位数组中
	for(int i =0;i < lineArray.Length; i++)
	{
 		Array[i] = lineArray[i].Split (',');
	}
}
先读取test文件,这里要注意,你要把test文件放到Asset的Resources目录下,没有这个目录就自己创建一个。因为每一行结尾都会有个“\r”,所以用这个可以分隔出每行数据,然后我们创建一个二维数组Array,行数用上一句求出的行数据,列数待定。因为每一行的数据都是用“,”分隔符分开的,所以我们用逗号分隔出每列数据,再以行为单位保存在Array中。现在你打印Array.Length应该是5,表示行数,Array[0].Length应该是3,表示列数。


4、以行列数读取数据

string GetDataByRowAndCol(int nRow, int nCol)
{
	if (Array.Length <= 0 || nRow >= Array.Length)
		return "";
	if (nCol >= Array[0].Length)
		return "";
		
	return Array[nRow][nCol];
}
这个代码很简单,前面都是行列越界判断,没啥好说的,这时打印GetDataByRowAndCol(1,2)应该是“这是苹果”。

5、以Id和名称读取数据

这应该是项目最常用到的,以行列的名称定位数据。

string GetDataByIdAndName(int nId, string strName)
{
	if (Array.Length <= 0)
		return "";
		
	int nRow = Array.Length;
	int nCol = Array[0].Length;		
	for (int i = 1; i < nRow; ++i) {
		string strId = string.Format("\n{0}", nId);
		if (Array[i][0] == strId) {
			for (int j = 0; j < nCol; ++j) {
				if (Array[0][j] == strName) {
					return Array[i][j];
				}
			}
		}
	}
		
	return "";
}
上面代码也很简单,先循环行数据,判断ID是否相同,找到ID后再循环列数据,看名称是否相同,然后返回行列对应的数据。这里有一点值得注意,就是判断Id的时候,id前面会有个“\n”,这是换行标识符,你可以用Debug的方式看一下Array,除了第一行,每一行的Id都会有个“\n”的前缀,所以必须这么判断。这时打印GetDataByIdAndName(4,"name")应该是“梨”。

就这些,有问题欢迎提问,哈哈。


1楼sunicdavy昨天 18:06你这样读取格子里带双引号的会出错的Re: lzhq1982昨天 18:08回复sunicdavyn哪句呢,都是实测过的,没有错啊

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android双击返回键退出程序的实现方法 iis7站长之家
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3