2006年10月24日

完全的版本号定义,分三项::<主版本号>.<次版本号>.<修订版本号>,如 1.0.0。

版本号升级原则:

主版本号:功能模块有大的变动,比如增加多个模块或者整体架构发生变化。

次版本号:和主版本相对而言,次版本号的升级对应的只是局部的变动。但该局部的变动造成了程序和以前版本不能兼容,或者对该程序以前的协作关系产生了破坏,或者是功能上有大的改进或增强。

修订版本号:局部的变动,主要是局部函数的功能改进,或者bug的修正,或者功能的扩充。

 

原则上,自第一个稳定版本发布后,修订版本号会经常性改动,而次版本号则依情况作改动,主版本号改动的频率很低,除非有大的重构或功能改进。对于小项目而言,甚至可以简化为:>.<次版本号>.<修订版本号>。

 

2006年10月12日

一:遵循一致的准则,确立标准并遵循

  无论是控件使用,提示信息措辞,还是颜色、窗口布局风格,遵循统一的标准,做到真正的一致。
  这样得到的好处:

  1:使用户使用起来能够建立起精确的心里模型,使用熟练了一个界面后,切换到另外一个界面能够很轻松的推测出各种功能,语句理解也不需要费神理解
  2:降低培训、支持成本,支持人员不会行费力逐个指导。
  3:给用户统一感觉,不觉得混乱,心情愉快,支持度增加

  做法:

  项目组有经验人士,确立UI规范:
  ·美工提供色调配色方案,提供整体配色表
  ·界面控制程序人员、用户体验人员提出合理统一使用的控件库。参考标准界面使用规范:

  控件功能遵循行业标准,windows平台参见《Microsoft 用户体验》(MSDN中有,中文已经翻译发行,项目组必须有一本)

  控件样式在允许的范围内可以统一修改其样式、色调
  参考其他软件先进操作,提取对本项目有用的功能,以使用,绝对不能盲从,漫无目的。
  根据需要,设计特殊操作控件,准则为:简化操作、达到一定功能目的

  ·界面实施人员与美工商榷控件可实现性,(如不实行此步骤,将会导致各自对对方工作不满意,也会产生不一致的混乱)。重复叠代上述工作。
  ·建立合理化文档《UI标准》描述上述规范,
  ·强行界面设计者理解之,并作为开发准则,
  ·SQA人员进行监控开发人员是否遵循,及时告诫开发人员。

  二:(Color)颜色使用恰当,遵循对比原则

  1:统一色调,针对软件类型以及用户工作环境选择恰当色调:
  安全软件,根据工业标准,可以选取黄色,绿色体现环保,蓝色表现时尚、紫色表现浪漫等等,淡色可以使人舒适,暗色做背景使人不觉得累等

  2:如果没有自己的系列界面,采用标准界面则可以少考虑此方面,做到与操作系统统一,读取系统标准色表

  3:色盲、色弱用户,即使使用了特殊颜色表示重点或者特别的东西,也应该使用特殊指示符,如"!","?"着重号,以及图标等

  4:颜色方案也需要测试,常常由于显示器、显卡的问题,色彩表现每台机器都不一样,应该经过严格测试,不同机器进行颜色测试

  5:遵循对比原则:在浅色背景上使用深色文字,深色背景上使用浅色文字,蓝色文字以白色背景容易识别,而在红色背景则不易分辨,原因是红色和蓝色没有足够反差,而蓝色和白色反差很大。除非特殊场合,杜绝使用对比强烈,让人产生憎恶感的颜色。

  6:整个界面色彩尽量少的使用类别不同的颜色

  itop色表
  具体标准参考美术学统计学术标准。
  色表的建设,对于美工在图案设计、包装设计上起着标准参考作用,对于程序界面设计人员设计控件、窗体调色起到有章可循的作用。

  三:(Resource)资源

  一个多姿多彩的人机交互界面,少不了精美的鼠标光标、图标以及指示图片、底图等。

  1:也需要遵循统一的规则,包括上述颜色表的建立,图标的建立步骤也应该尽可能的形成标准,参考itop的outlookbar图标设计标准
  2:有标准的图标风格设计,有统一的构图布局,有统一的色调、对比度、色阶,以及图片风格
  3:底图应该融于底图,使用浅色, 低对比,尽量少的使用颜色。
  4:图标、图像应该很清晰的表达出意思,遵循常用标准,或者用户机器容易联想的到物件,绝对不允许画出默认奇妙的图案。
  5:鼠标光标样式统一,尽量使用系统标准,杜绝出现重复的情况,例如某些软件中一个手的形状就有4钟不同的样子。

