Feeling

    三人行,必有我师焉

   ::  :: 新随笔 :: 联系 ::  :: 管理 ::
  185 随笔 :: 0 文章 :: 392 评论 :: 0 Trackbacks

#

1 快速排序(QuickSort)

快速排序是一个就地排序,分而治之,大规模递归的算法。从本质上来说,它是归并排序的就地版本。快速排序可以由下面四步组成。

(1) 如果不多于1个数据,直接返回。
(2) 一般选择序列最左边的值作为支点数据。
(3) 将序列分成2部分,一部分都大于支点数据,另外一部分都小于支点数据。
(4) 对两边利用递归排序数列。

快速排序比大部分排序算法都要快。尽管我们可以在某些特殊的情况下写出比快速排序快的算法,但是就通常情况而言,没有比它更快的了。快速排序是递归的,对于内存非常有限的机器来说,它不是一个好的选择。 

2 归并排序(MergeSort)

归并排序先分解要排序的序列,从1分成2,2分成4,依次分解,当分解到只有1个一组的时候,就可以排序这些分组,然后依次合并回原来的序列中,这样就可以排序所有数据。合并排序比堆排序稍微快一点,但是需要比堆排序多一倍的内存空间,因为它需要一个额外的数组。

3 堆排序(HeapSort)

堆排序适合于数据量非常大的场合(百万数据)。

堆排序不需要大量的递归或者多维的暂存数组。这对于数据量非常巨大的序列是合适的。比如超过数百万条记录,因为快速排序,归并排序都使用递归来设计算法,在数据量非常大的时候,可能会发生堆栈溢出错误。

堆排序会将所有的数据建成一个堆,最大的数据在堆顶,然后将堆顶数据和序列的最后一个数据交换。接下来再次重建堆,交换数据,依次下去,就可以排序所有的数据。

4 Shell排序(ShellSort)

Shell排序通过将数据分成不同的组,先对每一组进行排序,然后再对所有的元素进行一次插入排序,以减少数据交换和移动的次数。平均效率是O(nlogn)。其中分组的合理性会对算法产生重要的影响。现在多用D.E.Knuth的分组方法。

Shell排序比冒泡排序快5倍,比插入排序大致快2倍。Shell排序比起QuickSort,MergeSort,HeapSort慢很多。但是它相对比较简单,它适合于数据量在5000以下并且速度并不是特别重要的场合。它对于数据量较小的数列重复排序是非常好的。

5 插入排序(InsertSort)

插入排序通过把序列中的值插入一个已经排序好的序列中,直到该序列的结束。插入排序是对冒泡排序的改进。它比冒泡排序快2倍。一般不用在数据大于1000的场合下使用插入排序,或者重复排序超过200数据项的序列。

6 冒泡排序(BubbleSort)

冒泡排序是最慢的排序算法。在实际运用中它是效率最低的算法。它通过一趟又一趟地比较数组中的每一个元素,使较大的数据下沉,较小的数据上升。它是O(n^2)的算法。

7 交换排序(ExchangeSort)和选择排序(SelectSort)

这两种排序方法都是交换方法的排序算法,效率都是 O(n2)。在实际应用中处于和冒泡排序基本相同的地位。它们只是排序算法发展的初级阶段,在实际中使用较少。

8 基数排序(RadixSort)

基数排序和通常的排序算法并不走同样的路线。它是一种比较新颖的算法,但是它只能用于整数的排序,如果我们要把同样的办法运用到浮点数上,我们必须了解浮点数的存储格式,并通过特殊的方式将浮点数映射到整数上,然后再映射回去,这是非常麻烦的事情,因此,它的使用同样也不多。而且,最重要的是,这样算法也需要较多的存储空间。

9 总结

下面是一个总的表格,大致总结了我们常见的所有的排序算法的特点。
排序法 平均时间最差情形稳定度额外空间备注
冒泡 O(n2)  O(n2) 稳定O(1)n小时较好
交换  O(n2)  O(n2)不稳定O(1)n小时较好
选择 O(n2) O(n2)不稳定O(1)n小时较好
插入 O(n2) O(n2)稳定O(1)大部分已排序时较好
基数O(logRB)O(logRB)稳定O(n)

