求个会写手机游戏挂机脚本脚本的朋友,帮忙写个脚本

当前位置: >>
游戏工作室行业越来越难做,相信大家都有这种感觉!市场的辅助一个比一个坑,好不容易找到个靠谱的,结果挂还没到期,作者就因为各种原因跑路了,这种情况相信大部分人也经历过,哎,无奈!于是,有些小伙伴桌子一拍:“TMD,买不到好辅助老子自己写!”你是这样的吗?起码十年前我是这样的!那么问题就来了,游戏辅助怎么写?脚本用什么写?都得学习什么知识?要有什么语言基础吗?得学多久才能出师赚钱?基于这无数个新手必经的问题,本文做一个详细的解答,希望小白们看过后不在困惑。网上可以搜到一大把的所谓的,各种各样的,不可怀疑,里面确实有一些不错的。但是什么叫零基础?不是说什么基础都不要?其实,最起码的数学知识还是要的,如果你不知道1+1等于几,那你还是放弃吧。其实在计算机的世界里,1+1=10,因为计算机只认识1和0。如果你知道了1+1为什么等于10,恭喜你,你已经开始具备基础了。关于内存和模拟,我想说,如果你不想以后每天累死累活的,就不要考虑内存了,一款内存辅助一个人是极难完成的,当然,如果你能找到几个志同道合的人一起学习前行的话,可以走内存路线,分工合作,一个人一个方向,破解脱壳、逆向分析、游戏数据分析、过驱动保护、主程序开发、脚本编写……等等等吧,相信很多人都是一个人在战斗,内存方向绝对不是一个好的方向。当然,你也可以在学习的过程中发现原来自己是一个计算机天才,恭喜你,你可以脱离游戏工作室这个行业了,随便找个大公司做个程序猿年薪几十万也是个不错的选择。那,如果内存不能做的话就只能选择模拟了,所谓模拟,也就是模拟键盘鼠标操作的辅助,通过找图识色识别文字达到判断条件,然后模拟鼠标键盘操作实现自动完成游戏内的各种动作。这里不得不说的是按键精灵,我也是从这里开始入门的,有点VB基础的上手可能会更快一些,因为按键精灵是基于VB的语法开发出来的,本人虽说计算机专业本科毕业,但是学校里没学过任何东西,大学四年全在社会实践了(其实就是混了四年)。毕业设计倒是跟着一个工业电子专业的同事用VB开发的,所以按键精灵我上手也比较快,也写出不少当时还算过得去的商业小精灵。四年前,彻底放弃了按键精灵这个平台。要问为什么,有几个理由:1、局限性:按键精灵单纯实现功能是没问题的,但是如果要实现集中管理、中央监控,是比较复杂的,那需要对VB的ActiveX开发有较为深入的功底,以我这二把刀的水瓶就算了。2、防封问题:虽说商业小精灵的各种防护盾有一定的效果,但这个东西,仁者见仁智者见智,真要检测你只是分分钟的问题;3、费用问题:这是放弃它的主要原因,商业小精灵一个注册码的开卡价格从最开始的几块钱一下涨到20块钱,翻了几倍,黑啊,真心的黑啊,不跟你玩了还不行么。放弃了按键精灵得找个新的开发平台啊,当时我面前有2个选择,VC和易语言,最后选择了易语言,理由也很简单,自己C语言基础本来就没有,英文水平更是LOW的不能再LOW了(四级都没过),易语言起码都是中文语法,好歹能看懂,最终选择了E语言,买了本书,买了正版U-KEY(淘宝价598),买正版也是为了避免以后的麻烦事儿,盗版的大多挂马大家应该懂得,你不想自己辛辛苦苦写的源程序最后成了别人的赚钱工具吧?OK,开始钻研E语言,说实话,书买了都没看完过,为啥,不是不想看,是好多东西是用不到的,最有效的学习方法是实践,当时我是用了一个月的时间把自己当时用按键精灵写的一个辅助转化到E语言的,要说怎么做到的……很简单,照着葫芦画瓢呗,语法换换就可以了。编写边调试,最终可以完全跟小精灵一样了,在此基础上又开始研究中控,用了几天时间,中控台可以控制客户机了,WOW,那时候是很兴奋的。慢慢的,开始学习E语言的其它东西,网上很多开源的资源可以借鉴甚至拿来稍微改改就可以为己所用,从此一发不可收拾,结果,我变成了一个苦逼的程序猿。四年时间,每天都在代码、调试、测试中度过。机器也从十几台AMD640全变成了十台E3,自给自足的小型游戏工作室也算是成型了。机器也基本上是拿来测试用的,现在有个老项目在挂着,啥时候想起来或者中控报警了就去看看,钱够了就挂单出货,温饱是没啥问题了,也有个一起成长的游戏工作室朋友在一起研究游戏,他负责找项目,我负责写,收入虽然不高,但是不用担心抄水表的上门,我们都坚信,坚持肯定会有爆发的那一天。成为游戏辅助脚本作者的路上有孤独、寂寞、潦倒,也会有兴奋、喜悦、满足感。如果你做好准备了而且真心喜欢这个行业,做自己喜欢的事儿,让别人去死吧!第一次写这样的文章,逻辑可能比我的程序要混乱,能帮到朋友们一点点,那也是极好的!NBE这个平台激发了我写此文的冲动,处女作,望大家海涵!相关阅读:
本文&&原创,禁止转载!地址:
没看够,不过瘾?深度交流请移步NBE论坛!
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
你好。可以合作一下不QQ
你好,可以合作下吗,或者带带我。市场辅助很不稳定。。。
wwwwbluesoul
你说按键精灵会被游戏检测封掉,那用E语言写的程序不会被封吗?按键精灵还有防御盾,用E语言岂不是要自己写类似防御盾的程序?
和我好像,不过学的时候中途发现自己的逻辑思维还可以,就又学习了JAVA,C#,object-c,swift,然后....我真的成了一个程序猿...
新手菜鸟集一身
Armchannel
我也是按键入门之后vb,然后又按键循环着用,其实用按键我也实现了中控监测挂机电脑的功能,和楼主一样,报警了就去手动弄弄或者在公司通过teamview弄一下.收入的确是可以的,等于多了一个人帮忙打工.一个月下来6,7K基本是这个数了.最近和了一些工作做朋友合作,他找游戏我来写,希望尽快弄完赚点钱:)
你的经历和我大同小异!同道中人啊!
新手菜鸟集一身
你好,能教我编写辅助吗,我真是零基础
愤怒的老鸟
苦逼青年变成了苦逼中年,全是泪和汗啊!
易语言暂时没出安卓和苹果版本,不过吴涛正在开发手机版易语言!你说问题要看具体情况。如果中控台和手机上的辅助分离开的,那问题就不是问题了!只需要2个软件之间留个互相通信的端口就可以了!具体细节那就是作者根据情况去考虑了!希望能对你有所帮助!
易语言的中控可以用在手游上吗??谢谢
《悲剧,刚才不小心回复自己帖子了!》易语言暂时没出安卓和苹果版本,不过吴涛正在开发手机版易语言!你说问题要看具体情况。如果中控台和手机上的辅助分离开的,那问题就不是问题了!只需要2个软件之间留个互相通信的端口就可以了!具体细节那就是作者根据情况去考虑了!希望能对你有所帮助!
计算机只认识1和0那么当计算机要告诉你1+1等于10的时候它不能用1+1=10来告诉你的.它至应该是告诉你的是 ‘1 + 1 == 10’ 如果他要表示1+1=10 那么‘1+1’就作为自己给自己置留的代码.然后给这个“代码”赋值“10”
你说的是c语言,按键不需要双等号,没赋值一说
猜你喜欢本年最热
游戏工作室_本月最热游戏脚本制作方法_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
游戏脚本制作方法
&&游戏脚本制作方法
阅读已结束,下载本文需要
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
还剩13页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢此页面上的内容需要较新版本的 Adobe Flash Player。
最新开发文章
最新信息推荐
上市公司专栏
实时股价每分更新
纳斯达克(美元)(市值:亿美元)
综指: 涨跌幅:
恒生指数(港币)(市值:亿港币)
综指: 涨跌幅:
综指: 涨跌幅:
游戏脚本的实现
来源:互联网02-26-2010
  创建一个角色扮演游戏项目时,会发现在源码中编写游戏相关信息十分困难(这样做也是非常鲁莽的)。最好的办法就是使用外部数据源(类似于程序的代码),称之为游戏脚本(例如对话)。以这种方式,可以控制游戏的流程并节省宝贵的时间,因为不需要在每次做出改变后重新进行编译。
  理解脚本
  当创建游戏时,游戏脚本与所编写的程序代码非常类似,只是游戏脚本相对于游戏引擎而言是外部的。正因为它们是外部的,所以才可以迅速地对脚本做出更改,而不用重新编译整个游戏引擎。否则对于一个超过100万行代码的项目,仅仅为了改变一个对话行就要重新编译整个项目。
  脚本的使用并不会非常困难,而且游戏的每个方面都可以从脚本的运用中获益,比如导航菜单、战斗控制、处理玩家的物品清单,都可以使用脚本。举个例子,进行游戏开发时,把自己想象成处于战斗的用户,他们有规律地使用一系列的法术发起攻击。但在游戏开发过程中可能决定改变部分法术,如果法术的资料是硬编码的话,将面临一个非常麻烦的问题,必须更改控制法术的那些程序代码的每个实例,更不用说去调试和检验那些代码直到正确为止。为什么要花费如此多的时间去做这些改变呢?
  相反,可以将法术以及它们对游戏中人物的影响编写到几个小小的脚本里。每当战斗打响时,这些脚本被加载,并显示可供选择的法术。一旦该法术被施展,一个脚本将发挥自己的作用,从造成损伤到产生运动或法术图形的动画。
  有两种类型的脚本系统可供使用,第一种涉及到使用某种脚本编程语言,在脚本文件中输入命令,编译该文件,并在游戏中执行编译好的脚本文件。第二种是第一种的简化版本,将命令输入到一个文件中,系统通过从一个预先定义好的命令集里选择命令来创建脚本。
  为了简化问题的处理,我们使用第二种脚本系统来创建自己的脚本命令集,称之为Mad Lib Scripting(MLS)系统,它使用一个预先定义好的命令集合(称为行为action),同时每个定义好的命令都与一个游戏功能相关联。
  下图是一个脚本命令集示例:
  使用这样一个有限的行为集合,就不再需要复杂的可编译脚本语言了。相反,只需要告诉脚本系统要使用哪些行为,以及这些行为将使用怎样的选项以实现游戏的功能。对于这种方法,最大的好处就是不再需要为指定一个简单的行为而罗列代码行,可以通过编号来引用行为和选项。
  举个例子,Play Sound行为的编号为4,而且该行为仅要求一个输入,即播放声音的编号。在脚本中只存储两个数值:一个对应于行为,另一个代表了声音。使用数值表示行为(代替文本)的方法可以使这种类型脚本的处理既快速又简单。
  Mad Lib Scripting系统的设计
  创建在游戏中想到的行为,可以通过创建或编辑脚本来填充那些空白点(称之为条目entries)。对于每个行为,请明确提供一个可供空白条目填充的选项列表,它的类型可以从一行文本到一串数字。接着将行为和空白条目进行编号,以便脚本系统可以引用它们,以下是一些行为列表的范例:
  1. Character (*NAME*) takes (*NUMBER*) damage.
  在这6种行为中,都有0个或多个空白条目位于括号内,每个空白条目包含了一个文本字符串或者一个数字,这个行为与可能条目(以及条目的类型)的列表被称之为行为模板(action template),如下图所示:
  一旦使用了行为模板,就可以使用它们的编号而不是行为的文本进行引用(文本的存在只是为了使用户能够更容易理解每个行为所实现的功能)。
  MLS系统的编写
  为了使MLS系统功能尽可能强大,需要设计它以便可以支持多重行为的模板,而且每个行为模板都包含不受数量限制的行为。以这种方式,就可以将系统复用到任何想要的项目中。当一个脚本完成时,将脚本读入到引擎中,并处理各自的行为,为每个由脚本编辑器所输入的行为使用指定的条目。
  一个行为模板需要保存行为的列表,包括文本、条目编号以及每个条目的数据。每个行为按它们在列表中的索引值进行编号,同时每个行为中的空白条目也被加以编号。可以为每个条目指定一种类型(文本型、整数型、浮点型、布尔型、多重选择型),如下所示:
  0. No entry type
  每个条目类型都有一个独特的特征,字符串类型的长度是可以变化的,数字型可以是两个数字范围之间的任何数值,而布尔值可以是TRUE或者FALSE。至于多重选项型,每个选项都有它自己的文本字符串(脚本从一个列表中获取选项,而且所选选项的索引编号比它的文本更适用)。
  行为可以采用如下格式:
  Action #1: Spell targets (*MULTIPLE_CHOICE*).
  Possible choices for blank entry #1:
  我们通过创建结构体ENTRY_RULE和ACTION来处理条目规则与行为。