八:(TAB ORDER)TAB顺序

  习惯用法,阅读顺序,从从左到右,从上到下
  窗体中控件的Tab按键激活顺序,TabOrder,. BCB/DELPHI中使用窗体设计右键菜单选择taborder设置,VC中窗体RES编辑区域使用ctrl+D

  九:(ShortcutKey & Accelerator& PopMenu)快捷键、加速键和弹出菜单

  ·快捷键:

  1:全局快捷键菜单中加以描述 CTRL+XXX 并入帮助列表。

  2:快捷键写入帮助,特殊说明,并在使用培训时强调使用

  ·加速键:

  1:使用非破坏性缺省按钮,回车、ESC键的正确使用

  一个窗体,有默认加速键,如回车表示激活当前窗口设置为default的按钮动作,esc表示关闭窗口。

  在调用default按钮动作和关闭动作时候,不应该做有破坏性的操作,避免用户错误操作产生危害程度,例如不能把删除数据等功能的按钮作为缺省按钮。当用户要提交很多数据时,应该屏蔽esc,或者做退出提示,告诫用户是否保存提交。

  2:可接收动作控件必须拥有加速键,统一加速键描述(&A)

  为结合键盘使用,可操作控件都应该有加速键,加速键定义准则,为英文单词第一个字母,如果同一窗体重复则用第二个字母,以此类推,则加速方式为alt+这个加速键,用统一的方法标识在界面中,如XXX(A) 或者wps的 A.XXX 英文可直接在字母下标识下划线 Cancel,

  对于无法像button一样显示快捷键的Edit等控件,则在Edit描述的Label中显示快捷键。

  ·弹出菜单

  辅助菜单必须在可视化界面上拥有对应的按钮或者菜单选项。

  由于辅助菜单由用户点击鼠标左右键或者别的动作才能调出来显示给用户。无法清晰的显示给用户,所以对应选项应该可以通过别的途径得到,例如界面上有相应控件或弹出右键菜单的按钮等。

  十:(ACTION)用户交互

  1:disable而不是not visible

  要使一个功能有时允许有时不允许用户使用,则这个控件的不能随便隐藏,应该使用disable属性进行表示,以免用户发现控件失踪后措手无策

  2:窗口弹出位置要明显

  点击一个控件,弹出窗口或者菜单,应该给人明显提示,最低要求是覆盖刚才点击的位置,让用户轻松跳转到新的界面。

  3:执行动作要提示

  给用户一个视觉感受的同时,写程序的时候应该注意用户的交互感受,UI作为人机对话的工具,用户做了任何动作,应该给用户一个视觉或者听觉、触觉提示。而且这个提示应该行明显,但不应提示过长,可以有以下几种方法:

  当用户点击按钮等动作进行一个工作时:

  1:弹出交互对话框让用户点击确认。
  2:改变UI中控件参数提示:(处理不用用户确认的提示,有一定延时,或者用户按键后自动清除。)
  如:改变标题栏字符串,显示“信息:提交成功”,或者专门设置一个状态栏、TLable等用来进行提示。
  3:听觉提示:
  在确定有声卡,用户可以听到声音的时候,发出特殊声音提示。一般作为重要提示的辅助。声音不应过长,紧急错误提示应该短促,频率较高,成功提示应该舒缓,轻松。等等……

【zt】

手机上内置聊天软件的争夺日趋白热化。日前,一种可以利用手机直接进行对讲通话的新兴聊天工具——PICA(皮咔),正试图借德信无线抢占手机终端。“掌中无限”CEO梁晖介绍说,在中国最大的手机软件和整机方案设计供应商牵手后,内置PICA的手机很快将要上市,年底之前估计能达到100多万部。据悉,在未来的一年里,德信无线将把“掌中无限”这款核心产品在其手机设计程序平台预置,从而实现跨终端、跨平台的手机对讲服务。