B是真数(0-9),

R是基数(个十百)

ShellO(nlogn)O(ns) 1<2不稳定O(1)s是所选分组
快速O(nlogn)O(n2)不稳定O(nlogn)n大时较好
归并O(nlogn)O(nlogn)稳定O(1)n大时较好
O(nlogn)O(nlogn)不稳定O(1)n大时较好

posted @ 2012-11-10 22:30 三人行,必有我师焉 阅读(336) | 评论 (0)编辑 收藏

Eclipse Class Decompiler是一款Eclipse插件,整合了多种反编译器,和Eclipse Class Viewer无缝集成,能够很方便的使用插件查看类库源码,进行Debug调试。
同时还提供了在线自动查找源代码,查看Class二进制字节码的功能。 


Eclipse Class Decompiler对JDK的最低要求为JDK1.6, 能反编译和debug各版本的Class文件,支持JDK8的Lambda语法,同时支持中文等非Ascii码字符集的解析,支持Eclipse 3.6及以上所有版本的Eclipse。

本插件支持Windows,Linux,Macosx 32位及64位操作系统。

Github项目地址为:https://github.com/cnfree/Eclipse-Class-Decompiler

请通过以下地址选择一个可用的源在线安装:

http://cnfree.github.io/Eclipse-Class-Decompiler/update
http://raw.githubusercontent.com/cnfree/eclipse/master/decompiler/update/
http://www.cpupk.com/decompiler/update/

离线包下载地址:
https://github.com/cnfree/Eclipse-Class-Decompiler/releases/download/v2.10.0/eclipse-class-decompiler-update_v2.10.0.zip
 
插件使用说明:

下图为Eclipse Class Decompiler的首选项页面,可以选择缺省的反编译器工具,并进行反编译器的基本设置。缺省的反编译工具为JD-Core,JD-Core更为先进一些,支持泛型、Enum、注解等JDK1.5以后才有的新语法。

首选项配置选项:
1.重用缓存代码:只会反编译一次,以后每次打开该类文件,都显示的是缓存的反编译代码。
2.忽略已存在的源代码:若未选中,则查看Class文件是否已绑定了Java源代码,如果已绑定,则显示Java源代码,如果未绑定,则反编译Class文件。若选中此项,则忽略已绑定的Java源代码,显示反编译结果。
3.显示反编译器报告:显示反编译器反编译后生成的数据报告及异常信息。
4.使用Eclipse代码格式化工具:使用Eclipse格式化工具对反编译结果重新格式化排版,反编译整个Jar包时,此操作会消耗一些时间。
5.使用Eclipse成员排序:使用Eclipse成员排序对反编译结果重新格式化排版,反编译整个Jar包时,此操作会消耗大量时间。
6.以注释方式输出原始行号信息:如果Class文件包含原始行号信息,则会将行号信息以注释的方式打印到反编译结果中。
7.根据行号对齐源代码以便于调试:若选中该项,插件会采用AST工具分析反编译结果,并根据行号信息调整代码顺序,以便于Debug过程中的单步跟踪调试。
8.设置类反编译查看器作为缺省的类文件编辑器:默认为选中,将忽略Eclipse自带的Class Viewer,每次Eclipse启动后,默认使用本插件提供的类查看器打开Class文件。



插件提供了系统菜单,工具栏,当打开了插件提供的类反编译查看器后,会激活菜单和工具栏选项,可以方便的进行首选项配置,切换反编译工具重新反编译,以及导出反编译结果。






类反编译查看器右键菜单包含了Eclipse自带类查看器右键菜单的全部选项,并增加了一个“导出反编译源代码”菜单项。



打开项目路径下的Class文件,如果设置类反编译查看器为缺省的查看器,直接双击Class文件即可,如果没有设置为缺省查看器,可以使用右键菜单进行查看。