enumENTRY_TYPE{ENTRY_NONE=0,ENTRY_TEXT,ENTRY_BOOL,ENTRY_INT,ENTRY_FLOAT,ENTRY_CHOICE};char*char_ typedefintBOOL; //============================================================================ //Structurestostoreinformationaboutasingleblankentry. //============================================================================ typedefstructENTRY_RULE { long//typeofblankentry(ENTRY_TEXT,ENTRY_BOOL,) //Thefollowingtwounionscontainthevariousinformationaboutasingleblankentry, //fromthemin/maxvalues(forintandfloattypes),aswellasthenumberofchoices //inamultiplechoiceentry. union { longlong_//minvalueoflongtype floatfloat_//minvalueoffloattype longnum_//numberofchoicesinlist }; union { longlong_//maxvalueoflongtype floatfloat_//maxvalueoffloattype char_ptr*//choicetextarray }; //structureconstructortocleartodefaultvalues ENTRY_RULE() { memset(this,0,sizeof(*this)); } //structuredestructortocleanupusedresources ~ENTRY_RULE() { //specialcaseforchoicetype if(type==ENTRY_CHOICE&&choices!=NULL) { for(longi=0;i<num_i++) delete[]choices[i]; delete[] } } }*ENTRY_RULE_PTR; //============================================================================ //Structurethatstoreasingleaction. //============================================================================ typedefstructACTION { long//actionindex[0,numberofaction-1] chartext[256];//actiontext shortnum_entries_//numberofentriesinaction ENTRY_RULE_PTRentries_//arrayofentrystructures ACTION*//nextactioninlinkedlist ACTION() { memset(this,0,sizeof(*this)); } ~ACTION() { delete[]entries_ } }*ACTION_PTR; 行为模板被存储为文本文件,同时每个行为的文本被包括在括号中。每个包含条目的行为(标记为文本中的波浪字符)紧跟着是条目数据的列表。每个条目由一个描述条目类型(文本型、布尔型、整型、浮点型或选项型)的单词开始。对于文本类型而言并没有更多的需要信息,对于布尔类型来说也是如此。而作为整数和浮点型,则要求一个最小值和最大值。最后,选项类型条目后跟着的是可供选择的编号以及每个选项的文本(包括在引号里)。如下所示:
  "If flag #~ is ~ then"