据了解,在将PICA软件植入手机终端后,通过手机用户可以实现基于移动数据网络的语音对讲、即时语音信息、图片或视频文件的传输。事实上,想抢占手机终端的聊天软件不仅只有PICA。近日,中国移动花很大精力开发的即时通信工具Fetion的Beta已经正式上线,进入公测阶段,这项被中国移动命名为“飞信”的业务,现在正以功能免费的形式进行业务正式商用前的基础用户积累。“飞信”业务现在提供PC到手机免费发送短信、2-8人的群组语音聊天以及交友活动,模式和功能与目前的PI鄄CA完全一致。

在被中国移动定制的手机中,中国移动不允许微软操作系统的手机内置MSN软件。面对中国移动对即时通信工具的垄断意图,PICA目前貌似强大的用户基础很可能不堪一击。这也可以看做是PICA与德信无线直接结盟并在年内规模推出PICA手机的重要原因———在中国移动“飞信”还没有完全成熟之前,借用手机企业的力量,进一步扩大用户市场,为以后赢得更大的话语权做准备。(n101)

 

/**

 *感叹中移动一手折天。

 *客户端平台依旧按计划开发。

 *命运受别人左右。不过我们还有一点点主动权。

 */

2006年09月28日

VC中定制Doxygen注释宏

 

感谢曾发明同学

 

1 参照vc自带的sample.dsm生成文档yymacro.dsm

2 编辑yymacro.dsm内容,添加如下三个宏:

       A)

生成Doxygen样式的函数注释

YYAddDoxygenFunctionDescription()

对应注释为:

       /**

        * Func1 declaration

        * @param int a input1 a

        * @param int b input2 b

        * @see TestMe()

        * @return int

 */

对应按钮为:

Ctrl+shift+f

 

       B)

生成doxygen样式的公开变量的注释

YYAddDoxygenValDescription ()

对应注释为:

/**< . . */

对应按钮为:

Ctrl+shift+v

       C)

生成doxygen样式的一般通用的注释

YYAddDoxygenCommenDescription ()

对应注释为:

/**

       *

 */

对应按钮为:

Ctrl+shift+c

3 保存yymacro.dsm,并添加该宏文件到sample.dsm所在目录中。

4 参照msdn To assign a macro to a toolbar button”,” To assign a macro to a key sequence映射对应宏到按钮和菜单。

 

5 附录:

A yymacro.dsm

‘——————————————————————————

‘FILE DESCRIPTION: 杨勇定制的宏,内含doxygen注释宏等。

‘——————————————————————————

 

辅助函数

‘Strips the leading tab spaces.

Function YYStripTabs (ByVal MyStr)

       Do While InStr(MyStr, vbTab) <> 0

              MyStr = Right(MyStr, Len(MyStr) – InStr(MyStr, vbTab))

       Loop

       YYStripTabs = Trim(MyStr)

End Function

 

生成Doxygen样式的函数注释

Sub YYAddDoxygenFunctionDescription()

‘DESCRIPTION: AddDoxygenFunctionDescription