同时插件也支持直接将外部的Class文件拖拽到Eclipse编辑器中进行反编译。


Eclipse Class Decompiler插件也提供了反编译整个Jar文件或者Java包的反编译。该操作支持Package Explorer对包显示布局的操作,如果是平铺模式布局,则导出的源代码不包含子包,如果是层级模式布局,则导出选中的包及其所有的子包。




Debug调试:可以在首选项选中对齐行号进行单步跟踪调试,和普通的包含源代码时的调试操作完全一致,同样的也可以设置断点进行跟踪。当透视图为Debug时,插件自动生成行号并进行对齐方便调试代码,无需进行任何设置。


博文地址:http://www.blogjava.net/cnfree/archive/2012/10/30/390457.html
posted @ 2012-10-30 13:48 三人行,必有我师焉 阅读(92492) | 评论 (43)编辑 收藏

The original author of the JadClipse project maintains it no more, and the latest build 3.3.0 doesn't support eclipse 4.x, so I download the source code and update it.

JadClipse for Eclipse 4.x also support Eclipse 3.x, and provides several new features:
 
1. Integrate jad.exe into the plugin, don't need to set jad path in the preference page again.
2. Add two options in the JadClipse main preference page:
    (1) Use Eclipse member sorter
    (2) Show decompiler report
3. Update the formatting preference default settings, the "Output fields before methods" setting's default value changes to true.

JadClipse for Eclipse 4.x Update Site: http://feeling.sourceforge.net/update

Offline Archive Update File Download: 
1. http://feeling.sourceforge.net/downloads/org.sf.feeling.decompiler_1.0.3.zip
2. http://www.blogjava.net/Files/cnfree/org.sf.feeling.decompiler_1.0.3.zip
posted @ 2012-10-15 17:45 三人行,必有我师焉 阅读(7448) | 评论 (10)编辑 收藏

http://www.open-open.com/lib/view/1326265166952

http://blog.chinaunix.net/uid-22342564-id-3183018.html
posted @ 2012-05-31 02:42 三人行,必有我师焉 阅读(473) | 评论 (0)编辑 收藏

com\maxmpz\audioplayer\widget\listwrappers\D800DC00 这个package 主要用于 PlayList 模型的操作。

com\maxmpz\audioplayer\widget\listwrappers\D800DC00\D803DC04.java

里面有个
    private static int D801DC01(Activity activity, int i)
    {
        TypedArray typedarray 
= activity.obtainStyledAttributes(null, com.maxmpz.audioplayer.j.true.p, 00);
        
int j = typedarray.getResourceId(i, 0);
        typedarray.recycle();
        
return j;
    }

Context.obtainStyledAttributes 实现控件属性与XML定义绑定的代码。 

TypedArray其实就是一个存放资源的Array,首先从上下文中获取到R.styleable。。。这个属性资源的资源数组。 attrs是构造函数传进来,应该就是对应attrs.xml文件。 a.getString(R.styleable。。。);这句代码就是获取attrs.xml中定义的属性,并将这个属性的值传给本控件的mValue.最后,返回一个绑定结束的信号给资源:a.recycle();绑定结束

相关学习文章:
http://blog.csdn.net/aomandeshangxiao/article/details/7449973

com.maxmpz.audioplayer.widget.listwrappers.0xE9 这个类,用于显示文件夹列表,右上方有2个自定义的RadioButton,用来设置是平铺模式显示还是层级显示。
定义了一个ID为:flat_hier_group 的RadioGroup,里面有个2个自定义的RadioButton。

<RadioGroup android:gravity="right" android:orientation="horizontal" android:id="@id/flat_hier_group" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true"
  xmlns:android
="http://schemas.android.com/apk/res/android">
    
<RadioButton android:id="@id/flat_folders_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="0.0dip" android:button="@drawable/matte_flat_folders_selector" />
    
<RadioButton android:id="@id/hier_folders_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="-8.0dip" android:button="@drawable/matte_hier_folders_selector" />
</RadioGroup>

