剑行云端

无冥冥之志者,无昭昭之明;无惛惛之事者,无赫赫之功。

配置文件中经常用到ini文件,在VC中其函数分别为:
写入.ini文件:

BOOL WritePrivateProfileString(
  LPCTSTR lpAppName,  // INI文件中的一个字段名[节名]可以有很多个节名

  LPCTSTR lpKeyName,  // lpAppName 下的一个键名,也就是里面具体的变量名

  LPCTSTR lpString,   // 键值,也就是数据

  LPCTSTR lpFileName  // INI文件的路径
);

读取.ini文件:

DWORD GetPrivateProfileString(
  LPCTSTR lpAppName,        // INI文件中的一个字段名[节名]可以有很多个节名

  LPCTSTR lpKeyName,        // lpAppName 下的一个键名,也就是里面具体的变量名

  LPCTSTR lpDefault,        // 如果lpReturnedString为空,则把个变量赋给lpReturnedString

  LPTSTR lpReturnedString,  // 存放键值的指针变量,用于接收INI文件中键值(数据)的接收缓冲区

  DWORD nSize,            // lpReturnedString的缓冲区大小

  LPCTSTR lpFileName        // INI文件的路径
);

读取整形值:(返回值为读到的整)

UINT GetPrivateProfileInt(
  LPCTSTR lpAppName,  // INI文件中的一个字段名[节名]可以有很多个节名
  LPCTSTR lpKeyName,  // lpAppName 下的一个键名,也就是里面具体的变量名
  INT nDefault,       // 如果没有找到指定的数据返回,则把个变量值赋给返回值

  LPCTSTR lpFileName  // INI文件的路径

);
读写INI文件时相对路径和绝对路径都可以,根据实际情况选择

“..\\IniFileName.ini”    // 这样的为相对路径

“D:\\IniFileName.ini”    // 这样的为绝对路径

MAX_PATH:是微软最大路径占的字节所设的宏

例子:

写INI文件:

LPTSTR lpPath = new char[MAX_PATH];
 
strcpy(lpPath, “D:\\IniFileName.ini”);

WritePrivateProfileString(“LiMing”, “Sex”, “Man”, lpPath);
WritePrivateProfileString(“LiMing”, “Age”, “20″, lpPath);
 
WritePrivateProfileString(“Fangfang”, “Sex”, “Woman”, lpPath);
WritePrivateProfileString(“Fangfang”, “Age”, “21″, lpPath);

delete [] lpPath;

INI文件如下:

[LiMing]
Sex=Man
Age=20
[Fangfang]
Sex=Woman
Age=21

读INI文件:

LPTSTR lpPath = new char[MAX_PATH];
LPTSTR LiMingSex = new char[6];
int LiMingAge;
LPTSTR FangfangSex = new char[6];
int FangfangAge;
 

strcpy(lpPath, “..\\IniFileName.ini”);
 
GetPrivateProfileString(“LiMing”, “Sex”, “”, LiMingSex, 6, lpPath);
LiMingAge = GetPrivateProfileInt(“LiMing”, “Age”, 0, lpPath);
 
GetPrivateProfileString(“Fangfang”, “Sex”, “”, FangfangSex, 6, lpPath);
FangfangAge = GetPrivateProfileInt(“Fangfang”, “Age”, 0, lpPath);

delete [] lpPath;

ini文件现在很少操作了,一般配置文件都为xml了,但是为了方便我暂时先选择了ini,下面是有关读取ini的记录,作为存档
ini文件(即Initialization file),这种类型的文件中通常存放的是一个程序的初始化信息。ini文件由若干个节(Section)组成,每个Section由若干键(Key)组成,每个Key可以赋相应的值。读写ini文件实际上就是读写某个的Section中相应的Key的值,而这只要借助几个函数即可完成。
一、向ini文件中写入信息的函数
1. 把信息写入系统的win.ini文件
BOOL WriteProfileString(
LPCTSTR lpAppName, // 节的名字,是一个以0结束的字符串
LPCTSTR lpKeyName, // 键的名字,是一个以0结束的字符串。若为NULL,则删除整个节
LPCTSTR lpString // 键的值,是一个以0结束的字符串。若为NULL,则删除对应的键
)

2. 把信息写入自己定义的.ini文件
BOOL WritePrivateProfileString(
LPCTSTR lpAppName, // 同上
LPCTSTR lpKeyName, // 同上
LPCTSTR lpString, // 同上
LPCTSTR lpFileName // 要写入的文件的文件名。若该ini文件与程序在同一个目录下,也可使用相对
//路径,否则需要给出绝度路径。
)

如:
::WriteProfileString(“Test”,”id”,”xym”);
//在win.ini中创建一个Test节,并在该节中创建一个键id,其值为xym

::WritePrivateProfileString(“Test”,”id”,”xym”,”d:\\vc\\Ex1\\ex1.ini”);
//在Ex1目录下的ex1.ini中创建一个Test节,并在该节中创建一个键id,其值为xym

//若Ex1.ini文件与读写该文件的程序在同一个目录下,则上面语句也可写为:
::WritePrivateProfileString(“Test”,”id”,”xym”,”.\\ex1.ini”);

需要注意的是,C系列的语言中,转义字符’\\’表示反斜线’\’。另外,当使用相对路径时,\\前的.号不能丢掉了。

