当前位置:  编程技术>移动开发
本页文章导读:
    ▪Unity3D开发(1):NGUI之UIRoot屏幕分辨率自适应        Unity3D开发(一):NGUI之UIRoot屏幕分辨率自适应NGUI在Unity3D游戏开发中非常常用,而NGUI对于每一个UI场景,都是以一个UIRoot为UI游戏对象树的根的,那么这个UIRoot是起什么作用的呢? 先简单看.........
    ▪ Objective-C学习札记 循环结构        Objective-C学习笔记 循环结构在OC中提供了三种循环结构while、do...while、for,学过编程语言的都了解这个,OC这方面与其他的与其他的变成语言没有什么不同,下面就简单的介绍一下。 while是先.........
    ▪ 完善二叉树       完美二叉树不废话,直接上代码 class BinaryTree { // 定义二叉树的操作类 class Node { private Comparable data; // 保存数据 private Node left;// 表示左子树 private Node right;// 表示右子树 public Node(Compara.........

[1]Unity3D开发(1):NGUI之UIRoot屏幕分辨率自适应
    来源: 互联网  发布时间: 2014-02-18
Unity3D开发(一):NGUI之UIRoot屏幕分辨率自适应

NGUI在Unity3D游戏开发中非常常用,而NGUI对于每一个UI场景,都是以一个UIRoot为UI游戏对象树的根的,那么这个UIRoot是起什么作用的呢?

先简单看一下UIRoot中的基本属性

UIRoot游戏对象的属性只有4个,分别是缩放规则,手动高度,最小高度和最大高度

而正是这4个属性,将影响整个UI场景中整体的缩放比例,当设置好这4个属性之后,UIRoot游戏对象的相对缩放值(LocalScale)将会生成并且不能被直接修改(NGUI中很多属性都是不能直接被修改的,这种控制是在UIRoot脚本中,通过设置[ExecuteInEditMode]做到的,其相对缩放值是根据UIRoot的4个属性计算出来的),那么这4个属性分别是什么含义呢?

(吐槽一下,也许这里的用户体验并不足够友好,因为Manual Height和Minimum Height, Maximum Height并不会同时起作用,如果能做到在选择Scaling Style时动态的切换,使用者也许能更清楚它们之间的关系)


1.Scaling Style (缩放类型)

这是一个简单的枚举变量,包括三个枚举值

public enum Scaling
	{
		PixelPerfect,
		FixedSize,
		FixedSizeOnMobiles,
	}
(FixedSize和FixedSizeOnMobiles类似,并且后者只添加了对ios和android平台的判断,所以前者可以替代后者使用)

这里只讨论PixelPerfect和FixedSize的区别,两者都是针对于所有在此UIRoot之下的UI组件而言的,也可以认为是在此UIRoot下,整个游戏屏幕的尺寸的缩放类型!


2.Manual Height和Minimum Height, Maximum Height (手动高度和最小高度,最大高度)

Manual Height和Minimum Height, Maximum Height不会同时对此UIRoot起作用,当选择Scaling Style为PixelPerfect时,我们需要设置Minimum Height, Maximum Height;而当Scaling Style为FixedSize或FixedSizeOnMobiles时,我们需要设置Manual Height。(这就是我前面吐槽的原因)


3.使用 (1)PexelPerfect和Minimum Height, Maximum Height

这个组合主要用于我们期望所有的UI纹理都“尽量”不进行缩放,所谓“尽量”的程度,则是取决于Minimum Height和Maximum Height,Minimum Height表示当设备分别率小于此设置值时,根据此设置值对UIRoot进行缩放;Maximum Height表示当设备分辨率大于此设置值时,根据此设置值对UIRoot进行缩放(UIRoot是UI游戏对象树的根,修改UIRoot的缩放,则会影响整棵UI树的缩放)

(2)FixedSize和Manul Height

这个组合主要用于我们期望所有的UI纹理都进行“合适”的缩放,所谓“合适”缩放的原则,则是根据Manual Height设置值,当设备分辨率的高度值不同于此设置值时,则根据其比例(即Manual Height / Screen Height)对整棵UI树的进行“等比”缩放(宽度的缩放比也是此比例值),这样,我们就可以做一套资源,在不同尺寸的分辨率最好的“不变形”的适配了

(3)交集

前面两组在什么情况下等同呢?

Manual Height == Minimum Height == Maximum Height 

推导过程,呵呵~~

具体可参考UIRoot中activeHeight属性和GetPixelSizeAdjustment的计算过程


4.这也许并不够

基于以上推到,当我们以1024x768为标准分辨率做一套UI资源(也就是选择FixedSize并且Manual Height=768),似乎可以满足百分之90以上的机型了,而为什么是1024x768呢?

既然我们已经容忍在除1024x768之外的其他设备上进行等比缩放了,那为什么不是960x640呢?

计算一下1024x768的宽高比=1.33,960x640的宽高比=1.5,这就是移动设备的分辨率比例的全部了吗?

当然不是,iphone5的比例就要大于1.5,还有各种奇葩的android设备呢,比如夏新的n828就是960x540,宽高比=1.78

那为什么以1024x768为标准呢?

因为1.33的宽高比,当我们的1024x768的资源到960x640的设备上时会有什么现象?

根据Manual Height / Screen Height的比例可知,我们需要缩放768 / 640 = 1.2倍,假设是一张1024x768的纹理,高度缩放1.2倍变为了640,宽度也要相应缩放1.2倍变为853(保证等比缩放不变形),也就是说1024x768的资源放到960x640上反而两边有了黑边,这是我们可以容忍的,我们可以做一个很大的背景或者拉伸,保证UI组件不变形即可,很多游戏都是这么做的,比如植物大战僵尸在iphone5和ipad上看到的背景视野并不一样大!

当放到夏新的机器上呢?

我们需要缩放768 / 540 = 1.4倍,宽度1024 / 1.4 = 731,这是可以的,只是看起来更怪一些,因为两边的黑边相对比例更大了(960 - 731=229的黑边区域)

而我表示android机器的分辨率奇葩到只有想不到,没有做不到的程度,也许宽高比1.7并不是终点,当遇到1.8之后,黑边的相对比例会更大。。。


5.问题又来了

假设我们的游戏类型更适合iphone手机玩,不太适合ipad,所以我希望能以960x640为标准做一套资源,可以吗?

我只能说不太可以,因为你要在设计UI组件的大小做限制了,为什么需要做限制?

假设我有一张纹理是960x640大小的,在iphone上铺满整屏,根据我们的设置(FixedSize和Manual Height=640),拿到1024x768的分辨率上,高度640 / 768 = 0.83,为了保证等比缩放,宽度960 / 0.83 = 1156,不幸的事情发生了,1156 > 1024,这个UI组件宽度超过了屏幕的宽度,被裁剪了。。。这是我们不能容忍的,或许你可以说我们尽量不做这种尺寸的UI,OK,你可以对UI尺寸加限制,但是当面对android那些奇葩的分辨率的时候,你会发现限制越来越大,这也许会让美术和策划疯掉!


6.

当我们花上一些时间去观察现在移动设备的分辨率时,虽然奇葩很多,但是还是有一些规律的,规律的在于宽高比而不在于具体尺寸,大体上划分一下宽高比在1.3,1.5,1.7的范围上的居多(基本是全部吧!)即便是再有1.2,1.8的比例也无妨。。。

NGUI为我们提供的方案只有以各种高度为衡量标准是不够的,我们应该加上一种以宽度为衡量标准的缩放类型

而对于UI资源的标准,我们选取960x640,宽高比为1.5

这样,当我们在兼容大于1.5的尺寸的时候,使用NGUI的现有方案;当我们在兼容小于1.5的尺寸的时候,使用以宽度为衡量标准

也就是说有一个类似Manual Width的属性,当小于1.5时,我们使用Manual Width / Screen Width得出整棵UI树的缩放比例!

这样做的好处是“黑边”区域不会太大,并且不需要对UI组件的大小做限制!


PS: 我表示以上言论对于“可以为适配分辨率做无数套图的资源土豪”而言可能是我想多了!



    
[2] Objective-C学习札记 循环结构
    来源: 互联网  发布时间: 2014-02-18
Objective-C学习笔记 循环结构

在OC中提供了三种循环结构while、do...while、for,学过编程语言的都了解这个,OC这方面与其他的与其他的变成语言没有什么不同,下面就简单的介绍一下。

while是先判断条件然,如果条件成立则执行代码。do...while是先执行然后判断条件是否成立,所以do...while的代码一定会执行一次。for一般是知道执行循环的次数的时候使用。

在循环中还有continue和break需要知道。continue是跳过本次循环,执行下次循环。break是跳出整个循环结构。

//
//  main.m
//  mxy02-loopTest
//
//  Created by mxy on 13-9-7.
//  Copyright (c) 2013年 mxy. All rights reserved.
//

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        
        /*
            循环输出0-4
         */
       //for
        NSLog(@"for");
        for (int i = 0; i < 5; i++) {
            NSLog(@"这是第%d个数字",i);
        }
        
       //while
        NSLog(@"while");
        int i = 0;
        while (i < 5) {
            NSLog(@"这是第%d个数字",i);
            i ++;
        }
       //do...while
        NSLog(@"do...while");
        i = 0;
        do {
            NSLog(@"这是第%d个数字",i);
            i ++;
        } while (i < 5);
        
        /*
         2013-09-07 22:47:26.819 mxy02-loopTest[860:303] for
         2013-09-07 22:47:26.829 mxy02-loopTest[860:303] 这是第0个数字
         2013-09-07 22:47:26.833 mxy02-loopTest[860:303] 这是第1个数字
         2013-09-07 22:47:26.835 mxy02-loopTest[860:303] 这是第2个数字
         2013-09-07 22:47:26.844 mxy02-loopTest[860:303] 这是第3个数字
         2013-09-07 22:47:26.848 mxy02-loopTest[860:303] 这是第4个数字
         2013-09-07 22:47:26.851 mxy02-loopTest[860:303] while
         2013-09-07 22:47:26.862 mxy02-loopTest[860:303] 这是第0个数字
         2013-09-07 22:47:26.867 mxy02-loopTest[860:303] 这是第1个数字
         2013-09-07 22:47:26.870 mxy02-loopTest[860:303] 这是第2个数字
         2013-09-07 22:47:26.876 mxy02-loopTest[860:303] 这是第3个数字
         2013-09-07 22:47:26.878 mxy02-loopTest[860:303] 这是第4个数字
         2013-09-07 22:47:26.881 mxy02-loopTest[860:303] do...while
         2013-09-07 22:47:26.885 mxy02-loopTest[860:303] 这是第0个数字
         2013-09-07 22:47:26.890 mxy02-loopTest[860:303] 这是第1个数字
         2013-09-07 22:47:26.893 mxy02-loopTest[860:303] 这是第2个数字
         2013-09-07 22:47:26.897 mxy02-loopTest[860:303] 这是第3个数字
         2013-09-07 22:47:26.900 mxy02-loopTest[860:303] 这是第4个数字
         */
        
        //while与do...while不同在于判断的时间,while是先判断后执行,do...while是先执行后判断
        //与上面代码一样,只是将i改成了5
        //从结果中可以看出while什么都没有输出
        //do..while是输出了一次
        //while
        NSLog(@"while");
        i = 5;
        while (i < 5) {
            NSLog(@"这是第%d个数字",i);
            i ++;
        }
        //do...while
        NSLog(@"do...while");
        i = 5;
        do {
            NSLog(@"这是第%d个数字",i);
            i ++;
        } while (i < 5);
        
        /*
         2013-09-07 22:50:22.772 mxy02-loopTest[871:303] while
         2013-09-07 22:50:22.776 mxy02-loopTest[871:303] do...while
         2013-09-07 22:50:22.784 mxy02-loopTest[871:303] 这是第5个数字
         */
        
        /*
         break continue
         */
        //break
        NSLog(@"break");
        for (int m = 0 ; m < 5; m ++) {
            if(m == 2){
                break;
            }
            NSLog(@"数字%d",m);
        }
    
        //continue
        NSLog(@"continue");
        for (int m = 0 ; m < 5; m ++) {
            if(m == 2){
                continue;
            }
            NSLog(@"数字%d",m);
        }
    
        /*
         2013-09-07 22:57:16.446 mxy02-loopTest[905:303] break
         2013-09-07 22:57:16.454 mxy02-loopTest[905:303] 数字0
         2013-09-07 22:57:16.456 mxy02-loopTest[905:303] 数字1
         2013-09-07 22:57:16.481 mxy02-loopTest[905:303] continue
         2013-09-07 22:57:16.485 mxy02-loopTest[905:303] 数字0
         2013-09-07 22:57:16.489 mxy02-loopTest[905:303] 数字1
         2013-09-07 22:57:16.491 mxy02-loopTest[905:303] 数字3
         2013-09-07 22:57:16.494 mxy02-loopTest[905:303] 数字4

         */
    
    }
    return 0;
}