matte_flat_folders_selector的XML定义为:
 

<selector
  
xmlns:android="http://schemas.android.com/apk/res/android">
    
<item android:state_checked="true" android:drawable="@drawable/matte_flat_folders_selected" />
    
<item android:state_checked="false" android:drawable="@drawable/matte_flat_folders" />
</selector>

自定义的RadioButton实际上就是张背景透明的图片罢了。


播放器列表的Layout布局文件为 list_with_big_header.xml。

里面有个android:ellipsize属性:
EidtText和textview中内容过长的话自动换行,使用android:ellipsize与android:singleine可以解决,使只有一行。EditText不支持marquee

关于android:ellipsize属性更详细的文章:http://www.cnblogs.com/chiao/archive/2011/08/20/2147250.html


里面还有个 android:textAppearance 属性,这里涉及到了Android的theme和style设置了,更详细的文章参见:http://jiayanjujyj.iteye.com/blog/1392541
posted @ 2012-05-23 11:59 三人行,必有我师焉 阅读(425) | 评论 (0)编辑 收藏

获取屏幕Display: Activity.getWindowManager().getDefaultDisplay();
获取扩展存储目录:Environment.getExternalStorageDirectory()
通过文件获取Uri:Uri.fromFile(File)
根据文件路径获取图片:BitmapFactory.decodeFile(imageFilePath, bmpFactoryOptions)
获取相机Intent:new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
获取相机拍照后的图片:
Bundle extras = intent.getExtras();
Bitmap bmp = (Bitmap) extras.get("data");
触摸事件:onTouchEvent(MotionEvent ev)
媒体播放器:android.media.MediaPlayer
媒体控制器:android.widget.MediaController(和播放器不在同一个package下)
SurfaceView是视图(View)的继承类,这个视图里内嵌了一个专门用于绘制的Surface,类似于Canvas,但感觉比Canvas更高级。
android.provider.MediaStore里包含了相关的Image,Video,Audio信息,可通过managedQuery方法来查询和遍历。
Android中的AdapterView使用Adapter来获取数据,和JFace中的ContentProvider对应。
根据字符串路径获取Uri:
Uri.parse((String)Path)
封装好的视频View:android.widget.VideoView
视频录制:android.media.MediaRecorder
相机高画质:CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);


设置透明度(这是窗体本身的透明度,非背景)

WindowManager.LayoutParams lp=getWindow().getAttributes();
                lp.alpha=0.3f;
              getWindow().setAttributes(lp);
                
alpha在0.0f到1.0f之间。1.0完全不透明,0.0f完全透明


设置黑暗度

                WindowManager.LayoutParams lp=getWindow().getAttributes();
                lp.dimAmount=0.5f;
                getWindow().setAttributes(lp);
                getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);

dimAmount在0.0f和1.0f之间,0.0f完全不暗,1.0f全暗


设置背景模糊

getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND,     
           WindowManager.LayoutParams.FLAG_BLUR_BEHIND);



//调用浏览器 
Uri uri = Uri.parse(""); 
Intent it = new Intent(Intent.ACTION_VIEW,uri); 
startActivity(it); 

//显示某个坐标在地图上 
Uri uri = Uri.parse("geo:38.899533,-77.036476"); 
Intent it = new Intent(Intent.Action_VIEW,uri); 
startActivity(it); 

//显示路径 
Uri uri = Uri.parse("http://maps.google.com/maps?f=d&saddr=startLat%20startLng&daddr=endLat%20endLng&hl=en"); 
Intent it = new Intent(Intent.ACTION_VIEW,URI); 
startActivity(it); 

//拨打电话 
Uri uri = Uri.parse("tel:10086"); 
Intent it = new Intent(Intent.ACTION_DIAL, uri); 
startActivity(it); 

Uri uri = Uri.parse("tel.10086"); 
Intent it =new Intent(Intent.ACTION_CALL,uri); 
//需要添加 <uses-permission id="android.permission.CALL_PHONE" /> 这个权限到androidmanifest.xml 