二、从ini文件中读取数据的函数
1、从系统的win.ini文件中读取信息
(1) 读取字符串
DWORD GetProfileString(
LPCTSTR lpAppName, // 节名
LPCTSTR lpKeyName, // 键名,读取该键的值
LPCTSTR lpDefault, // 若指定的键不存在,该值作为读取的默认值
LPTSTR lpReturnedString, // 一个指向缓冲区的指针,接收读取的字符串
DWORD nSize // 指定lpReturnedString指向的缓冲区的大小
)

如:
CString str;
::GetProfileString(“Test”,”id”,”Error”,str.GetBuffer(20),20);

(2) 读取整数
UINT GetProfileInt(
LPCTSTR lpAppName, // 同上
LPCTSTR lpKeyName, // 同上
INT nDefault // 若指定的键名不存在,该值作为读取的默认值
)

如使用以下语句写入了年龄信息:
::WriteProfileString(“Test”,”age”,”25″);
//在win.ini中创建一个Test节,并在该节中创建一个键age,其值为25

则可用以下语句读取age键的值:
int age;
age=::GetProfileInt(“Test”,”age”,0);

2、从自己的ini文件中读取信息
(1) 读取字符串
DWORD GetPrivateProfileString(
LPCTSTR lpAppName, // 同1(1)
LPCTSTR lpKeyName, // 同1(1)
LPCTSTR lpDefault, // 同1(1)
LPTSTR lpReturnedString, // 同1(1)
DWORD nSize, // 同1(1)
LPCTSTR lpFileName // 读取信息的文件名。若该ini文件与程序在同一个目录下,也可使用相
//对路径,否则需要给出绝度路径。
)

如:
CString str;
::GetPrivateProfileString(“Test”,”id”,”Error”,str.GetBuffer(20),20,”.\\ex1.ini”);
或:
::GetPrivateProfileString(“Test”,”id”,”Error”,str.GetBuffer(20),20,”d:\\vc\\Ex1\\ex1.ini”);

(2) 读取整数

UINT GetPrivateProfileInt(
LPCTSTR lpAppName, // 同上
LPCTSTR lpKeyName, // 同上
INT nDefault, // 若指定的键名不存在,该值作为读取的默认值
LPCTSTR lpFileName // 同上
)

如使用以下语句写入了年龄信息:
::WritePrivateProfileString(“Test”,”age”,”25″,”.\\ex1.ini”);
//在ex1.ini中创建一个Test节,并在该节中创建一个键age,其值为25

则可用以下语句读取age键的值:
int age;
age=::GetPrivateProfileInt(“Test”,”age”,0,”.\\ex1.ini”);

三、 删除键值或节

回顾一下WriteProfileString函数的说明
BOOL WriteProfileString(
LPCTSTR lpAppName, // 节的名字,是一个以0结束的字符串
LPCTSTR lpKeyName, // 键的名字,是一个以0结束的字符串。若为NULL,则删除整个节
LPCTSTR lpString // 键的值,是一个以0结束的字符串。若为NULL,则删除对应的键
)

由此可见,要删除某个节,只需要将WriteProfileString第二个参数设为NULL即可。而要删除某个键,则只需要将该函数的第三个参数设为 NULL即可。这是删除系统的win.ini中的节或键,类似的,要删除自己定义的ini文件中的节或键,也可做相同的操作。
如:
::WriteProfileString(“Test”,NULL,NULL); //删除win.ini中的Test节
::WriteProfileString(“Test”,”id”,NULL); //删除win.ini中的id键

::WritePrivateProfileString(“Test”,NULL,NULL,”.\\ex1.ini”); //删除ex1.ini中的Test节
::WritePrivateProfileString(“Test”,”id”,NULL,”.\\ex1.ini”); //删除ex1.ini中的id键

四、如何判断一个ini文件中有多少个节
要判断一个ini文件中有多少个节,最简单的办法就是将所有的节名都找出来,然后统计节名的个数。而要将所有的节名找出来,使用GetPrivateProfileSectionNames函数就可以了,其原型如下:
DWORD GetPrivateProfileSectionNames(
LPTSTR lpszReturnBuffer, // 指向一个缓冲区,用来保存返回的所有节名
DWORD nSize, // 参数lpszReturnBuffer的大小
LPCTSTR lpFileName // 文件名,若该ini文件与程序在同一个目录下,

//也可使用相对路径,否则需要给出绝度路径
)

下面的是用来统计一个ini文件中共有多少个节的函数,当然,如果需要同时找到每个节中的各个键及其值,根据找到节名就可以很容易的得到了。

/*统计共有多少个节
节名的分离方法:若chSectionNames数组的第一字符是’\0′字符,则表明
有0个节。否则,从chSectionNames数组的第一个字符开始,顺序往后找,
直到找到一个’\0′字符,若该字符的后继字符不是 ‘\0′字符,则表明前
面的字符组成一个节名。若连续找到两个’\0′字符,则统计结束*/