‘DESCRIPTION: Creates a comment block for the currently selected C/C++ function prototype

 

       ‘Throughout this file, ActiveDocument.Selection is used in place

       ‘of ActiveDocument.Selection.Text.  The two are equivalent, and can

       ‘be used interchangeably. The reason for the equivalence is that

       ‘Text is regarded as the default property to use. All uses of

       ‘ActiveDocument.Selection without any other property default to the Text

       ‘property.

      

       if ActiveDocument.Language = dsCPP Then

              Header = YYStripTabs(Trim(ActiveDocument.Selection))

 

              ‘Get the function return type.

              ‘RetTp 返回类型

              if Header <> "" then

                     Reti = InStr(Header, " ")

                     Loc = InStr(Header, "(")

                     if Reti < Loc Then

                       RetTp = Left(Header, Reti)

                       Header = Right(Header, Len(Header) – Reti)

                     End If

 

                     ‘Get the function name.

                     ‘fcName 函数名城

                     Loc = InStr(Header, "(") – 1

                     Loc2 = InStr(Header, ")")

                     if Loc > 0 And Loc2 > 0 then ‘make sure there is a ‘(‘ and a ‘)’

                            fcName = Left(Header, Loc)

                            Header = Right(Header, Len(Header) – Len(fcName))

 

                            ‘Do we have storage type on the return type?

                            Trim (fcName)

                            If InStr(fcName," ") <> 0 Then

                                   retTp = retTp + Left(fcName,InStr (fcName," "))

                                   fcName = Right(fcName, Len(fcName) – InStr(fcName," "))

                            End If

 

                            ‘Get the function parameters.

                            iPrm = 0

                            iPrmA = 0

                            prms = Header

 

                            ‘Count the number of parameters.

                            Do While InStr(prms, ",") <> 0

                                   iPrm = iPrm + 1

                                   prms = Right(prms, Len(prms) – InStr(prms, ","))

                            Loop

                           

                            ‘Store the parameter list in the array.

                            If iPrm > 0 Then  ‘ If multiple params.

                                   iPrm = iPrm + 1

                                   iPrmA = iPrm

                                   Redim ParamArr(iPrm)

                                   Do While InStr(header, ",") <> 0

                                          ParamArr(iPrm) = Left(Header, InStr (Header, ",") – 1)

                                          ‘Remove brace from first parameter.

                                          If InStr(ParamArr(iPrm), " (") <> 0 Then

                                                 ParamArr(iPrm) = Right(ParamArr(iPrm), _

                                                               Len(ParamArr(iPrm))-InStr(ParamArr(iPrm)," ("))

                                                 Trim(ParamArr(iPrm))

                                          End If

                                          Header = Right(Header, Len(Header) – InStr(Header,","))

                                          iPrm = iPrm – 1

                                          Loop

                                   ParamArr(iPrm) = Header

                                   ‘Remove trailing brace from last parameter.

                                   If InStr(ParamArr(iPrm), ")") <> 0 Then

                                          ParamArr(iPrm) = Left(ParamArr(iPrm), _

                                                        InStr(ParamArr(iPrm), ")") – 1)

                                          Trim(ParamArr(iPrm))

                                   End If

                            Else ‘Possibly one param.

                                   Redim ParamArr(1)

                                   Header = Right(Header, Len(Header) – 1) ‘ Strip the first brace.

                                   Trim(Header)

                                   ParamArr(1) = YYStripTabs(Header)

                                   If InStr(ParamArr(1), ")") <> 1 Then

                                          ParamArr(1) = Left(ParamArr(1), InStr(ParamArr(1), ")") – 1)

                                          Trim(ParamArr(1))

                                          iPrmA = 1

                                   End If

                            End If

 

                            ‘Position the cursor one line above the selected text.

                            ActiveDocument.Selection.LineUp

                            ActiveDocument.Selection.LineDown

                            ActiveDocument.Selection.StartOfLine

                            ActiveDocument.Selection = vbLf

 

                            声称Doxygen样注释文档

                            Descr = vbTab + "/**" + _                                                    

                                          vbLf + vbTab + " * " + fcName + _

                                          vbLf

                           

                            ‘Print the parameter list.

                            Last = iPrmA

                            Do While iPrmA <> 0

                                   ‘Remove a line feed from any of the arguments.

                                   If InStr(ParamArr(iPrmA), vbLf) <> 0 Then

                                          ParamArr(iPrmA) = Right(ParamArr(iPrmA), _

                                                        (Len(ParamArr(iPrmA)) – _

                                                        InStr(ParamArr(iPrmA), vbLf)))

                                          Trim(ParamArr(iPrmA))

                                   End If

                                   ParamArr(iPrmA) = YYStripTabs(ParamArr(iPrmA))

                                   ‘If there are 2+ parameters, the first parameter will

                                   ‘have a ‘(‘ prepended to it, remove it here:

                                   if iPrmA = Last AND Last <> 1 then

                                     ParamArr(iPrmA) = Right(ParamArr(iPrmA), _

                                                 Len(ParamArr(iPrmA)) – 1)

                                   End If

                                   Descr = Descr + _

                                                 vbTab + " * @param " + ParamArr(iPrmA) + _

                                                 vbLf

                                   iPrmA = iPrmA – 1

                            Loop

 

                            Descr = Descr + _

                                          vbTab + " * @return " + RetTp + _

                                          vbLf + vbTab + " */" + _

                                          vbLf

                            ActiveDocument.Selection = Descr

                     Else

                            MsgBox("It is possible that the function you are trying to"+_

                                          " work with has a syntax error.")

                     End if

              End If

       Else

              MsgBox("You need to have an active C/C++ document open"+ _

                            vbLF+"with the function prototype selected.")

       End If

End Sub

 

生成doxygen样式的公开变量的注释

Sub YYAddDoxygenValDescription ()

       if ActiveDocument.Language = dsCPP Then

              ActiveDocument.Selection = ActiveDocument.Selection + _

                                                               vbTab + "/**< . . */"                          

       End if

End Sub

 

生成doxygen样式的一般通用的注释

Sub YYAddDoxygenCommenDescription ()

       if ActiveDocument.Language = dsCPP Then

              ActiveDocument.Selection = "/** " + _

                                                               vbLf + " * " + _

                                                               vbLf + " */"

       End if

End Sub

 

 

B)测试文件