//发送短信或彩信 
Intent it = new Intent(Intent.ACTION_VIEW); 
it.putExtra("sms_body", "The SMS text"); 
it.setType("vnd.android-dir/mms-sms"); 
startActivity(it); 

//发送短信 
Uri uri = Uri.parse("smsto:10086"); 
Intent it = new Intent(Intent.ACTION_SENDTO, uri); 
it.putExtra("sms_body", "cwj"); 
startActivity(it); 

//发送彩信 
Uri uri = Uri.parse("content://media/external/images/media/23"); 
Intent it = new Intent(Intent.ACTION_SEND); 
it.putExtra("sms_body", "some text"); 
it.putExtra(Intent.EXTRA_STREAM, uri); 
it.setType("image/png"); 
startActivity(it); 

//发送邮件 
Uri uri = Uri.parse("mailto:android123@163.com"); 
Intent it = new Intent(Intent.ACTION_SENDTO, uri); 
startActivity(it); 

Intent it = new Intent(Intent.ACTION_SEND); 
it.putExtra(Intent.EXTRA_EMAIL, android123@163.com); 
it.putExtra(Intent.EXTRA_TEXT, "The email body text"); 
it.setType("text/plain"); 
startActivity(Intent.createChooser(it, "Choose Email Client")); 

Intent it=new Intent(Intent.ACTION_SEND); 
String[] tos={"me@abc.com"}; 
String[] ccs={"you@abc.com"}; 
it.putExtra(Intent.EXTRA_EMAIL, tos); 
it.putExtra(Intent.EXTRA_CC, ccs); 
it.putExtra(Intent.EXTRA_TEXT, "The email body text"); 
it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text"); 
it.setType("message/rfc822"); 
startActivity(Intent.createChooser(it, "Choose Email Client")); 

//播放媒体文件 
Intent it = new Intent(Intent.ACTION_VIEW); 
Uri uri = Uri.parse("file:///sdcard/cwj.mp3"); 
it.setDataAndType(uri, "audio/mp3"); 
startActivity(it); 

Uri uri = Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "1"); 
Intent it = new Intent(Intent.ACTION_VIEW, uri); 
startActivity(it); 

//卸载APK 
Uri uri = Uri.fromParts("package", strPackageName, null); 
Intent it = new Intent(Intent.ACTION_DELETE, uri); 
startActivity(it); 

//卸载apk 2 
Uri uninstallUri = Uri.fromParts("package", "xxx", null); 
returnIt = new Intent(Intent.ACTION_DELETE, uninstallUri); 

//安装APK 
Uri installUri = Uri.fromParts("package", "xxx", null); 
returnIt = new Intent(Intent.ACTION_PACKAGE_ADDED, installUri); 

//播放音乐 
Uri playUri = Uri.parse("file:///sdcard/download/sth.mp3"); 
returnIt = new Intent(Intent.ACTION_VIEW, playUri); 

//发送附近 
Intent it = new Intent(Intent.ACTION_SEND); 
it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text"); 
it.putExtra(Intent.EXTRA_STREAM, "file:///sdcard/cwj.mp3"); 
sendIntent.setType("audio/mp3"); 
startActivity(Intent.createChooser(it, "Choose Email Client")); 

//market上某个应用信,pkg_name就是应用的packageName 
Uri uri = Uri.parse("market://search?q=pname:pkg_name"); 
Intent it = new Intent(Intent.ACTION_VIEW, uri); 
startActivity(it); 

//market上某个应用信息,app_id可以通过www网站看下 
Uri uri = Uri.parse("market://details?id=app_id"); 
Intent it = new Intent(Intent.ACTION_VIEW, uri); 
startActivity(it); 

//调用搜索 
Intent intent = new Intent(); 
intent.setAction(Intent.ACTION_WEB_SEARCH); 
intent.putExtra(SearchManager.QUERY,"android123") 
startActivity(intent); 