int CTestDlg::CalcCount(void)
{
TCHAR chSectionNames[2048]={0}; //所有节名组成的字符数组
char * pSectionName; //保存找到的某个节名字符串的首地址
int i; //i指向数组chSectionNames的某个位置,从0开始,顺序后移
int j=0; //j用来保存下一个节名字符串的首地址相对于当前i的位置偏移量
int count=0; //统计节的个数

//CString name;
//char id[20];
::GetPrivateProfileSectionNames(chSectionNames,2048,”.\\ex1.ini”);
for(i=0;i<2048;i++,j++)
{
if(chSectionNames[0]==’\0′)
break; //如果第一个字符就是0,则说明ini中一个节也没有
if(chSectionNames[i]==’\0′)
{
pSectionName=&chSectionNames[i-j]; //找到一个0,则说明从这个字符往前,减掉j个偏移量,
//就是一个节名的首地址

j=-1; //找到一个节名后,j的值要还原,以统计下一个节名地址的偏移量
//赋成-1是因为节名字符串的最后一个字符0是终止符,不能作为节名

//的一部分
/*::GetPrivateProfileString(pSectionName,”id”,”Error”,id,20,”.\\ex1.ini”);
name.Format(“%s”,id);*/
//在获取节名的时候可以获取该节中键的值,前提是我们知道该节中有哪些键。

AfxMessageBox(pSectionName); //把找到的显示出来

if(chSectionNames[i+1]==0)
{
break; //当两个相邻的字符都是0时,则所有的节名都已找到,循环终止
}
}

}

return count;
}


最高清的无敌版本

阿凡达高清蓝光1080p 下载地址
文件大小:11G和20G 两个版本(要准备好硬盘空间哦)

11G版本 emule 和迅雷下载地址:
[阿凡达].Avatar.2009.1080p.BluRay.X264-AMIABLE.mkv

20G版本 emule 和迅雷下载地址:
[阿凡达].Avatar.2009.BluRay.1080p.DTS.2Audio.x264-CHD.mkv

11G版本 BT下载地址:
请使用 uTorrent 下载

magnet:?xt=urn:btih:C4EUEC4HYFIC5FBI4RISILSUTFYY3Y7A&tr.0=http://idowns.org:6969/announce&tr.1=http://idowns.org:2710/announce&tr.2=http://tracker.bittorrent.am:80/announce&tr.3=http://tracker.openbittorrent.com/announce&tr.4=http://tracker.openbittorrent.com:80/announce&tr.5=http://denis.stalker.h3q.com:6969/announce&tr.6=http://torrent-download.to:5869/announce&tr.7=http://tracker.publicbt.com:80/announce&tr.8=http://tracker.prq.to/announce

字幕下载
下载 : 《阿凡达》高清蓝光1080p 字幕 2010-04-24 (57.42 KB, 已下载 612 次)

《阿凡达》高清蓝光1080p 介绍

◎译  名 阿凡达/化身/异次元战神/天神下凡/神之化身
◎片  名 Avatar
◎年  代 2009
◎国  家 美国/英国
◎类  别 动作/惊悚/科幻/冒险
◎语  言 英语
◎字  幕 中文
◎IMDB评分 8.4/10 (222,908 votes) Top 250: #73
◎IMDB链接 http://www.imdb.com/title/tt0499549/
◎文件格式 X264 + DTS
◎视频尺寸 1920 x 1080
◎文件大小 10.93GB
◎片  长 161 min 41 sec
◎导  演 詹姆斯·卡梅隆 James Cameron
◎主  演 萨姆·沃辛顿 Sam Worthington ….Jake Sully
佐伊·索尔达娜 Zoe Saldana ….Neytiri
西格妮·韦弗 Sigourney Weaver ….Dr. Grace Augustine
史蒂芬·朗 Stephen Lang ….Colonel Miles Quaritch
乔·摩尔 Joel Moore ….Norm Spellman (as Joel David Moore)
吉奥瓦尼·瑞比西 Giovanni Ribisi ….Parker Selfridge
米歇尔·罗德里格兹 Michelle Rodriguez ….Trudy Chacon
拉兹·阿隆索 Laz Alonso ….Tsu’tey
韦斯·斯塔迪 Wes Studi ….Eytukan
希·庞德 CCH Pounder ….Moat
迪利普·劳 Dileep Rao ….Dr. Max Patel
Matt Gerald ….Corporal Lyle Wainfleet
Sean Anthony Moran ….Private Fike
Jason Whyte ….Cryo Vault Med Tech
Scott Lawrence ….Venture Star Crew Chief
Kelly Kilgour ….Lock Up Trooper
J. Patrick Pitts ….Shuttle Pilot
Sean Patrick Murphy ….Shuttle Co-Pilot
Peter Dillon ….Shuttle Crew Chief
Kevin Dorman ….Tractor Operator
Kelson Henderson ….Dragon Gunship Pilot
David Van Horn ….Dragon Gunship Gunner
Jacob Tomuri ….Dragon Gunship Navigator
Michael Blain-Rozgay ….Suit #1
Jon Brent Curry ….Suit #2
Julene Renee ….Ambient Room Tech
Luke Hawker ….Ambient Room Tech
Woody Schultz ….Ambient Room Tech
Peter Mensah ….Horse Clan Leader
Sonia Yee ….Link Room Tech
Ilram Choi ….Basketball Avatar
Kyla Warren ….Na’vi Child
Chris Mala ….Troupe
Nicole Dionne ….Nav’i (uncredited)
Jamie Harrison ….Trooper (uncredited)
Dean Knowsley ….Samson Pilot (uncredited)
Justin Shenkarow ….(voice) (uncredited)
Nikie Zambo ….Na’vi (uncredited)

◎简  介

故事开始于地球,杰克·萨利(Jake Sully,萨姆·沃辛顿 饰)是一个双腿瘫痪的老兵,他觉得没有任何东西值得他去战斗,因此当被要求去潘多拉星球到那里的采矿公司工作时欣然接受。