#ifndef __A__H

#define __A__H

 

#include <iostream>

 

/**

 *   class A’s declaration

 */

class A

{

public:

       enum TEnum

       {

              TVal1,           /**< enum value TVal1. */ 

              TVal2,           /**< enum value TVal2. */ 

              TVal3            /**< enum value TVal3. */ 

       };

 

       TEnum *enumPtr; /**< enum pointer. Details. */

       TEnum enumVar;  /**< enum variable. Details. */

 

       /**

        * Func1 declaration

        * @param int a input1 a

        * @param int b input2 b

        * @see TestMe()

        * @return int

        */

 

       int Func1(int a, int b);

 

 

       /**

        * TestMe

        * @param int a

        * @param const char *s

        * @return int

        */

       int TestMe(int a,const char *s);

 

 

       /**

        * TestAutoComment

        * @param int a param1 description

        * @param int b param2 description

        * @param char c param3 description

        * @return int ret description

        */

       int TestAutoComment(int a, int b, char c);

 

       int iA;     /**< iA1. iA’s Details1. */

                     /**< iA2. iA’s Details2. */

      

       /**

       * a public variable iB.

       * Details1.

       * Details2.

       */

       int iB;     /**< . . */

 

       int iC; /**< iC1 中文注释测试. iC’s Details1. */

                     /**< iC2. iC’s Details2. */

};

 

#endif//__A__H

2006年09月13日
Doxygen注释风格
 
1 类的申明
/**
 *   class declaration
 */
 
2 变量申明
/**< val’s brief. val’s details1. */
 
3 函数申明
       /**
       * a normal member taking two arguments and returning an integer value.
       * @param a an integer argument.
       * @param s a constant character pointer.
       * @see Test()
       * @see ~Test()
       * @see testMeToo()
       * @see publicVar()
       * @return The test results
       */
 
4 config文件中的OUTPUT_LANGUAGE设为Chinese即可支持中文。
5 Doxygen下载:
http://www.stack.nl/~dimitri/doxygen/
2006年05月12日

版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
原文地址:
http://www.matrix.org.cn/resource/article/43/43790_j2me_mappy.html
关键字:j2me,mappy,tile,地图编辑


本文主要介绍目前开发游戏比较流行的两款工具mappy(mapwin)和tiled,分别介绍工具的安装、使用、优缺点分析,虽然不能面面俱到,但使用要点之处都已说明。作为开发游戏的fans们必不可少的入门指南。

一、何所谓“地图编辑器”
 地图编辑器,顾名思义,就是用来编辑地图的工具,如果玩过《魔兽争霸》或是《帝国时代 2 》、《英雄无敌》的话,应该会知道这几款游戏都附有地图编辑工具,可提供玩家自行编辑地图关卡,地图编辑器就具有类似的功能。

二、mappy(mapwin)入门指南:

1.预备知识:
tile:中文名字-瓷砖,呵呵,也就是平铺在某个物体表面上的单元。使用过j2me的Tile或者vc开发游戏的都知道。
playback library:回放库,支持装载和显示mapwin的FMP地图文件的库。

2.mapwin简介:


软件名称:mapwin
版本:1.4.11
运行环境:windows
依赖库文件:libpng12.dll、zlib.dll
用途:灵活的建立2d、3d游戏的tile。
强大的回放库支持:DirectX、Allegro、OpenGL、Java、CDX、SDL、Delphi、Blitz Basic、Dark Basic、GBAMappy、Combined、GameMaker等