//调用分享菜单 
Intent intent=new Intent(Intent.ACTION_SEND); 
intent.setType("text/plain"); //分享的数据类型 
intent.putExtra(Intent.EXTRA_SUBJECT, "subject"); //主题 
intent.putExtra(Intent.EXTRA_TEXT, "content"); //内容 
startActivity(Intent.createChooser(intent, "title")); //目标应用选择对话框的标题


获取Location:
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_COARSE);
criteria.setPowerRequirement(Criteria.POWER_LOW);
LocationManager locManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
if(locManager.getBestProvider(criteria, true) != null)
myLocation = locManager.getLastKnownLocation(locManager.getBestProvider(criteria, true));
else {
myLocation = new Location("gps");
myLocation.setLatitude(47.100301);
myLocation.setLongitude(-119.982465);
}
posted @ 2012-05-05 19:41 三人行,必有我师焉 阅读(848) | 评论 (0)编辑 收藏


3.1以下版本升级到最新版最好先还原到初始档,然后重新备份一下初始档。

如果不希望重新开局,以下提供正确的操作步骤:
1、进入备份与还原界面。
2、选择“备份当前游戏数据“进行备份。
3、选择“ 还原游戏至初始档状态“进行还原。
4、选择“设置当前游戏数据作为游戏初始档”进行备份。
5、在还原备份数据的列表中选择步骤2备份的数据存档进行还原

就可以正常进入游戏,并且更新了原始档。


3.9版更新内容:
1、修正了若干已知Bug。
2、象兵及战车数据使用兵种第二防御数据。
3、全面更新地图坐标算法,防止无法进入游戏或者武将位于山地无法移动。
4、增加了切换游戏势力功能,可以无需开档游玩任意势力。
5、增加了东州兵和骆驼兵模的防跳补丁。


3.8版更新内容:
1、增加了解锁朝廷、在野、乱军势力的功能。
2、增加了解除诸葛亮外出云游状态的脚本补丁,玩家可以使用任何势力收买诸葛亮,并且激活三顾茅庐技能。
3、增加了全势力官爵升级的脚本补丁。
4、增加了部分武将特殊技能全势力激活的脚本补丁。
5、增加了创建新兵种功能。


3.7版更新内容:
1、修正了一些细节上的bug。
2、增加了雾隐版吕玲绮卫队女兵模型的导入。
3、增加了武将模型作为骑兵模型的导入,并且可自由移除已导入的模型。
4、步兵的士兵模型可以选择将军模型,骑兵的士兵模型可以选择已导入的将军模型和雾影女兵模型。

3.6版更新内容:
1、修正了导入弩兵陷阵营战斗跳出的bug。
2、修正了收买武将修改器发生异常的bug。
3、修正了更换异族武将势力游戏跳出的bug。
4、修改了一些2种势力都有的武将相关的bug。
5、新建武将后清空武将编辑页面状态。
6、编辑武将能力页面新增了编辑武将卫队经验选项。
7、基本修改页面增加了所有兵种生产回合、费用下调的修改。
8、基本修改页面增加了所有城市建筑生产回合、费用下调的修改。

3.5版更新内容:
1、修正了兵种修改页面中兵种名称显示错乱的bug,现在很容易分清雇佣兵和城市招募了。
2、增加了乱军刷新概率的修改。
3、增加导入弩骑高顺卫队和弩兵陷阵营的功能。

3.4版更新内容:
1、修正了编辑大众卫队武将名字时会改变大众卫队名称的bug。
2、增加了编辑势力地图颜色的功能。
3、增加了降低敌方所有武将忠诚度的功能。
4、解决游戏中部分武将心灰意冷状态下无法被收买的bug。

3.3版更新内容:
1、修正了一些bug,比如编辑武将坐标会发生变化的bug。
2、创建新武将页面的爵位增加了自定义功能。
3、难度修改页面中,增加了禁用电脑驿站加成,禁止电脑生产刺客,以及能够编辑电脑太守加成几率的新功能。

