2006年05月15日

     对于自制力极差的我,实在是想不到别的办法来拒绝一些难以抵挡的诱惑。唯有毒誓,或许可以一试。如果毒誓都无法解救我,那只有毫无怨言的成为毒誓的牺牲品。一直在努力作一个信守承诺的人,但很多时候确由于吞吞吐吐的言词以及懒懒散散的行为,将自己陷入一种尴尬的境地。每天都对着镜子照,每天都看那张虚伪麻木的脸庞,却越来越少的反省自己的所作所为,慢慢地学会标榜自己,学会吹嘘,学会冷漠,学会堕落,慢慢地连堕落之后的羞愧也被继之而来的堕落淹没。无数次的告诉自己,救赎自己的灵魂,却总是停留在口头。可悲之极!!!毒誓,也许只有你是我的救命稻草。

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年04月17日

   最近的心情差到了极点,不知道这样的状态还能持续多久。现在想的只是怎样能尽快地逃离这座城市,逃往一个陌生的城市,寻找些冷漠将自己包裹起来。

       这座城市,熟悉而有温暖,这里有我每天都要走过的马路,有我听了七年之多的“乡音”,这里还有陪我走过这段人生路的知心哥们,以及许许多多的回忆也曾想着自己就在这座美丽的城市安下心来,过一种平静安宁的生活。可是走到今天,我却迫不得已的想离开这座城市,虽然我是那么的舍不得。

离开,是莫名而来的一时冲动,抑或是压抑了已久的逃亡,对我已经无关紧要,我只是想离开,去寻找一个陌生的地方,寻找些冷漠冰冻我的伤口,然后慢慢的体验一个人在外漂泊的辛酸。

满面泪水为你们而流。。。

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月31日
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”,其他的似乎影响不大。
通过上述的设置后,可以通过模拟器连接局域网,但对于外网还没有测试过。

2005年12月24日

1 利用API的keybd_event函数来模拟键盘输入
例如:
// Simulate a key press
keybd_event(65,
MapVirtualKey(65, 0),
0,
0 );

// Simulate a key release
keybd_event(65,
MapVirtualKey(65, 0)
KEYEVENTF_KEYUP,
0);
}
2 也可以发送一条键盘消息给指定窗口。比如要模拟一个字母键“A”,可以这样:PostMessage(hWnd, WM_CHAR, ‘A’, 0); 模拟按一个回车:PostMessage(hWnd, WM_KEYDOWN, VK_RETURN, 0)。这里的关键问题是要确定窗口句柄(hWnd),使用GetFocus()函数可以得到键盘光标所在窗口句柄,但该函数只能得到当前进程内的窗口句柄。
  如果要得到其他应用程序的键盘光标所在窗口句柄,需要调用 AttachThreadInput()函数。该函数的作用就是将其他窗口线程的输入附加到本窗口线程的输入操作中,这样就可以调用GetFocus()函数得到其他窗口的句柄了。

2005年11月09日

实现方法:
采用图像调制方法,动态每帧调整调制因子。调制公式如下:
di = s * modulate_factor.
其中,di 为目标图像, s 为原图像备份, modulate_factor为调制因子。只需在每帧动态递增调制因子即可。如modulate_factor += delta;一般delta可设为0.01到0.1之间的值,初始一般为1或0。

改进:
上述方法对与纯黑的地方不起作用,可以加个减亮因子d_factor,修正公式如下:
di = (d_factor + s) * modulate_factor;
d_factor需要每帧更新。

区分图像本身通过加减法改变亮度和外界光线光照改变图像亮度。