3.快速安装导航:
首先就是下载mapwin,作者下载的是mapwin1.4.11版。
如果需要支持PNG图片,那么就要到下载两个dll文件:
zlib.dll-用于文件压缩,下载地址:zlib.net
libpng12.dll-libpng的window版,png图像压缩库,下载地址:gnuwin32
安装这两个dll文件很简单,方法就是直接复制到mapwin目录下。

4.快速使用导航:
(1)第一步就是启动程序。然后File->new map,新建一个map,设置每个tile的长宽和map包含的tile的行数和列数。
image

(2)根据提示进入File->Import…,选择作为tile的图片,这样右侧会出现以前面设置的按照每个tile的长宽划分的图片tile。

(3)此时就可以使用鼠标选取tile,在map中的适当位置点击便会将此tile画在map上。使用右键可以删除map上的title。
image

(4)mapwin默认只有一个layer,如果要新建layer的话,可以通过Layer->add layer实现,map上方的状态条会显示鼠标当前的位置和当前Layer的层数。

(5)map完成后,按ctrl+s保存,选择File->export as text,将map导出为用map数组表示的文本。其中“Map Array(s) Prefix with”选项可以修改为java语言表示数组的形式:new int[][]。这样就会生成j2me中可用的代码片断,可以直接用到程序中。
image

5.优缺点:
优点:与tiled相比,支持2d、3d游戏,具有很多的游戏开发接口和语言;使用相应的回放库可以设置碰撞检测等扩展功能。
缺点:缺少快捷工具栏,操作速度慢。

三、tiled入门指南:

1.预备知识:
Tileset:tile的集合,这是tiled管理tile的一种分组方式。每个tile有一个name来代表。
Tile的存在方式:tiled软件管理tile的方法与众不同。tile默认只保存在map中,也可以导出为.tsx文件供多个map共用。

2.tiled简介:


软件名称:Tiled
版本:0.5.1
运行环境:支持java的os
依赖库文件:无
用途:tiled地图编辑器是一种用于通用目的的编辑器。特点是比较好用,风格类似mini版的photoshop。它可以用于制作多种类型的游戏引擎需要,而且支持使用插件读写map、增加用于引擎的map格式。

3.快速安装导航:
下载tiled,然后解压缩,可以发现tiled.jar文件,使用java -jar tiled.jar命令来运行之。

4.快速使用导航:
(1)使用File->new,进入New Map Dialog对话框,其中可以选择Map的类型,设置Map size和Tile size,这和mapwin很类似。
image

(2)建立map之后,系统会默认分配一个layer,但是并没有Tileset,所以选择Tilesets->New tileset…建立tileset。输入Tileset名字后,选取“Reference tileset image”选项,浏览Tile image所使用的图片。其中的“Tile spacing”为设置Tile四边的边框,因为不常用,所以经常被设置为0。
image

(3)在增加了tileset后,点击左下角的按钮可以看到tile的调色板,这时便可以在调色板中选择合适的tile在map上构图了。


tile左侧的工具栏提供了快捷工具:move layer、paint、erase、fill、eye dropper(取色器)、select、缩放。而在右侧是类似photoshop的layer manger,用来新建layer、复制layer、锁定layer、隐藏layer。

eye dropper的使用方法有两种:一种是选择eye dropper工具,然后在map中选择tile;另一种方法更快捷-直接在map中的tile上点击鼠标右键。


(4)当map画好后,按ctrl+s可以将map保存为tmx文件。
(5)对map文件内容的解释:


        <?xml version="1.0" ?>
        <map orientation="orthogonal" width="32" height="32" tilewidth="24" tileheight="24">
          <tileset firstgid="1" name="Sewers" tilewidth="24" tileheight="24">
            <image source="tiledweb/files/tiles_pipes.png"/>
          </tileset>
          <layer name="Layer 0">
            <data encoding="base64" compression="gzip">
              H4sIAAAAAAAAAO3NoREAMAgEsLedAfafE4+s6l0jolNJiif18tt/Fj8AAMC9ARtYg28AEAAA
            </data>
          </layer>
        </map>


        此文件表示了这个map只有一个tileset和一个layer,注意一下前面建立map和tileset时输入的数据不是所有都在这个文件中,因为使用默认的属性(如tile spacing)是不会保存在这个文件中的。
        由于一个tile可以被多个map引用,所以layer的data属性值使用base64编码、使用gzip压缩的一个32位整数的数组,它代表了tile的全局id–firstgid。每个tile内部使用自己的local id,而firstgid作为在多个map中区分tile的标识。
        