3.2版更新内容:
1、增加了1.9a中特有的马匹,1.9a特有的马匹一般冲量都比较大,老版马匹冲量较小。
2、修正了武将地图坐标自动计算错误的bug。我把RGB颜色值写错了,另外遗漏了森林颜色。
3、修正了编辑新武将坐标和兵模无效生效的bug。
4、增加了孙刘曹中特殊武将不能被交换到其他势力的注释。

3.1版更新内容:
1、修正了未对掌旗官旗帜,城市旗帜,援军,盟军旗帜做修改的bug。
2、修正了编辑武将人物列传未繁体化,换行的bug。
3、增加了修改势力后代武将姓氏的功能。

3.0.1版更新内容:
1、更新了压缩武将图片的算法,让武将图片显示的更加清晰。
2、修正了解压缩更新包,仅支持GBK编码的bug。

3.0版更新内容:
1、新增编辑势力功能。
2、修正编辑武将坐标可能导致游戏异常的bug。
3、修正禁止电脑驿站暴兵的bug(此处bug是由于1.9和1.7的驿站代码不一样导致的)。
4、增加了添加势力兵种对兵营的要求,提高游戏的可玩性。
5、增加了对城墙生命值的修改。
6、增加了武将身份设置功能,方便玩家自定义君主或者继承人。
7、增加了修改器的自动更新功能,3.0及其后续版本若发现修改器有新版本,将会自动更新到最新版本。

注意事项:
因为3.0版改动较大,若使用编辑势力功能,请首先还原游戏数据到初始状态,重新做一次原始备份档,否则编辑势力后,无法还原到游戏原始状态。


