魔法世界全元素魔法详解一览魔法世界有哪些魔法
未知是否需开新档,但我测试时都是开新档的。。。。破负重限制,超速回蓝,超高魔力测试已通过7.6修正:超高魔力,加新魔法必须开新档=======================我是悲痛的分隔线==================关于负重module_scripts.py有以下的一段代码(item_set_slot,"itm_sipahi_helmet_a",slot_item_weight,200),(item_set_slot,"itm_shahi",slot_item_weight,200),(item_set_slot,"itm_rabati",slot_item_weight,200),(item_set_slot,"itm_black_stick",slot_item_weight,100),(item_set_slot,"itm_red_stick",slot_item_weight,100),(item_set_slot,"itm_dark_magicwand",slot_item_weight,150),(item_set_slot,"itm_red_magicwand",slot_item_weight,150),(item_set_slot,"itm_dark_shadow_sceptre",slot_item_weight,250),(item_set_slot,"itm_red_kindle_sceptre",slot_item_weight,250),(item_set_slot,"itm_felguard_armor",slot_item_weight,2400),(item_set_slot,"itm_felguard_greaves",slot_item_weight,350),(item_set_slot,"itm_felguard_helmet",slot_item_weight,275),(item_set_slot,"itm_shaman_robe",slot_item_weight,500),(item_set_slot,"itm_shaman_helmet",slot_item_weight,225),(item_set_slot,"itm_mage_robe",slot_item_weight,400),(item_set_slot,"itm_hell_armor",slot_item_weight,220),(item_set_slot,"itm_hell_helmet",slot_item_weight,275),]),("get_total_equipment_weight",[(store_script_param_1,":troop_id"),(assign,":weight",0),(try_for_range,":slot_no",0,ek_horse),(troop_get_inventory_slot,":item",":troop_id",":slot_no"),(ge,":item",0),(item_get_slot,":cur_item_weight",":item",slot_item_weight),(val_add,":weight",":cur_item_weight"),(try_end),(val_div,":weight",100),(assign,reg1,":weight"),]),#newscriptend#newmagicend]复制代码明显的(item_set_slot,"itm_mage_robe",slot_item_weight,400),(item_set_slot,"itm_hell_armor",slot_item_weight,220),(item_set_slot,"itm_hell_helmet",slot_item_weight,275),复制代码是个物品重量表,这样就防止有人改items.txt了,用修改器查查itm_hell_helmet发现itm_hell_helmet的重量是2.75,再看到(val_div,":weight",100),(assign,reg1,":weight"),复制代码275与2.75正好是100倍关系所以我们可以得出负重限制的原理:先设定一个表格,每一装备对应一个被放大100倍的重量,累加全部重量后再除以100,超过20就禁止魔法。那么只要吧除以100改成除以10000(val_div,":weight",10000),(assign,reg1,":weight"),复制代码破解负重限制就完成了具体改法如下scripts.txt文件中:491212249790986447749143021224979098644774915052731224979098644774916122497909864477491552105212249790986447749132249790986447749163021082122497909864477491310021332720575940379279371224979098644774913改成49121224979098644774914302122497909864477491505273122497909864477491612249790986447749155210521224979098644774913224979098644774916302108212249790986447749131000021332720575940379279371224979098644774913负重超过20不能使用魔法会变成负重超过2000不能使用魔法---------------------------------------------------------------------------------------------------------超速回蓝module_scripts.py有以下的一段代码(val_add,"$bonus_to_sepll_proficiency",100),(try_end),]),("mana_add",[(assign,":mana_add",1),(get_player_agent_no,":player_no"),(agent_get_wielded_item,"$player_items",":player_no"),(try_begin),(eq,"$player_items","itm_black_stick"),(val_add,":mana_add",2),(else_try),(eq,"$player_items","itm_red_stick"),(val_add,":mana_add",4),(else_try),(eq,"$player_items","itm_dark_magicwand"),(val_add,":mana_add",6),(else_try),(eq,"$player_items","itm_red_magicwand"),(val_add,":mana_add",8),(else_try),(eq,"$player_items","itm_dark_shadow_sceptre"),(val_add,":mana_add",10),(else_try),(eq,"$player_items","itm_red_kindle_sceptre"),(val_add,":mana_add",15),(try_end),(try_begin),复制代码1,2,4,6。。。。就是不同的魔杖的回魔量了改他们就行了。。。具体改法:scripts.txt红字依次是不同的魔杖的回魔量,随你改。。。顺序是itm_black_stick,itm_red_stick,itm_dark_magicwand,itm_red_magicwand,itm_dark_shadow_sceptre,itm_red_kindle_sceptremana_add-152213321224979098644774912117001122497909864477491317262144115188075856193122497909864477491340312144115188075856193288230376151712179210521224979098644774912250312144115188075856193288230376151712180210521224979098644774912450312144115188075856193288230376151712181210521224979098644774912650312144115188075856193288230376151712182210521224979098644774912850312144115188075856193288230376151712183210521224979098644774912105031214411518807585619328823037615171218421052122497909864477491215304054033602879701896396801652210521224979098644774912250540336028797018963968016532105212249790986447749124505403360287970189639680165421052122497909864477491265054033602879701896396801655210521224979098644774912850540336028797018963968016562105212249790986447749121050540336028797018963968016572105212249790986447749121250540336028797018963968016582105212249790986447749121550540336028797018963968016592105212249790986447749122050540336028797018963968016510210521224979098644774912303021052144115188075855916122497909864477491221102144115188075855916144115188075855932需装备对应法杖才有用!改法二:module_scripts.py中有这一段:关于每升一级加的回魔速度,改这个就行了,具体改法就省略了。。。。。。和上方的差不多,改源代码再生成MOD,用FC比较一下就可以找到txt文档中对应的修改位置了。。。(troop_slot_eq,"trp_player",slot_troop_Title,magic_Magic_Apprentice),(val_add,":mana_add",2),(else_try),(troop_slot_eq,"trp_player",slot_troop_Title,magic_Primary_Magician),(val_add,":mana_add",4),(else_try),(troop_slot_eq,"trp_player",slot_troop_Title,magic_Intermediate_Magician),(val_add,":mana_add",6),(else_try),(troop_slot_eq,"trp_player",slot_troop_Title,magic_High_Level_Magician),(val_add,":mana_add",8),(else_try),(troop_slot_eq,"trp_player",slot_troop_Title,magic_Trained_Mage),(val_add,":mana_add",10),(else_try),(troop_slot_eq,"trp_player",slot_troop_Title,magic_Veteran_Mage),(val_add,":mana_add",12),(else_try),(troop_slot_eq,"trp_player",slot_troop_Title,magic_Magic_Expert),(val_add,":mana_add",15),(else_try),(troop_slot_eq,"trp_player",slot_troop_Title,magic_Master_of_Magic),(val_add,":mana_add",20),(else_try),(troop_slot_eq,"trp_player",slot_troop_Title,magic_Magic_God),(val_add,":mana_add",30),复制代码-----------------------------------------------------------------超高魔力:module_dialogs.py中有[anyone,"magic_talk8",[],"Now,letmeteachyouhowtocast'Fireball'.","magic_talk11",[(val_add,"$maximun_mana",100),(assign,"$mana","$maximun_mana"),]],复制代码这样一句,明显$maximun_mana",100改成$maximun_mana",10000,初始魔力就变成10000具体改法:dlga_magic_talk8:magic_talk114095550Now,_let_me_teach_you_how_to_cast_'Fireball'.5622105214411518807585593210021332144115188075855916144115188075855932改成dlga_magic_talk8:magic_talk114095550Now,_let_me_teach_you_how_to_cast_'Fireball'.562210521441151880758559321000021332144115188075855916144115188075855932这样和禅达老师聊完后就有10000魔力了(第一次聊)---------------------------------------------------------------加新魔法,未测试过,修改后果自负。。。。。。(troop_set_slot,"trp_player",slot_troop_Fireball,magic_Novice),复制代码是加魔法的语句其中slot_troop_Fireball是魔法名称magic_Novice是魔法等级按这个排出新语句后[anyone|plyr,"magic_talk11",[],"Well,IthinkIgotit.Thankyou.ButIalsowanttoknowsomethingmoreaboutmagic.","magic_talk13",[(display_message,"@LearnedFireball!",0xffff00),(troop_set_slot,"trp_player",slot_troop_Fireball,magic_Novice)[color=Red]加在这儿,每句用“,”分隔,末尾要有一个“,”[/color],]],复制代码这样和禅达老师聊完后就有你加的魔法了(第一次聊)
模拟人生3的所有秘籍
Ctrl+Shift+Ctestingcheatsenabled true开启
testingcheatsenabled false 关闭
按Shift+右击小人有个[set skill level...]选一个技能,该技能值便满值。
Motherlode:为选择的家庭增加五万元模拟币
Moveobjects on:移动原本不能移动的物品,人也可以移动
shift+点击物品:会出现隐藏选项 (例如弄坏该物品...)
shift+点击人物:会出现隐藏选项 (参照下面)
Cheer up:鼓励对方
spawn... tombstone of L and D: 出现一个墓碑
Age Baby:随机造出婴孩(男)
Age Baby:随机造出婴孩(女)
New Toddler Boy:随机造出幼儿(男)
New Toddler Girl:随机造出幼儿(女)
New Child Boy:随机造出小孩(男)
New Child Girl:随机造出小孩(女)
New Teen Male:随机造出青年(男)
New Teen Female:随机造出青年(女)
New Adult Male:随机造出成年人(男)
New Adult Female:随机造出成年人(女)
New Elder Man:随机造出老年人(男)
New Elder Woman:随机造出老年人(女)
Add to Family :把该名模拟市民变成家人
Age Transition Cinematic:转换年纪(进入下一个年龄层)
disableSnappingToSlotsOnAlt on:按下ALT键之后物件可以不按格线摆放
AgeTransition:转换年纪(进入下一个年龄层)
Add Neighbor To Family...:把你所选择的邻居变成家人
Get Family Mamber...:使某个亲戚到来
Make me Family child:(未确定)
hideHeadlineEffects true 隐藏头顶思考泡泡
Rename Sim:重新命名该模拟市民
Show Parent and Sibling Relationship:显示亲戚关系
Make Me Friendly to Everyone Here:提高与在场所有人的人际关系
Make me Alien Pregnant:怀孕(外星小孩)
Get Pregnant with..:与"XX(人名)"怀有小孩
Speed up my Pregnancy:加快怀孕速度
New Baby:新的小孩
CINECAM BABY:即时生出婴孩
Add XXX To Family:加"人名"入家庭(可以控制)
unlockOutfits:在创造模拟市民中可以使用各种职业生涯的服装。必须先输入此密技再进入创造模拟市民。
*Baldness ON:变成秃头
*Baldness OFF:与上相反
Workout Current Clothes:健身(穿普通服饰)
Yoga-Current Clothes:瑜伽 (穿普通服饰)
Die of old Age:老死
Die By Satellite:被卫星撞死
Die From Fright:被吓死
Die of Starvation:饿死
Die by Fire:烧死
Die by Electrocution:电死
Die by Disease:病死
槽函数的问题
一、概述
二、信号
三、槽
四、信号和槽的关联
五、元对象工具
六、程式样例
七、应注意的问题
相关资源
作者简介
作者:唐新华 (xhsmart@263.net)
软件工程师
信号和槽作为QT的核心机制在QT编程中有着广泛的应用,本文介绍了信号和槽的一些基本概念、元对象工具及在实际使用过程中应注意的一些问题。
QT 是个跨平台的C++ GUI应用构架,他提供了丰富的窗口部件集,具有面向对象、易于扩展、真正的组件编程等特点,更为引人注目的是目前Linux上最为流行的KDE桌面环境就是建立在QT库的基础之上。QT支持下列平台:MS/WINDOWS-95、98、NT和2000;UNIX/X11-Linux、Sun Solaris、HP-UX、Digital Unix、IBM AIX、SGI IRIX;EMBEDDED-支持framebuffer的Linux平台。伴随着KDE的快速发展和普及,QT非常可能成为Linux窗口平台上进行软件研发时的GUI最佳选择。
一、概述
信号和槽机制是QT的核心机制,要精通QT编程就必须对信号和槽有所了解。信号和槽是一种高级接口,应用于对象之间的通信,他是QT的核心特性,也是QT差别于其他工具包的重要地方。信号和槽是QT自行定义的一种通信机制,他独立于标准的C/C++语言,因此要正确的处理信号和槽,必须借助一个称为moc(Meta Object Compiler)的QT工具,该工具是个C++预处理程式,他为高层次的事件处理自动生成所需要的附加代码。
在我们所熟知的非常多GUI工具包中,窗口小部件(widget)都有一个回调函数用于响应他们能触发的每个动作,这个回调函数通常是个指向某个函数的指针。不过,在 QT中信号和槽取代了这些凌乱的函数指针,使得我们编写这些通信程式更为简洁明了。信号和槽能携带任意数量和任意类型的参数,他们是类型完全安全的,不会像回调函数那样产生core dumps。
所有从QObject或其子类(例如Qwidget)派生的类都能够包含信号和槽。当对象改动其状态时,信号就由该对象发射(emit)出去,这就是对象所要做的全部事情,他不知道另一端是谁在接收这个信号。这就是真正的信息封装,他确保对象被当作一个真正的软件组件来使用。槽用于接收信号,但他们是普通的对象成员函数。一个槽并不知道是否有所有信号和自己相连接。而且,对象并不了解具体的通信机制。
你能将非常多信号和单个的槽进行连接,也能将单个的信号和非常多的槽进行连接,甚至于将一个信号和另外一个信号相连接也是可能的,这时无论第一个信号什么时候发射系统都将即时发射第二个信号。总之,信号和槽构造了一个强大的部件编程机制。
二、信号
当某个信号对其客户或所有者发生的内部状态发生改动,信号被一个对象发射。只有定义过这个信号的类及其派生类能够发射这个信号。当一个信号被发射时,和其相关联的槽将被即时执行,就象一个正常的函数调用相同。信号-槽机制完全独立于所有GUI事件循环。只有当所有的槽返回以后发射函数(emit)才返回。如果存在多个槽和某个信号相关联,那么,当这个信号被发射时,这些槽将会一个接一个地执行,不过他们执行的顺序将会是随机的、不确定的,我们不能人为地指定哪个先执行、哪个后执行。
信号的声明是在头文件中进行的,QT的signals关键字指出进入了信号声明区,随后即可声明自己的信号。例如,下面定义了三个信号:
signals:
void mySignal();
void mySignal(int x);
void mySignalParam(int x,int y);
在上面的定义中,signals是QT的关键字,而非C/C++的。接下来的一行void mySignal() 定义了信号mySignal,这个信号没有携带参数;接下来的一行void mySignal(int x)定义了重名信号mySignal,不过他携带一个整形参数,这有点类似于C++中的虚函数。从形式上讲信号的声明和普通的C++函数是相同的,不过信号却没有函数体定义,另外,信号的返回类型都是void,不要指望能从信号返回什么有用信息。
信号由moc自动产生,他们不应该在.cpp文件中实现。
三、槽
槽是普通的C++成员函数,能被正常调用,他们唯一的特别性就是非常多信号能和其相关联。当和其关联的信号被发射时,这个槽就会被调用。槽能有参数,但槽的参数不能有缺省值。
既然槽是普通的成员函数,因此和其他的函数相同,他们也有存取权限。槽的存取权限决定了谁能够和其相关联。同普通的C++成员函数相同,槽函数也分为三种类型,即public slots、private slots和protected slots。
public slots:在这个区内声明的槽意味着所有对象都可将信号和之相连接。这对于组件编程非常有用,你能创建彼此互不了解的对象,将他们的信号和槽进行连接以便信息能够正确的传递。
protected slots:在这个区内声明的槽意味着当前类及其子类能将信号和之相连接。这适用于那些槽,他们是类实现的一部分,不过其界面接口却面向外部。
private slots:在这个区内声明的槽意味着只有类自己能将信号和之相连接。这适用于联系非常紧密的类。
槽也能够声明为虚函数,这也是非常有用的。
槽的声明也是在头文件中进行的。例如,下面声明了三个槽:
public slots:
void mySlot();
void mySlot(int x);
void mySignalParam(int x,int y);
四、信号和槽的关联
通过调用QObject对象的connect函数来将某个对象的信号和另外一个对象的槽函数相关联,这样当发射者发射信号时,接收者的槽函数将被调用。该函数的定义如下:
bool QObject::connect ( const QObject * sender, const char * signal,
const QObject * receiver, const char * member ) [static]
这个函数的作用就是将发射者sender对象中的信号signal和接收者receiver中的member槽函数联系起来。当指定信号signal时必须使用QT的宏SIGNAL(),当指定槽函数时必须使用宏SLOT()。如果发射者和接收者属于同一个对象的话,那么在connect调用中接收者参数能省略。
例如,下面定义了两个对象:标签对象label和滚动条对象scroll,并将valueChanged()信号和标签对象的setNum()相关联,另外信号还携带了一个整形参数,这样标签总是显示滚动条所处位置的值。
QLabel *label = new QLabel;
QScrollBar *scroll = new QScrollBar;
QObject::connect( scroll, SIGNAL(valueChanged(int)),
label, SLOT(setNum(int)) );
一个信号甚至能够和另一个信号相关联,看下面的例子:
class MyWidget : public QWidget
{
public:
MyWidget();
…
signals:
void aSignal();
…
private:
…
QPushButton *aButton;
};
MyWidget::MyWidget()
{
aButton = new QPushButton( this );
connect( aButton, SIGNAL(clicked()), SIGNAL(aSignal()) );
}
在上面的构造函数中,MyWidget创建了一个私有的按钮aButton,按钮的单击事件产生的信号clicked()和另外一个信号aSignal() 进行了关联。这样一来,当信号clicked()被发射时,信号aSignal()也接着被发射。当然,你也能直接将单击事件和某个私有的槽函数相关联,然后在槽中发射aSignal()信号,这样的话似乎有点多余。
当信号和槽没有必要继续保持关联时,我们能使用disconnect函数来断开连接。其定义如下:
bool QObject::disconnect ( const QObject * sender, const char * signal,
const Object * receiver, const char * member ) [static]
这个函数断研发射者中的信号和接收者中的槽函数之间的关联。
有三种情况必须使用disconnect()函数:
断开和某个对象相关联的所有对象。这似乎有点不可理解,事实上,当我们在某个对象中定义了一个或多个信号,这些信号和另外若干个对象中的槽相关联,如果我们要切断这些关联的话,就能利用这个方法,非常之简洁。
disconnect( myObject, 0, 0, 0 )
或
myObject-disconnect()
断开和某个特定信号的所有关联。
disconnect( myObject, SIGNAL(mySignal()), 0, 0 )
或
myObject-disconnect( SIGNAL(mySignal()) )
断开两个对象之间的关联。
disconnect( myObject, 0, myReceiver, 0 )
或
myObject-disconnect( myReceiver )
在disconnect函数中0能用作一个通配符,分别表示所有信号、所有接收对象、接收对象中的所有槽函数。不过发射者sender不能为0,其他三个参数的值能等于0。
五、元对象工具
元对象编译器moc(meta object compiler)对C++文件中的类声明进行分析并产生用于初始化元对象的C++代码,元对象包含全部信号和槽的名字及指向这些函数的指针。
moc 读C++源文件,如果发现有Q_OBJECT宏声明的类,他就会生成另外一个C++源文件,这个新生成的文件中包含有该类的元对象代码。例如,假设我们有一个头文件mysignal.h,在这个文件中包含有信号或槽的声明,那么在编译之前 moc 工具就会根据该文件自动生成一个名为mysignal.moc.h的C++源文件并将其提交给编译器;类似地,对应于mysignal.cpp文件moc 工具将自动生成一个名为mysignal.moc.cpp文件提交给编译器。
元对象代码是signal/slot机制所必须的。用moc产生的C++源文件必须和类实现一起进行编译和连接,或用#include语句将其包含到类的源文件中。moc并不扩展#include或#define宏定义,他只是简单的跳过所遇见的所有预处理指令。
六、程式样例
这里给出了一个简单的样例程式,程式中定义了三个信号、三个槽函数,然后将信号和槽进行了关联,每个槽函数只是简单的弹出一个对话框窗口。读者能用kdevelop生成一个简单的QT应用程式,然后将下面的代码添加到相应的程式中去。
信号和槽函数的声明一般位于头文件中,同时在类声明的开始位置必须加上Q_OBJECT语句,这条语句是不可缺少的,他将告诉编译器在编译之前必须先应用 moc工具进行扩展。关键字signals指出随后开始信号的声明,这里signals用的是复数形式而非单数,siganls没有public、 private、protected等属性,这点不同于slots。另外,signals、slots关键字是QT自己定义的,不是C++中的关键字。
信号的声明类似于函数的声明而非变量的声明,左边要有类型,右边要有括号,如果要向槽中传递参数的话,在括号中指定每个形式参数的类型,当然,形式参数的个数能多于一个。
关键字slots指出随后开始槽的声明,这里slots用的也是复数形式。
槽的声明和普通函数的声明相同,能携带零或多个形式参数。既然信号的声明类似于普通C++函数的声明,那么,信号也可采用C++中虚函数的形式进行声明,即同名但参数不同。例如,第一次定义的void mySignal()没有带参数,而第二次定义的却带有参数,从这里我们能看到QT的信号机制是非常灵活的。
信号和槽之间的联系必须事先用connect函数进行指定。如果要断开二者之间的联系,能使用函数disconnect。
//tsignal.h
…
class TsignalApp:public QMainWindow
{
Q_OBJECT
…
//信号声明区
signals:
//声明信号mySignal()
void mySignal();
//声明信号mySignal(int)
void mySignal(int x);
//声明信号mySignalParam(int,int)
void mySignalParam(int x,int y);
//槽声明区
public slots:
//声明槽函数mySlot()
void mySlot();
//声明槽函数mySlot(int)
void mySlot(int x);
//声明槽函数mySignalParam (int,int)
void mySignalParam(int x,int y);
}
…
//tsignal.cpp
…
TsignalApp::TsignalApp()
{
…
//将信号mySignal()和槽mySlot()相关联
connect(this,SIGNAL(mySignal()),SLOT(mySlot()));
//将信号mySignal(int)和槽mySlot(int)相关联
connect(this,SIGNAL(mySignal(int)),SLOT(mySlot(int)));
//将信号mySignalParam(int,int)和槽mySlotParam(int,int)相关联
connect(this,SIGNAL(mySignalParam(int,int)),SLOT(mySlotParam(int,int)));
}
// 定义槽函数mySlot()
void TsignalApp::mySlot()
{
QMessageBox::about(this,”Tsignal”, “This is a signal/slot sample without
parameter.”);
}
// 定义槽函数mySlot(int)
void TsignalApp::mySlot(int x)
{
QMessageBox::about(this,”Tsignal”, “This is a signal/slot sample with one
parameter.”);
}
// 定义槽函数mySlotParam(int,int)
void TsignalApp::mySlotParam(int x,int y)
{
char s[256];
sprintf(s,”x:%d y:%d”,x,y);
QMessageBox::about(this,”Tsignal”, s);
}
void TsignalApp::slotFileNew()
{
//发射信号mySignal()
emit mySignal();
//发射信号mySignal(int)
emit mySignal(5);
//发射信号mySignalParam(5,100)
emit mySignalParam(5,100);
}
七、应注意的问题
信号和槽机制是比较灵活的,但有些局限性我们必须了解,这样在实际的使用过程中做到有的放矢,避免产生一些错误。下面就介绍一下这方面的情况。
1.信号和槽的效率是非常高的,不过同真正的回调函数比较起来,由于增加了灵活性,因此在速度上还是有所损失,当然这种损失相对来说是比较小的,通过在一台 i586-133的机器上测试是10微秒(运行Linux),可见这种机制所提供的简洁性、灵活性还是值得的。但如果我们要追求高效率的话,比如在实时系统中就要尽可能的少用这种机制。
2.信号和槽机制和普通函数的调用相同,如果使用不当的话,在程式执行时也有可能产生死循环。因此,在定义槽函数时一定要注意避免间接形成无限循环,即在槽中再次发射所接收到的同样信号。例如,在前面给出的例子中如果在mySlot()槽函数中加上语句emit mySignal()即可形成死循环。
3.如果一个信号和多个槽相联系的话,那么,当这个信号被发射时,和之相关的槽被激活的顺序将是随机的。
4. 宏定义不能用在signal和slot的参数中。
既然moc工具不扩展#define,因此,在signals和slots中携带参数的宏就不能正确地工作,如果不带参数是能的。例如,下面的例子中将带有参数的宏SIGNEDNESS(a)作为信号的参数是不合语法的:
#ifdef ultrix
#define SIGNEDNESS(a) unsigned a
#else
#define SIGNEDNESS(a) a
#endif
class Whatever : public QObject
{
[…]
signals:
void someSignal( SIGNEDNESS(a) );
[…]
};
5. 构造函数不能用在signals或slots声明区域内。
的确,将一个构造函数放在signals或slots区内有点不可理解,无论怎么,不能将他们放在private slots、protected slots或public slots区内。下面的用法是不合语法需求的:
class SomeClass : public QObject
{
Q_OBJECT
public slots:
SomeClass( QObject *parent, const char *name )
: QObject( parent, name ) {} // 在槽声明区内声明构造函数不合语法
[…]
};
6. 函数指针不能作为信号或槽的参数。
例如,下面的例子中将void (*applyFunction)(QList*, void*)作为参数是不合语法的:
class someClass : public QObject
{
Q_OBJECT
[…]
public slots:
void apply(void (*applyFunction)(QList*, void*), char*); // 不合语法
};
你能采用下面的方法绕过这个限制:
typedef void (*ApplyFunctionType)(QList*, void*);
class someClass : public QObject
{
Q_OBJECT
[…]
public slots:
void apply( ApplyFunctionType, char *);
};
7.信号和槽不能有缺省参数。
既然signal-slot绑定是发生在运行时刻,那么,从概念上讲使用缺省参数是困难的。下面的用法是不合理的:
class SomeClass : public QObject
{
Q_OBJECT
public slots:
void someSlot(int x=100); // 将x的缺省值定义成100,在槽函数声明中使用是错误的
};
8.信号和槽也不能携带模板类参数。
如果将信号、槽声明为模板类参数的话,即使moc工具不报告错误,也不可能得到预期的结果。例如,下面的例子中当信号发射时,槽函数不会被正确调用:
[…]
public slots:
void MyWidget::setLocation (pair location);
[…]
public signals:
void MyObject::moved (pair location);
不过,你能使用typedef语句来绕过这个限制。如下所示:
typedef pair IntPair;
[…]
public slots:
void MyWidget::setLocation (IntPair location);
[…]
public signals:
void MyObject::moved (IntPair location);
这样使用的话,你就能得到正确的结果。
9.嵌套的类不能位于信号或槽区域内,也不能有信号或槽。
例如,下面的例子中,在class B中声明槽b()是不合语法的,在信号区内声明槽b()也是不合语法的。
class A
{
Q_OBJECT
public:
class B
{
public slots: // 在嵌套类中声明槽不合语法
void b();
[….]
};
signals:
class B
{
// 在信号区内声明嵌套类不合语法
void b();
[….]
}:
};
10.友元声明不能位于信号或槽声明区内。相反,他们应该在普通C++的private、protected或public区内进行声明。下面的例子是不合语法规范的:
class someClass : public QObject
{
Q_OBJECT
[…]
signals: //信号定义区
friend class ClassTemplate; // 此处定义不合语法
满意请采纳。
古墓丽影9有没有什么办法能将困难模式改成简单模式?比如像更改文件之类的方法。
《古墓丽影9》v1.1.730.0升级档+3DM破解补丁
使用说明:
1、解压缩
2、复制Update文件夹下的升级补丁到游戏目录覆盖
3、复制Crack文件夹下的破解补丁到游戏目录覆盖
4、运行游戏
更新说明:
New fixes in 730.0:
• Upgraded the save slots from three to 99
• Introduced “Last Campsite Save”, which automatically saves your progress up to the last campsite you have visited
• Added stereoscopic 3D reticle
• Fixed issues with the discovery of the Unworthy campsite.
• Fixed a problem that occurred when traveling back to the Sacred Hall Basecamp after that story has been completed
• Fixed a playthrough stopper in Chasm Bridge
• Fixed a playthrough stopper that could occur when loading a saved game created in the Coastal Forest after upgrading the axe but before opening the gate
• The active selection in the main menu no longer changes due to the rotation of the menu itself
(下载地址:http://www.591danji.com/danji/patch/19311.html)
• Fixed Mouse and Aim Sensitivity slider settings getting rounded to coarser values on save
• Fixed a crash in multiplayer that could occur while migrating hosts
• Added functionality to activate and deactivate DLC multiplayer maps during matchmaking. Maps can also be manually activated and deactivated in the new ‘Match Making’ menu in the ‘Options’ menu.
• (DX11) Fixed a few self-shadowing artifacts in the beach
• (DX11) Various performance optimizations
• (DX11) Improved sunlight shadow quality
• (DX11) Lens flares now render correctly in stereoscopic 3D
• (DX11) Improved exclusive fullscreen - windowed transitions
• (DX11) Fixed occasional crash on startup related to stereoscopic detection
While we expect this patch to be an improvement for everyone, if you do have trouble with this patch and prefer to stay on the old version we made a Beta available on Steam, Build722.3, that can be used to switch back to the previous version. Please note however that you can only play multiplayer with people that share your version.
有什么好游戏
《疾速赛车:进军诺克斯维尔》(Sprint Cars: Road To Knoxville)硬盘版
《疤面煞星:掌握世界》(Scarface)硬盘版
《要塞传奇》(Stronghold: Legends)Clone版/破解版
《冠军足球经理2007》(Championship Manager 2007)Clone版/破解版[Bin]
《沉默英雄》(Silent Heroes)更换为修正版
《战地2142》(Battlefield 2142)多国语言版(包含繁体/简体中文)[ISO]
《重返狼穴2血战太平洋》(Deadly Dozen 2 Pacific Theater)英文版[ISO]
《百鬼夜宴》
《哥特王朝3》(Gothic 3)破解版[ISO]
《冠军足球经理2007》(Championship Manager 2007)硬盘版
《疯狂主妇》(Desperate Housewives: The Game)Clone版/破解版[Bin]
《魔法使与主人》繁体中文版
《冰雪传奇》简体中文版硬盘版
《战锤40K:战争黎明-黑暗十字军》(Warhammer 40K:Dawn of WAR - Dark Crusade)硬盘版
《钢铁意志》(Will Of Steel)硬盘版
《机动战士敢达在线》
《魔法大帝》(Lords of Magic : Special Edition)Special Edition/特别版[ISO]
《孤单枪手2简体中文版》(AlienShooter2)完全破解
《狗仔队》(PAPARAZZI)[Bin]
《模拟人生2:宠物》(The Sims 2:Pets)资料片
《足球经理2007》(Football Manager 2007)Clone版[Bin]
《幻象杀手》(Fahrenheit)欧洲未删剪版[ISO]
《回声:失落秘洞之谜》(ECHO: Secrets of the Lost Cavern)完美破解版
《席德·梅尔的铁路》(Sid Meiers RailRoads)破解版\CLONE版[Bin]
《突袭》(Sudden Strike)繁体中文硬盘版
《狗仔队》(PAPARAZZI)硬盘版
《目标柏林》(Rush for Berlin)破解版[ISO]
《太空帝国 5 硬盘版》(Space Empires V)1.08
《抗日:血战上海滩》简体中文硬盘版
《E5旅:新铁血联盟》(Brigade E5: New Jagged Union)[Bin]
《突袭2:秘密行动2》(Hidden Stroke II)硬盘版/附繁体中文汉化包
《抗日:血战缅甸》简体中文硬盘版
《大白鲨》(Jaws Unleashed)破解版\CLONE版[ISO]
《扑克超级明星2》(Poker Superstars II)[Bin]
《南茜·朱儿:卡普洞的怪兽》(Nancy Drew: The Creature of Kapu Cave)[Bin]
《拉霸机高手:神秘森林》(Reel Deal Slots Mystic Forest)[Bin]
《闪电战:燃烧的地平线》(Blitzkrieg: Burning Horizon)硬盘版
《终极麻将20》(Ultimate Mahjongg 20)[Bin]
《黑客帝国》(Enter The Matrix).ISO英文版[ISO]
《席德梅尔的铁路》(Sid Meier's Railroads)硬盘版
《惊天计划》(Th3 Plan)破解版[ISO]
《玛莉·艾莉·莉莉炼金工房》桌面装饰集[ISO]
《神探杰克》(Jack Orlando Director's Cut)简体中文版[ISO]
《足球经理2007》(Football Manager 2007)硬盘版
《要塞传奇》(Stronghold Legends)硬盘版
《战术指令2:闪电战》(Strategic Command 2 Blitzkrieg)硬盘版
《疯狗Ⅱ之黄金失窃案》(Mad Dog 2:The Lost Gold)[ISO]
《极度恐慌:撤离点》(F.E.A.R.: Extraction Point)资料片Clone版/破解版
《魔法门之黑暗弥赛亚》(Dark Messiah Of Might And Magic)Clone版/更新1.01升级档免CD补丁
《星球大战:帝国战争-堕落之军》(Star Wars Empire At War Forces of Corruption)更换Clone修正版/DVDClone版
《狮心王》(Lionheart)简体中文硬盘版
《惊天计划》(Th3 Plan)硬盘版
《职业进化足球6》(Pro Evolution Soccer 6)Clone版/破解版[ISO]
《超级力量2》(superpower2)中文版已更新补丁[ISO]
《黑帮教父》(Gangland)国际中文版[ISO]
《梦幻之星:宇宙》(Phantasy Star Universe)[ISO]
《漫画英雄:终极联盟》(Marvel: Ultimate Alliance)Clone版/更换破解修正版[ISO]
《赛道狂飙:日出极限版》(Trackmania Sunrise Extreme)破解版[ISO]
《奇趣射击场》(Smoking Guns Shooting Gallery)[Bin]
《终极纸牌》(Ultimate Solitaire 1000 Unique Games)[Bin]
《晶化2:寻找宝石王冠之旅》(Crystalize 2 Quest for the Jewel Crown)[Bin]
《墨尔本杯挑战赛》(Melbourne Cup Challenge)破解版[Bin]
《赌场高手:挥金如土》(Reel Deal Casino High Roller)[Bin]
《职业进化足球6》(Pro Evolution Soccer 6)硬盘版
《证据:最后的典礼》(Evidence: The Last Ritual)[Bin]
《仙剑奇侠传后传——灵儿续传》完整版
《复活-秦殇前传》(Seal of Evil)硬盘版
《赛道狂飙:日出极限版》(Trackmania Sunrise Extreme)硬盘版
《职业进化足球6》(Pro Evolution Soccer 6)简体中文硬盘版[更新中文实名存档]
《大白鲨》(Jaws Unleashed)硬盘版
《奇趣射击场》(Smoking Guns Shooting Gallery)硬盘版
《魔法门之黑暗弥赛亚》(Dark Messiah Of Might And Magic)硬盘版/RIP版
《卡丁车公开赛》(open kart)Rip
《圣域+资料片魔都魅影》(Sacred Underworld)中文Clone版
《游戏动画收集》(Animation game Collections)
《坎贝拉的非洲冒险》(Cabelas African Safari)[Bin]
《夜行侦探 迷失者》(EVE-the lost one)[ISO]
《小鬼历险记》(Gast: The Greatest Little Ghost!)[Bin]
《坎贝拉的非洲冒险》(Cabelas African Safari)硬盘版
《眼镜蛇11:警报》(Cobra 11 - Nitro)[ISO]
《太平洋风暴》(Pacific Storm)[Bin]
《极品飞车10卡本峡谷》(Need for Speed Carbon)典藏DVDClone版/免CD补丁\破解版
《野兽与乡巴佬》(Beasts and Bumpkins)PC,硬盘版,简体中文版
《无冬之夜2》(Neverwinter Nights 2)CLONE版\破解版
《极品飞车10 卡本峡谷》(Need for Speed Carbon)典藏繁体中文克隆版/更新免CD补丁
《FIFA足球经理2007》(FIFA Manager 2007)CLONE版\破解版
《极品飞车10卡本峡谷典藏版花絮DVDRip》(Need for Speed Carbon Bonus DVDRip)
《爱国者:战火中的国家》(Patriots: A Nation Under Fire)[Bin]
《细胞分裂4:双重间谍》(Tom Clancy's Splinter Cell Double Agent)Clone版/免CD补丁/更新DVD5版本
《漫画英雄:终极联盟》(Marvel:Ultimate Alliance)硬盘版
《恐惧:撤离点》(F.E.A.R. Extraction Point)资料片[独立硬盘版]
《太空帝国5》(Space Empires V)修正版[Bin]
《领土之战3:觉醒》(Dominions 3 The Awakening)[ISO]
《黑暗地球》(Dark Earth)
《细胞分裂4:双重间谍 》(Tom Clancy's Splinter Cell Double Agent)破解版[ISO]
《史努比大战红男爵》(Snoopy Vs The Red Baron)Clone版/破解版/免CD[Bin]
《恶魔守卫战》(Master of Defense)
《赏金猎人》(Bounty Special Edition)
《宝石探秘纸牌》(Jewel Quest Solitaire )
《反恐精英起源胜利之日起源》2943多国语言硬盘版
游戏为什么叫游戏
“什么是游戏?”不少朋友问到我这个问题,其实怎么说呢?这本来是一个非常简单的意思,但又有些复杂。在英文中,游戏做为名词出现时一般使用Game,而做为动词使用时则往往用play。这就是一些玩家问到的,如果是游戏杂志或是游戏网站,往往会有Game这个词出现,而早期的Dos下运行的游戏,执行文件则会出现play.bat。
现在玩家们常说的“玩游戏”,一般是指电子游戏,也就是运行在家用电脑(PC)、家用电子游戏机(什么PS、SS、SFC、MD、3DO,多了去了)或是掌中宝游戏机(Game boy)及街机上电子游戏程序。
其实,游戏这个词的历史远远比电子游戏程序要早得多,早在宋·《教战守》一文中,苏轼就有“游戏酒食”一词,本意为“嬉戏”的意思。而在电子游戏程序,没有出现时,游戏一词已经被人们广为使用了,象是“幼儿园老师:‘小朋友,今天我们来做个游戏,好不好?’”或是“我们来做个小小的智力游戏?”之类的。
好了,说来说去,我们一直围绕着游戏这个词的历史和用法了,回过头来再谈谈电子游戏程序吧。
其实各种电子游戏程序的原形都是我们可以看的到的游戏,就拿不少玩家朋友们所津津乐道的角色扮演游戏(Role Personate Game缩写为RPG)来说吧,它的雏形实际上是六、七十年代风靡于美国青少年中的角色棋游戏。
这种棋虽然比之电子游戏程序要简单落后的多,但不能不说是RPG游戏的始祖。大致玩法是这样的。双人或多人游戏,根据游戏脚本不同,每个人可以选择自己喜欢的角色,如骑士、魔法师、精灵等等。指定专门的人来负责执行游戏脚本,如念到“大家来到一个山洞前,我们是否进去?”由游戏者来选择“进”或“不进”;再如念到“面前出现一条可怖的巨龙,我们是杀死它还是逃跑?” 由游戏者来选择“杀”或“逃”。游戏中亦是存在级别(Level)这个概念的,级别越高其能力当然也更高。随角色职业的不同,其级别与能力的换算关系,一般在角色棋游戏说明书上可以看到。从上面这些,我们不难看出它与RPG电子游戏程序非常相像。另外,这种棋也有存盘(Save)与载入(Load)的概念,一局游戏棋往往要耗用大量的时间,于是游戏规则设定参与游戏的游戏者,可以在离于时,保留自己的职业与级别,以便于下次游戏时继续使用,只要是同一个游戏,游戏者只要带着自己的级别可以与任何其它游戏者结伴冒险。当时时有这样的对话,“Hi, I im a cavalier, level is nine, and you?”(我是一个骑士,九级,你呢??)“Oh, I im black Pentateuch, level is thirteen”(我是黑魔法师,十三级)。如果这两个游戏者自己身上没有补充体力的道具,觉得这样冒险有困难,他们还可以邀请一个拥有擅于补充体力的白魔法师的伙伴一起开始以后的游戏。根据游戏脚本,游戏有最终的目的与结局。当然如果游戏不当,游戏者所扮演的角色也会死亡,那他只好退出游戏了。但一般情况都有其它办法来复活他,游戏毕竟是游戏嘛。
在介绍这种角色棋之前,我们说到哪儿了?对了,各种电子游戏程序的原形都是我们可以看的到的游戏。战棋类SLG和TAB游戏不用说了,类似的战棋即使没有玩过,应该也听说过吧?比如几年前在中国出现的“强手”游戏不就是《大富翁》游戏的雏形吗?
还有一部分电子游戏程序,没有在游戏机中模拟之前,本身就是一种游戏。如体育类游戏、赛车类游戏和益智类游戏。象是足球、蓝球或是其它什么球,还有赛车,抛去电子游戏成份,再暂把现代体育精神也放到一边,不就是一种游戏吗?电子游戏程序只不过起到了在保留其规则的前提下,用电子方式模拟了一遍的作用。
还有不少益智玩具、游戏也是这样的,象棋、军棋、围棋、麻将、华容道、九连环、俄罗斯方块、黑白棋……这些游戏,在“移植”为电子游戏程序时,有的原封不动的保留了其规则,有的做了一些改变或升级。从俄罗斯方块的变种,我们不难看出电子游戏程序的灵活性和随意性。
在英语Game与Play中,都含有竞赛的意思,而游戏本身的乐趣也就在于竞赛。从体育项目与棋类,无不的如此。
体育:无论是绿茵场上各国球员们的奋力角逐,还是田径场上的拼博,即使没有奥零匹克,也同样存在着竞争的乐趣。可以说,体育没有了竞争也就不存在体育了。
棋类:同样如此,抛去胜利后的精神与物质奖励,与对手面对面的智力角逐,就是棋本身的乐趣,这就是没有人经常自己与自己对奕的原因。
把这些游戏规则模拟到了电子游戏程序中后,除了保留人与人的竞争外,电子游戏程序的设计者们还为喜欢单玩的人们设计了单人游戏,也就是与电脑本身的竞争。于是AI的概念的诞生了,所谓AI是artificial intelligence的缩写,就是人工智能,用电子程序来模拟类似于人的一系列思考与判断。它经常被用在各类电子游戏程序中,但电脑毕竟是电脑,它所能做的,仅仅是“判断:如果…………后,然后采用…………措施;如果…………不成立,则采用…………措施。”这些在程序编程中也就是If与Else的简单组合。
我们不难想想,无论是多人电子游戏程序(是人与人的竞争),还是单人电子游戏程序(人与电子AI的竞争或是人按着游戏规则来运行),从某种角度来说,都是一种智力的竞争。
看了我上面的结论,一定有人不服气,像《仙剑奇侠传》这样的单人游戏也是竞争吗?答案是肯定的。举个例子来说,游戏过程中,要求玩家找到某种道具才可以将游戏的进程继续下去,而这个道具被游戏设计者放在游戏中某一个角落里,这种情况不就是你与游戏设计者的简单的“藏”与“找”智力竞争吗?(呵呵,当然你玩完一款游戏后,大可以说“设计游戏的这个猪,真的没有我聪明啊”,但别忘了,游戏正是为了让你通过并让你得到成就感的。游戏的设计者大可以把游戏做得你根本永远也别想过去,也就是这个游戏的任何地方,根本就没有这个道具,这时你更应该骂他了)。
再比如《仙剑奇侠传》中与“护塔明王”之战,“护塔明王”的能力值是由设计者直接赋与的,而你所控制的李逍遥是从一级,慢慢培养起来的。他们之间的战斗,不就是你与设计者之间战斗的具体表现吗?
如果我说游戏是文化,一定会有不少对电子游戏程序不了解的朋友持反对意见的,“电子游戏?呱唧呱唧打完了就打完了,哪会有什么文化?”
其实游戏中同样蕴涵着浓郁的文化气息,在上一章中我们知道,游戏的来源基本上来源于生活,而一款游戏与另一款游戏的不同之处,也就是游戏的风格,这些风格构成了游戏的文化。
无论是魔法、骑士迭起的中世纪风格,还是幻漫离奇的未来风格,在游戏中都遵循着一定的规则。
如果有兴趣大可以把我们玩过的所有游戏都一一列出,从风格角度再加以分类,这样游戏的几个文化圈就一目了然了。
在Street fighter风糜的那段日子,有次在公车上,曾听到几个非常小的小学生,兴致勃勃讨论着Kin、Run和春丽究竟谁更厉害一些。其实虽早已成人,但与同是电玩迷又同是游戏策划的朋友勇在一起时,有时不也聊这些吗?正是这种游戏文化,把我和勇与那些小学生联在了一起。(笑)再说白一点儿,两个《星际》迷遇在一起,必然会讨论三个种族的优劣;两个魔法门英雄无敌高手见面,也必然会研究,那个种族系发展的快,关联他们在一起的,正是每一个游戏不同的文化。
在这一节中,我们略谈谈游戏的成就感。同样的道理,每一位玩家在游戏时,都有处在一个扮演的地位。无论是控制千军万马的SLG,还是扮演一代大侠的RPG,再么就是赛车手、飞行员,或者是餐厅、公园、医院的经营者,或多或少都可以满足每一个游戏者的英雄主义幻想。
所谓英雄主义,我们知道,就是就是人类对英雄的崇拜情结。而游戏恰恰可以投其所好的让所有人都成为自己崇拜的英雄。无论是杀手刺客、大富翁、勇敢的战士,甚至即使是高于人类的神、上帝,也可以成为被扮演的对象。
开发商们试着从不同的角度来满足玩家这种扮演的欲望,猎人、忍者、潜艇司令、城堡主人,甚至是僵尸、玩具、小鸡、蟑螂,都被一一展现给喜欢扮演它的玩家们。
这的确是一件非常有意思的事,无论是从玩家的角度还是从游戏制作者的角度。大家在试着扮演从来没有尝试过的角色时,无疑可以得到一种快感。虽然从某种意义来说,这种创新和突破已经超出了英雄主义的范畴,但也可以视之为理解的问题。
有时我在想,为什么不能从其它角度去创造游戏呢?
《太空迷路者》:一艘功能强大的宇宙飞船,因为某种原因迷失在宇宙的外空间,他们只有在无尽的宇宙寻找,由是他们去过很多星球,这些星球有着很多怪事,如时间逆流的空间,如可以食用自己的生物,如人的思维创造在宇宙中的实体……这个故事永远不会完结,迷路者会永远迷路下去,等待他们是更多的故事。
《复仇》:主角被人设了局而被谋杀了,他的魂魄来的阴间,真实的看见了阴间的很多事情。在已故好友的帮助下,他的魂魄回到了人世间。他能做的,只有托梦、夜间显灵、如果有才死的尸体,他也可以短暂的借尸还魂。他的目的就是通过听人的对话来查出杀害自己的真凶,使其得到应有报应。当然也可以加入一些感人的感情戏,一般来说,出现死人的感情戏都比较好处理。
……
游戏的世界既可以是真实的历史或现代世界的再现,当然也可以是幻想中的从来不存在的一个空间。无论是唐风古韵的历史世界,还是魔法与剑的欧州中世纪世界,还是血腥风的武林江湖,还是带有中国色彩的天宫地府,或是外太空空间的一个星球。可以这样说,只要能够想象到的,都可以做为游戏世界的一个元素。
时间、空间都可以虚拟和重建,幻想、现实之间也可以在游戏平和的统一起来,这正是游戏世界的魅力所在。
我们举个例子,现在你要创造一个属于你的世界,你完全可以让时间变得不统一(蜉蝣的一生是人类一天的话,他们的眼中的人类,必然接近于静止,这就是不同时间的生物,在一个空间中所出现的问题),完全可以让神话中的生物与你的世界中的现实生物并存,完全可以让没有思维的物品有思维,让有思维的生物变得没有思维,完全可以打乱现实世界中过去、现在、未来的因果关系,完全可以创造理论上不可能出现的幻想生物。
这就像写神话小说或是科幻小说一样,不怕实现不了,就怕想不到。而小说只是以文字形式建造,读者以想象的方式来了解。而游戏则是以强烈直观的方式,通过画面、声音把一个世界清晰的展现给游戏者。另外游戏者可通过种种方式来更深一步的认识你的世界,控制角色来到一个物品前,也许他会说话;走过镜子般平滑的地面,也许地面会陷落;走过一颗看似普通的树,也许它会突然攻击。这种理解世界和认识世界的方式,远远要比读书更加刺激,更加直观。
其实一个好的游戏情节的设计人,是完全可以成为作家的(当然是著名还是末流,取决于该人的文字写作能力,有好的情节写不好也是浪费)。
我们先谈作家,作家写的小说,并非都有离奇的情节,每一套情节都有自己的特色。有朴实凝重的,有离奇诡异的,有动人细腻的。而离奇诡异的较易改为游戏,原因非常简单,只有离奇的故事,以游戏表现上更可以一波三折,扣人心弦。所以从文字作品改成的游戏,一般来说科幻、武侠、侦探、惊险的题材居多。同样的道理,象《红楼梦》、《茶花女》这样有大篇幅的内心描写和繁续对白的作品,则很难改成游戏。当然,我们也排除一些游戏是以细腻的爱情故事为主点,但能够成功的毕竟是少数。
所以从游戏情节设计的角度来说,科幻、武侠、侦探、惊险居多,而游戏的情节为了应合玩家所寻找的刺激感,往往要比小说更具曲折性。这也是游戏设计的难点所在。
当然有个别游戏设计师为追求这种针对游戏的曲折性,而增加了不少画蛇添足的情节,这就从整体上使游戏质量大打折扣。举个例子:主角要打听女朋友的下落,于是他去找女朋友的好友,其好友确不在家,好友的母亲告诉主角她去了公司,到了女友好友的公司确不让进门,原因是她不是这个公司的人,于是他得去找该公司的主管送礼。可是那主管因为头天喝酒喝高了现在还在睡着,于是去商店买醒酒药。偏偏商店醒酒药售完,于是去厂家取,可是厂家回答缺少原材料……
如此狗拉羊肠的情节,可以无限的增加下去,而这恰恰会使游戏者非常烦感。好的情节并不是使情节连贯就可以了,而是要有“山穷水尽疑无路,柳暗花明又一村”的感觉,而幻漫的情节将是使游戏毕生难忘的点睛之笔。
《疾速赛车:进军诺克斯维尔》(Sprint Cars: Road To Knoxville)硬盘版
《疤面煞星:掌握世界》(Scarface)硬盘版
《要塞传奇》(Stronghold: Legends)Clone版/破解版
《冠军足球经理2007》(Championship Manager 2007)Clone版/破解版[Bin]
《沉默英雄》(Silent Heroes)更换为修正版
《战地2142》(Battlefield 2142)多国语言版(包含繁体/简体中文)[ISO]
《重返狼穴2血战太平洋》(Deadly Dozen 2 Pacific Theater)英文版[ISO]
《百鬼夜宴》
《哥特王朝3》(Gothic 3)破解版[ISO]
《冠军足球经理2007》(Championship Manager 2007)硬盘版
《疯狂主妇》(Desperate Housewives: The Game)Clone版/破解版[Bin]
《魔法使与主人》繁体中文版
《冰雪传奇》简体中文版硬盘版
《战锤40K:战争黎明-黑暗十字军》(Warhammer 40K:Dawn of WAR - Dark Crusade)硬盘版
《钢铁意志》(Will Of Steel)硬盘版
《机动战士敢达在线》
《魔法大帝》(Lords of Magic : Special Edition)Special Edition/特别版[ISO]
《孤单枪手2简体中文版》(AlienShooter2)完全破解
《狗仔队》(PAPARAZZI)[Bin]
《模拟人生2:宠物》(The Sims 2:Pets)资料片
《足球经理2007》(Football Manager 2007)Clone版[Bin]
《幻象杀手》(Fahrenheit)欧洲未删剪版[ISO]
《回声:失落秘洞之谜》(ECHO: Secrets of the Lost Cavern)完美破解版
《席德·梅尔的铁路》(Sid Meiers RailRoads)破解版\CLONE版[Bin]
《突袭》(Sudden Strike)繁体中文硬盘版
《狗仔队》(PAPARAZZI)硬盘版
《目标柏林》(Rush for Berlin)破解版[ISO]
《太空帝国 5 硬盘版》(Space Empires V)1.08
《抗日:血战上海滩》简体中文硬盘版
《E5旅:新铁血联盟》(Brigade E5: New Jagged Union)[Bin]
《突袭2:秘密行动2》(Hidden Stroke II)硬盘版/附繁体中文汉化包
《抗日:血战缅甸》简体中文硬盘版
《大白鲨》(Jaws Unleashed)破解版\CLONE版[ISO]
《扑克超级明星2》(Poker Superstars II)[Bin]
《南茜·朱儿:卡普洞的怪兽》(Nancy Drew: The Creature of Kapu Cave)[Bin]
《拉霸机高手:神秘森林》(Reel Deal Slots Mystic Forest)[Bin]
《闪电战:燃烧的地平线》(Blitzkrieg: Burning Horizon)硬盘版
《终极麻将20》(Ultimate Mahjongg 20)[Bin]
《黑客帝国》(Enter The Matrix).ISO英文版[ISO]
《席德梅尔的铁路》(Sid Meier's Railroads)硬盘版
《惊天计划》(Th3 Plan)破解版[ISO]
《玛莉·艾莉·莉莉炼金工房》桌面装饰集[ISO]
《神探杰克》(Jack Orlando Director's Cut)简体中文版[ISO]
《足球经理2007》(Football Manager 2007)硬盘版
《要塞传奇》(Stronghold Legends)硬盘版
《战术指令2:闪电战》(Strategic Command 2 Blitzkrieg)硬盘版
《疯狗Ⅱ之黄金失窃案》(Mad Dog 2:The Lost Gold)[ISO]
《极度恐慌:撤离点》(F.E.A.R.: Extraction Point)资料片Clone版/破解版
《魔法门之黑暗弥赛亚》(Dark Messiah Of Might And Magic)Clone版/更新1.01升级档免CD补丁
《星球大战:帝国战争-堕落之军》(Star Wars Empire At War Forces of Corruption)更换Clone修正版/DVDClone版
《狮心王》(Lionheart)简体中文硬盘版
《惊天计划》(Th3 Plan)硬盘版
《职业进化足球6》(Pro Evolution Soccer 6)Clone版/破解版[ISO]
《超级力量2》(superpower2)中文版已更新补丁[ISO]
《黑帮教父》(Gangland)国际中文版[ISO]
《梦幻之星:宇宙》(Phantasy Star Universe)[ISO]
《漫画英雄:终极联盟》(Marvel: Ultimate Alliance)Clone版/更换破解修正版[ISO]
《赛道狂飙:日出极限版》(Trackmania Sunrise Extreme)破解版[ISO]
《奇趣射击场》(Smoking Guns Shooting Gallery)[Bin]
《终极纸牌》(Ultimate Solitaire 1000 Unique Games)[Bin]
《晶化2:寻找宝石王冠之旅》(Crystalize 2 Quest for the Jewel Crown)[Bin]
《墨尔本杯挑战赛》(Melbourne Cup Challenge)破解版[Bin]
《赌场高手:挥金如土》(Reel Deal Casino High Roller)[Bin]
《职业进化足球6》(Pro Evolution Soccer 6)硬盘版
《证据:最后的典礼》(Evidence: The Last Ritual)[Bin]
《仙剑奇侠传后传——灵儿续传》完整版
《复活-秦殇前传》(Seal of Evil)硬盘版
《赛道狂飙:日出极限版》(Trackmania Sunrise Extreme)硬盘版
《职业进化足球6》(Pro Evolution Soccer 6)简体中文硬盘版[更新中文实名存档]
《大白鲨》(Jaws Unleashed)硬盘版
《奇趣射击场》(Smoking Guns Shooting Gallery)硬盘版
《魔法门之黑暗弥赛亚》(Dark Messiah Of Might And Magic)硬盘版/RIP版
《卡丁车公开赛》(open kart)Rip
《圣域+资料片魔都魅影》(Sacred Underworld)中文Clone版
《游戏动画收集》(Animation game Collections)
《坎贝拉的非洲冒险》(Cabelas African Safari)[Bin]
《夜行侦探 迷失者》(EVE-the lost one)[ISO]
《小鬼历险记》(Gast: The Greatest Little Ghost!)[Bin]
《坎贝拉的非洲冒险》(Cabelas African Safari)硬盘版
《眼镜蛇11:警报》(Cobra 11 - Nitro)[ISO]
《太平洋风暴》(Pacific Storm)[Bin]
《极品飞车10卡本峡谷》(Need for Speed Carbon)典藏DVDClone版/免CD补丁\破解版
《野兽与乡巴佬》(Beasts and Bumpkins)PC,硬盘版,简体中文版
《无冬之夜2》(Neverwinter Nights 2)CLONE版\破解版
《极品飞车10 卡本峡谷》(Need for Speed Carbon)典藏繁体中文克隆版/更新免CD补丁
《FIFA足球经理2007》(FIFA Manager 2007)CLONE版\破解版
《极品飞车10卡本峡谷典藏版花絮DVDRip》(Need for Speed Carbon Bonus DVDRip)
《爱国者:战火中的国家》(Patriots: A Nation Under Fire)[Bin]
《细胞分裂4:双重间谍》(Tom Clancy's Splinter Cell Double Agent)Clone版/免CD补丁/更新DVD5版本
《漫画英雄:终极联盟》(Marvel:Ultimate Alliance)硬盘版
《恐惧:撤离点》(F.E.A.R. Extraction Point)资料片[独立硬盘版]
《太空帝国5》(Space Empires V)修正版[Bin]
《领土之战3:觉醒》(Dominions 3 The Awakening)[ISO]
《黑暗地球》(Dark Earth)
《细胞分裂4:双重间谍 》(Tom Clancy's Splinter Cell Double Agent)破解版[ISO]
《史努比大战红男爵》(Snoopy Vs The Red Baron)Clone版/破解版/免CD[Bin]
《恶魔守卫战》(Master of Defense)
《赏金猎人》(Bounty Special Edition)
《宝石探秘纸牌》(Jewel Quest Solitaire )
《反恐精英起源胜利之日起源》2943多国语言硬盘版
python中flask如何降低内存?
Dict
在小型程序中,特别是在脚本中,使用Python自带的dict来表示结构信息非常简单方便:
ob = {'x':1, 'y':2, 'z':3}
x = ob['x']
ob['y'] = y
由于在Python 3.6中dict的实现采用了一组有序键,因此其结构更为紧凑,更深得人心。但是,让我们看看dict在内容中占用的空间大小:
print(sys.getsizeof(ob))
240
如上所示,dict占用了大量内存,尤其是如果突然虚需要创建大量实例时:
实例数
对象大小
1 000 000
240 Mb
10 000 000
2.40 Gb
100 000 000
24 Gb
类实例
有些人希望将所有东西都封装到类中,他们更喜欢将结构定义为可以通过属性名访问的类:
class Point:
#
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
ob = Point(1,2,3)
x = ob.x
ob.y = y
类实例的结构很有趣:
字段
大小(比特)
PyGC_Head
24
PyObject_HEAD
16
__weakref__
8
__dict__
8
合计:
56
在上表中,__weakref__是该列表的引用,称之为到该对象的弱引用(weak reference);字段__dict__是该类的实例字典的引用,其中包含实例属性的值(注意在64-bit引用平台中占用8字节)。从Python3.3开始,所有类实例的字典的键都存储在共享空间中。这样就减少了内存中实例的大小:
print(sys.getsizeof(ob), sys.getsizeof(ob.__dict__))
56 112
因此,大量类实例在内存中占用的空间少于常规字典(dict):
实例数
大小
1 000 000
168 Mb
10 000 000
1.68 Gb
100 000 000
16.8 Gb
不难看出,由于实例的字典很大,所以实例依然占用了大量内存。
带有__slots__的类实例
为了大幅降低内存中类实例的大小,我们可以考虑干掉__dict__和__weakref__。为此,我们可以借助 __slots__:
class Point:
__slots__ = 'x', 'y', 'z'
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
ob = Point(1,2,3)
print(sys.getsizeof(ob))
64
如此一来,内存中的对象就明显变小了:
字段
大小(比特)
PyGC_Head
24
PyObject_HEAD
16
x
8
y
8
z
8
总计:
64
在类的定义中使用了__slots__以后,大量实例占据的内存就明显减少了:
实例数
大小
1 000 000
64 Mb
10 000 000
640 Mb
100 000 000
6.4 Gb
目前,这是降低类实例占用内存的主要方式。
这种方式减少内存的原理为:在内存中,对象的标题后面存储的是对象的引用(即属性值),访问这些属性值可以使用类字典中的特殊描述符:
pprint(Point.__dict__)
mappingproxy(
....................................
'x': ,
'y': ,
'z': })
为了自动化使用__slots__创建类的过程,你可以使用库namedlist(https://pypi.org/project/namedlist)。namedlist.namedlist函数可以创建带有__slots__的类:
Point = namedlist('Point', ('x', 'y', 'z'))
还有一个包attrs(https://pypi.org/project/attrs),无论使用或不使用__slots__都可以利用这个包自动创建类。
元组
Python还有一个自带的元组(tuple)类型,代表不可修改的数据结构。元组是固定的结构或记录,但它不包含字段名称。你可以利用字段索引访问元组的字段。在创建元组实例时,元组的字段会一次性关联到值对象:
ob = (1,2,3)
x = ob[0]
ob[1] = y # ERROR
元组实例非常紧凑:
print(sys.getsizeof(ob))
72
由于内存中的元组还包含字段数,因此需要占据内存的8个字节,多于带有__slots__的类:
字段
大小(字节)
PyGC_Head
24
PyObject_HEAD
16
ob_size
8
[0]
8
[1]
8
[2]
8
总计:
72
命名元组
由于元组的使用非常广泛,所以终有一天你需要通过名称访问元组。为了满足这种需求,你可以使用模块collections.namedtuple。
namedtuple函数可以自动生成这种类:
Point = namedtuple('Point', ('x', 'y', 'z'))
如上代码创建了元组的子类,其中还定义了通过名称访问字段的描述符。对于上述示例,访问方式如下:
class Point(tuple):
#
@property
def _get_x(self):
return self[0]
@property
def _get_y(self):
return self[1]
@property
def _get_z(self):
return self[2]
#
def __new__(cls, x, y, z):
return tuple.__new__(cls, (x, y, z))
这种类所有的实例所占用的内存与元组完全相同。但大量的实例占用的内存也会稍稍多一些:
实例数
大小
1 000 000
72 Mb
10 000 000
720 Mb
100 000 000
7.2 Gb
记录类:不带循环GC的可变更命名元组
由于元组及其相应的命名元组类能够生成不可修改的对象,因此类似于ob.x的对象值不能再被赋予其他值,所以有时还需要可修改的命名元组。由于Python没有相当于元组且支持赋值的内置类型,因此人们想了许多办法。在这里我们讨论一下记录类(recordclass,https://pypi.org/project/recordclass),它在StackoverFlow上广受好评(https://stackoverflow.com/questions/29290359/existence-of-mutable-named-tuple-in)。
此外,它还可以将对象占用的内存量减少到与元组对象差不多的水平。
recordclass包引入了类型recordclass.mutabletuple,它几乎等价于元组,但它支持赋值。它会创建几乎与namedtuple完全一致的子类,但支持给属性赋新值(而不需要创建新的实例)。recordclass函数与namedtuple函数类似,可以自动创建这些类:
Point = recordclass('Point', ('x', 'y', 'z'))
ob = Point(1, 2, 3)
类实例的结构也类似于tuple,但没有PyGC_Head:
字段
大小(字节)
PyObject_HEAD
16
ob_size
8
x
8
y
8
z
8
总计:
48
在默认情况下,recordclass函数会创建一个类,该类不参与垃圾回收机制。一般来说,namedtuple和recordclass都可以生成表示记录或简单数据结构(即非递归结构)的类。在Python中正确使用这二者不会造成循环引用。因此,recordclass生成的类实例默认情况下不包含PyGC_Head片段(这个片段是支持循环垃圾回收机制的必需字段,或者更准确地说,在创建类的PyTypeObject结构中,flags字段默认情况下不会设置Py_TPFLAGS_HAVE_GC标志)。
大量实例占用的内存量要小于带有__slots__的类实例:
实例数
大小
1 000 000
48 Mb10 000 000
480 Mb
100 000 000
4.8 Gb
dataobject
recordclass库提出的另一个解决方案的基本想法为:内存结构采用与带__slots__的类实例同样的结构,但不参与循环垃圾回收机制。这种类可以通过recordclass.make_dataclass函数生成:
Point = make_dataclass('Point', ('x', 'y', 'z'))
这种方式创建的类默认会生成可修改的实例。
另一种方法是从recordclass.dataobject继承:
class Point(dataobject):
x:int
y:int
z:int
这种方法创建的类实例不会参与循环垃圾回收机制。内存中实例的结构与带有__slots__的类相同,但没有PyGC_Head:
字段
大小(字节)
PyObject_HEAD
16
ob_size
8
x
8
y
8
z
8
总计:
48
ob = Point(1,2,3)
print(sys.getsizeof(ob))
40
如果想访问字段,则需要使用特殊的描述符来表示从对象开头算起的偏移量,其位置位于类字典内:
mappingproxy({'__new__': ,
.......................................
'x': ,
'y': ,
'z': })
大量实例占用的内存量在CPython实现中是最小的:
实例数
大小
1 000 000
40 Mb
10 000 000
400 Mb
100 000 000
4.0 Gb
Cython
还有一个基于Cython(https://cython.org/)的方案。该方案的优点是字段可以使用C语言的原子类型。访问字段的描述符可以通过纯Python创建。例如:
cdef class Python:
cdef public int x, y, z
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
本例中实例占用的内存更小:
ob = Point(1,2,3)
print(sys.getsizeof(ob))
32
内存结构如下:
字段
大小(字节)