注意此软件没有导出为map数组的功能,只能使用View->Show Coordinates显示坐标。

5.优缺点:
优点:易用。使用xml规范作为map文件的书写规范有利于用户自定义修改和功能的扩展。
缺点:缺少与游戏开发语言的接口,还需要进一步的开发扩展。


四、参考资源:

mappy官方网站:http://www.tilemap.co.uk/index.html
Tiled官方网站:http://tiled.rpgdx.net/index.html
zlib官方网站:http://www.zlib.net/
libpng官方网站:http://gnuwin32.sourceforge.net/packages/libpng.htm

2006年05月10日

一个简单的封装类:

//h

class CCallHandler : public CActive
{
public:
 static CCallHandler* NewL();
 ~CCallHandler();

private:
 CCallHandler();
 void ConstructL();

 // inherited from CActive
 void RunL();
 void DoCancel();

 void StartL();
 void Stop();

 enum TState { EWaiting, EAnswering, EWatching };
private:
 RTelServer iServer;
 RPhone  iPhone;
 RLine  iLine;
 RAdvGsmCall iCall;
 RTelServer::TPhoneInfo iPhoneInfo;
 RPhone::TLineInfo  iLineInfo;
 TName   iCallName;
 RCall::TStatus iCallStatus;
 TInt   iNumberPhones;
 TState   iState;
 
 RFileLogger  iLog;
};

//cpp

      void CCallHandler::ConstructL()
{
 iLog.Connect();
 iLog.CreateLog(_L("Logs"),_L("calltest.txt"),EFileLoggingModeOverwrite);
 

 CActiveScheduler::Add(this);

// TInt numLines;
 
 _LIT (KTsyName,"phonetsy.tsy");
 
 iServer.Connect();
 iServer.LoadPhoneModule(KTsyName);

 iServer.GetPhoneInfo(0, iPhoneInfo);
 iPhone.Open(iServer, iPhoneInfo.iName);
 iPhone.Initialise();

 TInt numberPhones = 0;
 iServer.EnumeratePhones(numberPhones);
 
 TBool foundLine = EFalse;
 for(TInt a = 0; a < numberPhones; a++)
 {
  User::LeaveIfError(iPhone.GetLineInfo(a, iLineInfo));
  if(iLineInfo.iLineCapsFlags & RLine::KCapsVoice)
  {
   foundLine = ETrue;
   break;
  }
 }

 if(!foundLine)
  User::Leave(KErrNotFound);
 
 User::LeaveIfError(iLine.Open(iPhone, iLineInfo.iName));

 RDebug::Print(iPhoneInfo.iName);
 
 StartL();
}

void CCallHandler::RunL()
{
 if(iStatus.Int() != KErrNone)
  return;
 
 switch(iState)
 {
 case EWaiting:
  {
   // answer the call
   iState = EAnswering;
   StartL();
   break;
  }
 case EAnswering:
  {
   iState = EWatching;
   StartL();
  // iObserver.HandleCallInChangeL(RCall::EStatusConnected);
   break;
  }
 case EWatching:
  {
   User::LeaveIfError(iCall.GetStatus(iCallStatus));
   if (iCallStatus == RCall::EStatusHangingUp)
   {
  //  iObserver.HandleCallInChangeL(iCallStatus);
    iCall.Close();
    iState = EWaiting;
   }
   StartL();
   break;
  }
 }
}