说明:
1、修改器安装文件夹路径最好不要包含中文或者空格(有个别用户因为中文和空格路径问题无法启动修改器,调试器会提示:
Error occurred during initialization of VM
java.lang.UnsatisfiedLinkError: no zip in java.library.path


2、正常情况下,请使用“三国全面战争1.9a修改器”运行修改器。

3、非正常情况下,比如修改器无法启动成功,或者一直处于系统初始化状态,或者弹出错误窗口(不包括修改失败),请使用“三国全面战争1.9a修改器(调试器)”运行修改器。调试器启动时会显示一个黑色的dos窗口,如运行时发生错误,错误信息会打印到黑色dos窗口,请截图或者复制错误信息,发送到:http://www.1mod.org/thread-37918-1-1.html,我看见后会及时修正错误。

4、游戏原始备份档下载地址:http://feeling.sourceforge.net/patch/1.9a/default.zip
如果你需要恢复原始数据,而又未作原始档备份,可以从此地址下载。
恢复原始数据的2种方法:
1、解压缩后,复制data目录下的数据文件到游戏中,替换游戏数据文件。
2、复制压缩文件到游戏目录下的/patch/bak目录下,替换掉你自己的原始备份档,然后通过修改器恢复原始备份档。

5、关于杀毒软件误报问题:
(1)如果是国产杀毒软件报病毒,请你不要抱怨修改器,去抱怨那些垃圾杀毒软件吧,技术不过关,老是误报。
(2)如果是国外知名杀毒软件报病毒,比如卡巴斯基,麦咖啡,微软MSE等等,你可以截图发给我。
(3)推荐使用微软MSE,口碑不错,完全免费。


6、修改需理智,请谨慎修改,方能提高游戏的可玩性。










下载地址:http://feeling.sourceforge.net/patch/1.9a/patch_1.9a_3.9.zip

修改器简易教程:http://tieba.baidu.com/p/1418490788


小技巧:
1.如果希望新建武将成为势力君主,可以在创建后和武将势力君主交换。
2.能够更换所属势力的武将不能有后代,也不能是势力君主或者继承人,如果希望更换这些武将的势力,可以先和势力内的没有后代的垃圾武将交换一下,让他们成为自由身,就可以更换武将所属势力了。
posted @ 2012-01-25 22:57 三人行,必有我师焉 阅读(119394) | 评论 (85)编辑 收藏

关于PaletteData的生成:
case Gdip.PixelFormat16bppARGB1555:                                        
case Gdip.PixelFormat16bppRGB555: 
    paletteData = new PaletteData(0x7C00, 0x3E0, 0x1F); 
break;
case Gdip.PixelFormat16bppRGB565: 
    paletteData = new PaletteData(0xF800, 0x7E0, 0x1F); 
break;
case Gdip.PixelFormat24bppRGB: 
    paletteData = new PaletteData(0xFF, 0xFF00, 0xFF0000); 
break;
case Gdip.PixelFormat32bppRGB:
case Gdip.PixelFormat32bppARGB: 
    paletteData = new PaletteData(0xFF00, 0xFF0000, 0xFF000000); 
break;

32位ImageData中的data是以RGBA的顺序存储的。data[0]:red,data[1]:green,data[2]:blue,data[3]:alpha

从byte[]中读取RGB pixel:
public static int getPixelFromRGBA( int depth, byte[] data )
{
        switch ( depth )
        {
            case 32 :
                return ( ( data[0] & 0xFF ) << 24 )
                        + ( ( data[1] & 0xFF ) << 16 )
                        + ( ( data[2] & 0xFF ) << 8 )
                        + ( data[3] & 0xFF );
            case 24 :
                return ( ( data[0] & 0xFF ) << 16 )
                        + ( ( data[1] & 0xFF ) << 8 )
                        + ( data[2] & 0xFF );
            case 16 :
                return ( ( data[1] & 0xFF ) << 8 ) + ( data[0] & 0xFF );
            case 8 :
                return data[0] & 0xFF;
        }
        SWT.error( SWT.ERROR_UNSUPPORTED_DEPTH );
        return 0;
}

从pixel中取出RGB值:
RGB rgb = imagedata.palette.getRGB( pixel );

生成一个空的32位图片:
ImageData dest = new ImageData( width,
                height,
                32,
                new PaletteData( 0xFF00, 0xFF0000, 0xFF000000 ) );

24位透明图片转成32位透明图片:
    public static ImageData convertToRGBA( ImageData src )
    {
        ImageData dest = new ImageData( src.width,
                src.height,
                32,
                new PaletteData( 0xFF00, 0xFF0000, 0xFF000000 ) );

        for ( int x = 0; x < src.width; x++ )
        {
            for ( int y = 0; y < src.height; y++ )
            {
                int pixel = src.getPixel( x, y );
                RGB rgb = src.palette.getRGB( pixel );

                byte[] rgba = new byte[4];

                rgba[0] = (byte) rgb.red;
                rgba[1] = (byte) rgb.green;
                rgba[2] = (byte) rgb.blue;

                if ( pixel == src.transparentPixel )
                {
                    rgba[3] = (byte) ( 0 );
                }
                else
                {
                    rgba[3] = (byte) ( 255 );
                }
                dest.setPixel( x, y, getPixelFromRGBA( 32, rgba ) );
            }
        }
        return dest;
    }

posted @ 2012-01-15 13:49 三人行,必有我师焉 阅读(3563) | 评论 (1)编辑 收藏

SourceForge最近实在太慢了,忍无可忍,每天浪费我大量时间……终于让我不得不投向GitHub的怀抱……
posted @ 2012-01-14 16:33 三人行,必有我师焉 阅读(2271) | 评论 (0)编辑 收藏

JDK1.6的File.createTempFile方法有bug,在我的机器上第一次调用该方法需要耗时5秒时间,换了好几个1.6的版本均有该问题。JDK1.4,1.5则无此问题。

不一定所有的机器都有此问题,不过这儿肯定是有问题的,起码在我的机器上有问题。
posted @ 2012-01-13 15:51 三人行,必有我师焉 阅读(1631) | 评论 (2)编辑 收藏

仅列出标题
共9页: 上一页 1 2 3 4 5 6 7 8 9 下一页 
GitHub |  开源中国社区 |  maven仓库 |  文件格式转换