INT 0 255 BOOL "Else" "Endif" "Set flag #~ to ~" INT 0 255 BOOL "Print ~" TEXT "Move character to ~, ~, ~" FLOAT 0.0 2048.0 FLOAT 0.0 2048.0 FLOAT 0.0 2048.0 "Character ~ ~ ~ ~ points" CHOICE 3 "Main Character" "Caster" "Target" CHOICE 2 "Gains" "Looses" INT 0 128 CHOICE 2 "Hit" "Magic" "Engage in battle sequence #~" INT 0 65535 "End Script"
  脚本条目的创建
  因为ENREY_RULE结构仅包含了行为和条目的规则,所以需要另外的结构数组去存储每个条目的数据。这些新的结构包括了在条目中所使用的文本、布尔值、多重选项,我们使用结构体ENTRY来表示。
//============================================================================typedefstructENTRY { long//typeofblankentry(ENTRY_TEXT,ENTRY_BOOL,) union { longio_//usedforsaving/loading long//lengthoftext(0terminator) long//selectioninchoice BOOLbool_//BOOLvalue longlong_//longbalue floatfloat_//floatvalue }; char*//entrytextbuffer ENTRY() { memset(this,0,sizeof(*this)); } ~ENTRY() { delete[] } }*ENTRY_PTR; 在处理脚本条目的过程中,当一个脚本出现了许多条目时,最麻烦的问题也就接踵而来。脚本中的每个行为都要求一个相匹配的ENTRY_RULE结构,其依次包含了一定数量的ENTRY结构。为了更好地处理一个脚本的结构,还需要其他的结构来记录属于脚本行为的每个条目,我们将它命名为SCRPT。
  //============================================================================typedefstructSCRIPT { longaction_//[0,numberofactions-1] longnum_//numberofentriesinthisaction ENTRY_PTR//arrayofentries SCRIPT*//previousinlinkedlist SCRIPT*//nextinlinkedlist SCRIPT() { memset(this,0,sizeof(*this)); } ~SCRIPT() { delete[] } }*SCRIPT_PTR; prev和next维护了整个脚本的连接列表,为了构造SCRIPT结构的连接列表,从代表脚本的第一个行为的根结构开始,然后使用next和prev将SCRIPT结构连接起来,如下图所示:
  ACTION_TEMPLATE类的整合
  理解了行为模板所使用的结构以及所容纳的脚本后,现在开始将它们整合到一起创建一个加载并处理脚本的类。
  //============================================================================typedefclassACTION_TEMPLATE { private: longm_num_//numberofactionsintemplate ACTION_PTRm_root_//listoftemplateactions public: ACTION_TEMPLATE(); ~ACTION_TEMPLATE(); BOOLload_actions(constchar*filename); voidfree(); longget_num_actions(); ACTION_PTRget_root_action(); ACTION_PTRget_action(longact_index); SCRIPT_PTRcreate_script(longact_index); longget_num_entries_rule(longact_index); ENTRY_RULE_PTRget_entry_rule(longact_index,longentry_rule_index); voidexpand_default_action_text(char*buffer,ACTION_PTRaction); BOOLexpand_action_text(char*buffer,SCRIPT_PTRscript); }*ACTION_TEMPLATE_PTR; 实现:
  //------------------------------------------------------------------------staticBOOL_get_quoted_line(FILE*fp,char*data,longmax_data_size) { intc; longpos=0; //readuntilaquoteisreached(orEOF) while(1) { if((c=fgetc(fp))==EOF) returnFALSE; if(c=='"') { //readuntilnextquot(orEOF) while(1) { if((c=fgetc(fp))==EOF) returnFALSE; //returntextwhen2ndquotefound if(c=='"') { data[pos]=0; break; } //addacceptabletexttoline if(c!=0x0a&&c!=0x0d)//ifcharacterisnotlinefeed,notcarriage. { if(pos<max_data_size-1) data[pos++]=c; } } break; } } returnTRUE; } //------------------------------------------------------------------------ //Getwordfromfile. //------------------------------------------------------------------------ staticBOOL_get_word(FILE*fp,char*data,longmax_data_size) { intc; longpos=0; //resetwordtoempty data[0]=0; //readuntilanacceptablecharacterfound while(1) { if((c=fgetc(fp))==EOF) { data[0]=0; returnFALSE; } //checkforstartofword if(c!=32&&c!=0x0a&&c!=0x0d)//ifcharacterisnotblank,notlinefeed,notcarriage. { data[pos++]=c; //loopuntilendofword(orEOF) while((c=fgetc(fp))!=EOF) { //breakonacceptablewordseperators if(c==32||c==0x0a||c==0x0d) break; //addifenoughroomleft if(pos<max_data_size-1) data[pos++]=c; } //addendoflinetotext data[pos]=0; break; } } returnTRUE; } //------------------------------------------------------------------------ //Constructor,zeromemberdata. //------------------------------------------------------------------------ ACTION_TEMPLATE::ACTION_TEMPLATE() { memset(this,0,sizeof(*this)); } //------------------------------------------------------------------------ //Destructor,releaseallocatedmemory. //------------------------------------------------------------------------ ACTION_TEMPLATE::~ACTION_TEMPLATE() { free(); } //------------------------------------------------------------------------ //Releaseallocatedmemory. //------------------------------------------------------------------------ voidACTION_TEMPLATE::free() { deletem_root_ m_num_actions=0; } //------------------------------------------------------------------------ //Loadanactiontemplate. //------------------------------------------------------------------------ BOOLACTION_TEMPLATE::load_actions(constchar*filename) { constintsize=256; //freepreviousactionstructures free(); FILE* //opentheactionfile if((fp=fopen(filename,"rb"))==NULL) returnFALSE; ACTION_PTRact_ptr=NULL; //keeploopinguntilendoffilefound while(1) { chartext[size]; //getnextquotedaction if(!_get_quoted_line(fp,text,size)) break; //quitifnoactiontext if(text[0]==0) break; //allocateonactionstructureandappendittolist ACTION_PTRact=newACTION; act->next=NULL; if(act_ptr==NULL) m_root_action= else act_ptr->next= act_ptr= //copyactiontext strcpy(act->text,text); //storeactionindex act->index=m_num_ //increasethenumberofactionsloaded m_num_actions++; size_ttext_len=strlen(text); //countthenumberofentriesintheaction for(size_ti=0;i<text_i++) { if(text[i]=='~') act->num_entries_rule++; } //allocatedandreadinentries(ifany) if(act->num_entries_rule!=0) { act->entries_rule=newENTRY_RULE[act->num_entries_rule]; for(shortentry_index=0;entry_indexnum_entries_entry_index++) { ENTRY_RULE_PTRentry_rule=&act->entries_rule[entry_index]; //gettypeofentry _get_word(fp,text,size); if(!stricmp(text,"TEXT"))//TEXTtype,nothingdata. { entry_rule->type=ENTRY_TEXT; } elseif(!stricmp(text,"INT"))//LONGtype,getminandmaxvalues { entry_rule->type=ENTRY_INT; //getminvalue _get_word(fp,text,size); entry_rule->long_min=atol(text); //getmaxvalue _get_word(fp,text,size); entry_rule->long_max=atol(text); } elseif(!stricmp(text,"FLOAT"))//FLOATtype,getminandmaxvalues { entry_rule->type=ENTRY_FLOAT; //getminvalue _get_word(fp,text,size); entry_rule->float_min=(float)atof(text); //getmaxvalue _get_word(fp,text,size); entry_rule->float_max=(float)atof(text); } elseif(!stricmp(text,"BOOL"))//BOOLtype,nooptions. { entry_rule->type=ENTRY_BOOL; } elseif(!stricmp(text,"CHOICE"))//CHOICEtype,getnumberofentriesandentry'stexts. { entry_rule->type=ENTRY_CHOICE; //getthenumberofchoices _get_word(fp,text,size); entry_rule->num_choices=atol(text); entry_rule->choices=newchar_ptr[entry_rule->num_choices]; //geteachentrytext for(longchoice_index=0;choice_indexnum_choice_index++) { _get_quoted_line(fp,text,size); entry_rule->choices[choice_index]=strdup(text); } } } } } fclose(fp); returnTRUE; } //------------------------------------------------------------------------ //Returnnumberofactionsintemplate. //------------------------------------------------------------------------ longACTION_TEMPLATE::get_num_actions() { returnm_num_ } //------------------------------------------------------------------------ //ReturnrootACTIONstructure. //------------------------------------------------------------------------ ACTION_PTRACTION_TEMPLATE::get_root_action() { returnm_root_ } //------------------------------------------------------------------------ //ReturnspecifiedACTIONstructure. //------------------------------------------------------------------------ ACTION_PTRACTION_TEMPLATE::get_action(longact_index) { //returnerrorifhigherthannumberofactions if(act_index>=m_num_actions) returnNULL; ACTION_PTRact_ptr=m_root_ //scanlist while(act_ptr) { if(act_ptr->index==act_index) returnact_ act_ptr=act_ptr-> } returnNULL; } //------------------------------------------------------------------------ //Createscriptfromspecifiedactionindex. //------------------------------------------------------------------------ SCRIPT_PTRACTION_TEMPLATE::create_script(longact_index) { //makesureitisavalidaction if(act_index>=m_num_actions) returnNULL; ACTION_PTRact_ //getpointertoaction if((act_ptr=get_action(act_index))==NULL) returnNULL; //createnewSCRIPTstructure SCRIPT_PTRscript=newSCRIPT; script->action_index=act_ script->num_entries=act_ptr->num_entries_ script->entries=newENTRY[script->num_entries]; //setupeachentry for(longi=0;i
相关新闻:
相关专题:
<button style="border:2px solid #background-color:#margin-right:10" onclick='javascript:var _title=document.var _url=document.location.if( document.all ) {var _text=_title+" - "+ _clipboardData.setData("Text",_text);this.innerHTML="已经复制成功,请用 Ctrl+V 粘贴";}'>复制本文地址推荐给朋友
收藏这篇文章

我要回帖

更多关于 写手机游戏脚本 的文章

 

随机推荐