潘多拉星球上有一种别的地方都没有的矿物元素”unobtanium”,它将彻底改变人类的能源产业,正是受此吸引人类才不远万里来到这里拓 荒。不过资源丰富的潘多拉星球完全不适合人类生活,这里的空气对人类有毒,本土的动植物是凶猛的掠食者,非常危险。这里的环境也造就了与人类不同的一群生 物:10英尺高的蓝色类人生物”Na’vi族”。Na’vi族对于人类拓荒者的到来非常不满,他们也不喜欢人类的机器在这个星球的土地上到处挖矿、留下斑 斑伤痕。

由于潘多拉星球环境严酷,人类传统的宇航服、机甲都不足以保护矿工,于是科学家们转向了克隆技术:他们将人类DNA和Na’vi人的DNA结 合在一起,制造了一个克隆Na’vi人,这个克隆Na’vi人可以让人类的意识进驻其中,成为人类在这个星球上自由活动的”化身”。然而并不是任何人都可 以操纵这个克隆Na’vi人,只有DNA与他身上人类DNA配型相符的人才有这样的能力。

杰克·萨利的哥哥是这个克隆Na’vi的人类DNA捐献者,他就可以操纵这个克隆Na’vi人,然而他被杀死了,采矿的公司为了不让砸下去的 钱白砸(克隆Na’vi人价格不菲),必须找到一个可以代替他操纵克隆Na’vi的人,这个人的DNA还必须和其配型相符,于是他们自然就找到了杰克·萨 利,杰克·萨利对此很高兴,应为那意味着他又能走路了。

几年后,杰克·萨利到了潘多拉星球,他发现这里的美景简直无法用语言来形容,高达900英尺的参天巨树、星罗棋布飘浮在空中的群山、色彩斑斓 充满奇特植物的茂密雨林、晚上各种动植物还会发出光……就如同梦中的奇幻花园。不过很快他就体验到了这里的危险,一头毒狼(潘多拉星球一种本土生物)与他 狭路相逢,眼看就要被吃掉,一支箭射死了毒狼,杰克得救了。救他的是Na’vi族的一个女孩(佐伊·萨尔达娜 饰),杰克从她口中了解到了更多潘多拉星球 的知识。

Na’vi族人一直以来都与潘多拉星球的其他物种和谐相处,过着一种简朴天然的生活,杰克在和这个Na’vi女孩的相处过程中逐渐转变了对人 类来这里采矿的看法,他意识到他已经找到值得为之战斗的东西了。

不过杰克·萨利如果要加入Na’vi族人对抗人类入侵者的战争,要付出很大的代价:他并不能永远呆在”化身”中,当”化身”–克隆 Na’vi人睡觉时,他就会回到自己半身不遂的人类身体中,只有通过专门的连接设备才能重新回到”化身”中。一旦与自己的同胞为敌,他就失去了与”化身” 结合的可能,只能困在残疾的身体里,并失去那个他越来越喜欢的Na’vi女孩……

一句话评论

卡梅隆这部历时十余年打造的史诗巨作呈现了独一无二的宏伟场面,壮观的视野,激动人心的叙事以及回归自然的主题。

–《综艺》

卡梅隆运用了他掌握的所有视觉工具,像一位战略大师一样带领着观众,为众人展示战斗中的每一个转折,展现每一个改变故事进程的勇士们的死亡与怯弱 者的表情。

–《好莱坞报道》

没有任何电影事件能够超过《阿凡达》,它无论从哪个角度来看都是气势恢宏的:不管是野心或是视觉效果,又或是开创性的制作技术,甚至于令人咋舌的 制片成本。

–《泰晤士报》

幕后制作

十二年磨一剑

自1997年《泰坦尼克号》在全球大热之后,导演詹姆斯·卡梅隆的下一部电影令影迷等得几乎望眼欲穿。对此,詹姆斯·卡梅隆表示:”《阿凡 达》能够最终拍出来,是一次奇迹。这是一部科幻电影,是我喜欢的东西,科幻电影要表现的是我们现在无法接触到的事物,这是一种预言,它会让你反思我们现在 在做的一切,将来会发生什么样的后果?这就是我拍《阿凡达》的初衷之一,我对现在人类对大自然所做的一切感到深深的忧虑,我想将来也许会受到大自然的报 复。”

《泰坦尼克号》其北美6亿,全球18亿的票房成绩至今没有电影能超越,谈及这所带来的压力,詹姆斯·卡梅隆说:”《泰坦尼克号》的成功的确是 一件让人满足的事,我在之后拍摄了数部纪录片,可以说已经基本脱离了原来的圈子。我需要改变一种工作和生活的方式,拍摄那样的电影是一件非常折磨人的事。 离开了近10年,我又回来了,人们会有期待,也会怀疑,我究竟还能不能拍电影?大家这样想再正常不过,《泰坦尼克号》的票房?的确是太好了,我不认为《阿 凡达》能打破《泰坦尼克号》的票房记录,我拍这部电影的目的也不是为了打破什么,更何况我也不认为未来数年内能有什么电影超过这个记录。只要《阿凡达》能 够让投资方赚钱,我就感到很高兴了。”

为影片开出巨额投资的福克斯老上级新闻集团,其首席执行官、传媒大王鲁伯特·默多克,也罕见地针对一部影片发表了较多的言论,在谈及影片的制 作与投资时,鲁伯特·默多克说:”对这部电影我很有信心,詹姆斯·卡梅隆的艺术魅力是举世公认的,我想没有人会怀疑他对于电影的商业价值,因此我们为《阿 凡达》所做的一切都是在计划中的。这部电影所牵涉的方方面面都很复杂,投资与票房仅仅只是其一部分,我希望观众能够尽可能的关注影片本身,它是一部你应该 走到电影院坐下来静下心欣赏的电影,我们把它安排在了圣诞档期,连我自己都对《阿凡达》的上映迫不及待了。”

