前二天因工作需要,上头要求做一个wap版的网站,到网上学习了一天,整理几点经验如下:
1.wap网站用的是wml标识,非html,而且传统的javascript也不再适用,而是wmlscript,所以第一次接触的朋友们要先大概了解一下这个东东,学习资源如下:
http://www.w3school.com.cn/wap/wap_intro.asp --wml学习
http://www.w3school.com.cn/wmlscript/index.asp --wmlscript学习
2.找一款好的wap浏览器,普通浏览器并不能直接浏览wap网站,所以得找一个模拟器,以下是几款常用的:
a.opera 9以上版本(但好象不支持wmlscript)
b.openwave
c.winwap
d.m3gate (个人感觉这个最好用,不过这玩意儿现在升级了,好象不太好使了,建议如果要用这个,找旧版本的测试)
3.搭建测试环境(以IIS为例)
wap网站跟常规网站的不同在于,需要增加几个mime类型的支持:
在iis的站点mime类型里,把.wml,.wmls,.wmlc,.wmlsc,.wbmp这五类后缀添加进去就可以了
4.vs.net2008的配置
vs.net2005本来可以直接创建"Mobile WebForm"的,但到了vs2008反而将过一功能去掉了,所以需要手动下载"移动web窗体的模板",详细可参考
http://www.cnblogs.com/3stones/archive/2009/01/05/1351969.html 一文
5.为方便测试,还需要强制让vs输出wml,在web.config中把下面这节内容放在<system.web>之后
<browserCaps>
<result type="System.Web.Mobile.MobileCapabilities, System.Web.Mobile, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
<use var="HTTP_USER_AGENT"/>
preferredRenderingType = "wml11"
preferredRenderingMime = "text/vnd.wap.wml"
preferredImageMime = "image/vnd.wap.wbmp"
</browserCaps>
另外,因为wap开发中,很多常规控件都不能用,所以只能用一些最基本的移动控件,除此之外,其它开发跟常规webForm无异
要注意的地方:
1.传递多个参数时,不能用xxx.aspx?a=1&b=2 ,而要改成xxx.aspx?a=1&b=2 ,否则在opera上无法解析
2.如果在MobilePage对应的aspx中,直接用<%="你的内容"%>,最终运行时将得不到任何输出,正确的办法是创建一个Mobile User Control,在控件里就可以这样用了,然后再把该控件放到页面里
3.Mobile控件中,没有Repeater控件,只能用Mobile:List控件来代替,但是这个东西,我个人觉得并不好用,还不如在后台直接生成字符串,然后利用2中的办法,放到自定义控件里输出
4.几乎每个Mobile控件,都有一个BreakAfter属性,默认为true,即每个控件后面会自动添加<br />标记,如果您不需要换行,把这个属性设置为false
出处:http://yjmyzz.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
这个问题已经研究了好多遍了,总是忘记,就整理下来加深印象:
(1)方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。重载Overloading是一个类中多态性的一种表现。
(2)Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性。
(3)重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准
/**********************************************************/
然后我们再来谈谈 重写(Overriding)
(1) 父类与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。
在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。
(2)若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。
(3)子类函数的访问修饰权限不能少于父类的;
下面举例来说明一下动态绑定的概念:
class Base { void test(int i) { System.out.println("in base class"); System.out.print(i); } void test(byte b) { System.out.print(b); } } public class Test extends Base { void test(int i) { System.out.println("in test class"); i++; System.out.println(i); } public static void main(String[] agrs) { Base b = new Test(); b.test(0); b.test((byte) 0); } }
输出结果为:
in test class
1
0
摘自:知易教程
Cocos2d-iPhone 实现地图显示的有主要 2 组文件:
1) 负责整体地图的显示:CCTMXTiledMap.h, CCTMXTiledMap.m
2) 负责 xml 文件读取和解析:CCTMXXMLParser.h,CCTMXXMLParser.m
在实际游戏编程中,我们主要用到以下几个类:
1) CCTMXTiledMap
Layer 类的 init 凼数中通过以下的代码加载地图:(确保 PNG 文件不 tmx 在一起)
// Load level map gameWorld = [CCTMXTiledMap tiledMapWithTMXFile:@"Level1.tmx"]; [self addChild:gameWorld z:0 tag:9];
TMXTiledMap 是从 CocosNode 直接派生出来的。他的定义比我们预想的要简单:
@interface CCTMXTiledMap : CCNode { CGSize mapSize_; CGSize tileSize_; int mapOrientation_; NSMutableArray *objectGroups_; NSMutableDictionary *properties_; NSMutableDictionary *tileProperties_; }
分析初始化凼数 init 如下:
-(id) initWithTMXFile:(NSString*)tmxFile { NSAssert(tmxFile != nil, @"TMXTiledMap: tmx file should not bi nil"); if ((self=[super init])) { [self setContentSize:CGSizeZero]; CCTMXMapInfo *mapInfo = [CCTMXMapInfo formatWithTMXFile:tmxFile]; NSAssert( [mapInfo.tilesets count] != 0, @"TMXTiledMap: Map not found. Please check the filename."); mapSize_ = mapInfo.mapSize; tileSize_ = mapInfo.tileSize; mapOrientation_ = mapInfo.orientation; objectGroups_ = [mapInfo.objectGroups retain]; properties_ = [mapInfo.properties retain]; tileProperties_ = [mapInfo.tileProperties retain]; int idx=0; for( CCTMXLayerInfo *layerInfo in mapInfo.layers ) { if( layerInfo.visible ) { CCNode *child = [self parseLayer:layerInfo map:mapInfo]; [self addChild:child z:idx tag:idx]; // update content size with the max size CGSize childSize = [child contentSize]; CGSize currentSize = [self contentSize]; currentSize.width = MAX( currentSize.width, childSize.width ); currentSize.height = MAX( currentSize.height, childSize.height ); [self setContentSize:currentSize]; idx++; } } } return self; }
CCTMXTiledMap 直接由类 CCTMXLayer 来实现地图的每一个层。每一个 CCTMXLayer 的实例都是通过 Cocos2D-iPhone 标准的 AddChild 添加给 CCTMXTiledMap 的。
2) CCTMXlayer
CCTMXLayer 类定义如下:
@interface CCTMXLayer : CCSpriteBatchNode { CCTMXTilesetInfo *tileset_; NSString *layerName_; CGSize layerSize_; CGSize mapTileSize_; uint32_t *tiles_; // GID are 32 bit NSUInteger layerOrientation_; NSMutableArray *properties_; unsigned char opacity_; // TMX Layer supports opacity NSUInteger minGID_; NSUInteger maxGID_; // Only used when vertexZ is used NSInteger vertexZvalue_; BOOL useAutomaticVertexZ_; float alphaFuncValue_; // used for optimization CCSprite *reusedTile_; ccCArray *atlasIndexArray_; }显然,CCTMXLayer 对于“瓦片”图像块的管理是通过 CCSpriteSheet 来实现的。 因此,地图的每一个“瓦片”图像就是一个 CCSprite 对象。于是,每一个“瓦片”图 像都可以迚行任意的 CCSprite 操作(增加、删除、移劢、放缩、旋转、变色...)。所有 这些操作都是劢态迚行的。这就允许我们在游戏迚行过程中的对地图迚行劢态操作,通过劢态改变地图的状态来反映游戏精灵对环境产生的影响。