示例项目的下载地址:http://www.kuaipan.cn/file/id_29315247739243354.htm


    
[3] 完善二叉树
    来源: 互联网  发布时间: 2014-02-18
完美二叉树

不废话,直接上代码

class BinaryTree { // 定义二叉树的操作类
	class Node {
		private Comparable data; // 保存数据
		private Node left;// 表示左子树
		private Node right;// 表示右子树
		public Node(Comparable data) {
			this.data = data;
		}
		public void addNode(Node newNode) {
			if (((Integer)(newNode.data)).compareTo((Integer)(this.data)) < 0) {
				if (this.left == null) { // 当前的左子树是否等于空
					this.left = newNode;
				} else {
					this.left.addNode(newNode);// 继续向下继续判断
				}
			}
			if (((Integer)(newNode.data)).compareTo((Integer)(this.data)) >= 0) {
				if (this.right == null) { // 当前的右子树是否等于空
					this.right = newNode;
				} else {
					this.right.addNode(newNode);
				}
			}
		}
		public void printNode() {
			if (this.left != null) {
				this.left.printNode();
			}
			System.out.println(this.data);
			if (this.right != null) {
				this.right.printNode();
			}
		}
	}
	private Node root; // 定义根节点
	public void add(Comparable data) { // 表示增加节点
		Node newNode = new Node(data);
		if (this.root == null) { // 此时没有根节点,第一个元素作为根节点
			this.root = newNode;
		} else { // 判断节点是放在左子树还是右子树
			this.root.addNode(newNode);
		}
	}
	public void print() { // 打印节点
		this.root.printNode();
	}
}


public class BinaryTreeDemo {
	public static void main(String[] args) {
		BinaryTree bt = new BinaryTree();
		bt.add(5);
		bt.add(3);
		bt.add(1);
		bt.add(90);
		bt.add(90);
		bt.add(100);
		bt.add(60);
		bt.print();
	}
}



    
最新技术文章:
▪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显式启动与隐式启动Activity的区别介绍
▪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