电脑特效的里程碑?

詹姆斯·卡梅隆对电脑特效的迷恋与狂热众人皆知,《终结者》、《泰坦尼克号》等作品都采用了不少的CGI,而在《阿凡达》里,CGI的制作更 达到了一个崭新的境界。本片的电脑特效制作部门主管文斯·佩斯说:”这部电影所使用的CGI技术是全新的,所有的设备都是为这部电影而打造,我们希望《阿 凡达》能成为CGI技术的一次革命,能成为此后电影制作的一种选择。观众们会在这部电影里看到过去难以想像的许多场面,特别是3D版本。”

詹姆斯·卡梅隆对《阿凡达》里制作CGI的过程谈到:”这其实是拍摄本片最难的一段时间。我不希望重复自己,在上个世纪我想要拍摄一部新 CGI技术的电影,那个时候困难重重,大家都对我说办不到,我等了这么多年,终于能够有机会做一部真正全新CGI技术的电影了。全新意味着一切都要靠自己 摸索,没有任何东西可以借鉴,大家都并不清楚我们能做到什么地步,在一开始的确很迷茫……幸好这段痛苦的时间也很短暂,当CGI开始上了轨道,我们都明白 这部电影最终呈现的效果会是什么样了。我们为这部电影设计了全新的表情捕捉系统,它可以捕捉到演员的每一个细微表情。而这个系统会让詹姆斯`卡梅隆立即从 监视器中看到真实演员和虚拟环境的互动,这让他可以更好地执导演员和电脑生成的角色和环境配戏。”

《阿凡达》的演员们大部分时间都在绿幕前进行拍摄,而担任影片男一号的萨姆·沃辛顿对于这种拍摄方法说道:”我以前也拍过类似的电影,但跟 《阿凡达》比起来差别实在太大了。整个电影让我印象最深刻的是有一段我扮演的角色穿越丛林的戏,詹姆斯·卡梅隆事先给我讲述了整个场景的氛围,能见度多 少,气温多少,树木有多高,草丛有多深,我一共要走多少路,我行走的路线是如何,路上遇见什么样的生物,我需要做什么样的动作……这一切都需要我想象出 来,然后在摄影棚里做出相应的动作。天,这样的感觉实在太奇怪了,而当我最后发现做出来的动作居然能够和虚拟的电脑制作的画面契合在一起的时候,尽管我已 经经历过不少次这种拍摄经历了,但我必须要说的是,《阿凡达》是我做过最不可思议的一次!”

全新的3D之旅

《阿凡达》采用了时下热门的3D拍摄方式,谈及3D影院对《阿凡达》的影响,詹姆斯·卡梅隆说:”3D技术并不是简单唬唬小孩子的玩意,它能 让观众在观看电影的时候更加投入,犹如身临其境一般。我不希望观众是在看这个电影,看《阿凡达》的世界,而是通过3D技术,能够进入这个世界。它会将在家 里看碟和电影院看的效果形成天壤之别,我希望3D技术能够吸引大家进电影院观看《阿凡达》。”

最后詹姆斯·卡梅隆对本片说出了他的感言:”这部电影的前前后后筹备、制作了许多年,有数百位电影制作人员奉献出了他们的心血,终于等到上映 的这一天了,我和大家一样感到兴奋……我的野心是让人们重新点燃数十年前首次观看《2001太空漫游》或《星球大战》时的兴奋与激情!届时这股旋风会将你 吹至影院屏幕的后墙上……我对《阿凡达》的期望已经远远超过了过去拍摄的那些电影,有人称《阿凡达》会给观众带来一场视觉革命,我要做的并不仅限于此,我 希望大家能够通过《阿凡达》,感受到过去的电影从未带给你的那种震撼!”

花絮

·《阿凡达》是詹姆斯·卡梅隆继1997年《泰坦尼克号》之后的第一部故事片。

·《阿凡达》采用了普通影院版本、3D影院版本、IMAX-3D三种上映方式。

·《阿凡达》的北美公映日期是12月18日,十二年前,詹姆斯·卡梅隆的作品《泰坦尼克号》的公映日期同样也是12月18日。

·根据《纽约时代》的消息,数年间,本片前前后后众多的投资者已经在影片的成本、宣传等各方面花费了超过5亿美元,其中福克斯的投资为3亿美元, 派拉蒙等其他投资商的投资成本为2亿美元。这使得《阿凡达》成为电影史上投资最高的作品。

·为确保高额的投资能够收回,本片的续集计划已经在筹备中,如果《阿凡达》的票房能够取得成功,它很可能会发展成一个系列电影。

·《阿凡达》在筹备期间的片名为《880计划》”Project 880″,最后确定的片名为《阿凡达》(Avatar),片名源自印度佛教用语,意指灵魂被转移至新的躯体里面。

·为打造本片的科幻场景和新的视觉效果,詹姆斯·卡梅隆和好莱坞电影技术大师文斯·佩斯特别开发研制了新的摄影系统与数字技术,造价约为1400 万美元。

·本片的宣传口号是:”一个全新的世界等着你”(An All New World Awaits)。

·本片的计划从1998年就开始,当时詹姆斯·卡梅隆希望《阿凡达》能够趁着《泰坦尼克号》的全球风靡,使得本片能够在1999年上映,但由于开 出高额的4亿投资使得没有一间电影公司能够接此订单,结果导致本片的拍摄计划一直遥遥无期。

·影片有60%的场景是全电脑特效制作。

精彩对白

Col. Quaritch: You are not in Kansas anymore. You are on Pandora, ladies and gentleman.

Selfridge: This is why we’re here, because this little gray rock sells for twenty million a kilo.

夸里奇上校:”你们再也不会呆在堪萨斯州了。女士们先生们,现在你们身处的是潘多拉星球。”

塞尔弗里奇:”这就是为什么为什么来这里的原因:因为这里有着2000万公斤的的矿石。”

Jake Sully: They’ve sent us a message… that they can take whatever they want. Well we will send them a message. That this… this is our land!

Neytiri: You should not be here.

杰克·萨利:”他们已经给我们发出了一个信息……他们可以得到他们想要的任何东西。我们也会发出一个信息。这是……这是我们的土地!”

内泰丽:”你不应该在这里。”

Dr. Grace Augustine: Just relax and let your mind go blank. That shouldn’t be too hard for you.

格雷斯·奥古斯丁博士:”尽管放松,让你的大脑一片空白。这应该不会太难为你。”

穿帮镜头

常识错误:在哈利路亚山,雷达无法使用,剧情里的解释是这里有强力的磁场干扰。但问题是杰克和同伴们的无线电通讯却可以使用,而雷达其实就是“无 线电探测和测距”,要是雷达不能用,无线电也甭想可以正常工作。

在杰克和纳威人一起前往哈利路亚山上征服飞兽的时候,我们可以看到哈利路亚山的石头因为磁场的关系悬浮在空中,但是当杰克和飞兽搏斗的时候被摔下 时,我们会看到哈利路亚山的石头跟着杰克一起往下坠落,似乎这个时候石头又不受磁场的影响了。

在家园树被摧毁那一幕,杰克把格瑞丝扔到一根原木后面,结果几个镜头之后,他又把格瑞丝再次扔到同一根原木后面。

电影的结尾处,我们看到诺曼站在他自己的阿凡达后面,这在电影剧情里是不符合世界观设定的。而且在背景里我们还见到几个穿着裤子手里持枪的阿凡 达。也许这些是电影开始时我们在格瑞丝打篮球的地方见到的那几个吧。

杰克看见冰箱上纳威人的照片那一幕,照片都是3D形式的。也许在阿凡达的世界里,3D照片3154年很普遍了吧。

镜头衔接破绽:在夸里奇对杰克说“小伙,这叫做先下手为强”的时候,杰克的手是放在全息影像的桌子上面。然而在下一个镜头,夸里奇说“要是多几个 你这样的卧底就好了”的时候,杰克的手却垂在身旁。

本文的环境是vs2005和python2.5

0. 坏境设置
python的include/libs目录分别加到vc的include/lib directories中去。另外,由于python没有提供debug lib,体地说,就是没有提供python25_d.lib了。你可以自己编译python的源代码来得到python25_d.lib的,偶还没试过,呵呵。而且网上找了一下也没下载到。所以,如果你想要在debug下运行程序的话,你要把pyconfig.h(在python25/include/目录下)的大概是在283行,把pragma comment(lib,”python25_d.lib”)改成pragma comment(lib,”python25.lib”),让python都使用非debug lib.

还有个办法就是把python25.lib复制一份改名为python25_d.lib

1. 开始编程了
#include <python.h>
第一步就是包含python的头文件

2. 看一个很简单的例子
1)python文件test.py,很简单的定义了一个函数

#Filename test.py
def Hello():
    print “Hello, world!”
2)cpp文件

#include <python.h> //包含头文件,在c++中嵌入python,这是必须的
int main()
{
 Py_Initialize();

 PyObject * pModule = NULL;
 PyObject * pFunc   = NULL;

 pModule = PyImport_ImportModule(“test”);
 pFunc   = PyObject_GetAttrString(pModule, “Hello”);
 PyEval_CallObject(pFunc, NULL);

 Py_Finalize();

 return 0;
}

第一步还是包含头文件

第二步,使用python之前,要调用Py_Initialize();这个函数进行初始化。
帮助文档中如是说:
The basic initialization function is Py_Initialize(). This initializes the table of loaded modules, and creates the fundamental modules __builtin__, __main__, sys, and exceptions. It also initializes the module search path (sys.path).

反正,一开始你一定要调用。

第三步,声明一些Python的变量,PyObject类型的。其实声明也可放在前面,这个倒是无所谓的。

第四步,import module,也就是你的脚本名字,不需要加后缀名,否则会出错的。

第五步,从你import进来的module中得到你要的函数
 pFunc   = PyObject_GetAttrString(pModule, “Hello”);
上面的例子已经够清楚的了,最后一个是你要得到的函数的名字

第六步,调用PyEval_CallObject来执行你的函数,第二个参数为我们要调用的函数的函数,本例子不含参数,所以设置为NULL。

第七步,调用Py_Finalize,这个根Py_Initialize相对应的。一个在最前面,一个在最后面。

在下一篇中我将会对如何c++如何给python函数传递参数

上联:博士生,研究生,本科生,生生不息!  下联:06届,07届,08届,届届失业!  横批:愿读服输

上联:金沙江,嘉陵江,黑龙江,江江可投!  下联:飞跃楼,教学楼,宿舍楼,楼楼可跳!  横批:空前绝后

上联:爱国爱家爱师妹!  下联:防火防盗防师兄!  横批:恋爱自由

上联: 男生,女生,穷书生,生生不息!  下联: 初恋,热恋,婚外恋,恋恋不舍!   横批:生无可恋

上联:相遇,相识,相知,相爱必须!   下联:小吵,吵吵,大吵,分手难免!  横批:爱狠交织

上联:我爱的人不爱我  下联:爱我的人我不爱  横批:命苦

上联:上网,打牌,谈恋爱,虚度四年光阴,  下联:考研,出国,找工作,生活猪狗不如  横批:吃饱了撑的

上联:考初中 考高中 考大学 考考都愁  下联:抄语文 抄数学 抄英语 抄抄就过  横批: 不信挂科

上联:昨日,今日,明日,日日难熬  下联:早餐,午餐,晚餐,餐餐难进  横批:大学生活

上联: 昨夜校园漫步,看见青蛙装酷,呕吐,呕吐,只能拿头撞树  下联: 昨晚球场摆酷,忽闻恐龙撞树,恐怖,恐怖,可怜那棵小树  横批: 倩女幽魂

上联:好说,难说,好难说  下联:思你,念你,思念你  横批:真爱无悔

上联: 忆往昔峥嵘岁月,老婆一个,孩子一帮。  下联: 看今朝太平盛世,孩子一个,老婆一帮。  横批:与时俱进

上联:宁可没人格,不能不及格 下联:考试不作弊,来年当学弟
横批:死也要过

C与Python相互相互调用函数时,函数间的参数传递需要进行转换。近几天试了下VS调用Python的函数,也记下来来方便日后查阅。

1、C数据到Python数据转换
从C数据类型转成Python数据类型可以使用Py_BuildValue()函数。

PyObject* Py_BuildValue( const char *format, …)
Return value: New reference
format为转换格式说明字符串。
写几个常用的格式,具体的就不从python的说明文COPY过来了,用Py_BuildValue关键字可以找到相应说明。

“s” (string) [char *]
“z” (string or None) [char *]
  将以null结尾的C字符串string转换为Python对象,如果字符串为空,则返回None。

“u” (Unicode string) [Py_UNICODE *] 
  Unicode(UCS-2或UCS-4)字符串转为Python Unicode对象,如果字符串為空则返回None。

“i” (integer) [int]
“b” (integer) [char]
“h” (integer) [short int]
“l” (integer) [long int]
“B” (integer) [unsigned char]
“H” (integer) [unsigned short int]
  将[]相应的C类型转为Python的integer数据对象

“I” (integer/long) [unsigned int]
“k” (integer/long) [unsigned long]
  如果转换的数字大于Python sys.maxint则转为long integer否则转为integer数据对象。

“d” (float) [double]
“f” (float) [float]
  将C的double/float数据转为Python的floating point数据对象

“(items)” (tuple) [matching-items]
“[items]” (list) [matching-items]
“{items}” (dictionary) [matching-items]
  将多個相应的項目分別转为tuple、list和dict数据对象。
PyObject* pString = Py_BuildValue(“s”,”Python”);
PyObject* pInt = Py_BuildValue(“i”, 2003);

2、Python数据转成C数据
和前面的Py_BuildValue函数对着干,將Python的数据类型转为C的数据,使用下面的函数。
int PyArg_Parse( PyObject *args, const char *format, …)

args也就是需要转换的Python数据对象。
format的格式定义和Py_BuildValue函数以一样。

int n;
const char *pstr;
PyArg_Parse(pyResult,”i”,&n);
PyArg_Parse(pyResult,”s”,&pstr);

另外,也可以用相应类型的转换
char* PyString_AsString(PyObject *string) 转换字符串
double PyFloat_AsDouble(PyObject *pyfloat) 转换浮点数
long PyInt_AsLong( PyObject *io) 转换为整数

这次主要讲讲怎么把python中的class嵌入到c++中去。
顺便讲讲元组的操作。

1. 首先讲讲元组的操作
由于参数是通过元组传进去的,所以我们不能老是通过Py_BuildValue这个函数来操作元组,那样太不方便了。
Python提供了元组相关的操作,下面这个例子演示了如何操作。主要是下面几个函数:
//new一个元组,传入size
pArgs = PyTuple_New(argc – 3);
//set元组的直,第一个为元组,第二个为index(从0开始),第三个为value
PyTuple_SetItem(pArgs,0,Py_BuildValue(“i”,2000) );
PyTuple_SetItem(pArgs,1,Py_BuildValue(“i”,8) );

来自python doc的一个例子

#include <Python.h>
int
main(int argc, char *argv[])
{
    PyObject *pName, *pModule, *pDict, *pFunc;
    PyObject *pArgs, *pValue;
    int i;

    if (argc < 3) {
        fprintf(stderr,”Usage: call pythonfile funcname [args]\n”);
        return 1;
    }

    Py_Initialize();
    pName = PyString_FromString(argv[1]);
    /* Error checking of pName left out */

    pModule = PyImport_Import(pName);
    Py_DECREF(pName);

    if (pModule != NULL) {
        pFunc = PyObject_GetAttrString(pModule, argv[2]);
        /* pFunc is a new reference */

        if (pFunc && PyCallable_Check(pFunc)) {
            pArgs = PyTuple_New(argc – 3);
            for (i = 0; i < argc – 3; ++i) {
                pValue

jQuery EasyUI 组合树(ComboTree) 和组合框的用法差不多,只是在显示上有点差别:一个显示成树状结构,一个显示成列表结构。下面来介绍一下组合树(ComboTree)用法的详细用法:

HTML代码

  1. <select id="cc" style="width:200px;"></select>

然后按照《jQuery EasyUI框架使用文档》包含必要文件后,只要在$(function(){ }); 里插入下面的代码即可:

  1. $(‘#cc’).combotree({
  2.     url:’tree_data.json’
  3. });

继续阅读

上次我们已经学会了配置vs2005中的python库,还学会了简单的调用python函数,这次在这里将说说如何在C++中为python函数传递参数。这是还是以python2.5为例子,还是直接上代码来的直观
1. 一个有一个参数的例子
python文件
#Filename test2.py
def Hello(s):
    print “Hello, world!”
    print s
cpp文件
#include <python.h>
int main()
{
 Py_Initialize();
 PyObject * pModule = NULL;
 PyObject * pFunc   = NULL;
 PyObject * pArg    = NULL;
 pModule = PyImport_ImportModule(“test2″);
 pFunc   = PyObject_GetAttrString(pModule, “Hello”);
 pArg    = Py_BuildValue(“(s)”, “function with argument”);
 PyEval_CallObject(pFunc, pArg);
 Py_Finalize();
 return 0;
}
注意,参数要以tuple元组形式传入。因为这个函数只要一个参数,所以我们直接使用(s)构造一个元组了。
2. 一个有两个参数的例子
python文件中加入以下代码,一个加函数
def Add(a, b):
    print “a+b=”, a+b

cpp文件,只改了两行,有注释的那两行
#include <python.h>
int main()
{
 Py_Initialize();
 PyObject * pModule = NULL;
 PyObject * pFunc   = NULL;
 PyObject * pArg    = NULL;
 pModule = PyImport_ImportModule(“test2″);
 pFunc   = PyObject_GetAttrString(pModule, “Add”);//终于告别hello world了,开始使用新的函数
 pArg    = Py_BuildValue(“(i,i)”, 10, 15);//构造一个元组
 PyEval_CallObject(pFunc, pArg);
 Py_Finalize();

 return 0;
}
其它的就类似了。。。基本上,我们知道了怎么在c++中使用python中的函数。接下来学习一下如何使用python中的
class。
附:Py_BuildValue的使用例子,来自python documentation:
    Py_BuildValue(“”)                        None
    Py_BuildValue(“i”, 123)                  123
    Py_BuildValue(“iii”, 123, 456, 789)      (123, 456, 789)
    Py_BuildValue(“s”, “hello”)              ‘hello’
    Py_BuildValue(“ss”, “hello”, “world”)    (‘hello’, ‘world’)
    Py_BuildValue(“s#”, “hello”, 4)          ‘hell’
    Py_BuildValue(“()”)                      ()
    Py_BuildValue(“(i)”, 123)                (123,)
    Py_BuildValue(“(ii)”, 123, 456)          (123, 456)
    Py_BuildValue(“(i,i)”, 123, 456)         (123, 456)
    Py_BuildValue(“[i,i]“, 123, 456)         [123, 456]
    Py_BuildValue(“{s:i,s:i}”,
                  “abc”, 123, “def”, 456)    {‘abc’: 123, ‘def’: 456}
    Py_BuildValue(“((ii)(ii)) (ii)”,
                  1, 2, 3, 4, 5, 6)          (((1, 2), (3, 4)), (5, 6))

jQuery EasyUI 组合框(ComboBox)可以把一些HTML控件组合成一个控件,从而达到我们所期望的效果,下面介绍一下组合框详细用法:

HTML代码:首先要定义个select

  1. <select id="cc" name="dept" style="width:200px;">
  2.     <option value="aa">aitem1</option>
  3.     <option>bitem2</option>
  4.     <option>bitem3</option>
  5.     <option>ditem4</option>
  6.     <option>eitem5</option>
  7. </select>


然后按照《jQuery EasyUI框架使用文档》包含必要文件后,只要在$(function(){ }); 里插入下面的代码即可:

  1. $(‘#cc’).combobox(options);

options是组合框的一些选项,比如我们可以利用远程的数据来生成一个提示框

  1. $(‘#cc’).combobox({
  2.     url:’combobox_data.json’,
  3.     valueField:’id’,
  4.     textField:’text’
  5. });

下面我们来详细介绍一下选项的设置:

属性

属性名 类型 描述 默认值
width 数字 组件的宽度 auto
listWidth 数字 下拉列表的宽度 null
listHeight 数字 下拉列表的高度 null
valueField 字符串 基础数据值名称绑定到这个组合框 value
textField 字符串 基础数据的字段的名称绑定到这个组合框 text
editable 布尔 定义是否可以直接到文本域中键入文本 true
url 字符串 加载列表数据的远程URL null

事件

事件名 参数 描述
onLoadSuccess none 当远程数据成功加载时触发
onLoadError none 当远程数据加载失败时触发
onSelect record 当用户选择了一个列表项时触发
onChange newValue, oldValue 当文本域字段的值改变时触发

方法

方法名 参数 描述
select value 选择下拉列表中的一项
setValue param 设定指定值到文本域,参数可以是一个字符串,也可以是一个Javascript对象,如果是对象,必须包含两个属性各对应valueField和TextField属性。
getValue none 获取字段值
reload url 请求远程列表数据.

相关文章导读

Powered by WordPress Web Design by SRS Solutions © 2010 剑行云端 Design by SRS Solutions