void CCallHandler::StartL()
{
 switch(iState)
 {
 case EWaiting:
  iLog.Write(_L("EWaiting"));
  // sets iCallName when it receives an incoming call
  iLine.NotifyIncomingCall(iStatus, iCallName);
  break;
 case EAnswering:
  {
   iLog.Write(_L("EAnswering"));
   iLog.Write(iCallName);
   
   User::LeaveIfError(iCall.OpenExistingCall(iLine, iCallName));

   RAdvGsmCall::TDialledNumberInfo dialInfo;
   iCall.GetDialledNumberInfo(dialInfo);
   
   iLog.Write(dialInfo.iName);
   iLog.Write(dialInfo.iNumber.iTelNumber);
   iLog.WriteFormat(_L("type = %d"), dialInfo.iNumber.iTypeOfNumber);

   RAdvGsmCall::TRemotePartyInfo remotepartyinfo;
   iCall.GetRemotePartyInfo(remotepartyinfo);
   iLog.WriteFormat(_L("len = %d"), remotepartyinfo.iNumber.iTelNumber.Length());
   iLog.Write(remotepartyinfo.iNumber.iTelNumber);
  
  // iCall.AnswerIncomingCall(iStatus);
  }
  break;
 case EWatching:
  iLog.Write(_L("EWatching"));
  iCall.NotifyStatusChange(iStatus, iCallStatus);
  break;
 }
 SetActive();
}

void CCallHandler::Stop()
{
 switch(iState)
 {
 case EWaiting:
  iLine.NotifyIncomingCallCancel();
  break;
 case EAnswering:
  iCall.Close();
  break;
 case EWatching:
  iCall.NotifyStatusChangeCancel();
  iCall.Close();
  break;
 }
}

2006年02月07日

nnd,重装系统后配置网络,又出问题。使劲浑身招数也不行,最后凭借楠爷的index.wml侥幸成功。真怪事,哪也没动,一会行,一会不行。算来算去该是nokia抽风啦!!!

2006年01月05日

摘自:RELEASE NOTES for Nokia SIP Plug-in 4.0 for Series 60 (08.07.2005)

SIP Plug-in consists of three software components:

- The SIP Server Emulator combines the functionality of SIP Proxy Server and SIP
Registrar Server. It is the forwarding center that delivers SIP messages to its
recipients.

- SIP Extension for Series 60 2nd Edition SDK for Symbian OS, Supporting Feature
Pack 2 allows SIP features in Terminal Emulator. SIP Extension makes it possible
to send and receive SIP messages to and from the Terminal Emulator.
Feature Pack 2 and Feature Pack 3 versions of Series 60 2nd Edition SDK are
supported.

- The SIP application (ChipFlip) for Series 60 SDK Terminal Emulator can be used
to demonstrate SIP Server Emulator functionality.

Features:
=========
- SIP Server Emulator can be started, stopped and configured from a graphical
user interface (GUI).
- Incoming and outgoing messages can be logged.
Messages are stored into a text file.
- Log file can be monitored in real time from the GUI.
- SIP Server Emulator can be used in “manual response” -mode. When the SIP Server
Emulator receives a SIP message to be forwarded, the SIP Server Emulator
responses with a specified SIP message and doesn’t forward the incoming SIP
message.

Additional Requirements for Microsoft Visual Studio/Borland C++ BuilderX version:
- Series 60 2nd Edition SDK for Symbian OS, Supporting Feature Pack 2, For
C++, Supporting Microsoft Visual C++ and Borland C++BuilderX
- MS Visual C++ .NET or Borland C++ BuilderX (for building the example SIP
application)

问题:
所谓的Series 60 2nd Edition SDK for Symbian OS, Supporting Feature Pack 2是指英文版,对于中文版(如sdk2.1fp2 for chinese)sip插件并不支持。
nokia,有时候文档只说一半话,另一半就靠开发者自己慢慢摸索猜测了。感慨啊,水平高者玩nokia,水平低着被nokia玩。刻苦修炼才是正道!!!

2005年12月29日

1 参照Series 60 SDK 2.1 Emulator Configuration Guide,正确配置Ethernet support configuration。一般情况,我们都属于adsl用户,配置遵循”Network configuration without dhcp”指导原则。配置图如下:
( 还没学会贴图呢:()

2 选择合适的网卡。
3在模拟器中选择”工具->设备管理->配置服务器”,虽然在SDK上没有提及该步,但该步不可或缺。否则模拟器网络连接不会成功,一般会报以”网关无响应”或”不能连接 -34”的错误。(哎,被nokia玩得晕头转向的,最后还得屈首称臣…)
在该步中设置主机地址为”127.0.0.1”,其他的似乎影响不大。
通过上述的设置后,可以通过模拟器连接局域网,但对于外网还没有测试过。